Index: code/renderer/tr_local.h =================================================================== --- code/renderer/tr_local.h (revision 1713) +++ code/renderer/tr_local.h (working copy) @@ -207,6 +207,7 @@ TCGEN_LIGHTMAP, TCGEN_TEXTURE, TCGEN_ENVIRONMENT_MAPPED, + TCGEN_REFLECTION_MAPPED, TCGEN_FOG, TCGEN_VECTOR // S and T from world coordinates } texCoordGen_t; @@ -1520,7 +1521,8 @@ void RB_DeformTessGeometry( void ); -void RB_CalcEnvironmentTexCoords( float *dstTexCoords ); +void RB_CalcEnvironmentTexCoords( void ); +void RB_CalcReflectionTexCoords( void ); void RB_CalcFogTexCoords( float *dstTexCoords ); void RB_CalcScrollTexCoords( const float scroll[2], float *dstTexCoords ); void RB_CalcRotateTexCoords( float rotSpeed, float *dstTexCoords ); Index: code/renderer/tr_shade_calc.c =================================================================== --- code/renderer/tr_shade_calc.c (revision 1713) +++ code/renderer/tr_shade_calc.c (working copy) @@ -888,30 +888,25 @@ /* ** RB_CalcEnvironmentTexCoords */ -void RB_CalcEnvironmentTexCoords( float *st ) +void RB_CalcEnvironmentTexCoords() { - int i; - float *v, *normal; - vec3_t viewer, reflected; - float d; + qglTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + qglTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + qglEnable(GL_TEXTURE_GEN_S); + qglEnable(GL_TEXTURE_GEN_T); +} - v = tess.xyz[0]; - normal = tess.normal[0]; - - for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 ) - { - VectorSubtract (backEnd.or.viewOrigin, v, viewer); - VectorNormalizeFast (viewer); - - d = DotProduct (normal, viewer); - - reflected[0] = normal[0]*2*d - viewer[0]; - reflected[1] = normal[1]*2*d - viewer[1]; - reflected[2] = normal[2]*2*d - viewer[2]; - - st[0] = 0.5 + reflected[1] * 0.5; - st[1] = 0.5 - reflected[2] * 0.5; - } +/* +** RB_CalcReflectionTexCoords +*/ +void RB_CalcReflectionTexCoords() +{ + qglTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + qglTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + qglTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + qglEnable(GL_TEXTURE_GEN_S); + qglEnable(GL_TEXTURE_GEN_T); + qglEnable(GL_TEXTURE_GEN_R); } /* Index: code/renderer/tr_shade.c =================================================================== --- code/renderer/tr_shade.c (revision 1713) +++ code/renderer/tr_shade.c (working copy) @@ -1015,8 +1015,11 @@ RB_CalcFogTexCoords( ( float * ) tess.svars.texcoords[b] ); break; case TCGEN_ENVIRONMENT_MAPPED: - RB_CalcEnvironmentTexCoords( ( float * ) tess.svars.texcoords[b] ); + RB_CalcEnvironmentTexCoords(); break; + case TCGEN_REFLECTION_MAPPED: + RB_CalcReflectionTexCoords(); + break; case TCGEN_BAD: return; } @@ -1130,6 +1133,17 @@ // R_DrawElements( input->numIndexes, input->indexes ); } + if ( pStage->bundle[0].tcGen == TCGEN_ENVIRONMENT_MAPPED ) + { + qglDisable(GL_TEXTURE_GEN_S); + qglDisable(GL_TEXTURE_GEN_T); + } + if ( pStage->bundle[0].tcGen == TCGEN_REFLECTION_MAPPED ) + { + qglDisable(GL_TEXTURE_GEN_S); + qglDisable(GL_TEXTURE_GEN_T); + qglDisable(GL_TEXTURE_GEN_R); + } // allow skipping out to show just lightmaps during development if ( r_lightmap->integer && ( pStage->bundle[0].isLightmap || pStage->bundle[1].isLightmap || pStage->bundle[0].vertexLightmap ) ) {