On grid lighting, redistribute the 25% of the floodlight as omnidirectional ambient...
authorjal <germangar@gmail.com>
Sun, 11 Jul 2010 10:16:08 +0000 (12:16 +0200)
committerjal <germangar@gmail.com>
Sun, 11 Jul 2010 10:16:08 +0000 (12:16 +0200)
tools/quake3/q3map2/light.c

index cf292a79ecfa088498e244f1e120d2671f021fb8..dee882eed1402ed1248a80250719d7d610aa83c9 100644 (file)
@@ -1421,6 +1421,7 @@ typedef struct
 {
        vec3_t          dir;
        vec3_t          color;
+       vec3_t          ambient;
        int                     style;
 }
 contribution_t;
@@ -1514,6 +1515,7 @@ void TraceGrid( int num )
                /* add a contribution */
                VectorCopy( trace.color, contributions[ numCon ].color );
                VectorCopy( trace.direction, contributions[ numCon ].dir );
+               VectorClear( contributions[ numCon ].ambient );
                contributions[ numCon ].style = trace.light->style;
                numCon++;
                
@@ -1533,51 +1535,56 @@ void TraceGrid( int num )
        
        /////// Floodlighting for point //////////////////
        //do our floodlight ambient occlusion loop, and add a single contribution based on the brightest dir
-       if (floodlighty)
-       {
-               int q;
-               float addSize,f;
-               vec3_t col,dir;
-               col[0]=col[1]=col[2]=floodlightIntensity;
-               dir[0]=dir[1]=0;
-               dir[2]=1;
-
-               trace.testOcclusion = qtrue;
-               trace.forceSunlight = qfalse;
-               trace.inhibitRadius = DEFAULT_INHIBIT_RADIUS;
-               trace.testAll = qtrue;
-
-               for (q=0;q<2;q++)
-               {
-                       if (q==0) //upper hemisphere
-                       {
-                               trace.normal[0]=0;
-                               trace.normal[1]=0;
-                               trace.normal[2]=1;
-                       }
-                       else //lower hemisphere
-                       {
-                               trace.normal[0]=0;
-                               trace.normal[1]=0;
-                               trace.normal[2]=-1;
-                       }
-
-                       f = FloodLightForSample(&trace, floodlightDistance, floodlight_lowquality);
-
-                       contributions[ numCon ].color[0]=col[0]*f;
-                       contributions[ numCon ].color[1]=col[1]*f;
-                       contributions[ numCon ].color[2]=col[2]*f;
-
-                       contributions[ numCon ].dir[0]=dir[0];
-                       contributions[ numCon ].dir[1]=dir[1];
-                       contributions[ numCon ].dir[2]=dir[2];
-
-                       contributions[ numCon ].style = 0;
-                       numCon++;
-                       /* push average direction around */
-                       addSize = VectorLength( col );
-                       VectorMA( gp->dir, addSize, dir, gp->dir );
-               }
+       if( floodlighty )\r
+       {\r
+               int k;\r
+               float addSize, f;\r
+               vec3_t dir = { 0, 0, 1 };\r
+               float ambientFrac = 0.25f;\r
+\r
+               trace.testOcclusion = qtrue;\r
+               trace.forceSunlight = qfalse;\r
+               trace.inhibitRadius = DEFAULT_INHIBIT_RADIUS;\r
+               trace.testAll = qtrue;\r
+\r
+               for( k = 0; k < 2; k++ )\r
+               {\r
+                       if( k == 0 ) // upper hemisphere\r
+                       {\r
+                               trace.normal[0] = 0;\r
+                               trace.normal[1] = 0;\r
+                               trace.normal[2] = 1;\r
+                       }\r
+                       else //lower hemisphere\r
+                       {\r
+                               trace.normal[0] = 0;\r
+                               trace.normal[1] = 0;\r
+                               trace.normal[2] = -1;\r
+                       }\r
+\r
+                       f = FloodLightForSample( &trace, floodlightDistance, floodlight_lowquality );\r
+\r
+                       /* add a fraction as pure ambient, half as top-down direction */\r
+                       contributions[ numCon ].color[0]= floodlightRGB[0] * floodlightIntensity * f * ( 1.0f - ambientFrac );\r
+                       contributions[ numCon ].color[1]= floodlightRGB[1] * floodlightIntensity * f * ( 1.0f - ambientFrac );\r
+                       contributions[ numCon ].color[2]= floodlightRGB[2] * floodlightIntensity * f * ( 1.0f - ambientFrac );\r
+\r
+                       contributions[ numCon ].ambient[0]= floodlightRGB[0] * floodlightIntensity * f * ambientFrac;\r
+                       contributions[ numCon ].ambient[1]= floodlightRGB[1] * floodlightIntensity * f * ambientFrac;\r
+                       contributions[ numCon ].ambient[2]= floodlightRGB[2] * floodlightIntensity * f * ambientFrac;\r
+\r
+                       contributions[ numCon ].dir[0] = dir[0];\r
+                       contributions[ numCon ].dir[1] = dir[1];\r
+                       contributions[ numCon ].dir[2] = dir[2];\r
+\r
+                       contributions[ numCon ].style = 0;\r
+\r
+                       /* push average direction around */\r
+                       addSize = VectorLength( contributions[ numCon ].color );\r
+                       VectorMA( gp->dir, addSize, dir, gp->dir );\r
+\r
+                       numCon++;\r
+               }\r
        }
        /////////////////////
 
@@ -1632,6 +1639,8 @@ void TraceGrid( int num )
                d = 0.25f * (1.0f - d);
                VectorMA( gp->ambient[ j ], d, contributions[ i ].color, gp->ambient[ j ] );
 
+               VectorAdd( gp->ambient[ j ], contributions[ i ].ambient, gp->ambient[ j ] );
+
 /*
  * div0:
  * the total light average = ambient value + 0.25 * sum of all directional values