+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 );
+}