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
// ==================================================================================================================
{ 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