all changes
[vg.git] / vg_m.h
diff --git a/vg_m.h b/vg_m.h
index 703c5e5823b4bc0c459c445a06b069f6ada1dceb..368f2889aff1f23807325e92f11228f22c654305 100644 (file)
--- a/vg_m.h
+++ b/vg_m.h
 #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;
 }