slow down non-fast operation but make it more accurate by not using falloff tolerance at all when -fast is not used

This commit is contained in:
Rudolf Polzer 2012-02-09 10:51:09 +01:00
parent c30d367a12
commit 8dcd2d22e6

View File

@ -3631,10 +3631,15 @@ void SetupEnvelopes( qboolean forGrid, qboolean fastFlag )
/* handle area lights */
if( exactPointToPolygon && light->type == EMIT_AREA && light->w != NULL )
{
light->envelope = MAX_WORLD_COORD * 8.0f;
/* check for fast mode */
if( (light->flags & LIGHT_FAST) || (light->flags & LIGHT_FAST_TEMP) )
{
/* ugly hack to calculate extent for area lights, but only done once */
VectorScale( light->normal, -1.0f, dir );
for( radius = 100.0f; radius < 130000.0f && light->envelope == 0; radius += 10.0f )
for( radius = 100.0f; radius < MAX_WORLD_COORD * 8.0f; radius += 10.0f )
{
float factor;
@ -3643,12 +3648,13 @@ void SetupEnvelopes( qboolean forGrid, qboolean fastFlag )
if( factor < 0.0f )
factor *= -1.0f;
if( (factor * light->add) <= light->falloffTolerance )
{
light->envelope = radius;
break;
}
}
}
/* check for fast mode */
if( !(light->flags & LIGHT_FAST) && !(light->flags & LIGHT_FAST_TEMP) )
light->envelope = MAX_WORLD_COORD * 8.0f;
intensity = light->photons; /* hopefully not used */
}
else
@ -3660,15 +3666,14 @@ void SetupEnvelopes( qboolean forGrid, qboolean fastFlag )
/* other calcs */
if( light->envelope <= 0.0f )
{
/* FIXME shouldn't we assume falloffTolerance == 0 when -fast is not used? */
/* solve distance for non-distance lights */
if( !(light->flags & LIGHT_ATTEN_DISTANCE) )
light->envelope = MAX_WORLD_COORD * 8.0f;
else if( (light->flags & LIGHT_FAST) || (light->flags & LIGHT_FAST_TEMP) )
{
/* solve distance for linear lights */
else if( (light->flags & LIGHT_ATTEN_LINEAR ) )
//% light->envelope = ((intensity / light->falloffTolerance) * linearScale - 1 + radius) / light->fade;
if( (light->flags & LIGHT_ATTEN_LINEAR ) )
light->envelope = ((intensity * linearScale) - light->falloffTolerance) / light->fade;
/*
@ -3690,6 +3695,17 @@ void SetupEnvelopes( qboolean forGrid, qboolean fastFlag )
dist = sqrt( light->photons / T );
*/
}
else
{
/* solve distance for linear lights */
if( (light->flags & LIGHT_ATTEN_LINEAR ) )
light->envelope = (intensity * linearScale) / light->fade;
/* can't cull these */
else
light->envelope = MAX_WORLD_COORD * 8.0f;
}
}
/* chop radius against pvs */
{