]> git.rm.cloudns.org Git - xonotic/netradiant.git/commitdiff
Fix netradiant#182
authoruis <uis9936@gmail.com>
Sat, 23 Dec 2023 18:03:42 +0000 (21:03 +0300)
committeruis <uis9936@gmail.com>
Wed, 27 Dec 2023 00:46:11 +0000 (03:46 +0300)
tools/quake3/q3map2/light_bounce.c
tools/quake3/q3map2/light_ydnar.c

index b0b838b8ccea11094e34b50f3dc1745e0dc64384..67230851a786696695f9f55ec8b607250e605782 100644 (file)
@@ -268,7 +268,8 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm,
        vec4_t textureColor;
        float alpha, alphaI, bf;
        vec3_t blend;
-       float st[ 2 ], lightmap[ 2 ], *radLuxel;
+       float st[ 2 ], lightmap[ 2 ];
+       const float *radLuxel;
        radVert_t   *rv[ 3 ];
 
        if (!bouncing)
@@ -336,12 +337,14 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm,
                                                blend[ 0 ] = i;
                                                blend[ 1 ] = j;
                                                blend[ 2 ] = k;
+                                               /* Make blend inner sum = 1 */
                                                bf = ( 1.0f / ( blend[ 0 ] + blend[ 1 ] + blend[ 2 ] ) );
                                                VectorScale( blend, bf, blend );
 
                                                /* create a blended sample */
                                                st[ 0 ] = st[ 1 ] = 0.0f;
                                                lightmap[ 0 ] = lightmap[ 1 ] = 0.0f;
+                                               /* alpha and alphaI don't seem to be used anywhere*/
                                                alphaI = 0.0f;
                                                for ( l = 0; l < 3; l++ )
                                                {
@@ -374,7 +377,8 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm,
                                                radLuxel = RAD_LUXEL( lightmapNum, x, y );
 
                                                /* ignore unlit/unused luxels */
-                                               if ( radLuxel[ 0 ] < 0.0f ) {
+                                               if ( radLuxel[ 0 ] <= 0.0f || radLuxel[ 1 ] <= 0.0f || radLuxel[ 2 ] <= 0.0f ) {
+                                                       /* FIXME: not really sure which element of radLuxel should be checked */
                                                        continue;
                                                }
 
@@ -387,16 +391,8 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm,
                                                        textureColor[ 3 ] = 255;
                                                }
                                                avgcolor = ( textureColor[ 0 ] + textureColor[ 1 ] + textureColor[ 2 ] ) / 3;
-                                               for ( i = 0; i < 3; i++ ){
-                                                       color[ i ] = ( ( textureColor[ i ] * bounceColorRatio + ( avgcolor * ( 1 - bounceColorRatio ) ) ) / 255 ) * ( radLuxel[ i ] / 255 );
-                                               /*
-                                                  Workaround for https://gitlab.com/xonotic/netradiant/-/issues/182
-                                                  This loop normally uses the l iterator instead of i:
-                                                  for ( l = 0; l < 3; l++ ){
+                                               for ( l = 0; l < 3; l++ ){
                                                        color[ l ] = ( ( textureColor[ l ] * bounceColorRatio + ( avgcolor * ( 1 - bounceColorRatio ) ) ) / 255 ) * ( radLuxel[ l ] / 255 );
-                                                       }
-                                               */
-                                               //Sys_Printf( "%i %i %i %i %i \n", (int) textureColor[ 0 ], (int) textureColor[ 1 ], (int) textureColor[ 2 ], (int) avgcolor, (int) color[ i ] );
                                                }
                                                AddPointToBounds( color, mins, maxs );
                                                VectorAdd( average, color, average );
index eee4a17362c7ddf71d218aca2de8a4a9be6c73d4..380ed24353e8ca4885abb35831d770d69e2d9fe2 100644 (file)
@@ -829,6 +829,12 @@ static qboolean MapTriangle( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert
                return qfalse;
        }
 
+       /* prevent division by zero */
+       if ( plane[ lm->axisNum ] == 0 ) {
+               Sys_FPrintf( SYS_WRN, "WARNING: plane[lm->axisNum] == 0\n" );
+               return qfalse;
+       }
+
        /* check to see if we need to calculate texture->world tangent vectors */
        if ( info->si->normalImage != NULL && CalcTangentVectors( 3, dv, stvStatic, ttvStatic ) ) {
                stv = stvStatic;
@@ -1000,6 +1006,12 @@ static qboolean MapQuad( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert_t *
                return qfalse;
        }
 
+       /* prevent division by zero */
+       if ( plane[ lm->axisNum ] == 0 ) {
+               Sys_FPrintf( SYS_WRN, "WARNING: plane[lm->axisNum] == 0\n" );
+               return qfalse;
+       }
+
        /* 4th point must fall on the plane */
        dist = DotProduct( plane, dv[ 3 ]->xyz ) - plane[ 3 ];
        if ( fabs( dist ) > QUAD_PLANAR_EPSILON ) {
@@ -3670,6 +3682,7 @@ void SetupEnvelopes( qboolean forGrid, qboolean fastFlag ){
                                /* clear light envelope */
                                light->envelope = 0;
 
+                               /* FIXME: radius may be undefined */
                                /* handle area lights */
                                if ( exactPointToPolygon && light->type == EMIT_AREA && light->w != NULL ) {
                                        light->envelope = MAX_WORLD_COORD * 8.0f;