Clutter Engine 0.0.1
Loading...
Searching...
No Matches
quaternion.inl
2#include "../geometric.hpp"
3#include "../exponential.hpp"
4#include "epsilon.hpp"
5#include <limits>
6
7namespace glm
8{
9 template<typename T, qualifier Q>
10 GLM_FUNC_QUALIFIER vec<3, T, Q> eulerAngles(qua<T, Q> const& x)
11 {
12 return vec<3, T, Q>(pitch(x), yaw(x), roll(x));
13 }
14
15 template<typename T, qualifier Q>
16 GLM_FUNC_QUALIFIER T roll(qua<T, Q> const& q)
17 {
18 return static_cast<T>(atan(static_cast<T>(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));
19 }
20
21 template<typename T, qualifier Q>
22 GLM_FUNC_QUALIFIER T pitch(qua<T, Q> const& q)
23 {
24 //return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));
25 T const y = static_cast<T>(2) * (q.y * q.z + q.w * q.x);
26 T const x = q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z;
27
28 if(all(equal(vec<2, T, Q>(x, y), vec<2, T, Q>(0), epsilon<T>()))) //avoid atan2(0,0) - handle singularity - Matiis
29 return static_cast<T>(static_cast<T>(2) * atan(q.x, q.w));
30
31 return static_cast<T>(atan(y, x));
32 }
33
34 template<typename T, qualifier Q>
35 GLM_FUNC_QUALIFIER T yaw(qua<T, Q> const& q)
36 {
37 return asin(clamp(static_cast<T>(-2) * (q.x * q.z - q.w * q.y), static_cast<T>(-1), static_cast<T>(1)));
38 }
39
40 template<typename T, qualifier Q>
41 GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat3_cast(qua<T, Q> const& q)
42 {
43 mat<3, 3, T, Q> Result(T(1));
44 T qxx(q.x * q.x);
45 T qyy(q.y * q.y);
46 T qzz(q.z * q.z);
47 T qxz(q.x * q.z);
48 T qxy(q.x * q.y);
49 T qyz(q.y * q.z);
50 T qwx(q.w * q.x);
51 T qwy(q.w * q.y);
52 T qwz(q.w * q.z);
53
54 Result[0][0] = T(1) - T(2) * (qyy + qzz);
55 Result[0][1] = T(2) * (qxy + qwz);
56 Result[0][2] = T(2) * (qxz - qwy);
57
58 Result[1][0] = T(2) * (qxy - qwz);
59 Result[1][1] = T(1) - T(2) * (qxx + qzz);
60 Result[1][2] = T(2) * (qyz + qwx);
61
62 Result[2][0] = T(2) * (qxz + qwy);
63 Result[2][1] = T(2) * (qyz - qwx);
64 Result[2][2] = T(1) - T(2) * (qxx + qyy);
65 return Result;
66 }
67
68 template<typename T, qualifier Q>
69 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat4_cast(qua<T, Q> const& q)
70 {
71 return mat<4, 4, T, Q>(mat3_cast(q));
72 }
73
74 template<typename T, qualifier Q>
75 GLM_FUNC_QUALIFIER qua<T, Q> quat_cast(mat<3, 3, T, Q> const& m)
76 {
77 T fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2];
78 T fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2];
79 T fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1];
80 T fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2];
81
82 int biggestIndex = 0;
83 T fourBiggestSquaredMinus1 = fourWSquaredMinus1;
84 if(fourXSquaredMinus1 > fourBiggestSquaredMinus1)
85 {
86 fourBiggestSquaredMinus1 = fourXSquaredMinus1;
87 biggestIndex = 1;
88 }
89 if(fourYSquaredMinus1 > fourBiggestSquaredMinus1)
90 {
91 fourBiggestSquaredMinus1 = fourYSquaredMinus1;
92 biggestIndex = 2;
93 }
94 if(fourZSquaredMinus1 > fourBiggestSquaredMinus1)
95 {
96 fourBiggestSquaredMinus1 = fourZSquaredMinus1;
97 biggestIndex = 3;
98 }
99
100 T biggestVal = sqrt(fourBiggestSquaredMinus1 + static_cast<T>(1)) * static_cast<T>(0.5);
101 T mult = static_cast<T>(0.25) / biggestVal;
102
103 switch(biggestIndex)
104 {
105 case 0:
106 return qua<T, Q>(biggestVal, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult);
107 case 1:
108 return qua<T, Q>((m[1][2] - m[2][1]) * mult, biggestVal, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult);
109 case 2:
110 return qua<T, Q>((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggestVal, (m[1][2] + m[2][1]) * mult);
111 case 3:
112 return qua<T, Q>((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggestVal);
113 default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity.
114 assert(false);
115 return qua<T, Q>(1, 0, 0, 0);
116 }
117 }
118
119 template<typename T, qualifier Q>
120 GLM_FUNC_QUALIFIER qua<T, Q> quat_cast(mat<4, 4, T, Q> const& m4)
121 {
122 return quat_cast(mat<3, 3, T, Q>(m4));
123 }
124
125 template<typename T, qualifier Q>
126 GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(qua<T, Q> const& x, qua<T, Q> const& y)
127 {
128 vec<4, bool, Q> Result;
129 for(length_t i = 0; i < x.length(); ++i)
130 Result[i] = x[i] < y[i];
131 return Result;
132 }
133
134 template<typename T, qualifier Q>
135 GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
136 {
137 vec<4, bool, Q> Result;
138 for(length_t i = 0; i < x.length(); ++i)
139 Result[i] = x[i] <= y[i];
140 return Result;
141 }
142
143 template<typename T, qualifier Q>
144 GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y)
145 {
146 vec<4, bool, Q> Result;
147 for(length_t i = 0; i < x.length(); ++i)
148 Result[i] = x[i] > y[i];
149 return Result;
150 }
151
152 template<typename T, qualifier Q>
153 GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
154 {
155 vec<4, bool, Q> Result;
156 for(length_t i = 0; i < x.length(); ++i)
157 Result[i] = x[i] >= y[i];
158 return Result;
159 }
160
161
162 template<typename T, qualifier Q>
163 GLM_FUNC_QUALIFIER qua<T, Q> quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)
164 {
165# if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT
166 return quatLookAtLH(direction, up);
167# else
168 return quatLookAtRH(direction, up);
169# endif
170 }
171
172 template<typename T, qualifier Q>
173 GLM_FUNC_QUALIFIER qua<T, Q> quatLookAtRH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)
174 {
175 mat<3, 3, T, Q> Result;
176
177 Result[2] = -direction;
178 Result[0] = normalize(cross(up, Result[2]));
179 Result[1] = cross(Result[2], Result[0]);
180
181 return quat_cast(Result);
182 }
183
184 template<typename T, qualifier Q>
185 GLM_FUNC_QUALIFIER qua<T, Q> quatLookAtLH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)
186 {
187 mat<3, 3, T, Q> Result;
188
189 Result[2] = direction;
190 Result[0] = normalize(cross(up, Result[2]));
191 Result[1] = cross(Result[2], Result[0]);
192
193 return quat_cast(Result);
194 }
195}//namespace glm
196
197#if GLM_CONFIG_SIMD == GLM_ENABLE
198# include "quaternion_simd.inl"
199#endif
200
GLM_FUNC_QUALIFIER vec< L, T, Q > sqrt(vec< L, T, Q > const &x)
Definition func_exponential.inl:128
GLM_FUNC_QUALIFIER vec< L, T, Q > normalize(vec< L, T, Q > const &x)
Definition func_geometric.inl:190
GLM_FUNC_QUALIFIER vec< 3, T, Q > cross(vec< 3, T, Q > const &x, vec< 3, T, Q > const &y)
Definition func_geometric.inl:175
GLM_FUNC_QUALIFIER vec< L, T, Q > asin(vec< L, T, Q > const &v)
Definition func_trigonometric.inl:68
GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool all(vec< L, bool, Q > const &v)
Definition func_vector_relational.inl:67
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > greaterThanEqual(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:31
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > greaterThan(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:22
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > lessThanEqual(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:13
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > lessThan(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:4
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > equal(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:40
GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()
Return the epsilon constant for floating point types.
Definition scalar_constants.inl:6
GLM_FUNC_DECL T roll(qua< T, Q > const &x)
Definition quaternion.inl:16
GLM_FUNC_DECL qua< T, Q > quat_cast(mat< 3, 3, T, Q > const &x)
Definition quaternion.inl:75
GLM_FUNC_DECL mat< 3, 3, T, Q > mat3_cast(qua< T, Q > const &x)
Definition quaternion.inl:41
GLM_FUNC_DECL qua< T, Q > quatLookAtRH(vec< 3, T, Q > const &direction, vec< 3, T, Q > const &up)
Definition quaternion.inl:173
GLM_FUNC_DECL qua< T, Q > quatLookAt(vec< 3, T, Q > const &direction, vec< 3, T, Q > const &up)
Definition quaternion.inl:163
GLM_FUNC_DECL T pitch(qua< T, Q > const &x)
Definition quaternion.inl:22
GLM_FUNC_DECL T yaw(qua< T, Q > const &x)
Definition quaternion.inl:35
GLM_FUNC_DECL mat< 4, 4, T, Q > mat4_cast(qua< T, Q > const &x)
Definition quaternion.inl:69
GLM_FUNC_DECL vec< 3, T, Q > eulerAngles(qua< T, Q > const &x)
Definition quaternion.inl:10
GLM_FUNC_DECL qua< T, Q > quatLookAtLH(vec< 3, T, Q > const &direction, vec< 3, T, Q > const &up)
Definition quaternion.inl:185
Core features
Definition common.hpp:21
Definition qualifier.hpp:36
Definition type_quat.hpp:20
Definition qualifier.hpp:35