1b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///////////////////////////////////////////////////////////////////////////////////
2b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// OpenGL Mathematics (glm.g-truc.net)
3b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
4b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
5b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// Permission is hereby granted, free of charge, to any person obtaining a copy
6b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// of this software and associated documentation files (the "Software"), to deal
7b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// in the Software without restriction, including without limitation the rights
8b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// copies of the Software, and to permit persons to whom the Software is
10b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// furnished to do so, subject to the following conditions:
11b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
12b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// The above copyright notice and this permission notice shall be included in
13b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// all copies or substantial portions of the Software.
14b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
15b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// THE SOFTWARE.
22b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
23b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @ref gtx_dual_quaternion
24b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @file glm/gtx/dual_quaternion.hpp
25b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @date 2013-02-10 / 2013-02-20
26b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @author Maksim Vorobiev (msomeone@gmail.com)
27b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
28b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @see core (dependence)
29b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @see gtc_half_float (dependence)
30b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @see gtc_constants (dependence)
31b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @see gtc_quaternion (dependence)
32b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
33b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @defgroup gtc_dual_quaternion GLM_GTX_dual_quaternion
34b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @ingroup gtc
35b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
36b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @brief Defines a templated dual-quaternion type and several dual-quaternion operations.
37b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
38b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// <glm/gtx/dual_quaternion.hpp> need to be included to use these functionalities.
39b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///////////////////////////////////////////////////////////////////////////////////
40b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
41b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#ifndef GLM_GTX_dual_quaternion
42b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define GLM_GTX_dual_quaternion
43b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
44b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Dependency:
45b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "../glm.hpp"
46b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "../gtc/constants.hpp"
47b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "../gtc/quaternion.hpp"
48b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
49b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
50b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#	pragma message("GLM: GLM_GTX_dual_quaternion extension included")
51b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif
52b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
53b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGnamespace glm{
54b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGnamespace detail
55b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
56b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
57b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	struct tdualquat
58b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	{
59b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		enum ctor{null};
60b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
61b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		typedef glm::detail::tquat<T, P> part_type;
62b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
63b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	public:
64b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		glm::detail::tquat<T, P> real, dual;
65b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
66b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL GLM_CONSTEXPR int length() const;
67b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
68b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		// Constructors
69b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL tdualquat();
70b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL explicit tdualquat(tquat<T, P> const & real);
71b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL tdualquat(tquat<T, P> const & real,tquat<T, P> const & dual);
72b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL tdualquat(tquat<T, P> const & orientation,tvec3<T, P> const& translation);
73b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
74b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		//////////////////////////////////////////////////////////////
75b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		// tdualquat conversions
76b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL explicit tdualquat(tmat2x4<T, P> const & holder_mat);
77b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL explicit tdualquat(tmat3x4<T, P> const & aug_mat);
78b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
79b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		// Accesses
80b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL part_type & operator[](int i);
81b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL part_type const & operator[](int i) const;
82b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
83b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		// Operators
84b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL tdualquat<T, P> & operator*=(T const & s);
85b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		GLM_FUNC_DECL tdualquat<T, P> & operator/=(T const & s);
86b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	};
87b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
88b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
89b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tquat<T, P> operator- (
90b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tquat<T, P> const & q);
91b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
92b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
93b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> operator+ (
94b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q,
95b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & p);
96b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
97b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
98b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> operator* (
99b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q,
100b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & p);
101b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
102b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
103b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tvec3<T, P> operator* (
104b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tquat<T, P> const & q,
105b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tvec3<T, P> const & v);
106b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
107b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
108b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tvec3<T, P> operator* (
109b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tvec3<T, P> const & v,
110b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tquat<T, P> const & q);
111b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
112b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
113b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tvec4<T, P> operator* (
114b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tquat<T, P> const & q,
115b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tvec4<T, P> const & v);
116b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
117b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
118b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tvec4<T, P> operator* (
119b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tvec4<T, P> const & v,
120b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tquat<T, P> const & q);
121b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
122b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
123b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> operator* (
124b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q,
125b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		T const & s);
126b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
127b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
128b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> operator* (
129b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		T const & s,
130b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q);
131b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
132b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
133b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> operator/ (
134b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q,
135b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		T const & s);
136b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG} //namespace detail
137b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
138b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @addtogroup gtc_dual_quaternion
139b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @{
140b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
141b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Returns the normalized quaternion.
142b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
143b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
144b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
145b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> normalize(
146b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q);
147b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
148b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Returns the linear interpolation of two dual quaternion.
149b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
150b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
151b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
152b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> lerp(
153b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & x,
154b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & y,
155b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		T const & a);
156b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
157b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Returns the q inverse.
158b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
159b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
160b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
161b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> inverse(
162b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & q);
163b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
164b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/*
165b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Extracts a rotation part from dual-quaternion to a 3 * 3 matrix.
166b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// TODO
167b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
168b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
169b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
170b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	detail::tmat3x3<T, P> mat3_cast(
171b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & x);
172b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	*/
173b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
174b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Converts a quaternion to a 2 * 4 matrix.
175b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
176b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
177b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
178b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tmat2x4<T, P> mat2x4_cast(
179b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & x);
180b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
181b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Converts a quaternion to a 3 * 4 matrix.
182b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
183b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
184b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
185b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tmat3x4<T, P> mat3x4_cast(
186b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tdualquat<T, P> const & x);
187b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
188b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion.
189b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
190b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
191b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
192b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> dualquat_cast(
193b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tmat2x4<T, P> const & x);
194b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
195b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.
196b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
197b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
198b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	template <typename T, precision P>
199b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	GLM_FUNC_DECL detail::tdualquat<T, P> dualquat_cast(
200b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		detail::tmat3x4<T, P> const & x);
201b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
202b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
203b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of low single-precision floating-point numbers.
204b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
205b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
206b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, lowp>		lowp_dualquat;
207b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
208b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of medium single-precision floating-point numbers.
209b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
210b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
211b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, mediump>	mediump_dualquat;
212b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
213b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of high single-precision floating-point numbers.
214b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
215b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
216b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, highp>		highp_dualquat;
217b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
218b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
219b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of low single-precision floating-point numbers.
220b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
221b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
222b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, lowp>		lowp_fdualquat;
223b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
224b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of medium single-precision floating-point numbers.
225b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
226b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
227b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, mediump>	mediump_fdualquat;
228b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
229b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of high single-precision floating-point numbers.
230b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
231b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
232b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<float, highp>		highp_fdualquat;
233b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
234b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
235b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of low double-precision floating-point numbers.
236b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
237b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
238b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<double, lowp>		lowp_ddualquat;
239b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
240b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of medium double-precision floating-point numbers.
241b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
242b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
243b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<double, mediump>	mediump_ddualquat;
244b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
245b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of high double-precision floating-point numbers.
246b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
247b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
248b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef detail::tdualquat<double, highp>	highp_ddualquat;
249b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
250b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
251b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
252b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of floating-point numbers.
253b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
254b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
255b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_fdualquat			dualquat;
256b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
257b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of single-precision floating-point numbers.
258b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
259b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
260b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_fdualquat			fdualquat;
261b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
262b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_fdualquat			dualquat;
263b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_fdualquat			fdualquat;
264b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
265b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef mediump_fdualquat		dualquat;
266b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef mediump_fdualquat		fdualquat;
267b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT))
268b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef lowp_fdualquat			dualquat;
269b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef lowp_fdualquat			fdualquat;
270b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#else
271b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#	error "GLM error: multiple default precision requested for single-precision floating-point types"
272b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif
273b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
274b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
275b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))
276b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// Dual-quaternion of default double-precision floating-point numbers.
277b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	///
278b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @see gtc_dual_quaternion
279b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_ddualquat			ddualquat;
280b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))
281b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef highp_ddualquat			ddualquat;
282b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))
283b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef mediump_ddualquat		ddualquat;
284b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE))
285b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	typedef lowp_ddualquat			ddualquat;
286b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#else
287b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#	error "GLM error: Multiple default precision requested for double-precision floating-point types"
288b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif
289b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
290b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	/// @}
291b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG} //namespace glm
292b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
293b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "dual_quaternion.inl"
294b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
295b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif//GLM_GTX_dual_quaternion
296