/*----------------------------------------------------------------------------- Name : btgLoadTextures Description : reload the background Inputs : Outputs : Return : ----------------------------------------------------------------------------*/ void BtgBackground::btgLoadTextures(void) { if (btgLastBackground[0] != '\0') { btgLoad(btgLastBackground); btgFade = -1; } }
/*----------------------------------------------------------------------------- Name : btgRender Description : renders the background. assumes modelview already set Inputs : Outputs : Return : ----------------------------------------------------------------------------*/ void btgRender() { udword nStar; sdword lightOn, index; GLboolean texOn, blendOn, depthOn; udword* dlast; udword* dnext; static sdword lastFade = 255; #if MR_KEYBOARD_CHEATS extern bool gMosaic; #endif if (btgHead == NULL) { #ifdef _WIN32 btgLoad("BTG\\default.btg"); #else btgLoad("BTG/default.btg"); #endif } #if MR_KEYBOARD_CHEATS glShadeModel(gMosaic ? GL_FLAT : GL_SMOOTH); #else glShadeModel(GL_SMOOTH); #endif glGetFloatv(GL_COLOR_CLEAR_VALUE, _bgColor); for (index = 0; index < 4; index++) { _bgByte[index] = (GLubyte)(_bgColor[index] * 255.0f); } dnext = (udword*)_bgByte; dlast = (udword*)lastbg; depthOn = glIsEnabled(GL_DEPTH_TEST); lightOn = rndLightingEnable(FALSE); texOn = glIsEnabled(GL_TEXTURE_2D); blendOn = glIsEnabled(GL_BLEND); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); rndAdditiveBlends(FALSE); if (useVBO) glBindBuffer(GL_ARRAY_BUFFER, vboTransVerts); //polys if (btgFade != lastFade || *dnext != *dlast) { if (btgFade < 0) { btgFade = 255; } #ifndef _WIN32_FIXME btgColorVertices(); #endif if (useVBO) glBufferData(GL_ARRAY_BUFFER, btgHead->numVerts * sizeof(btgTransVertex), btgTransVerts, GL_STATIC_DRAW); *dlast = *dnext; lastFade = btgFade; } //use DrawElements to render the bg polys glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); if (useVBO) { glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(btgTransVertex), 0); glVertexPointer(3, GL_FLOAT, sizeof(btgTransVertex), (GLvoid*)4); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIndices); glDrawElements(GL_TRIANGLES, 3 * btgHead->numPolys, GL_UNSIGNED_SHORT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } else { glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(btgTransVertex), (GLubyte*)btgTransVerts); glVertexPointer(3, GL_FLOAT, sizeof(btgTransVertex), ((GLubyte*)btgTransVerts) + 4); glDrawElements(GL_TRIANGLES, 3 * btgHead->numPolys, GL_UNSIGNED_SHORT, btgIndices); } glDisableClientState(GL_COLOR_ARRAY); //stars rndPerspectiveCorrection(FALSE); rndAdditiveBlends(TRUE); trClearCurrent(); glEnable(GL_TEXTURE_2D); rndTextureEnvironment(RTE_Modulate); glEnableClientState(GL_TEXTURE_COORD_ARRAY); if (useVBO) { glBindBuffer(GL_ARRAY_BUFFER, vboTransStars); glVertexPointer(3, GL_FLOAT, sizeof(GLfloat) * 5, 0); glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat) * 5, (GLubyte*)sizeof(vector)); glBindBuffer(GL_ARRAY_BUFFER, 0); } else { glVertexPointer(3, GL_FLOAT, sizeof(GLfloat) * 5, (GLubyte*)btgTransStars); glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat) * 5, ((GLubyte*)btgTransStars) + sizeof(vector)); } for (nStar = 0; nStar < btgHead->numStars; nStar++) { if (btgStars[nStar].glhandle) { glColor4ub((GLubyte)btgStars[nStar].red, (GLubyte)btgStars[nStar].green, (GLubyte)btgStars[nStar].blue, (GLubyte)btgStars[nStar].alpha); glBindTexture(GL_TEXTURE_2D, btgStars[nStar].glhandle); glDrawArrays(GL_TRIANGLE_STRIP, nStar * 4, 4); } } glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisable(GL_BLEND); rndAdditiveBlends(FALSE); rndLightingEnable(lightOn); if (texOn) glEnable(GL_TEXTURE_2D); if (blendOn) { glEnable(GL_BLEND); } else { glDisable(GL_BLEND); } glEnable(GL_CULL_FACE); if (depthOn) { glEnable(GL_DEPTH_TEST); } else { glDisable(GL_DEPTH_TEST); } }