Inverse Matrix44
The snippet can be accessed without any authentication.
Authored by
Zandor Smith
This will produce an inverse 4x4 matrix of the current instance.
bool igad::Matrix44::Invert() {
float determinant = Determinant();
if (determinant == 0)
return false;
float inv[16];
inv[0] = f[5] * f[10] * f[15] - f[5] * f[11] * f[14] - f[9] * f[6] * f[15] + f[9] * f[7] * f[14] + f[13] * f[6] * f[11] - f[13] * f[7] * f[10];
inv[1] = -f[1] * f[10] * f[15] + f[1] * f[11] * f[14] + f[9] * f[2] * f[15] - f[9] * f[3] * f[14] - f[13] * f[2] * f[11] + f[13] * f[3] * f[10];
inv[2] = f[1] * f[6] * f[15] - f[1] * f[7] * f[14] - f[5] * f[2] * f[15] + f[5] * f[3] * f[14] + f[13] * f[2] * f[7] - f[13] * f[3] * f[6];
inv[3] = -f[1] * f[6] * f[11] + f[1] * f[7] * f[10] + f[5] * f[2] * f[11] - f[5] * f[3] * f[10] - f[9] * f[2] * f[7] + f[9] * f[3] * f[6];
inv[4] = -f[4] * f[10] * f[15] + f[4] * f[11] * f[14] + f[8] * f[6] * f[15] - f[8] * f[7] * f[14] - f[12] * f[6] * f[11] + f[12] * f[7] * f[10];
inv[5] = f[0] * f[10] * f[15] - f[0] * f[11] * f[14] - f[8] * f[2] * f[15] + f[8] * f[3] * f[14] + f[12] * f[2] * f[11] - f[12] * f[3] * f[10];
inv[6] = -f[0] * f[6] * f[15] + f[0] * f[7] * f[14] + f[4] * f[2] * f[15] - f[4] * f[3] * f[14] - f[12] * f[2] * f[7] + f[12] * f[3] * f[6];
inv[7] = f[0] * f[6] * f[11] - f[0] * f[7] * f[10] - f[4] * f[2] * f[11] + f[4] * f[3] * f[10] + f[8] * f[2] * f[7] - f[8] * f[3] * f[6];
inv[8] = f[4] * f[9] * f[15] - f[4] * f[11] * f[13] - f[8] * f[5] * f[15] + f[8] * f[7] * f[13] + f[12] * f[5] * f[11] - f[12] * f[7] * f[9];
inv[9] = -f[0] * f[9] * f[15] + f[0] * f[11] * f[13] + f[8] * f[1] * f[15] - f[8] * f[3] * f[13] - f[12] * f[1] * f[11] + f[12] * f[3] * f[9];
inv[10] = f[0] * f[5] * f[15] - f[0] * f[7] * f[13] - f[4] * f[1] * f[15] + f[4] * f[3] * f[13] + f[12] * f[1] * f[7] - f[12] * f[3] * f[5];
inv[11] = -f[0] * f[5] * f[11] + f[0] * f[7] * f[9] + f[4] * f[1] * f[11] - f[4] * f[3] * f[9] - f[8] * f[1] * f[7] + f[8] * f[3] * f[5];
inv[12] = -f[4] * f[9] * f[14] + f[4] * f[10] * f[13] + f[8] * f[5] * f[14] - f[8] * f[6] * f[13] - f[12] * f[5] * f[10] + f[12] * f[6] * f[9];
inv[13] = f[0] * f[9] * f[14] - f[0] * f[10] * f[13] - f[8] * f[1] * f[14] + f[8] * f[2] * f[13] + f[12] * f[1] * f[10] - f[12] * f[2] * f[9];
inv[14] = -f[0] * f[5] * f[14] + f[0] * f[6] * f[13] + f[4] * f[1] * f[14] - f[4] * f[2] * f[13] - f[12] * f[1] * f[6] + f[12] * f[2] * f[5];
inv[15] = f[0] * f[5] * f[10] - f[0] * f[6] * f[9] - f[4] * f[1] * f[10] + f[4] * f[2] * f[9] + f[8] * f[1] * f[6] - f[8] * f[2] * f[5];
determinant = 1.0 / determinant;
for (int i = 0; i < sizeof f / sizeof *f; i++)
f[i] = inv[i] * determinant;
return true;
}
Please register or sign in to comment