Add function to invert 3x3 matrix
This commit is contained in:
parent
8c74706fdc
commit
84fbb711e1
@ -56,6 +56,42 @@ M4x4f viewport(f32 x, f32 y, u64 w, u64 h) {
|
||||
return output;
|
||||
}
|
||||
|
||||
M3x3f mat3x3_inv(M3x3f matrix) {
|
||||
M3x3f dest = {0};
|
||||
float det;
|
||||
|
||||
float a = matrix.rows[0].elements[0], b = matrix.rows[0].elements[1],
|
||||
c = matrix.rows[0].elements[2], d = matrix.rows[1].elements[0],
|
||||
e = matrix.rows[1].elements[1], f = matrix.rows[1].elements[2],
|
||||
g = matrix.rows[2].elements[0], h = matrix.rows[2].elements[1],
|
||||
i = matrix.rows[2].elements[2];
|
||||
|
||||
dest.rows[0].elements[0] = e * i - f * h;
|
||||
dest.rows[0].elements[1] = -(b * i - h * c);
|
||||
dest.rows[0].elements[2] = b * f - e * c;
|
||||
dest.rows[1].elements[0] = -(d * i - g * f);
|
||||
dest.rows[1].elements[1] = a * i - c * g;
|
||||
dest.rows[1].elements[2] = -(a * f - d * c);
|
||||
dest.rows[2].elements[0] = d * h - g * e;
|
||||
dest.rows[2].elements[1] = -(a * h - g * b);
|
||||
dest.rows[2].elements[2] = a * e - b * d;
|
||||
|
||||
det = 1.0f / (a * dest.rows[0].elements[0] + b * dest.rows[1].elements[0] +
|
||||
c * dest.rows[2].elements[0]);
|
||||
|
||||
dest.rows[0].elements[0] *= det;
|
||||
dest.rows[0].elements[1] *= det;
|
||||
dest.rows[0].elements[2] *= det;
|
||||
dest.rows[1].elements[0] *= det;
|
||||
dest.rows[1].elements[1] *= det;
|
||||
dest.rows[1].elements[2] *= det;
|
||||
dest.rows[2].elements[0] *= det;
|
||||
dest.rows[2].elements[1] *= det;
|
||||
dest.rows[2].elements[2] *= det;
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
M4x4f mat4x4_inv(M4x4f matrix) {
|
||||
f32 mat[4][4] = mat4x4_to_array(matrix);
|
||||
f32 dest[4][4] = {0};
|
||||
|
@ -293,6 +293,7 @@ MAKE_LIST_TYPE(V2f);
|
||||
M4x4f lookat(V3f eye, V3f target, V3f up);
|
||||
M4x4f projection(f32 coeff);
|
||||
M4x4f viewport(f32 x, f32 y, u64 w, u64 h);
|
||||
M3x3f mat3x3_inv(M3x3f matrix);
|
||||
M4x4f mat4x4_inv(M4x4f matrix);
|
||||
|
||||
#endif // VEC_H
|
||||
|
Loading…
Reference in New Issue
Block a user