Created
November 3, 2016 18:17
-
-
Save sakrist/b2c463226ebb29f5cc68dd0f2cd35c23 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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