matrix3x3
[csRadar.git] / csrMath.h
index c758afca1f66fa96f1e1615df7dc371282c8f29d..63e5bd0e29115a0ddbb1d11f809d4eed48f27a4b 100644 (file)
--- a/csrMath.h
+++ b/csrMath.h
@@ -181,7 +181,41 @@ void v3_fill( v3f a, float v )
        a[2] = v;
 }
 
+// Matrix 3x3
+//======================================================================================================
 
+void m3x3_inv_transpose( m3x3f src, m3x3f dest )
+{
+       float a = src[0][0], b = src[0][1], c = src[0][2],
+                       d = src[1][0], e = src[1][1], f = src[1][2],
+                       g = src[2][0], h = src[2][1], i = src[2][2];
+
+       float det =    1.f / 
+                                       (+a*(e*i-h*f)
+                -b*(d*i-f*g)
+                +c*(d*h-e*g));
+                
+       dest[0][0] =  (e*i-h*f)*det;
+       dest[1][0] = -(b*i-c*h)*det;
+       dest[2][0] =  (b*f-c*e)*det;
+       dest[0][1] = -(d*i-f*g)*det;
+       dest[1][1] =  (a*i-c*g)*det;
+       dest[2][1] = -(a*f-d*c)*det;
+       dest[0][2] =  (d*h-g*e)*det;
+       dest[1][2] = -(a*h-g*b)*det;
+       dest[2][2] =  (a*e-d*b)*det;
+}
+
+void m3x3_mulv( m3x3f m, v3f v, v3f d )
+{
+       v3f res;
+       
+       res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
+       res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
+       res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
+       
+       v3_copy( res, d );
+}
 
 // Matrix 4x3
 // ==================================================================================================================
@@ -191,6 +225,27 @@ void v3_fill( v3f a, float v )
                                                                { 0.0f, 0.0f, 1.0f, },\
                                                                { 0.0f, 0.0f, 0.0f }}
 
+void m4x3_to_3x3( m4x3f a, m3x3f b )
+{
+       v3_copy( a[0], b[0] );
+       v3_copy( a[1], b[1] );
+       v3_copy( a[2], b[2] );
+}
+
+void m4x3_copy( m4x3f a, m4x3f b )
+{
+       v3_copy( a[0], b[0] );
+       v3_copy( a[1], b[1] );
+       v3_copy( a[2], b[2] );
+       v3_copy( a[3], b[3] );
+}
+
+void m4x3_identity( m4x3f a )
+{
+       m4x3f id = M4X3_IDENTITY;
+       m4x3_copy( id, a );
+}
+
 void m4x3_mul( m4x3f a, m4x3f b, m4x3f d ) 
 {
        float