From: hgn Date: Sat, 10 Jul 2021 09:39:37 +0000 (+0100) Subject: matrix3x3 X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=commitdiff_plain;h=8aa3bce0394bff13b44ea3cd84a47f5880fd7527 matrix3x3 --- diff --git a/csrMath.h b/csrMath.h index c758afc..63e5bd0 100644 --- 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 diff --git a/csrTypes.h b/csrTypes.h index e65ad99..3aafcba 100644 --- a/csrTypes.h +++ b/csrTypes.h @@ -12,4 +12,5 @@ typedef unsigned int uint; typedef float v2f[2]; typedef float v3f[3]; typedef float v4f[4]; +typedef v3f m3x3f[3]; typedef v3f m4x3f[4]; diff --git a/vmf.h b/vmf.h index 887fe84..cdec7dd 100644 --- a/vmf.h +++ b/vmf.h @@ -69,6 +69,8 @@ struct vmf_map vdf_node *root; } *cache; + + m4x3f transform; }; // IMPLEMENTATION