gtc/quaternion.hpp
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 #ifndef GLM_GTC_quaternion
40 #define GLM_GTC_quaternion GLM_VERSION
41 
42 // Dependency:
43 #include "../glm.hpp"
44 #include "../gtc/half_float.hpp"
45 
46 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
47 # pragma message("GLM: GLM_GTC_quaternion extension included")
48 #endif
49 
50 namespace glm{
51 namespace detail
52 {
53  template <typename T>
54  struct tquat// : public genType<T, tquat>
55  {
56  enum ctor{null};
57 
58  typedef T value_type;
59  typedef std::size_t size_type;
60 
61  public:
62  value_type x, y, z, w;
63 
64  GLM_FUNC_DECL size_type length() const;
65 
66  // Constructors
67  tquat();
68  explicit tquat(
69  value_type const & s,
70  glm::detail::tvec3<T> const & v);
71  explicit tquat(
72  value_type const & w,
73  value_type const & x,
74  value_type const & y,
75  value_type const & z);
76 
77  // Convertions
78 
80  explicit tquat(
81  tvec3<T> const & eulerAngles);
82  explicit tquat(
83  tmat3x3<T> const & m);
84  explicit tquat(
85  tmat4x4<T> const & m);
86 
87  // Accesses
88  value_type & operator[](int i);
89  value_type const & operator[](int i) const;
90 
91  // Operators
92  tquat<T> & operator*=(value_type const & s);
93  tquat<T> & operator/=(value_type const & s);
94  };
95 
96  template <typename T>
97  detail::tquat<T> operator- (
98  detail::tquat<T> const & q);
99 
100  template <typename T>
101  detail::tquat<T> operator+ (
102  detail::tquat<T> const & q,
103  detail::tquat<T> const & p);
104 
105  template <typename T>
106  detail::tquat<T> operator* (
107  detail::tquat<T> const & q,
108  detail::tquat<T> const & p);
109 
110  template <typename T>
111  detail::tvec3<T> operator* (
112  detail::tquat<T> const & q,
113  detail::tvec3<T> const & v);
114 
115  template <typename T>
116  detail::tvec3<T> operator* (
117  detail::tvec3<T> const & v,
118  detail::tquat<T> const & q);
119 
120  template <typename T>
121  detail::tvec4<T> operator* (
122  detail::tquat<T> const & q,
123  detail::tvec4<T> const & v);
124 
125  template <typename T>
126  detail::tvec4<T> operator* (
127  detail::tvec4<T> const & v,
128  detail::tquat<T> const & q);
129 
130  template <typename T>
131  detail::tquat<T> operator* (
132  detail::tquat<T> const & q,
133  typename detail::tquat<T>::value_type const & s);
134 
135  template <typename T>
136  detail::tquat<T> operator* (
137  typename detail::tquat<T>::value_type const & s,
138  detail::tquat<T> const & q);
139 
140  template <typename T>
141  detail::tquat<T> operator/ (
142  detail::tquat<T> const & q,
143  typename detail::tquat<T>::value_type const & s);
144 
145 } //namespace detail
146 
149 
153  template <typename T>
154  T length(
155  detail::tquat<T> const & q);
156 
160  template <typename T>
161  detail::tquat<T> normalize(
162  detail::tquat<T> const & q);
163 
167  template <typename T>
168  T dot(
169  detail::tquat<T> const & q1,
170  detail::tquat<T> const & q2);
171 
175  template <typename T>
176  detail::tquat<T> mix(
177  detail::tquat<T> const & x,
178  detail::tquat<T> const & y,
179  T const & a);
180 
184  template <typename T>
185  detail::tquat<T> conjugate(
186  detail::tquat<T> const & q);
187 
191  template <typename T>
192  detail::tquat<T> inverse(
193  detail::tquat<T> const & q);
194 
202  template <typename T>
203  detail::tquat<T> rotate(
204  detail::tquat<T> const & q,
205  typename detail::tquat<T>::value_type const & angle,
206  detail::tvec3<T> const & axis);
207 
211  template <typename T>
212  detail::tvec3<T> eulerAngles(
213  detail::tquat<T> const & x);
214 
218  template <typename T>
219  detail::tmat3x3<T> mat3_cast(
220  detail::tquat<T> const & x);
221 
225  template <typename T>
226  detail::tmat4x4<T> mat4_cast(
227  detail::tquat<T> const & x);
228 
232  template <typename T>
233  detail::tquat<T> quat_cast(
234  detail::tmat3x3<T> const & x);
235 
239  template <typename T>
240  detail::tquat<T> quat_cast(
241  detail::tmat4x4<T> const & x);
242 
246  template <typename valType>
247  valType angle(
248  detail::tquat<valType> const & x);
249 
253  template <typename valType>
254  detail::tvec3<valType> axis(
255  detail::tquat<valType> const & x);
256 
265  template <typename valType>
266  detail::tquat<valType> angleAxis(
267  valType const & angle,
268  valType const & x,
269  valType const & y,
270  valType const & z);
271 
278  template <typename valType>
279  detail::tquat<valType> angleAxis(
280  valType const & angle,
281  detail::tvec3<valType> const & axis);
282 
286  typedef detail::tquat<float> quat;
287 
291  typedef detail::tquat<detail::half> hquat;
292 
296  typedef detail::tquat<float> fquat;
297 
301  typedef detail::tquat<double> dquat;
302 
306  typedef detail::tquat<lowp_float> lowp_quat;
307 
311  typedef detail::tquat<mediump_float> mediump_quat;
312 
316  typedef detail::tquat<highp_float> highp_quat;
317 
319 } //namespace glm
320 
321 #include "quaternion.inl"
322 
323 #endif//GLM_GTC_quaternion