Skip to content

Instantly share code, notes, and snippets.

@sakrist
Created November 3, 2016 18:17
Show Gist options
  • Save sakrist/b2c463226ebb29f5cc68dd0f2cd35c23 to your computer and use it in GitHub Desktop.
Save sakrist/b2c463226ebb29f5cc68dd0f2cd35c23 to your computer and use it in GitHub Desktop.
static __inline__ GLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertable) {
float b00 = matrix.m[0] * matrix.m[5] - matrix.m[1] * matrix.m[4];
float b01 = matrix.m[0] * matrix.m[6] - matrix.m[2] * matrix.m[4];
float b02 = matrix.m[0] * matrix.m[7] - matrix.m[3] * matrix.m[4];
float b03 = matrix.m[1] * matrix.m[6] - matrix.m[2] * matrix.m[5];
float b04 = matrix.m[1] * matrix.m[7] - matrix.m[3] * matrix.m[5];
float b05 = matrix.m[2] * matrix.m[7] - matrix.m[3] * matrix.m[6];
float b06 = matrix.m[8] * matrix.m[13] - matrix.m[9] * matrix.m[12];
float b07 = matrix.m[8] * matrix.m[14] - matrix.m[10] * matrix.m[12];
float b08 = matrix.m[8] * matrix.m[15] - matrix.m[11] * matrix.m[12];
float b09 = matrix.m[9] * matrix.m[14] - matrix.m[10] * matrix.m[13];
float b10 = matrix.m[9] * matrix.m[15] - matrix.m[11] * matrix.m[13];
float b11 = matrix.m[10] * matrix.m[15] - matrix.m[11] * matrix.m[14];
// Calculate the determinant (inlined to avoid double-caching)
float determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
if (isInvertable != NULL) {
*isInvertable = determinant != 0;
}
if (determinant == 0) {
return GLKMatrix4Identity;
}
float invDet = 1.0f / determinant;
GLKMatrix4 m;
m.m[0] = (matrix.m[5] * b11 - matrix.m[6] * b10 + matrix.m[7] * b09) * invDet;
m.m[1] = (-matrix.m[1] * b11 + matrix.m[2] * b10 - matrix.m[3] * b09) * invDet;
m.m[2] = (matrix.m[13] * b05 - matrix.m[14] * b04 + matrix.m[15] * b03) * invDet;
m.m[3] = (-matrix.m[9] * b05 + matrix.m[10] * b04 - matrix.m[11] * b03) * invDet;
m.m[4] = (-matrix.m[4] * b11 + matrix.m[6] * b08 - matrix.m[7] * b07) * invDet;
m.m[5] = (matrix.m[0] * b11 - matrix.m[2] * b08 + matrix.m[3] * b07) * invDet;
m.m[6] = (-matrix.m[12] * b05 + matrix.m[14] * b02 - matrix.m[15] * b01) * invDet;
m.m[7] = (matrix.m[8] * b05 - matrix.m[10] * b02 + matrix.m[11] * b01) * invDet;
m.m[8] = (matrix.m[4] * b10 - matrix.m[5] * b08 + matrix.m[7] * b06) * invDet;
m.m[9] = (-matrix.m[0] * b10 + matrix.m[1] * b08 - matrix.m[3] * b06) * invDet;
m.m[10] = (matrix.m[12] * b04 - matrix.m[13] * b02 + matrix.m[15] * b00) * invDet;
m.m[11] = (-matrix.m[8] * b04 + matrix.m[9] * b02 - matrix.m[11] * b00) * invDet;
m.m[12] = (-matrix.m[4] * b09 + matrix.m[5] * b07 - matrix.m[6] * b06) * invDet;
m.m[13] = (matrix.m[0] * b09 - matrix.m[1] * b07 + matrix.m[2] * b06) * invDet;
m.m[14] = (-matrix.m[12] * b03 + matrix.m[13] * b01 - matrix.m[14] * b00) * invDet;
m.m[15] = (matrix.m[8] * b03 - matrix.m[9] * b01 + matrix.m[10] * b00) * invDet;
return m;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment