111# ifdef GLM_FORCE_QUAT_DATA_WXYZ
112 : w(q.w), x(q.x), y(q.y), z(q.z)
114 : x(q.x), y(q.y), z(q.z), w(q.w)
119 template<
typename T, qualifier Q>
120 template<qualifier P>
122# ifdef GLM_FORCE_QUAT_DATA_WXYZ
123 : w(q.w), x(q.x), y(q.y), z(q.z)
125 : x(q.x), y(q.y), z(q.z), w(q.w)
131 template<
typename T, qualifier Q>
132 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q>::qua(T s, vec<3, T, Q>
const& v)
133# ifdef GLM_FORCE_QUAT_DATA_WXYZ
134 : w(s), x(v.x), y(v.y), z(v.z)
136 : x(v.x), y(v.y), z(v.z), w(s)
140 template <
typename T, qualifier Q>
141 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q>::qua(T _w, T _x, T _y, T _z)
142# ifdef GLM_FORCE_QUAT_DATA_WXYZ
143 : w(_w), x(_x), y(_y), z(_z)
145 : x(_x), y(_y), z(_z), w(_w)
151 template<
typename T, qualifier Q>
152 template<
typename U, qualifier P>
153 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q>::qua(qua<U, P>
const& q)
154# ifdef GLM_FORCE_QUAT_DATA_WXYZ
155 : w(
static_cast<T
>(q.w)), x(
static_cast<T
>(q.x)), y(
static_cast<T
>(q.y)), z(
static_cast<T
>(q.z))
157 : x(
static_cast<T
>(q.x)), y(
static_cast<T
>(q.y)), z(
static_cast<T
>(q.z)), w(
static_cast<T
>(q.w))
179 template<
typename T, qualifier Q>
182 T norm_u_norm_v =
sqrt(dot(u, u) * dot(v, v));
183 T real_part = norm_u_norm_v + dot(u, v);
186 if(real_part <
static_cast<T
>(1.e-6f) * norm_u_norm_v)
191 real_part =
static_cast<T
>(0);
203 template<
typename T, qualifier Q>
209 this->w = c.x * c.y * c.z + s.x * s.y * s.z;
210 this->x = s.x * c.y * c.z - c.x * s.y * s.z;
211 this->y = c.x * s.y * c.z + s.x * c.y * s.z;
212 this->z = c.x * c.y * s.z - s.x * s.y * c.z;
215 template<
typename T, qualifier Q>
221 template<
typename T, qualifier Q>
222 GLM_FUNC_QUALIFIER qua<T, Q>::qua(mat<4, 4, T, Q>
const& m)
227# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS
228 template<
typename T, qualifier Q>
229 GLM_FUNC_QUALIFIER qua<T, Q>::operator mat<3, 3, T, Q>()
const
234 template<
typename T, qualifier Q>
235 GLM_FUNC_QUALIFIER qua<T, Q>::operator mat<4, 4, T, Q>()
const
243# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
244 template<
typename T, qualifier Q>
245 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator=(qua<T, Q>
const& q)
255 template<
typename T, qualifier Q>
257 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator=(qua<U, Q>
const& q)
259 this->w =
static_cast<T
>(q.w);
260 this->x =
static_cast<T
>(q.x);
261 this->y =
static_cast<T
>(q.y);
262 this->z =
static_cast<T
>(q.z);
266 template<
typename T, qualifier Q>
268 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator+=(qua<U, Q>
const& q)
270 return (*
this = detail::compute_quat_add<T, Q, detail::is_aligned<Q>::value>::call(*
this, qua<T, Q>(q)));
273 template<
typename T, qualifier Q>
275 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator-=(qua<U, Q>
const& q)
277 return (*
this = detail::compute_quat_sub<T, Q, detail::is_aligned<Q>::value>::call(*
this, qua<T, Q>(q)));
280 template<
typename T, qualifier Q>
282 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator*=(qua<U, Q>
const& r)
284 qua<T, Q>
const p(*
this);
285 qua<T, Q>
const q(r);
287 this->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z;
288 this->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y;
289 this->y = p.w * q.y + p.y * q.w + p.z * q.x - p.x * q.z;
290 this->z = p.w * q.z + p.z * q.w + p.x * q.y - p.y * q.x;
294 template<
typename T, qualifier Q>
296 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator*=(U s)
298 return (*
this = detail::compute_quat_mul_scalar<T, Q, detail::is_aligned<Q>::value>::call(*
this,
static_cast<U
>(s)));
301 template<
typename T, qualifier Q>
303 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> & qua<T, Q>::operator/=(U s)
305 return (*
this = detail::compute_quat_div_scalar<T, Q, detail::is_aligned<Q>::value>::call(*
this,
static_cast<U
>(s)));
310 template<
typename T, qualifier Q>
311 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q>
const& q)
316 template<
typename T, qualifier Q>
317 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q>
const& q)
319 return qua<T, Q>(-q.w, -q.x, -q.y, -q.z);
324 template<
typename T, qualifier Q>
325 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q>
const& q, qua<T, Q>
const& p)
327 return qua<T, Q>(q) += p;
330 template<
typename T, qualifier Q>
331 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q>
const& q, qua<T, Q>
const& p)
333 return qua<T, Q>(q) -= p;
336 template<
typename T, qualifier Q>
337 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q>
const& q, qua<T, Q>
const& p)
339 return qua<T, Q>(q) *= p;
342 template<
typename T, qualifier Q>
343 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(qua<T, Q>
const& q, vec<3, T, Q>
const& v)
345 vec<3, T, Q>
const QuatVector(q.x, q.y, q.z);
346 vec<3, T, Q>
const uv(
glm::cross(QuatVector, v));
347 vec<3, T, Q>
const uuv(
glm::cross(QuatVector, uv));
349 return v + ((uv * q.w) + uuv) *
static_cast<T
>(2);
352 template<
typename T, qualifier Q>
353 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q>
const& v, qua<T, Q>
const& q)
358 template<
typename T, qualifier Q>
359 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(qua<T, Q>
const& q, vec<4, T, Q>
const& v)
361 return detail::compute_quat_mul_vec4<T, Q, detail::is_aligned<Q>::value>::call(q, v);
364 template<
typename T, qualifier Q>
365 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q>
const& v, qua<T, Q>
const& q)
370 template<
typename T, qualifier Q>
371 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q>
const& q, T
const& s)
374 q.w * s, q.x * s, q.y * s, q.z * s);
377 template<
typename T, qualifier Q>
378 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator*(T
const& s, qua<T, Q>
const& q)
383 template<
typename T, qualifier Q>
384 GLM_FUNC_QUALIFIER GLM_CONSTEXPR qua<T, Q> operator/(qua<T, Q>
const& q, T
const& s)
387 q.w / s, q.x / s, q.y / s, q.z / s);
392 template<
typename T, qualifier Q>
393 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
bool operator==(qua<T, Q>
const& q1, qua<T, Q>
const& q2)
395 return q1.x == q2.x && q1.y == q2.y && q1.z == q2.z && q1.w == q2.w;
398 template<
typename T, qualifier Q>
399 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
bool operator!=(qua<T, Q>
const& q1, qua<T, Q>
const& q2)
401 return q1.x != q2.x || q1.y != q2.y || q1.z != q2.z || q1.w != q2.w;
405#if GLM_CONFIG_SIMD == GLM_ENABLE
406# include "type_quat_simd.inl"