]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/light.c
always chmod the release exe file
[xonotic/netradiant.git] / tools / quake3 / q3map2 / light.c
index b07314c03e310d9422e19bf29f86660b36028dbb..a703faacf53e8fff145e897ef42351055e3e62af 100644 (file)
@@ -758,6 +758,7 @@ int LightContributionToSample( trace_t *trace )
        light = trace->light;
        
        /* clear color */
+       trace->forceSubsampling = 0.0f; /* to make sure */
        VectorClear( trace->color );
        VectorClear( trace->colorNoShadow );
        VectorClear( trace->directionContribution );
@@ -821,7 +822,7 @@ int LightContributionToSample( trace_t *trace )
                        angle = DotProduct( trace->normal, trace->direction );
                        
                        /* twosided lighting */
-                       if( trace->twoSided )
+                       if( trace->twoSided && angle < 0 )
                        {
                                angle = -angle;
 
@@ -835,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 )
@@ -877,6 +883,13 @@ int LightContributionToSample( trace_t *trace )
                                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;
@@ -1090,6 +1103,7 @@ int LightContributionToSample( trace_t *trace )
                {
                        /* trace */
                        TraceLine( trace );
+                       trace->forceSubsampling *= add;
                        if( !(trace->compileFlags & C_SKY) || trace->opaque )
                        {
                                VectorClear( trace->color );
@@ -1102,6 +1116,8 @@ int LightContributionToSample( trace_t *trace )
                /* return to sender */
                return 1;
        }
+       else
+               Error("Light of undefined type!");
 
        /* VorteX: set noShadow color */
        VectorScale(light->color, add, trace->colorNoShadow);
@@ -1144,6 +1160,7 @@ int LightContributionToSample( trace_t *trace )
        
        /* raytrace */
        TraceLine( trace );
+       trace->forceSubsampling *= add;
        if( trace->passSolid || trace->opaque )
        {
                VectorClear( trace->color );
@@ -1815,7 +1832,7 @@ void LightWorld( void )
        vec3_t          color;
        float           f;
        int                     b, bt;
-       qboolean        minVertex, minGrid, ps;
+       qboolean        minVertex, minGrid;
        const char      *value;
        
 
@@ -2033,6 +2050,7 @@ int LightMain( int argc, char **argv )
        char            mapSource[ 1024 ];
        const char      *value;
        int lightmapMergeSize = 0;
+       qboolean        lightSamplesInsist = qfalse;
        
        
        /* note it */
@@ -2230,8 +2248,18 @@ int LightMain( int argc, char **argv )
                        i++;
                }
                
+               else if( !strcmp( argv[ i ], "-randomsamples" ) )
+               {
+                       lightRandomSamples = qtrue;
+                       Sys_Printf( "Random sampling enabled\n", lightRandomSamples );
+               }
+               
                else if( !strcmp( argv[ i ], "-samples" ) )
                {
+                       if(*argv[i+1] == '+')
+                               lightSamplesInsist = qtrue;
+                       else
+                               lightSamplesInsist = qfalse;
                        lightSamples = atoi( argv[ i + 1 ] );
                        if( lightSamples < 1 )
                                lightSamples = 1;
@@ -2726,6 +2754,11 @@ int LightMain( int argc, char **argv )
                {
                        lightmapExtraVisClusterNudge = qtrue;
                }
+               else if( !strcmp( argv[ i ], "-fill" ) )
+               {
+                       lightmapFill = qtrue;
+                       Sys_Printf( "Filling lightmap colors from surrounding pixels to improve JPEG compression\n" );
+               }
                /* unhandled args */
                else
                {
@@ -2734,6 +2767,38 @@ int LightMain( int argc, char **argv )
 
        }
 
+       /* fix up samples count */
+       if(lightRandomSamples)
+       {
+               if(!lightSamplesInsist)
+               {
+                       /* approximately match -samples in quality */
+                       switch(lightSamples)
+                       {
+                               /* somewhat okay */
+                               case 1:
+                               case 2:
+                                       lightSamples = 16;
+                                       Sys_Printf( "Adaptive supersampling preset enabled with %d random sample(s) per lightmap texel\n", lightSamples );
+                                       break;
+
+                               /* good */
+                               case 3:
+                                       lightSamples = 64;
+                                       Sys_Printf( "Adaptive supersampling preset enabled with %d random sample(s) per lightmap texel\n", lightSamples );
+                                       break;
+
+                               /* perfect */
+                               case 4:
+                                       lightSamples = 256;
+                                       Sys_Printf( "Adaptive supersampling preset enabled with %d random sample(s) per lightmap texel\n", lightSamples );
+                                       break;
+
+                               default: break;
+                       }
+               }
+       }
+
        /* fix up lightmap search power */
        if(lightmapMergeSize)
        {
@@ -2777,7 +2842,7 @@ int LightMain( int argc, char **argv )
        /* load map file */
        value = ValueForKey( &entities[ 0 ], "_keepLights" );
        if( value[ 0 ] != '1' )
-               LoadMapFile( mapSource, qtrue );
+               LoadMapFile( mapSource, qtrue, qfalse );
        
        /* set the entity/model origins and init yDrawVerts */
        SetEntityOrigins();