diff --git a/tools/quake3/q3map2/light_bounce.c b/tools/quake3/q3map2/light_bounce.c index 7b428e11..97da22f5 100644 --- a/tools/quake3/q3map2/light_bounce.c +++ b/tools/quake3/q3map2/light_bounce.c @@ -195,6 +195,23 @@ static void RadClipWindingEpsilon( radWinding_t *in, vec3_t normal, vec_t dist, +/* + Modulo1IfNegative() + Previously the bias computation was doing: + + while ( f < 0.0f ) { + f += 1.0f; + } + + That may end in infinite loop in some case. + It may also be slower because of useless loops. + I don't know what that computation is for. + -- illwieckz +*/ +float Modulo1IfNegative( float f ){ + return f < 0.0f ? f - floor( f ) : f; +} + /* @@ -204,10 +221,8 @@ static void RadClipWindingEpsilon( radWinding_t *in, vec3_t normal, vec_t dist, */ qboolean RadSampleImage( byte *pixels, int width, int height, float st[ 2 ], float color[ 4 ] ){ - float sto[ 2 ]; int x, y; - /* clear color first */ color[ 0 ] = color[ 1 ] = color[ 2 ] = color[ 3 ] = 255; @@ -216,18 +231,10 @@ qboolean RadSampleImage( byte *pixels, int width, int height, float st[ 2 ], flo return qfalse; } - /* bias st */ - sto[ 0 ] = st[ 0 ]; - while ( sto[ 0 ] < 0.0f ) - sto[ 0 ] += 1.0f; - sto[ 1 ] = st[ 1 ]; - while ( sto[ 1 ] < 0.0f ) - sto[ 1 ] += 1.0f; - /* get offsets */ - x = ( (float) width * sto[ 0 ] ) + 0.5f; + x = ( (float) width * Modulo1IfNegative( st[ 0 ] ) ) + 0.5f; x %= width; - y = ( (float) height * sto[ 1 ] ) + 0.5f; + y = ( (float) height * Modulo1IfNegative( st[ 1 ] ) ) + 0.5f; y %= height; /* get pixel */