1 /// @ref core
2 /// @file glm/detail/type_quat.hpp
3 
4 #pragma once
5 
6 // Dependency:
7 #include "../detail/type_mat3x3.hpp"
8 #include "../detail/type_mat4x4.hpp"
9 #include "../detail/type_vec3.hpp"
10 #include "../detail/type_vec4.hpp"
11 #include "../ext/vector_relational.hpp"
12 #include "../ext/quaternion_relational.hpp"
13 #include "../gtc/constants.hpp"
14 #include "../gtc/matrix_transform.hpp"
15 
16 namespace glm
17 {
18 	template<typename T, qualifier Q>
19 	struct qua
20 	{
21 		// -- Implementation detail --
22 
23 		typedef qua<T, Q> type;
24 		typedef T value_type;
25 
26 		// -- Data --
27 
28 #		if GLM_SILENT_WARNINGS == GLM_ENABLE
29 #			if GLM_COMPILER & GLM_COMPILER_GCC
30 #				pragma GCC diagnostic push
31 #				pragma GCC diagnostic ignored "-Wpedantic"
32 #			elif GLM_COMPILER & GLM_COMPILER_CLANG
33 #				pragma clang diagnostic push
34 #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
35 #				pragma clang diagnostic ignored "-Wnested-anon-types"
36 #			elif GLM_COMPILER & GLM_COMPILER_VC
37 #				pragma warning(push)
38 #				pragma warning(disable: 4201)  // nonstandard extension used : nameless struct/union
39 #			endif
40 #		endif
41 
42 #		if GLM_LANG & GLM_LANG_CXXMS_FLAG
43 			union
44 			{
45 #				ifdef GLM_FORCE_QUAT_DATA_WXYZ
46 					struct { T w, x, y, z; };
47 #				else
48 					struct { T x, y, z, w; };
49 #				endif
50 
51 				typename detail::storage<4, T, detail::is_aligned<Q>::value>::type data;
52 			};
53 #		else
54 #			ifdef GLM_FORCE_QUAT_DATA_WXYZ
55 				T w, x, y, z;
56 #			else
57 				T x, y, z, w;
58 #			endif
59 #		endif
60 
61 #		if GLM_SILENT_WARNINGS == GLM_ENABLE
62 #			if GLM_COMPILER & GLM_COMPILER_CLANG
63 #				pragma clang diagnostic pop
64 #			elif GLM_COMPILER & GLM_COMPILER_GCC
65 #				pragma GCC diagnostic pop
66 #			elif GLM_COMPILER & GLM_COMPILER_VC
67 #				pragma warning(pop)
68 #			endif
69 #		endif
70 
71 		// -- Component accesses --
72 
73 		typedef length_t length_type;
74 
75 		/// Return the count of components of a quaternion
lengthglm::qua76 		GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;}
77 
78 		GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i);
79 		GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const;
80 
81 		// -- Implicit basic constructors --
82 
83 		GLM_FUNC_DECL GLM_CONSTEXPR qua() GLM_DEFAULT;
84 		GLM_FUNC_DECL GLM_CONSTEXPR qua(qua<T, Q> const& q) GLM_DEFAULT;
85 		template<qualifier P>
86 		GLM_FUNC_DECL GLM_CONSTEXPR qua(qua<T, P> const& q);
87 
88 		// -- Explicit basic constructors --
89 
90 		GLM_FUNC_DECL GLM_CONSTEXPR qua(T s, vec<3, T, Q> const& v);
91 		GLM_FUNC_DECL GLM_CONSTEXPR qua(T w, T x, T y, T z);
92 
93 		// -- Conversion constructors --
94 
95 		template<typename U, qualifier P>
96 		GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(qua<U, P> const& q);
97 
98 		/// Explicit conversion operators
99 #		if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS
100 			GLM_FUNC_DECL explicit operator mat<3, 3, T, Q>() const;
101 			GLM_FUNC_DECL explicit operator mat<4, 4, T, Q>() const;
102 #		endif
103 
104 		/// Create a quaternion from two normalized axis
105 		///
106 		/// @param u A first normalized axis
107 		/// @param v A second normalized axis
108 		/// @see gtc_quaternion
109 		/// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
110 		GLM_FUNC_DECL qua(vec<3, T, Q> const& u, vec<3, T, Q> const& v);
111 
112 		/// Build a quaternion from euler angles (pitch, yaw, roll), in radians.
113 		GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT qua(vec<3, T, Q> const& eulerAngles);
114 		GLM_FUNC_DECL GLM_EXPLICIT qua(mat<3, 3, T, Q> const& q);
115 		GLM_FUNC_DECL GLM_EXPLICIT qua(mat<4, 4, T, Q> const& q);
116 
117 		// -- Unary arithmetic operators --
118 
119 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator=(qua<T, Q> const& q) GLM_DEFAULT;
120 
121 		template<typename U>
122 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator=(qua<U, Q> const& q);
123 		template<typename U>
124 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator+=(qua<U, Q> const& q);
125 		template<typename U>
126 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator-=(qua<U, Q> const& q);
127 		template<typename U>
128 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator*=(qua<U, Q> const& q);
129 		template<typename U>
130 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator*=(U s);
131 		template<typename U>
132 		GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q>& operator/=(U s);
133 	};
134 
135 	// -- Unary bit operators --
136 
137 	template<typename T, qualifier Q>
138 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q> const& q);
139 
140 	template<typename T, qualifier Q>
141 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q> const& q);
142 
143 	// -- Binary operators --
144 
145 	template<typename T, qualifier Q>
146 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q> const& q, qua<T, Q> const& p);
147 
148 	template<typename T, qualifier Q>
149 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q> const& q, qua<T, Q> const& p);
150 
151 	template<typename T, qualifier Q>
152 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q> const& q, qua<T, Q> const& p);
153 
154 	template<typename T, qualifier Q>
155 	GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(qua<T, Q> const& q, vec<3, T, Q> const& v);
156 
157 	template<typename T, qualifier Q>
158 	GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua<T, Q> const& q);
159 
160 	template<typename T, qualifier Q>
161 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(qua<T, Q> const& q, vec<4, T, Q> const& v);
162 
163 	template<typename T, qualifier Q>
164 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua<T, Q> const& q);
165 
166 	template<typename T, qualifier Q>
167 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q> const& q, T const& s);
168 
169 	template<typename T, qualifier Q>
170 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(T const& s, qua<T, Q> const& q);
171 
172 	template<typename T, qualifier Q>
173 	GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator/(qua<T, Q> const& q, T const& s);
174 
175 	// -- Boolean operators --
176 
177 	template<typename T, qualifier Q>
178 	GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(qua<T, Q> const& q1, qua<T, Q> const& q2);
179 
180 	template<typename T, qualifier Q>
181 	GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(qua<T, Q> const& q1, qua<T, Q> const& q2);
182 } //namespace glm
183 
184 #ifndef GLM_EXTERNAL_TEMPLATE
185 #include "type_quat.inl"
186 #endif//GLM_EXTERNAL_TEMPLATE
187