From 58c81750243fbc67762e950ccce9eba87f36c4d7 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Thu, 19 Jan 2006 20:28:12 +0000 Subject: [PATCH] * Added Q_isnan for NaN tests with -ffast-math * Fixed UT/OpenAL work around --- code/client/snd_openal.c | 15 ++++++--------- code/qcommon/q_math.c | 20 ++++++++++++++++++++ code/qcommon/q_shared.h | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index 69231861..19ec33c2 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -492,15 +492,12 @@ S_AL_SanitiseVector #define S_AL_SanitiseVector(v) _S_AL_SanitiseVector(v,__LINE__) static void _S_AL_SanitiseVector( vec3_t v, int line ) { - // NaNs can't be compared for equality, thus always fail this test - if( v[ 0 ] == v[ 0 ] && - v[ 1 ] == v[ 1 ] && - v[ 2 ] == v[ 2 ] ) - return; - - Com_DPrintf( S_COLOR_YELLOW "WARNING: vector with one or more NaN components " - "being passed to OpenAL at %s:%d -- zeroing\n", __FILE__, line ); - VectorClear( v ); + if( Q_isnan( v[ 0 ] ) || Q_isnan( v[ 1 ] ) || Q_isnan( v[ 2 ] ) ) + { + Com_DPrintf( S_COLOR_YELLOW "WARNING: vector with one or more NaN components " + "being passed to OpenAL at %s:%d -- zeroing\n", __FILE__, line ); + VectorClear( v ); + } } /* diff --git a/code/qcommon/q_math.c b/code/qcommon/q_math.c index de90b8b4..5ddd81fe 100644 --- a/code/qcommon/q_math.c +++ b/code/qcommon/q_math.c @@ -1252,4 +1252,24 @@ void PerpendicularVector( vec3_t dst, const vec3_t src ) VectorNormalize( dst ); } +/* +================ +Q_isnan +Don't pass doubles to this +================ +*/ +int Q_isnan( float x ) +{ + union + { + float f; + unsigned int i; + } t; + + t.f = x; + t.i &= 0x7FFFFFFF; + t.i = 0x7F800000 - t.i; + + return (int)( (unsigned int)t.i >> 31 ); +} diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index a9388e7f..e80074de 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -557,6 +557,7 @@ void MakeNormalVectors( const vec3_t forward, vec3_t right, vec3_t up ); void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]); void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); void PerpendicularVector( vec3_t dst, const vec3_t src ); +int Q_isnan( float x ); //=============================================