示例#1
0
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);
}
示例#2
0
/*
=================
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
}