1 static inline void cgm_mcopy(float *dest, const float *src)
3 memcpy(dest, src, 16 * sizeof(float));
6 static inline void cgm_mzero(float *m)
12 static inline void cgm_midentity(float *m)
14 static float id[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
18 static inline void cgm_msetrow_v3(float *m, int idx, const cgm_vec3 *v)
26 static inline void cgm_msetrow_v4(float *m, int idx, const cgm_vec4 *v)
34 static inline void cgm_msetcol_v3(float *m, int idx, const cgm_vec3 *v)
37 m[idx * 4 + 1] = v->y;
38 m[idx * 4 + 2] = v->z;
39 m[idx * 4 + 3] = 0.0f;
42 static inline void cgm_msetcol_v4(float *m, int idx, const cgm_vec4 *v)
45 m[idx * 4 + 1] = v->y;
46 m[idx * 4 + 2] = v->z;
47 m[idx * 4 + 3] = v->w;
50 static inline void cgm_mgetrow_v3(cgm_vec3 *v, const float *m, int idx)
57 static inline void cgm_mgetrow_v4(cgm_vec4 *v, const float *m, int idx)
65 static inline void cgm_mgetcol_v3(cgm_vec3 *v, const float *m, int idx)
68 v->y = m[idx * 4 + 1];
69 v->z = m[idx * 4 + 2];
72 static inline void cgm_mgetcol_v4(cgm_vec4 *v, const float *m, int idx)
75 v->y = m[idx * 4 + 1];
76 v->z = m[idx * 4 + 2];
77 v->w = m[idx * 4 + 3];
80 static inline void cgm_msubmatrix(float *m, int row, int col)
89 if(i == col) continue;
93 if(j == row) continue;
95 m[subi * 4 + subj++] = orig[i * 4 + j];
103 static inline void cgm_mupper3(float *m)
105 m[3] = m[7] = m[11] = m[12] = m[13] = m[14] = 0.0f;
109 static inline float cgm_msubdet(float *m, int row, int col)
111 cgm_msubmatrix(m, row, col);
115 static inline float cgm_mcofactor(float *m, int row, int col)
117 float min = cgm_msubdet(m, row, col);
118 return (row + col) & 1 ? -min : min;
121 static inline float cgm_mdet(float *m)
123 return m[0] * cgm_msubdet(m, 0, 0) - m[1] * cgm_msubdet(m, 0, 1) +
124 m[2] * cgm_msubdet(m, 0, 2) - m[3] * cgm_msubdet(m, 0, 3);
127 static inline void cgm_mtranspose(float *m)
141 static inline void cgm_mcofmatrix(float *m)
150 m[i * 4 + j] = cgm_mcofactor(tmp, i, j);
155 static inline int cgm_minverse(float *m)
160 float det = cgm_mdet(m);
161 if(det == 0.0f) return -1;
162 inv_det = 1.0f / det;
168 m[i * 4 + j] = cgm_mcofactor(tmp, j, i) * inv_det; /* transposed */