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;
|
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) {
|
M4x4f mat4x4_inv(M4x4f matrix) {
|
||||||
f32 mat[4][4] = mat4x4_to_array(matrix);
|
f32 mat[4][4] = mat4x4_to_array(matrix);
|
||||||
f32 dest[4][4] = {0};
|
f32 dest[4][4] = {0};
|
||||||
|
@ -293,6 +293,7 @@ MAKE_LIST_TYPE(V2f);
|
|||||||
M4x4f lookat(V3f eye, V3f target, V3f up);
|
M4x4f lookat(V3f eye, V3f target, V3f up);
|
||||||
M4x4f projection(f32 coeff);
|
M4x4f projection(f32 coeff);
|
||||||
M4x4f viewport(f32 x, f32 y, u64 w, u64 h);
|
M4x4f viewport(f32 x, f32 y, u64 w, u64 h);
|
||||||
|
M3x3f mat3x3_inv(M3x3f matrix);
|
||||||
M4x4f mat4x4_inv(M4x4f matrix);
|
M4x4f mat4x4_inv(M4x4f matrix);
|
||||||
|
|
||||||
#endif // VEC_H
|
#endif // VEC_H
|
||||||
|
Loading…
Reference in New Issue
Block a user