0.9.6
gtc/quaternion.hpp
Go to the documentation of this file.
1 
44 #pragma once
45 
46 // Dependency:
47 #include "../mat3x3.hpp"
48 #include "../mat4x4.hpp"
49 #include "../vec3.hpp"
50 #include "../vec4.hpp"
51 #include "../gtc/constants.hpp"
52 
53 #if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
54 # pragma message("GLM: GLM_GTC_quaternion extension included")
55 #endif
56 
57 namespace glm
58 {
61 
62  template <typename T, precision P>
63  struct tquat
64  {
65  typedef tquat<T, P> type;
66  typedef T value_type;
67 
68  public:
69  T x, y, z, w;
70 
72  // Component accesses
73 
74 # ifdef GLM_FORCE_SIZE_FUNC
75  typedef size_t size_type;
77  GLM_FUNC_DECL GLM_CONSTEXPR size_type size() const;
78 
79  GLM_FUNC_DECL T & operator[](size_type i);
80  GLM_FUNC_DECL T const & operator[](size_type i) const;
81 # else
82  typedef length_t length_type;
84  GLM_FUNC_DECL GLM_CONSTEXPR length_type length() const;
85 
86  GLM_FUNC_DECL T & operator[](length_type i);
87  GLM_FUNC_DECL T const & operator[](length_type i) const;
88 # endif//GLM_FORCE_SIZE_FUNC
89 
91  // Implicit basic constructors
92 
93  GLM_FUNC_DECL tquat();
94  template <precision Q>
95  GLM_FUNC_DECL tquat(tquat<T, Q> const & q);
96 
98  // Explicit basic constructors
99 
100  GLM_FUNC_DECL explicit tquat(ctor);
101  GLM_FUNC_DECL explicit tquat(T const & s, tvec3<T, P> const & v);
102  GLM_FUNC_DECL tquat(T const & w, T const & x, T const & y, T const & z);
103 
105  // Convertions
106 
107 # ifdef GLM_FORCE_EXPLICIT_CTOR
108  template <typename U, precision Q>
109  GLM_FUNC_DECL explicit tquat(tquat<U, Q> const & q);
110 # else
111  template <typename U, precision Q>
112  GLM_FUNC_DECL tquat(tquat<U, Q> const & q);
113 # endif
114 
115  // explicit conversion operators
116  GLM_FUNC_DECL explicit operator tmat3x3<T, P>();
117  GLM_FUNC_DECL explicit operator tmat4x4<T, P>();
118 
125  GLM_FUNC_DECL explicit tquat(tvec3<T, P> const & u, tvec3<T, P> const & v);
126 
128  GLM_FUNC_DECL explicit tquat(tvec3<T, P> const & eulerAngles);
129  GLM_FUNC_DECL explicit tquat(tmat3x3<T, P> const & m);
130  GLM_FUNC_DECL explicit tquat(tmat4x4<T, P> const & m);
131 
133  // Operators
134  GLM_FUNC_DECL tquat<T, P> & operator+=(tquat<T, P> const & q);
135  GLM_FUNC_DECL tquat<T, P> & operator*=(tquat<T, P> const & q);
136  GLM_FUNC_DECL tquat<T, P> & operator*=(T const & s);
137  GLM_FUNC_DECL tquat<T, P> & operator/=(T const & s);
138  };
139 
140  template <typename T, precision P>
141  GLM_FUNC_DECL tquat<T, P> operator-(tquat<T, P> const & q);
142 
143  template <typename T, precision P>
144  GLM_FUNC_DECL tquat<T, P> operator+(tquat<T, P> const & q, tquat<T, P> const & p);
145 
146  template <typename T, precision P>
147  GLM_FUNC_DECL tquat<T, P> operator*(tquat<T, P> const & q, tquat<T, P> const & p);
148 
149  template <typename T, precision P>
150  GLM_FUNC_DECL tvec3<T, P> operator*(tquat<T, P> const & q, tvec3<T, P> const & v);
151 
152  template <typename T, precision P>
153  GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, tquat<T, P> const & q);
154 
155  template <typename T, precision P>
156  GLM_FUNC_DECL tvec4<T, P> operator*(tquat<T, P> const & q, tvec4<T, P> const & v);
157 
158  template <typename T, precision P>
159  GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, tquat<T, P> const & q);
160 
161  template <typename T, precision P>
162  GLM_FUNC_DECL tquat<T, P> operator*(tquat<T, P> const & q, T const & s);
163 
164  template <typename T, precision P>
165  GLM_FUNC_DECL tquat<T, P> operator*(T const & s, tquat<T, P> const & q);
166 
167  template <typename T, precision P>
168  GLM_FUNC_DECL tquat<T, P> operator/(tquat<T, P> const & q, T const & s);
169 
173  template <typename T, precision P>
174  GLM_FUNC_DECL T length(tquat<T, P> const & q);
175 
179  template <typename T, precision P>
180  GLM_FUNC_DECL tquat<T, P> normalize(tquat<T, P> const & q);
181 
185  template <typename T, precision P, template <typename, precision> class quatType>
186  GLM_FUNC_DECL T dot(quatType<T, P> const & x, quatType<T, P> const & y);
187 
198  template <typename T, precision P>
199  GLM_FUNC_DECL tquat<T, P> mix(tquat<T, P> const & x, tquat<T, P> const & y, T const & a);
200 
209  template <typename T, precision P>
210  GLM_FUNC_DECL tquat<T, P> lerp(tquat<T, P> const & x, tquat<T, P> const & y, T const & a);
211 
220  template <typename T, precision P>
221  GLM_FUNC_DECL tquat<T, P> slerp(tquat<T, P> const & x, tquat<T, P> const & y, T const & a);
222 
226  template <typename T, precision P>
227  GLM_FUNC_DECL tquat<T, P> conjugate(tquat<T, P> const & q);
228 
232  template <typename T, precision P>
233  GLM_FUNC_DECL tquat<T, P> inverse(tquat<T, P> const & q);
234 
242  template <typename T, precision P>
243  GLM_FUNC_DECL tquat<T, P> rotate(tquat<T, P> const & q, T const & angle, tvec3<T, P> const & axis);
244 
249  template <typename T, precision P>
250  GLM_FUNC_DECL tvec3<T, P> eulerAngles(tquat<T, P> const & x);
251 
255  template <typename T, precision P>
256  GLM_FUNC_DECL T roll(tquat<T, P> const & x);
257 
261  template <typename T, precision P>
262  GLM_FUNC_DECL T pitch(tquat<T, P> const & x);
263 
267  template <typename T, precision P>
268  GLM_FUNC_DECL T yaw(tquat<T, P> const & x);
269 
273  template <typename T, precision P>
274  GLM_FUNC_DECL tmat3x3<T, P> mat3_cast(tquat<T, P> const & x);
275 
279  template <typename T, precision P>
280  GLM_FUNC_DECL tmat4x4<T, P> mat4_cast(tquat<T, P> const & x);
281 
285  template <typename T, precision P>
286  GLM_FUNC_DECL tquat<T, P> quat_cast(tmat3x3<T, P> const & x);
287 
291  template <typename T, precision P>
292  GLM_FUNC_DECL tquat<T, P> quat_cast(tmat4x4<T, P> const & x);
293 
297  template <typename T, precision P>
298  GLM_FUNC_DECL T angle(tquat<T, P> const & x);
299 
303  template <typename T, precision P>
304  GLM_FUNC_DECL tvec3<T, P> axis(tquat<T, P> const & x);
305 
312  template <typename T, precision P>
313  GLM_FUNC_DECL tquat<T, P> angleAxis(T const & angle, tvec3<T, P> const & axis);
314 
320  template <typename T, precision P>
321  GLM_FUNC_DECL tvec4<bool, P> lessThan(tquat<T, P> const & x, tquat<T, P> const & y);
322 
328  template <typename T, precision P>
329  GLM_FUNC_DECL tvec4<bool, P> lessThanEqual(tquat<T, P> const & x, tquat<T, P> const & y);
330 
336  template <typename T, precision P>
337  GLM_FUNC_DECL tvec4<bool, P> greaterThan(tquat<T, P> const & x, tquat<T, P> const & y);
338 
344  template <typename T, precision P>
345  GLM_FUNC_DECL tvec4<bool, P> greaterThanEqual(tquat<T, P> const & x, tquat<T, P> const & y);
346 
352  template <typename T, precision P>
353  GLM_FUNC_DECL tvec4<bool, P> equal(tquat<T, P> const & x, tquat<T, P> const & y);
354 
360  template <typename T, precision P>
361  GLM_FUNC_DECL tvec4<bool, P> notEqual(tquat<T, P> const & x, tquat<T, P> const & y);
363 } //namespace glm
364 
365 #include "quaternion.inl"
GLM_FUNC_DECL tquat< T, P > quat_cast(tmat4x4< T, P > const &x)
Converts a 4 * 4 matrix to a quaternion.
GLM_FUNC_DECL tquat< T, P > rotate(tquat< T, P > const &q, T const &angle, tvec3< T, P > const &axis)
Rotates a quaternion from a vector of 3 components axis and an angle.
GLM_FUNC_DECL tvec4< bool, P > lessThanEqual(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison of result x <= y.
GLM_FUNC_DECL tvec4< bool, P > lessThan(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison result of x < y.
GLM_FUNC_DECL tvec4< bool, P > notEqual(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison of result x != y.
GLM_FUNC_DECL tquat< T, P > inverse(tquat< T, P > const &q)
Returns the q inverse.
GLM_FUNC_DECL T length(tquat< T, P > const &q)
Returns the length of the quaternion.
GLM_FUNC_DECL tvec3< T, P > axis(tquat< T, P > const &x)
Returns the q rotation axis.
GLM_FUNC_DECL tquat< T, P > slerp(tquat< T, P > const &x, tquat< T, P > const &y, T const &a)
Spherical linear interpolation of two quaternions.
GLM_FUNC_DECL tmat3x3< T, P > mat3_cast(tquat< T, P > const &x)
Converts a quaternion to a 3 * 3 matrix.
GLM_FUNC_DECL T dot(quatType< T, P > const &x, quatType< T, P > const &y)
Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...
GLM_FUNC_DECL T angle(tquat< T, P > const &x)
Returns the quaternion rotation angle.
GLM_FUNC_DECL tvec3< T, P > eulerAngles(tquat< T, P > const &x)
Returns euler angles, yitch as x, yaw as y, roll as z.
GLM_FUNC_DECL tvec4< bool, P > greaterThan(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison of result x > y.
GLM_FUNC_DECL tquat< T, P > mix(tquat< T, P > const &x, tquat< T, P > const &y, T const &a)
Spherical linear interpolation of two quaternions.
GLM_FUNC_DECL tquat< T, P > normalize(tquat< T, P > const &q)
Returns the normalized quaternion.
GLM_FUNC_DECL tvec4< bool, P > equal(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison of result x == y.
GLM_FUNC_DECL T pitch(tquat< T, P > const &x)
Returns pitch value of euler angles expressed in radians.
GLM_FUNC_DECL tvec4< bool, P > greaterThanEqual(tquat< T, P > const &x, tquat< T, P > const &y)
Returns the component-wise comparison of result x >= y.
GLM_FUNC_DECL T roll(tquat< T, P > const &x)
Returns roll value of euler angles expressed in radians.
Definition: _noise.hpp:39
GLM_FUNC_DECL tquat< T, P > conjugate(tquat< T, P > const &q)
Returns the q conjugate.
GLM_FUNC_DECL tmat4x4< T, P > mat4_cast(tquat< T, P > const &x)
Converts a quaternion to a 4 * 4 matrix.
GLM_FUNC_DECL tquat< T, P > angleAxis(T const &angle, tvec3< T, P > const &axis)
Build a quaternion from an angle and a normalized axis.
GLM_FUNC_DECL T yaw(tquat< T, P > const &x)
Returns yaw value of euler angles expressed in radians.
GLM_FUNC_DECL tquat< T, P > lerp(tquat< T, P > const &x, tquat< T, P > const &y, T const &a)
Linear interpolation of two quaternions.