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