/* ================= R_SetShellBlend ================= */ void R_SetShellBlend (qboolean toggle) { // shells only if ( !(currententity->flags & RF_MASK_SHELL) ) return; if (toggle) //turn on { // Psychospaz's envmapping if (EnvMapShell()) { glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); GL_Bind(glMedia.spheremappic->texnum); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); } else if (FlowingShell()) GL_Bind(glMedia.shelltexture->texnum); else GL_DisableTexture(0); GL_ClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); GL_StencilFunc(GL_EQUAL, 1, 2); glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); GL_Enable(GL_STENCIL_TEST); shellFlowH = 0.25 * sin(r_newrefdef.time * 0.5 * M_PI); shellFlowV = -(r_newrefdef.time / 2.0); } else // turn off { // Psychospaz's envmapping if (EnvMapShell()) { glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); } else if (FlowingShell()) { /*nothing*/ } else GL_EnableTexture(0); GL_Disable(GL_STENCIL_TEST); } }
/* ==================== RE_BeginFrame ==================== */ void RE_BeginFrame( void ) { drawBufferCommand_t *cmd; if ( !tr.registered ) { return; } GLimp_LogComment( "--- RE_BeginFrame ---\n" ); tr.frameCount++; tr.frameSceneNum = 0; tr.viewCount = 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 = qfalse; } else { R_SyncRenderThread(); glEnable( GL_STENCIL_TEST ); glStencilMask( ~0U ); GL_ClearStencil( 0U ); glStencilFunc( GL_ALWAYS, 0U, ~0U ); glStencilOp( GL_KEEP, GL_INCR, GL_INCR ); } r_measureOverdraw->modified = qfalse; } 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 = qfalse; } // texturemode stuff if ( r_textureMode->modified ) { R_SyncRenderThread(); GL_TextureMode( r_textureMode->string ); r_textureMode->modified = qfalse; } // check for errors if ( !r_ignoreGLErrors->integer ) { int err; char s[ 128 ]; R_SyncRenderThread(); if ( ( err = glGetError() ) != GL_NO_ERROR ) { switch ( err ) { case GL_INVALID_ENUM: strcpy( s, "GL_INVALID_ENUM" ); break; case GL_INVALID_VALUE: strcpy( s, "GL_INVALID_VALUE" ); break; case GL_INVALID_OPERATION: strcpy( s, "GL_INVALID_OPERATION" ); break; case GL_STACK_OVERFLOW: strcpy( s, "GL_STACK_OVERFLOW" ); break; case GL_STACK_UNDERFLOW: strcpy( s, "GL_STACK_UNDERFLOW" ); break; case GL_OUT_OF_MEMORY: strcpy( s, "GL_OUT_OF_MEMORY" ); break; case GL_TABLE_TOO_LARGE: strcpy( s, "GL_TABLE_TOO_LARGE" ); break; case GL_INVALID_FRAMEBUFFER_OPERATION_EXT: strcpy( s, "GL_INVALID_FRAMEBUFFER_OPERATION_EXT" ); break; default: Com_sprintf( s, sizeof( s ), "0x%X", err ); break; } //ri.Error(ERR_FATAL, "caught OpenGL error: %s in file %s line %i", s, filename, line); ri.Error( ERR_FATAL, "RE_BeginFrame() - glGetError() failed (%s)!", s ); } } // draw buffer stuff cmd = (drawBufferCommand_t*) R_GetCommandBuffer( sizeof( *cmd ) ); if ( !cmd ) { return; } cmd->commandId = RC_DRAW_BUFFER; if ( !Q_stricmp( r_drawBuffer->string, "GL_FRONT" ) ) { cmd->buffer = ( int ) GL_FRONT; } else { cmd->buffer = ( int ) GL_BACK; } }