Merge pull request #653 from illwieckz/fixinfinitebounce

q3map2/light_bounce: prevent infinite loop on obscure bias compute
This commit is contained in:
Timothee "TTimo" Besset 2020-07-04 14:16:16 -07:00 committed by GitHub
commit 8c397cb01f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 */