ui_splash.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. #include "../client/client.h"
  2. #include "../renderer/tr_local.h"
  3. #include "../win32/glw_win_dx8.h"
  4. #include "../win32/win_local.h"
  5. #include "../win32/win_file.h"
  6. #include "../ui/ui_splash.h"
  7. extern bool Sys_QuickStart( void );
  8. /*********
  9. Globals
  10. *********/
  11. static bool SP_LicenseDone = false;
  12. /*********
  13. SP_DisplayIntros
  14. Draws intro movies to the screen
  15. *********/
  16. void SP_DisplayLogos(void)
  17. {
  18. if( !Sys_QuickStart() )
  19. CIN_PlayAllFrames( "logos", 0, 0, 640, 480, 0, true );
  20. }
  21. /*********
  22. SP_DrawTexture
  23. *********/
  24. void SP_DrawTexture(void* pixels, float width, float height, float vShift)
  25. {
  26. if (!pixels)
  27. {
  28. // Ug. We were not even able to load the error message texture.
  29. return;
  30. }
  31. // Create a texture from the buffered file
  32. GLuint texid;
  33. qglGenTextures(1, &texid);
  34. qglBindTexture(GL_TEXTURE_2D, texid);
  35. qglTexImage2D(GL_TEXTURE_2D, 0, GL_DDS1_EXT, width, height, 0, GL_DDS1_EXT, GL_UNSIGNED_BYTE, pixels);
  36. qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  37. qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  38. qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  39. qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  40. // Reset every GL state we've got. Who knows what state
  41. // the renderer could be in when this function gets called.
  42. qglColor3f(1.f, 1.f, 1.f);
  43. #ifdef _XBOX
  44. if(glw_state->isWidescreen)
  45. qglViewport(0, 0, 720, 480);
  46. else
  47. #endif
  48. qglViewport(0, 0, 640, 480);
  49. GLboolean alpha = qglIsEnabled(GL_ALPHA_TEST);
  50. qglDisable(GL_ALPHA_TEST);
  51. GLboolean blend = qglIsEnabled(GL_BLEND);
  52. qglDisable(GL_BLEND);
  53. GLboolean cull = qglIsEnabled(GL_CULL_FACE);
  54. qglDisable(GL_CULL_FACE);
  55. GLboolean depth = qglIsEnabled(GL_DEPTH_TEST);
  56. qglDisable(GL_DEPTH_TEST);
  57. GLboolean fog = qglIsEnabled(GL_FOG);
  58. qglDisable(GL_FOG);
  59. GLboolean lighting = qglIsEnabled(GL_LIGHTING);
  60. qglDisable(GL_LIGHTING);
  61. GLboolean offset = qglIsEnabled(GL_POLYGON_OFFSET_FILL);
  62. qglDisable(GL_POLYGON_OFFSET_FILL);
  63. GLboolean scissor = qglIsEnabled(GL_SCISSOR_TEST);
  64. qglDisable(GL_SCISSOR_TEST);
  65. GLboolean stencil = qglIsEnabled(GL_STENCIL_TEST);
  66. qglDisable(GL_STENCIL_TEST);
  67. GLboolean texture = qglIsEnabled(GL_TEXTURE_2D);
  68. qglEnable(GL_TEXTURE_2D);
  69. qglMatrixMode(GL_MODELVIEW);
  70. qglLoadIdentity();
  71. qglMatrixMode(GL_PROJECTION);
  72. qglLoadIdentity();
  73. #ifdef _XBOX
  74. if(glw_state->isWidescreen)
  75. qglOrtho(0, 720, 0, 480, 0, 1);
  76. else
  77. #endif
  78. qglOrtho(0, 640, 0, 480, 0, 1);
  79. qglMatrixMode(GL_TEXTURE0);
  80. qglLoadIdentity();
  81. qglMatrixMode(GL_TEXTURE1);
  82. qglLoadIdentity();
  83. qglActiveTextureARB(GL_TEXTURE0_ARB);
  84. qglClientActiveTextureARB(GL_TEXTURE0_ARB);
  85. memset(&tess, 0, sizeof(tess));
  86. // Draw the error message
  87. qglBeginFrame();
  88. if (!SP_LicenseDone)
  89. {
  90. // clear the screen if we haven't done the
  91. // license yet...
  92. qglClearColor(0, 0, 0, 1);
  93. qglClear(GL_COLOR_BUFFER_BIT);
  94. }
  95. float x1, x2, y1, y2;
  96. #ifdef _XBOX
  97. if(glw_state->isWidescreen)
  98. {
  99. x1 = 0;
  100. x2 = 720;
  101. y1 = 0;
  102. y2 = 480;
  103. }
  104. else {
  105. #endif
  106. x1 = 0;
  107. x2 = 640;
  108. y1 = 0;
  109. y2 = 480;
  110. #ifdef _XBOX
  111. }
  112. #endif
  113. y1 += vShift;
  114. y2 += vShift;
  115. qglBeginEXT (GL_TRIANGLE_STRIP, 4, 0, 0, 4, 0);
  116. qglTexCoord2f( 0, 0 );
  117. qglVertex2f(x1, y1);
  118. qglTexCoord2f( 1 , 0 );
  119. qglVertex2f(x2, y1);
  120. qglTexCoord2f( 0, 1 );
  121. qglVertex2f(x1, y2);
  122. qglTexCoord2f( 1, 1 );
  123. qglVertex2f(x2, y2);
  124. qglEnd();
  125. qglEndFrame();
  126. qglFlush();
  127. // Restore (most) of the render states we reset
  128. if (alpha) qglEnable(GL_ALPHA_TEST);
  129. else qglDisable(GL_ALPHA_TEST);
  130. if (blend) qglEnable(GL_BLEND);
  131. else qglDisable(GL_BLEND);
  132. if (cull) qglEnable(GL_CULL_FACE);
  133. else qglDisable(GL_CULL_FACE);
  134. if (depth) qglEnable(GL_DEPTH_TEST);
  135. else qglDisable(GL_DEPTH_TEST);
  136. if (fog) qglEnable(GL_FOG);
  137. else qglDisable(GL_FOG);
  138. if (lighting) qglEnable(GL_LIGHTING);
  139. else qglDisable(GL_LIGHTING);
  140. if (offset) qglEnable(GL_POLYGON_OFFSET_FILL);
  141. else qglDisable(GL_POLYGON_OFFSET_FILL);
  142. if (scissor) qglEnable(GL_SCISSOR_TEST);
  143. else qglDisable(GL_SCISSOR_TEST);
  144. if (stencil) qglEnable(GL_STENCIL_TEST);
  145. else qglDisable(GL_STENCIL_TEST);
  146. if (texture) qglEnable(GL_TEXTURE_2D);
  147. else qglDisable(GL_TEXTURE_2D);
  148. // Kill the texture
  149. qglDeleteTextures(1, &texid);
  150. }
  151. /*********
  152. SP_GetLanguageExt
  153. Retuns the extension for the current language, or
  154. english if the language is unknown.
  155. *********/
  156. char* SP_GetLanguageExt()
  157. {
  158. switch(XGetLanguage())
  159. {
  160. case XC_LANGUAGE_ENGLISH:
  161. return "EN";
  162. // case XC_LANGUAGE_JAPANESE:
  163. // return "JA";
  164. case XC_LANGUAGE_GERMAN:
  165. return "GE";
  166. // case XC_LANGUAGE_SPANISH:
  167. // return "SP";
  168. // case XC_LANGUAGE_ITALIAN:
  169. // return "IT";
  170. // case XC_LANGUAGE_KOREAN:
  171. // return "KO";
  172. // case XC_LANGUAGE_TCHINESE:
  173. // return "CH";
  174. // case XC_LANGUAGE_PORTUGUESE:
  175. // return "PO";
  176. case XC_LANGUAGE_FRENCH:
  177. return "FR";
  178. default:
  179. return "EN";
  180. }
  181. }
  182. /*********
  183. SP_LoadFileWithLanguage
  184. Loads a screen with the appropriate language
  185. *********/
  186. void *SP_LoadFileWithLanguage(const char *name)
  187. {
  188. char fullname[MAX_QPATH];
  189. void *buffer = NULL;
  190. char *ext;
  191. // get the language extension
  192. ext = SP_GetLanguageExt();
  193. // creat the fullpath name and try to load the texture
  194. sprintf(fullname, "%s_%s.dds", name, ext);
  195. buffer = SP_LoadFile(fullname);
  196. if (!buffer)
  197. {
  198. sprintf(fullname, "%s.dds", name);
  199. buffer = SP_LoadFile(fullname);
  200. }
  201. return buffer;
  202. }
  203. /*********
  204. SP_LoadFile
  205. *********/
  206. void* SP_LoadFile(const char* name)
  207. {
  208. wfhandle_t h = WF_Open(name, true, false);
  209. if (h < 0) return NULL;
  210. if (WF_Seek(0, SEEK_END, h))
  211. {
  212. WF_Close(h);
  213. return NULL;
  214. }
  215. int len = WF_Tell(h);
  216. if (WF_Seek(0, SEEK_SET, h))
  217. {
  218. WF_Close(h);
  219. return NULL;
  220. }
  221. void *buf = Z_Malloc(len, TAG_TEMP_WORKSPACE, false, 32);
  222. if (WF_Read(buf, len, h) != len)
  223. {
  224. Z_Free(buf);
  225. WF_Close(h);
  226. return NULL;
  227. }
  228. WF_Close(h);
  229. return buf;
  230. }
  231. /********
  232. SP_DoLicense
  233. Draws the license splash to the screen
  234. *********/
  235. void SP_DoLicense(void)
  236. {
  237. if( Sys_QuickStart() )
  238. return;
  239. // Load the license screen
  240. void *license;
  241. extern const char *Sys_RemapPath( const char *filename );
  242. license = SP_LoadFileWithLanguage( Sys_RemapPath( "base\\media\\LicenseScreen" ) );
  243. if (license)
  244. {
  245. SP_DrawTexture(license, 512, 512, 0);
  246. Z_Free(license);
  247. }
  248. SP_LicenseDone = true;
  249. }
  250. /*
  251. SP_DrawMPLoadScreen
  252. Draws the Multiplayer loading screen
  253. */
  254. void SP_DrawMPLoadScreen( void )
  255. {
  256. // Load the texture:
  257. void *image = SP_LoadFileWithLanguage("d:\\base\\media\\LoadMP");
  258. if( image )
  259. {
  260. SP_DrawTexture(image, 512, 512, 0);
  261. Z_Free(image);
  262. }
  263. }
  264. /*
  265. SP_DrawSPLoadScreen
  266. Draws the single player loading screen - used when skipping the logo movies
  267. */
  268. void SP_DrawSPLoadScreen( void )
  269. {
  270. // Load the texture:
  271. extern const char *Sys_RemapPath( const char *filename );
  272. void *image = SP_LoadFileWithLanguage( Sys_RemapPath("base\\media\\LoadSP") );
  273. if( image )
  274. {
  275. SP_DrawTexture(image, 512, 512, 0);
  276. Z_Free(image);
  277. }
  278. }
  279. /*
  280. ERR_DiscFail
  281. Draws the damaged/dirty disc message, looping forever
  282. */
  283. void ERR_DiscFail(bool poll)
  284. {
  285. // Load the texture:
  286. extern const char *Sys_RemapPath( const char *filename );
  287. void *image = SP_LoadFileWithLanguage( Sys_RemapPath("base\\media\\DiscErr") );
  288. if( image )
  289. {
  290. SP_DrawTexture(image, 512, 512, 0);
  291. Z_Free(image);
  292. }
  293. for (;;)
  294. {
  295. extern void MuteBinkSystem(void);
  296. MuteBinkSystem();
  297. extern void S_Update_(void);
  298. S_Update_();
  299. }
  300. }