예제 #1
0
/*
* R_DrawCoronas
*/
void R_DrawCoronas( void )
{
	unsigned int i;
	float dist;
	dlight_t *light;
	rtrace_t tr;

	if( r_dynamiclight->integer != 2 )
		return;

	for( i = 0; i < rsc.numDlights; i++ )
	{
		light = rsc.dlights + i;
		dist =
			rn.viewAxis[AXIS_FORWARD+0] * ( light->origin[0] - rn.viewOrigin[0] ) +
			rn.viewAxis[AXIS_FORWARD+1] * ( light->origin[1] - rn.viewOrigin[1] ) +
			rn.viewAxis[AXIS_FORWARD+2] * ( light->origin[2] - rn.viewOrigin[2] );
		if( dist < 24.0f )
			continue;
		dist -= light->intensity;

		R_TraceLine( &tr, light->origin, rn.viewOrigin, SURF_NONSOLID );
		if( tr.fraction != 1.0f )
			continue;

		R_AddDSurfToDrawList( rsc.worldent, 
			R_FogForSphere( light->origin, 1 ), 
			r_coronaShader, 
			Distance( rn.viewOrigin, light->origin ), 0, NULL, &r_coronaSurfs[i] );
	}
}
예제 #2
0
파일: r_frontend.c 프로젝트: DenMSC/qfusion
/*
* RF_GetShaderForOrigin
*
* Trace 64 units in all axial directions to find the closest surface
*/
shader_t *RF_GetShaderForOrigin( const vec3_t origin )
{
	int i, j;
	vec3_t dir, end;
	rtrace_t tr;
	shader_t *best = NULL;
	float best_frac = 1000.0f;

	for( i = 0; i < 3; i++ ) {
		VectorClear( dir );

		for( j = -1; j <= 1; j += 2 ) {
			dir[i] = j;
			VectorMA( origin, 64, dir, end );

			R_TraceLine( &tr, origin, end, 0 );
			if( !tr.shader ) {
				continue;
			}

			if( tr.fraction < best_frac ) {
				best = tr.shader;
				best_frac = tr.fraction;
			}
		}
	}

	return best;
}
예제 #3
0
파일: r_scene.c 프로젝트: MGXRace/racesow
/*
* R_RenderDebugSurface
*/
static void R_RenderDebugSurface( const refdef_t *fd )
{
	rtrace_t tr;
	vec3_t forward;
	vec3_t start, end;
	msurface_t *surf;

	if( fd->rdflags & RDF_NOWORLDMODEL )
		return;

	if( r_speeds->integer != 4 && r_speeds->integer != 5 )
		return;

	VectorCopy( &fd->viewaxis[AXIS_FORWARD], forward );
	VectorCopy( fd->vieworg, start );
	VectorMA( start, 4096, forward, end );

	surf = R_TraceLine( &tr, start, end, 0 );
	if( surf && surf->drawSurf && !r_showtris->integer )
	{
		R_ClearDrawList( rn.meshlist );

		R_ClearDrawList( rn.portalmasklist );

		if( !R_AddSurfToDrawList( rn.meshlist, R_NUM2ENT(tr.ent), NULL, surf->shader, 0, 0, NULL, surf->drawSurf ) ) {
			return;
		}

		if( rn.refdef.rdflags & RDF_FLIPPED )
			RB_FlipFrontFace();

		rsc.debugSurface = surf;

		if( r_speeds->integer == 5 ) {
			// VBO debug mode
			R_AddVBOSlice( surf->drawSurf - rsh.worldBrushModel->drawSurfaces, 
				surf->drawSurf->numVerts, surf->drawSurf->numElems,
				0, 0 );
		}
		else {
			// classic mode (showtris for individual surface)
			R_AddVBOSlice( surf->drawSurf - rsh.worldBrushModel->drawSurfaces, 
				surf->mesh->numVerts, surf->mesh->numElems,
				surf->firstDrawSurfVert, surf->firstDrawSurfElem );
		}

		R_DrawOutlinedSurfaces( rn.meshlist );

		if( rn.refdef.rdflags & RDF_FLIPPED )
			RB_FlipFrontFace();
	}
}