8 float4 Q(q.x, q.y, q.z, q.w);
9 float4 absQ(abs(Q.x), abs(Q.y), abs(Q.z), abs(Q.w));
10 float absMax = max(max(absQ.x, absQ.y), max(absQ.z, absQ.w));
12 if (absQ[0] == absMax)
14 if (absQ[1] == absMax)
16 if (absQ[2] == absMax)
18 if (absQ[3] == absMax)
32 packed = packed * 0.5f + 0.5f;
33 return float4(packed, maxIndex / 3.0f);
39 uint maxIndex = packed.w * 3.0f;
40 float3 p = packed.xyz() * 2.0f - 1.0f;
43 float maxValue = sqrt(max(.0f, 1 - p.x * p.x - p.y * p.y - p.z * p.z));
45 Q =
float4(maxValue, p.xyz);
46 else if (maxIndex == 1)
47 Q =
float4(p.x, maxValue, p.yz);
48 else if (maxIndex == 2)
49 Q =
float4(p.xy, maxValue, p.z);
51 Q =
float4(p.xyz, maxValue);
52 return quat(Q.x, Q.y, Q.z, Q.w);