]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/light.c
more deluxemap+surfacelight fixes
[xonotic/netradiant.git] / tools / quake3 / q3map2 / light.c
index 868bb8d118cf4735c6e180d4666bc3ef1dc45d84..c072be0c62e88a347580fa1e2bbaa99a21f14450 100644 (file)
@@ -750,13 +750,15 @@ int LightContributionToSample( trace_t *trace )
        float                   add;
        float                   dist;
        float                   addDeluxe = 0.0f, addDeluxeBounceScale = 0.25f;
-       qboolean                angledDeluxe = qfalse;
+       qboolean                angledDeluxe = qtrue;
        float                   colorBrightness;
+       qboolean                doAddDeluxe = qtrue;
        
        /* get light */
        light = trace->light;
        
        /* clear color */
+       trace->forceSubsampling = 0.0f; /* to make sure */
        VectorClear( trace->color );
        VectorClear( trace->colorNoShadow );
        VectorClear( trace->directionContribution );
@@ -820,8 +822,13 @@ int LightContributionToSample( trace_t *trace )
                        angle = DotProduct( trace->normal, trace->direction );
                        
                        /* twosided lighting */
-                       if( trace->twoSided )
-                               angle = fabs( angle );
+                       if( trace->twoSided && angle < 0 )
+                       {
+                               angle = -angle;
+
+                               /* no deluxemap contribution from "other side" light */
+                               doAddDeluxe = qfalse;
+                       }
                        
                        /* attenuate */
                        angle *= -DotProduct( light->normal, trace->direction );
@@ -829,8 +836,13 @@ int LightContributionToSample( trace_t *trace )
                                return 0;
                        else if( angle < 0.0f &&
                                (trace->twoSided || (light->flags & LIGHT_TWOSIDED)) )
+                       {
                                angle = -angle;
 
+                               /* no deluxemap contribution from "other side" light */
+                               doAddDeluxe = qfalse;
+                       }
+
                        /* clamp the distance to prevent super hot spots */
                        dist = sqrt(dist * dist + light->extraDist * light->extraDist);
                        if( dist < 16.0f )
@@ -864,10 +876,20 @@ int LightContributionToSample( trace_t *trace )
                                        dist = SetupTrace( trace );
                                        if( dist >= light->envelope )
                                                return 0;
+
+                                       /* no deluxemap contribution from "other side" light */
+                                       doAddDeluxe = qfalse;
                                }
                                else
                                        return 0;
                        }
+
+                       /* also don't deluxe if the direction is on the wrong side */
+                       if(DotProduct(trace->normal, trace->direction) < 0)
+                       {
+                               /* no deluxemap contribution from "other side" light */
+                               doAddDeluxe = qfalse;
+                       }
                        
                        /* ydnar: moved to here */
                        add = factor * light->add;
@@ -898,8 +920,13 @@ int LightContributionToSample( trace_t *trace )
                        float dot = DotProduct( trace->normal, trace->direction ); 
 
                        /* twosided lighting */
-                       if( trace->twoSided )
-                               dot = fabs( dot );
+                       if( trace->twoSided && dot < 0 )
+                       {
+                               dot = -dot;
+
+                               /* no deluxemap contribution from "other side" light */
+                               doAddDeluxe = qfalse;
+                       }
 
                        /* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */
                        if( lightAngleHL )
@@ -1010,8 +1037,13 @@ int LightContributionToSample( trace_t *trace )
                        float dot = DotProduct( trace->normal, trace->direction ); 
 
                        /* twosided lighting */
-                       if( trace->twoSided )
-                               dot = fabs( dot );
+                       if( trace->twoSided && dot < 0 )
+                       {
+                               dot = -dot;
+
+                               /* no deluxemap contribution from "other side" light */
+                               doAddDeluxe = qfalse;
+                       }
 
                        /* jal: optional half Lambert attenuation (http://developer.valvesoftware.com/wiki/Half_Lambert) */
                        if( lightAngleHL )
@@ -1071,6 +1103,7 @@ int LightContributionToSample( trace_t *trace )
                {
                        /* trace */
                        TraceLine( trace );
+                       trace->forceSubsampling *= add;
                        if( !(trace->compileFlags & C_SKY) || trace->opaque )
                        {
                                VectorClear( trace->color );
@@ -1108,11 +1141,16 @@ int LightContributionToSample( trace_t *trace )
        if( bouncing )
        {
                addDeluxe *= addDeluxeBounceScale;
+               /* better NOT increase it beyond the original value
                if( addDeluxe < 0.00390625f )
                        addDeluxe = 0.00390625f;
+               */
        }
 
-       VectorScale( trace->direction, addDeluxe, trace->directionContribution );
+       if(doAddDeluxe)
+       {
+               VectorScale( trace->direction, addDeluxe, trace->directionContribution );
+       }
        
        /* setup trace */
        trace->testAll = qfalse;
@@ -1120,6 +1158,7 @@ int LightContributionToSample( trace_t *trace )
        
        /* raytrace */
        TraceLine( trace );
+       trace->forceSubsampling *= add;
        if( trace->passSolid || trace->opaque )
        {
                VectorClear( trace->color );