various
[vg.git] / vg_m.h
diff --git a/vg_m.h b/vg_m.h
index c48f13e40ee510399008ae9cfb168b61258db45b..090c4873ed723ad90244e8786842d047fa808a32 100644 (file)
--- a/vg_m.h
+++ b/vg_m.h
@@ -403,17 +403,22 @@ static inline f32 vg_lerpf( f32 a, f32 b, f32 t ){
    return a + t*(b-a);
 }
 
+static inline f64 vg_lerp( f64 a, f64 b, f64 t )
+{
+   return a + t*(b-a);
+}
+
 static inline void vg_slewf( f32 *a, f32 b, f32 speed ){
    f32 d = vg_signf( b-*a ),
        c = *a + d*speed;
    *a = vg_minf( b*d, c*d ) * d;
 }
 
-static inline f64 vg_lerp( f64 a, f64 b, f64 t )
-{
-   return a + t*(b-a);
+static inline f32 vg_smoothstepf( f32 x ){
+   return x*x*(3.0f - 2.0f*x);
 }
 
+
 /* correctly lerp around circular period -pi -> pi */
 static f32 vg_alerpf( f32 a, f32 b, f32 t )
 {
@@ -623,11 +628,11 @@ static inline void q_inv( v4f q, v4f d )
    d[3] =  q[3]*s;
 }
 
-static inline void q_nlerp( v4f a, v4f b, f32 t, v4f d )
-{
+static inline void q_nlerp( v4f a, v4f b, f32 t, v4f d ){
    if( v4_dot(a,b) < 0.0f ){
-      v4_muls( b, -1.0f, d );
-      v4_lerp( a, d, t, d );
+      v4f c;
+      v4_muls( b, -1.0f, c );
+      v4_lerp( a, c, t, d );
    }
    else
       v4_lerp( a, b, t, d );
@@ -705,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
@@ -1189,8 +1204,7 @@ static void m4x3_decompose( m4x3f m, v3f co, v4f q, v3f s )
    m3x3_q( rot, q );
 }
 
-static void m4x3_expand_aabb_point( m4x3f m, boxf box, v3f point )
-{
+static void m4x3_expand_aabb_point( m4x3f m, boxf box, v3f point ){
    v3f v;
    m4x3_mulv( m, point, v );
 
@@ -1198,26 +1212,19 @@ static void m4x3_expand_aabb_point( m4x3f m, boxf box, v3f point )
    v3_maxv( box[1], v, box[1] );
 }
 
-static void m4x3_transform_aabb( m4x3f m, boxf box )
-{
+static void m4x3_expand_aabb_aabb( m4x3f m, boxf boxa, boxf boxb ){
    v3f a; v3f b;
-   
-   v3_copy( box[0], a );
-   v3_copy( box[1], b );
-   v3_fill( box[0],  INFINITY );
-   v3_fill( box[1], -INFINITY );
-
-   m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], a[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], a[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], a[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], a[2] } );
-
-   m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], b[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], b[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], b[2] } );
-   m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], b[2] } );
+   v3_copy( boxb[0], a );
+   v3_copy( boxb[1], b );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ a[0], a[1], a[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ a[0], b[1], a[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ b[0], b[1], a[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ b[0], a[1], a[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ a[0], a[1], b[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ a[0], b[1], b[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ b[0], b[1], b[2] } );
+   m4x3_expand_aabb_point( m, boxa, (v3f){ b[0], a[1], b[2] } );
 }
-
 static inline void m4x3_lookat( m4x3f m, v3f pos, v3f target, v3f up )
 {
    v3f dir;
@@ -1452,8 +1459,7 @@ static int box_within( boxf greater, boxf lesser )
    return 0;
 }
 
-static inline void box_init_inf( boxf box )
-{
+static inline void box_init_inf( boxf box ){
    v3_fill( box[0],  INFINITY );
    v3_fill( box[1], -INFINITY );
 }
@@ -1540,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 )
    {
@@ -1562,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