14void mat3_print(
const mat3 *m )
16 for (
int i = 0; i < 3; i++ ) {
17 for (
int j = 0; j < 3; j++ )
18 printf(
"%7.g ", m->m[j][i] );
23void mat3_from_mat4(
mat3 *out,
const mat4 *in )
25 for (
int i = 0; i < 3; i++ )
26 for (
int j = 0; j < 3; j++ )
27 out->m[i][j] = in->m[i][j];
30void mat3_mul_vec(
vec3 *out,
const mat3 *M,
const vec3 *v )
32 for (
int i = 0; i < 3; i++ ) {
34 for (
int j = 0; j < 3; j++ )
35 a += M->m[j][i] * v->v[j];
40double mat3_det(
const mat3 *m )
42 return m->m[0][0] * ( m->m[1][1] * m->m[2][2] - m->m[2][1] * m->m[1][2] ) -
43 m->m[0][1] * ( m->m[1][0] * m->m[2][2] - m->m[1][2] * m->m[2][0] ) +
44 m->m[0][2] * ( m->m[1][0] * m->m[2][1] - m->m[1][1] * m->m[2][0] );
47void mat3_invert(
mat3 *m )
49 const double invdet = 1. / mat3_det( m );
51 m->m[0][0] = ( o.m[1][1] * o.m[2][2] - o.m[2][1] * o.m[1][2] ) * invdet;
52 m->m[0][1] = ( o.m[0][2] * o.m[2][1] - o.m[0][1] * o.m[2][2] ) * invdet;
53 m->m[0][2] = ( o.m[0][1] * o.m[1][2] - o.m[0][2] * o.m[1][1] ) * invdet;
54 m->m[1][0] = ( o.m[1][2] * o.m[2][0] - o.m[1][0] * o.m[2][2] ) * invdet;
55 m->m[1][1] = ( o.m[0][0] * o.m[2][2] - o.m[0][2] * o.m[2][0] ) * invdet;
56 m->m[1][2] = ( o.m[1][0] * o.m[0][2] - o.m[0][0] * o.m[1][2] ) * invdet;
57 m->m[2][0] = ( o.m[1][0] * o.m[2][1] - o.m[2][0] * o.m[1][1] ) * invdet;
58 m->m[2][1] = ( o.m[2][0] * o.m[0][1] - o.m[0][0] * o.m[2][1] ) * invdet;
59 m->m[2][2] = ( o.m[0][0] * o.m[1][1] - o.m[1][0] * o.m[0][1] ) * invdet;
62void mat3_transpose(
mat3 *m )
65 for (
int i = 0; i < 3 - 1; i++ ) {
66 for (
int j = i + 1; j < 3; j++ ) {
67 double t = m->m[i][j];
68 m->m[i][j] = m->m[j][i];