/* ** GL_SetDefaultState */ void GL_SetDefaultState( void ) { glClearDepth( 1.0f ); glCullFace( GL_FRONT ); glColor4f( 1, 1, 1, 1 ); // initialize downstream texture unit if we're running // in a multitexture environment if ( GLEW_ARB_multitexture ) { GL_SelectTexture( 1 ); GL_TextureMode( r_textureMode->string ); GL_TextureAnisotropy( r_ext_texture_filter_anisotropic->value ); GL_TexEnv( GL_MODULATE ); glDisable( GL_TEXTURE_2D ); GL_SelectTexture( 0 ); } glEnable( GL_TEXTURE_2D ); GL_TextureMode( r_textureMode->string ); GL_TextureAnisotropy( r_ext_texture_filter_anisotropic->value ); GL_TexEnv( GL_MODULATE ); glShadeModel( GL_SMOOTH ); glDepthFunc( GL_LEQUAL ); // the vertex array is always enabled, but the color and texture // arrays are enabled and disabled around the compiled vertex array call glEnableClientState( GL_VERTEX_ARRAY ); // // make sure our GL state vector is set correctly // glState.glStateBits = GLS_DEPTHTEST_DISABLE | GLS_DEPTHMASK_TRUE; glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); glDepthMask( GL_TRUE ); glDisable( GL_DEPTH_TEST ); glEnable( GL_SCISSOR_TEST ); glDisable( GL_CULL_FACE ); glDisable( GL_BLEND ); glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); glClearDepth( 1.0 ); glDrawBuffer( GL_BACK ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); //----(SA) added. #if 0 // ATI pn_triangles if ( GLEW_ATI_pn_triangles ) { int maxtess; // get max supported tesselation glGetIntegerv( GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI, ( GLint * ) &maxtess ); #ifdef __MACOS__ glConfig.ATIMaxTruformTess = 7; #else glConfig.ATIMaxTruformTess = maxtess; #endif // cap if necessary if ( r_ati_truform_tess->value > maxtess ) { ri.Cvar_Set( "r_ati_truform_tess", va( "%d", maxtess ) ); } // set Wolf defaults glPNTrianglesfATI( GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI, r_ati_truform_tess->value ); } #endif if ( glConfig.anisotropicAvailable ) { float maxAnisotropy; glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy ); glConfig.maxAnisotropy = maxAnisotropy; // set when rendering // glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glConfig.maxAnisotropy); } //----(SA) end }
/* ==================== RE_BeginFrame If running in stereo, RE_BeginFrame will be called twice for each RE_EndFrame ==================== */ void RE_BeginFrame(stereoFrame_t stereoFrame) { drawBufferCommand_t *cmd; if(!tr.registered) { return; } glState.finishCalled = false; tr.frameCount++; tr.frameSceneNum = 0; // // do overdraw measurement // if(r_measureOverdraw->integer) { if(glConfig.stencilBits < 4) { ri.Printf(PRINT_ALL, "Warning: not enough stencil bits to measure overdraw: %d\n", glConfig.stencilBits); ri.Cvar_Set("r_measureOverdraw", "0"); r_measureOverdraw->modified = false; } else if(r_shadows->integer == 2) { ri.Printf(PRINT_ALL, "Warning: stencil shadows and overdraw measurement are mutually exclusive\n"); ri.Cvar_Set("r_measureOverdraw", "0"); r_measureOverdraw->modified = false; } else { R_SyncRenderThread(); glEnable(GL_STENCIL_TEST); glStencilMask(~0U); glClearStencil(0U); glStencilFunc(GL_ALWAYS, 0U, ~0U); glStencilOp(GL_KEEP, GL_INCR, GL_INCR); } r_measureOverdraw->modified = false; } else { // this is only reached if it was on and is now off if(r_measureOverdraw->modified) { R_SyncRenderThread(); glDisable(GL_STENCIL_TEST); } r_measureOverdraw->modified = false; } // // texturemode stuff // if(r_textureMode->modified) { R_SyncRenderThread(); GL_TextureMode(r_textureMode->string); r_textureMode->modified = false; } // // anisotropic filtering stuff // if(r_textureAnisotropy->modified) { R_SyncRenderThread(); GL_TextureAnisotropy(r_textureAnisotropy->value); r_textureAnisotropy->modified = false; } // // NVidia stuff // // fog control if(glConfig.NVFogAvailable && r_nv_fogdist_mode->modified) { r_nv_fogdist_mode->modified = false; if(!Q_stricmp(r_nv_fogdist_mode->string, "GL_EYE_PLANE_ABSOLUTE_NV")) { glConfig.NVFogMode = (int)GL_EYE_PLANE_ABSOLUTE_NV; } else if(!Q_stricmp(r_nv_fogdist_mode->string, "GL_EYE_PLANE")) { glConfig.NVFogMode = (int)GL_EYE_PLANE; } else if(!Q_stricmp(r_nv_fogdist_mode->string, "GL_EYE_RADIAL_NV")) { glConfig.NVFogMode = (int)GL_EYE_RADIAL_NV; } else { // in case this was really 'else', store a valid value for next time glConfig.NVFogMode = (int)GL_EYE_RADIAL_NV; ri.Cvar_Set("r_nv_fogdist_mode", "GL_EYE_RADIAL_NV"); } } // // gamma stuff // if(r_gamma->modified) { r_gamma->modified = false; if( !glConfig.deviceSupportsGamma ) { Com_Printf( "r_gamma will be changed upon restarting.\n" ); } else { R_SyncRenderThread(); R_SetColorMappings(); } } // check for errors if(!r_ignoreGLErrors->integer) { int err; R_SyncRenderThread(); if((err = glGetError()) != GL_NO_ERROR) { ri.Error(ERR_FATAL, "RE_BeginFrame() - glGetError() failed (0x%x)!\n", err); } } // // draw buffer stuff // cmd = (drawBufferCommand_t*)R_GetCommandBuffer(sizeof(*cmd)); if(!cmd) { return; } cmd->commandId = RC_DRAW_BUFFER; if(glConfig.stereoEnabled) { if(stereoFrame == STEREO_LEFT) { cmd->buffer = (int)GL_BACK_LEFT; } else if(stereoFrame == STEREO_RIGHT) { cmd->buffer = (int)GL_BACK_RIGHT; } else { ri.Error(ERR_FATAL, "RE_BeginFrame: Stereo is enabled, but stereoFrame was %i", stereoFrame); } } else { if(stereoFrame != STEREO_CENTER) { ri.Error(ERR_FATAL, "RE_BeginFrame: Stereo is disabled, but stereoFrame was %i", stereoFrame); } if(!Q_stricmp(r_drawBuffer->string, "GL_FRONT")) { cmd->buffer = (int)GL_FRONT; } else { cmd->buffer = (int)GL_BACK; } } }