X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=gph-cmath;a=blobdiff_plain;f=src%2Fcgmmat.inl;h=74b27ccd1174eb44af95acc9fcd0406ca084b083;hp=86dd63d2ac19ddd29afc9a1baaf62574d19d72a8;hb=ceeb6a82a05fb8e4a741adf5916085da5fadb11c;hpb=cc26f59c90c0935eef7d7fdcf8ac327e23d14ebc diff --git a/src/cgmmat.inl b/src/cgmmat.inl index 86dd63d..74b27cc 100644 --- a/src/cgmmat.inl +++ b/src/cgmmat.inl @@ -79,6 +79,25 @@ static inline void cgm_mgetcol_v4(cgm_vec4 *v, const float *m, int idx) static inline void cgm_msubmatrix(float *m, int row, int col) { + float orig[16]; + int i, j, subi, subj; + + cgm_mcopy(orig, m); + + subi = 0; + for(i=0; i<4; i++) { + if(i == col) continue; + + subj = 0; + for(j=0; j<4; j++) { + if(j == row) continue; + + m[subi * 4 + subj++] = orig[i * 4 + j]; + } + subi++; + } + + cgm_mupper3(m); } static inline void cgm_mupper3(float *m) @@ -86,3 +105,67 @@ static inline void cgm_mupper3(float *m) m[3] = m[7] = m[11] = m[12] = m[13] = m[14] = 0.0f; m[15] = 1.0f; } + +static inline float cgm_msubdet(float *m, int row, int col) +{ + cgm_msubmatrix(m, row, col); + return cgm_mdet(m); +} + +static inline float cgm_mcofactor(float *m, int row, int col) +{ + float min = cgm_msubdet(m, row, col); + return (row + col) & 1 ? -min : min; +} + +static inline float cgm_mdet(float *m) +{ + return m[0] * cgm_msubdet(m, 0, 0) - m[1] * cgm_msubdet(m, 0, 1) + + m[2] * cgm_msubdet(m, 0, 2) - m[3] * cgm_msubdet(m, 0, 3); +} + +static inline void cgm_mtranspose(float *m) +{ + int i, j; + for(i=0; i<4; i++) { + for(j=0; j