void Sky_RenderLayers (void) { glmatrix skymatrix; // standard layers GL_BindTexture (GL_TEXTURE0_ARB, solidskytexture); R_ScrollSkyMatrix (8); GL_TexEnv (GL_TEXTURE1_ARB, GL_TEXTURE_2D, GL_DECAL); GL_BindTexture (GL_TEXTURE1_ARB, alphaskytexture); R_ScrollSkyMatrix (16); GL_IdentityMatrix (&skymatrix); GL_TranslateMatrix (&skymatrix, -r_origin[0], -r_origin[1], -r_origin[2]); GL_ScaleMatrix (&skymatrix, 65536, 65536, 65536); qglMultMatrixf (skymatrix.m16); GL_SetStreamSource (GLSTREAM_POSITION, 3, GL_FLOAT, sizeof (dpskyvert_t), r_dpskyverts->xyz); GL_SetStreamSource (GLSTREAM_COLOR, 0, GL_NONE, 0, NULL); GL_SetStreamSource (GLSTREAM_TEXCOORD0, 2, GL_FLOAT, sizeof (dpskyvert_t), r_dpskyverts->st); GL_SetStreamSource (GLSTREAM_TEXCOORD1, 2, GL_FLOAT, sizeof (dpskyvert_t), r_dpskyverts->st); GL_SetStreamSource (GLSTREAM_TEXCOORD2, 0, GL_NONE, 0, NULL); GL_SetIndices (r_dpskyindexes); GL_DrawIndexedPrimitive (GL_TRIANGLES, SKYSPHERE_NUMINDEXES, SKYSPHERE_NUMVERTS); GL_TexEnv (GL_TEXTURE1_ARB, GL_TEXTURE_2D, GL_NONE); qglMatrixMode (GL_TEXTURE); qglLoadIdentity (); qglMatrixMode (GL_MODELVIEW); GL_ActiveTexture (GL_TEXTURE0_ARB); qglMatrixMode (GL_TEXTURE); qglLoadIdentity (); qglMatrixMode (GL_MODELVIEW); qglLoadMatrixf (r_world_matrix.m16); }
/* ================= RB_ProjectionShadowDeform ================= */ void RB_ProjectionShadowDeform( void ) { #ifdef _XBOX float shadowMat[4][4]; vec3_t light, ground; float d, dot; ground[0] = backEnd.ori.axis[0][2]; ground[1] = backEnd.ori.axis[1][2]; ground[2] = backEnd.ori.axis[2][2]; d = backEnd.ori.origin[2] - backEnd.currentEntity->e.shadowPlane; light[0] = backEnd.currentEntity->lightDir[0]; light[1] = backEnd.currentEntity->lightDir[1]; light[2] = backEnd.currentEntity->lightDir[2]; dot = ground[0] * light[0] + ground[1] * light[1] + ground[2] * light[2]; // don't let the shadows get too long or go negative if ( dot < 0.5 ) { VectorMA( light, (0.5 - dot), ground, light ); dot = DotProduct( light, ground ); } shadowMat[0][0] = dot - light[0] * ground[0]; shadowMat[1][0] = 0.f - light[0] * ground[1]; shadowMat[2][0] = 0.f - light[0] * ground[2]; shadowMat[3][0] = 0.f - light[0] * d; shadowMat[0][1] = 0.f - light[1] * ground[0]; shadowMat[1][1] = dot - light[1] * ground[1]; shadowMat[2][1] = 0.f - light[1] * ground[2]; shadowMat[3][1] = 0.f - light[1] * d; shadowMat[0][2] = 0.f - light[2] * ground[0]; shadowMat[1][2] = 0.f - light[2] * ground[1]; shadowMat[2][2] = dot - light[2] * ground[2]; shadowMat[3][2] = 0.f - light[2] * d; shadowMat[0][3] = 0.f; shadowMat[1][3] = 0.f; shadowMat[2][3] = 0.f; shadowMat[3][3] = dot; qglMatrixMode(GL_MODELVIEW); qglMultMatrixf(&shadowMat[0][0]); // Turn on stenciling // This is done to prevent overlapping shadow artifacts qglEnable( GL_STENCIL_TEST ); qglStencilFunc( GL_NOTEQUAL, 0x1, 0xffffffff ); qglStencilMask( 0xffffffff ); qglStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); #else float *xyz; int i; float h; vec3_t ground; vec3_t light; float groundDist; float d; vec3_t lightDir; xyz = ( float * ) tess.xyz; ground[0] = backEnd.ori.axis[0][2]; ground[1] = backEnd.ori.axis[1][2]; ground[2] = backEnd.ori.axis[2][2]; groundDist = backEnd.ori.origin[2] - backEnd.currentEntity->e.shadowPlane; VectorCopy( backEnd.currentEntity->lightDir, lightDir ); d = DotProduct( lightDir, ground ); // don't let the shadows get too long or go negative if ( d < 0.5 ) { VectorMA( lightDir, (0.5 - d), ground, lightDir ); d = DotProduct( lightDir, ground ); } d = 1.0 / d; light[0] = lightDir[0] * d; light[1] = lightDir[1] * d; light[2] = lightDir[2] * d; for ( i = 0; i < tess.numVertexes; i++, xyz += 4 ) { h = DotProduct( xyz, ground ) + groundDist; xyz[0] -= light[0] * h; xyz[1] -= light[1] * h; xyz[2] -= light[2] * h; } #endif // _XBOX }