X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_m.h;h=368f2889aff1f23807325e92f11228f22c654305;hb=80c63a082132aa37bf0578d4d6757880db748a79;hp=703c5e5823b4bc0c459c445a06b069f6ada1dceb;hpb=a7938c00a8c486ad0e2a765c3092017487ba761e;p=vg.git diff --git a/vg_m.h b/vg_m.h index 703c5e5..368f288 100644 --- a/vg_m.h +++ b/vg_m.h @@ -10,6 +10,27 @@ #define VG_PIf 3.14159265358979323846264338327950288f #define VG_TAUf 6.28318530717958647692528676655900576f +static u32 vg_ftu32( float a ) +{ + u32 *ptr = (u32 *)(&a); + return *ptr; +} + +static int vg_isinff( float a ) +{ + return ((vg_ftu32(a)) & 0x7FFFFFFFU) == 0x7F800000U; +} + +static int vg_isnanf( float a ) +{ + return !vg_isinff(a) && ((vg_ftu32(a)) & 0x7F800000U) == 0x7F800000U; +} + +static int vg_validf( float a ) +{ + return ((vg_ftu32(a)) & 0x7F800000U) != 0x7F800000U; +} + static inline float vg_minf( float a, float b ) { return a < b? a: b; @@ -234,7 +255,9 @@ static inline void v3_mul( v3f a, v3f b, v3f d ) static inline void v3_div( v3f a, v3f b, v3f d ) { - d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; d[2] = a[2]/b[2]; + d[0] = b[0]!=0.0f? a[0]/b[0]: INFINITY; + d[1] = b[1]!=0.0f? a[1]/b[1]: INFINITY; + d[2] = b[2]!=0.0f? a[2]/b[2]: INFINITY; } static inline void v3_muls( v3f a, float s, v3f d ) @@ -242,9 +265,23 @@ static inline void v3_muls( v3f a, float s, v3f d ) d[0] = a[0]*s; d[1] = a[1]*s; d[2] = a[2]*s; } +static inline void v3_fill( v3f a, float v ) +{ + a[0] = v; + a[1] = v; + a[2] = v; +} + static inline void v3_divs( v3f a, float s, v3f d ) { - d[0] = a[0]/s; d[1] = a[1]/s; d[2] = a[2]/s; + if( s == 0.0f ) + v3_fill( d, INFINITY ); + else + { + d[0] = a[0]/s; + d[1] = a[1]/s; + d[2] = a[2]/s; + } } static inline void v3_muladds( v3f a, v3f b, float s, v3f d ) @@ -349,13 +386,6 @@ static inline float v3_maxf( v3f a ) return vg_maxf( vg_maxf( a[0], a[1] ), a[2] ); } -static inline void v3_fill( v3f a, float v ) -{ - a[0] = v; - a[1] = v; - a[2] = v; -} - static inline void v3_floor( v3f a, v3f b ) { b[0] = floorf( a[0] ); @@ -434,7 +464,7 @@ static inline void v4_lerp( v4f a, v4f b, float t, v4f d ) static inline float v4_dot( v4f a, v4f b ) { - return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*a[3]; + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3]; } static inline float v4_length( v4f a ) @@ -928,6 +958,7 @@ int ray_aabb( boxf box, v3f co, v3f dir, float dist ) v3_sub( box[0], co, v0 ); v3_sub( box[1], co, v1 ); + v3_div( v0, dir, v0 ); v3_div( v1, dir, v1 ); @@ -970,7 +1001,7 @@ static inline void m4x3_lookat( m4x3f m, v3f pos, v3f target, v3f up ) { 0.0f, 0.0f, 0.0f, 0.0f }} static void m4x4_projection( m4x4f m, float angle, - float ratio, float fnear, float ffar ) + float ratio, float fnear, float ffar ) { float scale = tanf( angle * 0.5f * VG_PIf / 180.0f ) * fnear, r = ratio * scale, @@ -978,21 +1009,24 @@ static void m4x4_projection( m4x4f m, float angle, t = scale, b = -t; - m[0][0] = 2.0f * fnear / (r - l); - m[0][1] = 0.0f; - m[0][2] = 0.0f; - m[0][3] = 0.0f; - m[1][0] = 0.0f; - m[1][1] = 2.0f * fnear / (t - b); - m[1][2] = 0.0f; - m[1][3] = 0.0f; - m[2][0] = (r + l) / (r - l); - m[2][1] = (t + b) / (t - b); - m[2][2] = -(ffar + fnear) / (ffar - fnear); - m[2][3] = -1.0f; - m[3][0] = 0.0f; - m[3][1] = 0.0f; - m[3][2] = -2.0f * ffar * fnear / (ffar - fnear); + m[0][0] = 2.0f * fnear / (r - l); + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + + m[1][0] = 0.0f; + m[1][1] = 2.0f * fnear / (t - b); + m[1][2] = 0.0f; + m[1][3] = 0.0f; + + m[2][0] = (r + l) / (r - l); + m[2][1] = (t + b) / (t - b); + m[2][2] = -(ffar + fnear) / (ffar - fnear); + m[2][3] = -1.0f; + + m[3][0] = 0.0f; + m[3][1] = 0.0f; + m[3][2] = -2.0f * ffar * fnear / (ffar - fnear); m[3][3] = 0.0f; }