#include "../client/client.h" #include "../renderer/tr_local.h" #include "../win32/glw_win_dx8.h" #include "../win32/win_local.h" #include "../win32/win_file.h" #include "../ui/ui_splash.h" #define SP_TextureExt "dds" extern bool Sys_QuickStart( void ); /********* Globals *********/ static bool SP_LicenseDone = false; /********* SP_DisplayIntros Draws intro movies to the screen *********/ void SP_DisplayLogos(void) { if( !Sys_QuickStart() ) CIN_PlayAllFrames( "logos", 0, 0, 640, 480, 0, true ); } /********* SP_DrawTexture *********/ void SP_DrawTexture(void* pixels, float width, float height, float vShift) { if (!pixels) { // Ug. We were not even able to load the error message texture. return; } // Create a texture from the buffered file GLuint texid; qglGenTextures(1, &texid); qglBindTexture(GL_TEXTURE_2D, texid); qglTexImage2D(GL_TEXTURE_2D, 0, GL_DDS1_EXT, width, height, 0, GL_DDS1_EXT, GL_UNSIGNED_BYTE, pixels); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); // Reset every GL state we've got. Who knows what state // the renderer could be in when this function gets called. qglColor3f(1.f, 1.f, 1.f); qglViewport(0, 0, 640, 480); GLboolean alpha = qglIsEnabled(GL_ALPHA_TEST); qglDisable(GL_ALPHA_TEST); GLboolean blend = qglIsEnabled(GL_BLEND); qglDisable(GL_BLEND); GLboolean cull = qglIsEnabled(GL_CULL_FACE); qglDisable(GL_CULL_FACE); GLboolean depth = qglIsEnabled(GL_DEPTH_TEST); qglDisable(GL_DEPTH_TEST); GLboolean fog = qglIsEnabled(GL_FOG); qglDisable(GL_FOG); GLboolean lighting = qglIsEnabled(GL_LIGHTING); qglDisable(GL_LIGHTING); GLboolean offset = qglIsEnabled(GL_POLYGON_OFFSET_FILL); qglDisable(GL_POLYGON_OFFSET_FILL); GLboolean scissor = qglIsEnabled(GL_SCISSOR_TEST); qglDisable(GL_SCISSOR_TEST); GLboolean stencil = qglIsEnabled(GL_STENCIL_TEST); qglDisable(GL_STENCIL_TEST); GLboolean texture = qglIsEnabled(GL_TEXTURE_2D); qglEnable(GL_TEXTURE_2D); qglMatrixMode(GL_MODELVIEW); qglLoadIdentity(); qglMatrixMode(GL_PROJECTION); qglLoadIdentity(); qglOrtho(0, 640, 0, 480, 0, 1); qglMatrixMode(GL_TEXTURE0); qglLoadIdentity(); qglMatrixMode(GL_TEXTURE1); qglLoadIdentity(); qglActiveTextureARB(GL_TEXTURE0_ARB); qglClientActiveTextureARB(GL_TEXTURE0_ARB); memset(&tess, 0, sizeof(tess)); // Draw the error message qglBeginFrame(); if (!SP_LicenseDone) { // clear the screen if we haven't done the // license yet... qglClearColor(0, 0, 0, 1); qglClear(GL_COLOR_BUFFER_BIT); } float x1 = 320 - width / 2; float x2 = 320 + width / 2; float y1 = 240 - height / 2; float y2 = 240 + height / 2; y1 += vShift; y2 += vShift; qglBeginEXT (GL_TRIANGLE_STRIP, 4, 0, 0, 4, 0); qglTexCoord2f( 0, 0 ); qglVertex2f(x1, y1); qglTexCoord2f( 1 , 0 ); qglVertex2f(x2, y1); qglTexCoord2f( 0, 1 ); qglVertex2f(x1, y2); qglTexCoord2f( 1, 1 ); qglVertex2f(x2, y2); qglEnd(); qglEndFrame(); qglFlush(); // Restore (most) of the render states we reset if (alpha) qglEnable(GL_ALPHA_TEST); else qglDisable(GL_ALPHA_TEST); if (blend) qglEnable(GL_BLEND); else qglDisable(GL_BLEND); if (cull) qglEnable(GL_CULL_FACE); else qglDisable(GL_CULL_FACE); if (depth) qglEnable(GL_DEPTH_TEST); else qglDisable(GL_DEPTH_TEST); if (fog) qglEnable(GL_FOG); else qglDisable(GL_FOG); if (lighting) qglEnable(GL_LIGHTING); else qglDisable(GL_LIGHTING); if (offset) qglEnable(GL_POLYGON_OFFSET_FILL); else qglDisable(GL_POLYGON_OFFSET_FILL); if (scissor) qglEnable(GL_SCISSOR_TEST); else qglDisable(GL_SCISSOR_TEST); if (stencil) qglEnable(GL_STENCIL_TEST); else qglDisable(GL_STENCIL_TEST); if (texture) qglEnable(GL_TEXTURE_2D); else qglDisable(GL_TEXTURE_2D); // Kill the texture qglDeleteTextures(1, &texid); } /********* SP_GetLanguageExt Retuns the extension for the current language, or english if the language is unknown. *********/ char* SP_GetLanguageExt() { switch(XGetLanguage()) { case XC_LANGUAGE_ENGLISH: return "EN"; case XC_LANGUAGE_JAPANESE: return "JA"; case XC_LANGUAGE_GERMAN: return "GE"; case XC_LANGUAGE_SPANISH: return "SP"; case XC_LANGUAGE_ITALIAN: return "IT"; case XC_LANGUAGE_KOREAN: return "KO"; case XC_LANGUAGE_TCHINESE: return "CH"; case XC_LANGUAGE_PORTUGUESE: return "PO"; default: return "EN"; } } /********* SP_LoadFileWithLanguage Loads a screen with the appropriate language *********/ void *SP_LoadFileWithLanguage(const char *name) { char fullname[MAX_QPATH]; void *buffer = NULL; char *ext; // get the language extension ext = SP_GetLanguageExt(); // creat the fullpath name and try to load the texture sprintf(fullname,"%s_%s." SP_TextureExt,name,ext); buffer = SP_LoadFile(fullname); if (!buffer) { sprintf(fullname, "%s." SP_TextureExt, name); buffer = SP_LoadFile(fullname); } return buffer; } /********* SP_LoadFile *********/ void* SP_LoadFile(const char* name) { wfhandle_t h = WF_Open(name, true, false); if (h < 0) return NULL; if (WF_Seek(0, SEEK_END, h)) { WF_Close(h); return NULL; } int len = WF_Tell(h); if (WF_Seek(0, SEEK_SET, h)) { WF_Close(h); return NULL; } void *buf = Z_Malloc(len, TAG_TEMP_WORKSPACE, false, 32); if (WF_Read(buf, len, h) != len) { Z_Free(buf); WF_Close(h); return NULL; } WF_Close(h); return buf; } /******** SP_DoLicense Draws the license splash to the screen *********/ void SP_DoLicense(void) { if( Sys_QuickStart() ) return; // Load the license screen void *license; license = SP_LoadFileWithLanguage("d:\\base\\media\\LicenseScreen"); if (license) { for (int c = 0; c < 3; ++c) { SP_DrawTexture(license, 1024, 1024, -20.0); } Z_Free(license); } SP_LicenseDone = true; }