void RB_StageIteratorLightmappedMultitexture(void) { shaderCommands_t *input; input = &tess; // // log this call // if(r_logFile->integer) { // don't just call LogComment, or we will get // a call to va() every frame! GLimp_LogComment(va("--- RB_StageIteratorLightmappedMultitexture( %s ) ---\n", tess.shader->name)); } // set GL fog SetIteratorFog(); // // set face culling appropriately // GL_Cull(input->shader->cullType); // // set color, pointers, and lock // GL_State(GLS_DEFAULT); glVertexPointer(3, GL_FLOAT, 16, input->xyz); #ifdef REPLACE_MODE glDisableClientState(GL_COLOR_ARRAY); glColor3f(1, 1, 1); glShadeModel(GL_FLAT); #else glEnableClientState(GL_COLOR_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, 0, tess.constantColor255); #endif // // select base stage // GL_SelectTexture(0); glEnableClientState(GL_TEXTURE_COORD_ARRAY); R_BindAnimatedImage(&tess.xstages[0]->bundle[0]); glTexCoordPointer(2, GL_FLOAT, 8, tess.texCoords0); // // configure second stage // GL_SelectTexture(1); glEnable(GL_TEXTURE_2D); if(r_lightmap->integer) { GL_TexEnv(GL_REPLACE); } else { GL_TexEnv(GL_MODULATE); } //----(SA) modified for snooper if(tess.xstages[0]->bundle[1].isLightmap && (backEnd.refdef.rdflags & RDF_SNOOPERVIEW)) { GL_Bind(tr.whiteImage); } else { R_BindAnimatedImage(&tess.xstages[0]->bundle[1]); } glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 8, tess.texCoords1); // // lock arrays // if (GLEW_EXT_compiled_vertex_array) { glLockArraysEXT(0, input->numVertexes); GLimp_LogComment("glLockArraysEXT\n"); } R_DrawElements(input->numIndexes, input->indexes); // // disable texturing on TEXTURE1, then select TEXTURE0 // glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); GL_SelectTexture(0); #ifdef REPLACE_MODE GL_TexEnv(GL_MODULATE); glShadeModel(GL_SMOOTH); #endif // // now do any dynamic lighting needed // //% if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) if(tess.dlightBits && tess.shader->fogPass && !(tess.shader->surfaceFlags & (SURF_NODLIGHT | SURF_SKY))) { if(r_dynamiclight->integer == 2) { DynamicLightPass(); } else { DynamicLightSinglePass(); } } // // now do fog // if(tess.fogNum && tess.shader->fogPass) { RB_FogPass(); } // // unlock arrays // if (GLEW_EXT_compiled_vertex_array) { glUnlockArraysEXT(); GLimp_LogComment("glUnlockArraysEXT\n"); } }
/* =================== RB_StageIteratorGeneric =================== */ void RB_StageIteratorGeneric(void) { shaderCommands_t *input; shader_t *shader; input = &tess; shader = input->shader; RB_DeformTessGeometry(); // log this call if (r_logFile->integer) { // don't just call LogComment, or we will get // a call to va() every frame! GLimp_LogComment(va("--- RB_StageIteratorGeneric( %s ) ---\n", tess.shader->name)); } // set GL fog SetIteratorFog(); // set face culling appropriately GL_Cull(shader->cullType); // set polygon offset if necessary if (shader->polygonOffset) { qglEnable(GL_POLYGON_OFFSET_FILL); qglPolygonOffset(r_offsetFactor->value, r_offsetUnits->value); } // if there is only a single pass then we can enable color // and texture arrays before we compile, otherwise we need // to avoid compiling those arrays since they will change // during multipass rendering if (tess.numPasses > 1 || shader->multitextureEnv) { setArraysOnce = qfalse; qglDisableClientState(GL_COLOR_ARRAY); qglDisableClientState(GL_TEXTURE_COORD_ARRAY); } else { setArraysOnce = qtrue; qglEnableClientState(GL_COLOR_ARRAY); qglColorPointer(4, GL_UNSIGNED_BYTE, 0, tess.svars.colors); qglEnableClientState(GL_TEXTURE_COORD_ARRAY); qglTexCoordPointer(2, GL_FLOAT, 0, tess.svars.texcoords[0]); } // lock XYZ qglVertexPointer(3, GL_FLOAT, 16, input->xyz); // padded for SIMD if (qglLockArraysEXT) { qglLockArraysEXT(0, input->numVertexes); GLimp_LogComment("glLockArraysEXT\n"); } // enable color and texcoord arrays after the lock if necessary if (!setArraysOnce) { qglEnableClientState(GL_TEXTURE_COORD_ARRAY); qglEnableClientState(GL_COLOR_ARRAY); } // call shader function RB_IterateStagesGeneric(input); // now do any dynamic lighting needed //tess.dlightBits = 255; // HACK! //if( tess.dlightBits && tess.shader->sort <= SS_OPAQUE && if (tess.dlightBits && tess.shader->fogPass && !(tess.shader->surfaceFlags & (SURF_NODLIGHT | SURF_SKY))) { if (r_dynamiclight->integer == 2) { DynamicLightPass(); } else { DynamicLightSinglePass(); } } // now do fog if (tess.fogNum && tess.shader->fogPass) { RB_FogPass(); } // unlock arrays if (qglUnlockArraysEXT) { qglUnlockArraysEXT(); GLimp_LogComment("glUnlockArraysEXT\n"); } // reset polygon offset if (shader->polygonOffset) { qglDisable(GL_POLYGON_OFFSET_FILL); } }
/* ** RB_StageIteratorVertexLitTexture */ void RB_StageIteratorVertexLitTexture(void) { shaderCommands_t *input; shader_t *shader; input = &tess; shader = input->shader; // // compute colors // RB_CalcDiffuseColor((unsigned char *)tess.svars.colors); // // log this call // if(r_logFile->integer) { // don't just call LogComment, or we will get // a call to va() every frame! GLimp_LogComment(va("--- RB_StageIteratorVertexLitTexturedUnfogged( %s ) ---\n", tess.shader->name)); } // set GL fog SetIteratorFog(); // // set face culling appropriately // GL_Cull(input->shader->cullType); // // set arrays and lock // glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, 0, tess.svars.colors); glTexCoordPointer(2, GL_FLOAT, 8, tess.texCoords0); glVertexPointer(3, GL_FLOAT, 16, input->xyz); if (GLEW_EXT_compiled_vertex_array) { glLockArraysEXT(0, input->numVertexes); GLimp_LogComment("glLockArraysEXT\n"); } // // call special shade routine // R_BindAnimatedImage(&tess.xstages[0]->bundle[0]); GL_State(tess.xstages[0]->stateBits); R_DrawElements(input->numIndexes, input->indexes); // // now do any dynamic lighting needed // //% if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) if(tess.dlightBits && tess.shader->fogPass && !(tess.shader->surfaceFlags & (SURF_NODLIGHT | SURF_SKY))) { if(r_dynamiclight->integer == 2) { DynamicLightPass(); } else { DynamicLightSinglePass(); } } // // now do fog // if(tess.fogNum && tess.shader->fogPass) { RB_FogPass(); } // // unlock arrays // if (GLEW_EXT_compiled_vertex_array) { glUnlockArraysEXT(); GLimp_LogComment("glUnlockArraysEXT\n"); } }