Add function to invert 3x3 matrix

This commit is contained in:
Abdelrahman Said 2024-09-01 22:28:11 +01:00
parent 8c74706fdc
commit 84fbb711e1
2 changed files with 37 additions and 0 deletions

View File

@ -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};

View File

@ -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