Skip to content

Instantly share code, notes, and snippets.

@DoctorGester
Created June 29, 2018 20:23
Show Gist options
  • Select an option

  • Save DoctorGester/c7fb0b4a2417b4077157111ae852dba2 to your computer and use it in GitHub Desktop.

Select an option

Save DoctorGester/c7fb0b4a2417b4077157111ae852dba2 to your computer and use it in GitHub Desktop.
bool mat4_invert(mat4& m, mat4& inv) {
double det;
inv.m11 = m.m22 * m.m33 * m.m44 -
m.m22 * m.m34 * m.m43 -
m.m32 * m.m23 * m.m44 +
m.m32 * m.m24 * m.m43 +
m.m42 * m.m23 * m.m34 -
m.m42 * m.m24 * m.m33;
inv.m21 = -m.m21 * m.m33 * m.m44 +
m.m21 * m.m34 * m.m43 +
m.m31 * m.m23 * m.m44 -
m.m31 * m.m24 * m.m43 -
m.m41 * m.m23 * m.m34 +
m.m41 * m.m24 * m.m33;
inv.m31 = m.m21 * m.m32 * m.m44 -
m.m21 * m.m34 * m.m42 -
m.m31 * m.m22 * m.m44 +
m.m31 * m.m24 * m.m42 +
m.m41 * m.m22 * m.m34 -
m.m41 * m.m24 * m.m32;
inv.m41 = -m.m21 * m.m32 * m.m43 +
m.m21 * m.m33 * m.m42 +
m.m31 * m.m22 * m.m43 -
m.m31 * m.m23 * m.m42 -
m.m41 * m.m22 * m.m33 +
m.m41 * m.m23 * m.m32;
inv.m12 = -m.m12 * m.m33 * m.m44 +
m.m12 * m.m34 * m.m43 +
m.m32 * m.m13 * m.m44 -
m.m32 * m.m14 * m.m43 -
m.m42 * m.m13 * m.m34 +
m.m42 * m.m14 * m.m33;
inv.m22 = m.m11 * m.m33 * m.m44 -
m.m11 * m.m34 * m.m43 -
m.m31 * m.m13 * m.m44 +
m.m31 * m.m14 * m.m43 +
m.m41 * m.m13 * m.m34 -
m.m41 * m.m14 * m.m33;
inv.m32 = -m.m11 * m.m32 * m.m44 +
m.m11 * m.m34 * m.m42 +
m.m31 * m.m12 * m.m44 -
m.m31 * m.m14 * m.m42 -
m.m41 * m.m12 * m.m34 +
m.m41 * m.m14 * m.m32;
inv.m42 = m.m11 * m.m32 * m.m43 -
m.m11 * m.m33 * m.m42 -
m.m31 * m.m12 * m.m43 +
m.m31 * m.m13 * m.m42 +
m.m41 * m.m12 * m.m33 -
m.m41 * m.m13 * m.m32;
inv.m13 = m.m12 * m.m23 * m.m44 -
m.m12 * m.m24 * m.m43 -
m.m22 * m.m13 * m.m44 +
m.m22 * m.m14 * m.m43 +
m.m42 * m.m13 * m.m24 -
m.m42 * m.m14 * m.m23;
inv.m23 = -m.m11 * m.m23 * m.m44 +
m.m11 * m.m24 * m.m43 +
m.m21 * m.m13 * m.m44 -
m.m21 * m.m14 * m.m43 -
m.m41 * m.m13 * m.m24 +
m.m41 * m.m14 * m.m23;
inv.m33 = m.m11 * m.m22 * m.m44 -
m.m11 * m.m24 * m.m42 -
m.m21 * m.m12 * m.m44 +
m.m21 * m.m14 * m.m42 +
m.m41 * m.m12 * m.m24 -
m.m41 * m.m14 * m.m22;
inv.m43 = -m.m11 * m.m22 * m.m43 +
m.m11 * m.m23 * m.m42 +
m.m21 * m.m12 * m.m43 -
m.m21 * m.m13 * m.m42 -
m.m41 * m.m12 * m.m23 +
m.m41 * m.m13 * m.m22;
inv.m14 = -m.m12 * m.m23 * m.m34 +
m.m12 * m.m24 * m.m33 +
m.m22 * m.m13 * m.m34 -
m.m22 * m.m14 * m.m33 -
m.m32 * m.m13 * m.m24 +
m.m32 * m.m14 * m.m23;
inv.m24 = m.m11 * m.m23 * m.m34 -
m.m11 * m.m24 * m.m33 -
m.m21 * m.m13 * m.m34 +
m.m21 * m.m14 * m.m33 +
m.m31 * m.m13 * m.m24 -
m.m31 * m.m14 * m.m23;
inv.m34 = -m.m11 * m.m22 * m.m34 +
m.m11 * m.m24 * m.m32 +
m.m21 * m.m12 * m.m34 -
m.m21 * m.m14 * m.m32 -
m.m31 * m.m12 * m.m24 +
m.m31 * m.m14 * m.m22;
inv.m44 = m.m11 * m.m22 * m.m33 -
m.m11 * m.m23 * m.m32 -
m.m21 * m.m12 * m.m33 +
m.m21 * m.m13 * m.m32 +
m.m31 * m.m12 * m.m23 -
m.m31 * m.m13 * m.m22;
det = m.m11 * inv.m11 + m.m12 * inv.m21 + m.m13 * inv.m31 + m.m14 * inv.m41;
if (det == 0) {
return false;
}
det = 1.0 / det;
inv = inv * det;
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment