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