various
[vg.git] / vg_m.h
diff --git a/vg_m.h b/vg_m.h
index 91282f0f3d25e90249e97ac8cd052c83e52f3938..090c4873ed723ad90244e8786842d047fa808a32 100644 (file)
--- a/vg_m.h
+++ b/vg_m.h
@@ -710,6 +710,16 @@ static inline void m2x2_create_rotation( m2x2f a, f32 theta )
    a[1][1] =  c;
 }
 
+static inline void m2x2_mulv( m2x2f m, v2f v, v2f d )
+{
+   v2f res;
+   
+   res[0] = m[0][0]*v[0] + m[1][0]*v[1];
+   res[1] = m[0][1]*v[0] + m[1][1]*v[1];
+   
+   v2_copy( res, d );
+}
+
 /*
  * -----------------------------------------------------------------------------
  * Section 4.b                  3x3 matrices
@@ -1536,7 +1546,7 @@ int plane_intersect2( v4f a, v4f b, v3f p, v3f n )
 static int plane_segment( v4f plane, v3f a, v3f b, v3f co )
 {
    f32 d0 = v3_dot( a, plane ) - plane[3],
-         d1 = v3_dot( b, plane ) - plane[3];
+       d1 = v3_dot( b, plane ) - plane[3];
 
    if( d0*d1 < 0.0f )
    {
@@ -1558,6 +1568,17 @@ static inline f64 plane_polarity( f64 p[4], f64 a[3] )
    ;
 }
 
+static f32 ray_plane( v4f plane, v3f co, v3f dir ){
+   f32 d = v3_dot( plane, dir );
+   if( fabsf(d) > 1e-6f ){
+      v3f v0;
+      v3_muls( plane, plane[3], v0 );
+      v3_sub( v0, co, v0 );
+      return v3_dot( v0, plane ) / d;
+   }
+   else return INFINITY;
+}
+
 /*
  * -----------------------------------------------------------------------------
  * Section 5.c            Closest point functions