scalar_t m4_determinant(mat4_t m) { scalar_t det11 = (m[1][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[1][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + (m[1][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); scalar_t det12 = (m[1][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - (m[1][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[1][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); scalar_t det13 = (m[1][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - (m[1][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + (m[1][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); scalar_t det14 = (m[1][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - (m[1][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + (m[1][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); return m[0][0] * det11 - m[0][1] * det12 + m[0][2] * det13 - m[0][3] * det14; }