deluxemapping: ignore light contribution from the other side of a surface

This commit is contained in:
Rudolf Polzer 2010-09-22 07:17:33 +02:00
parent 4243255b4a
commit 1ec2aec67e

View File

@ -750,8 +750,9 @@ int LightContributionToSample( trace_t *trace )
float add; float add;
float dist; float dist;
float addDeluxe = 0.0f, addDeluxeBounceScale = 0.25f; float addDeluxe = 0.0f, addDeluxeBounceScale = 0.25f;
qboolean angledDeluxe = qfalse; qboolean angledDeluxe = qtrue;
float colorBrightness; float colorBrightness;
qboolean doAddDeluxe = qtrue;
/* get light */ /* get light */
light = trace->light; light = trace->light;
@ -821,7 +822,12 @@ int LightContributionToSample( trace_t *trace )
/* twosided lighting */ /* twosided lighting */
if( trace->twoSided ) if( trace->twoSided )
angle = fabs( angle ); {
angle = -angle;
/* no deluxemap contribution from "other side" light */
doAddDeluxe = qfalse;
}
/* attenuate */ /* attenuate */
angle *= -DotProduct( light->normal, trace->direction ); angle *= -DotProduct( light->normal, trace->direction );
@ -864,6 +870,9 @@ int LightContributionToSample( trace_t *trace )
dist = SetupTrace( trace ); dist = SetupTrace( trace );
if( dist >= light->envelope ) if( dist >= light->envelope )
return 0; return 0;
/* no deluxemap contribution from "other side" light */
doAddDeluxe = qfalse;
} }
else else
return 0; return 0;
@ -898,8 +907,13 @@ int LightContributionToSample( trace_t *trace )
float dot = DotProduct( trace->normal, trace->direction ); float dot = DotProduct( trace->normal, trace->direction );
/* twosided lighting */ /* twosided lighting */
if( trace->twoSided ) if( trace->twoSided && dot < 0 )
dot = fabs( dot ); {
dot = -dot;
/* no deluxemap contribution from "other side" light */
doAddDeluxe = qfalse;
}
/* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */ /* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */
if( lightAngleHL ) if( lightAngleHL )
@ -1010,8 +1024,13 @@ int LightContributionToSample( trace_t *trace )
float dot = DotProduct( trace->normal, trace->direction ); float dot = DotProduct( trace->normal, trace->direction );
/* twosided lighting */ /* twosided lighting */
if( trace->twoSided ) if( trace->twoSided && dot < 0 )
dot = fabs( dot ); {
dot = -dot;
/* no deluxemap contribution from "other side" light */
doAddDeluxe = qfalse;
}
/* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */ /* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */
if( lightAngleHL ) if( lightAngleHL )
@ -1108,11 +1127,16 @@ int LightContributionToSample( trace_t *trace )
if( bouncing ) if( bouncing )
{ {
addDeluxe *= addDeluxeBounceScale; addDeluxe *= addDeluxeBounceScale;
/* better NOT increase it beyond the original value
if( addDeluxe < 0.00390625f ) if( addDeluxe < 0.00390625f )
addDeluxe = 0.00390625f; addDeluxe = 0.00390625f;
*/
} }
if(doAddDeluxe)
{
VectorScale( trace->direction, addDeluxe, trace->directionContribution ); VectorScale( trace->direction, addDeluxe, trace->directionContribution );
}
/* setup trace */ /* setup trace */
trace->testAll = qfalse; trace->testAll = qfalse;