20void GPUDisplay::createQuaternionFromMatrix(
float*
v,
const float* mat)
22 if (mat[0] > mat[5] && mat[0] > mat[10]) {
23 const float S = sqrt(std::max(0.f, 1.0f + mat[0] - mat[5] - mat[10])) * 2;
25 v[1] = (mat[4] + mat[1]) /
S;
26 v[2] = (mat[2] + mat[8]) /
S;
27 v[3] = (mat[9] - mat[6]) /
S;
28 }
else if (mat[5] > mat[10]) {
29 const float S = sqrt(std::max(0.f, 1.0f + mat[5] - mat[0] - mat[10])) * 2;
31 v[0] = (mat[4] + mat[1]) /
S;
32 v[2] = (mat[9] + mat[6]) /
S;
33 v[3] = (mat[2] - mat[8]) /
S;
35 float S = sqrt(std::max(0.f, 1.0f + mat[10] - mat[0] - mat[5])) * 2;
37 if (fabsf(
S) < 0.001f) {
40 v[0] = (mat[2] + mat[8]) /
S;
41 v[1] = (mat[9] + mat[6]) /
S;
42 v[3] = (mat[4] - mat[1]) /
S;
44 if (
v[0] *
v[0] +
v[1] *
v[1] +
v[2] *
v[2] +
v[3] *
v[3] < 0.0001f) {