20 #include "../gtc/constants.hpp" 
   21 #include "../gtc/quaternion.hpp" 
   23 #ifndef GLM_ENABLE_EXPERIMENTAL 
   24 #       error "GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." 
   27 #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 
   28 #       pragma message("GLM: GLM_GTX_dual_quaternion extension included") 
   36         template<
typename T, qualifier Q = defaultp>
 
   42                 typedef glm::tquat<T, Q> part_type;
 
   46                 glm::tquat<T, Q> real, dual;
 
   50                 typedef length_t length_type;
 
   52                 GLM_FUNC_DECL 
static GLM_CONSTEXPR length_type 
length(){
return 2;}
 
   54                 GLM_FUNC_DECL part_type & operator[](length_type i);
 
   55                 GLM_FUNC_DECL part_type 
const& operator[](length_type i) 
const;
 
   59                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT_CTOR;
 
   60                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, Q> const& d) GLM_DEFAULT;
 
   62                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, P> const& d);
 
   66                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real);
 
   67                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& 
orientation, vec<3, T, Q> const& translation);
 
   68                 GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real, tquat<T, Q> const& dual);
 
   72                 template<typename U, qualifier P>
 
   73                 GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat<U, P> const& q);
 
   75                 GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<2, 4, T, Q> const& holder_mat);
 
   76                 GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<3, 4, T, Q> const& aug_mat);
 
   80                 GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<T, Q> const& m) GLM_DEFAULT;
 
   83                 GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<U, Q> const& m);
 
   85                 GLM_FUNC_DECL tdualquat<T, Q> & operator*=(U s);
 
   87                 GLM_FUNC_DECL tdualquat<T, Q> & operator/=(U s);
 
   92         template<typename T, qualifier Q>
 
   93         GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q);
 
   95         template<typename T, qualifier Q>
 
   96         GLM_FUNC_DECL tdualquat<T, Q> operator-(tdualquat<T, Q> const& q);
 
  100         template<typename T, qualifier Q>
 
  101         GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);
 
  103         template<typename T, qualifier Q>
 
  104         GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);
 
  106         template<typename T, qualifier Q>
 
  107         GLM_FUNC_DECL vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v);
 
  109         template<typename T, qualifier Q>
 
  110         GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q);
 
  112         template<typename T, qualifier Q>
 
  113         GLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v);
 
  115         template<typename T, qualifier Q>
 
  116         GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q);
 
  118         template<typename T, qualifier Q>
 
  119         GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s);
 
  121         template<typename T, qualifier Q>
 
  122         GLM_FUNC_DECL tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q);
 
  124         template<typename T, qualifier Q>
 
  125         GLM_FUNC_DECL tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s);
 
  129         template<typename T, qualifier Q>
 
  130         GLM_FUNC_DECL 
bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);
 
  132         template<typename T, qualifier Q>
 
  133         GLM_FUNC_DECL 
bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);
 
  138         template <typename T, qualifier Q>
 
  144         template<typename T, qualifier Q>
 
  145         GLM_FUNC_DECL tdualquat<T, Q> 
normalize(tdualquat<T, Q> const& q);
 
  150         template<typename T, qualifier Q>
 
  151         GLM_FUNC_DECL tdualquat<T, Q> 
lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a);
 
  156         template<typename T, qualifier Q>
 
  157         GLM_FUNC_DECL tdualquat<T, Q> 
inverse(tdualquat<T, Q> const& q);
 
  162         template<typename T, qualifier Q>
 
  163         GLM_FUNC_DECL mat<2, 4, T, Q> 
mat2x4_cast(tdualquat<T, Q> const& x);
 
  168         template<typename T, qualifier Q>
 
  169         GLM_FUNC_DECL mat<3, 4, T, Q> 
mat3x4_cast(tdualquat<T, Q> const& x);
 
  174         template<typename T, qualifier Q>
 
  175         GLM_FUNC_DECL tdualquat<T, Q> 
dualquat_cast(mat<2, 4, T, Q> const& x);
 
  180         template<typename T, qualifier Q>
 
  181         GLM_FUNC_DECL tdualquat<T, Q> 
dualquat_cast(mat<3, 4, T, Q> const& x);
 
  232 #if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) 
  242 #elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) 
  245 #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) 
  248 #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) 
  252 #       error "GLM error: multiple default precision requested for single-precision floating-point types" 
  256 #if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) 
  261 #elif(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) 
  263 #elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) 
  265 #elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE)) 
  268 #       error "GLM error: Multiple default precision requested for double-precision floating-point types" 
  274 #include "dual_quaternion.inl" 
tdualquat< float, highp > highp_dualquat
Dual-quaternion of high single-qualifier floating-point numbers. 
tdualquat< float, mediump > mediump_fdualquat
Dual-quaternion of medium single-qualifier floating-point numbers. 
GLM_FUNC_DECL mat< 4, 4, T, Q > orientation(vec< 3, T, Q > const &Normal, vec< 3, T, Q > const &Up)
Build a rotation matrix from a normal and a up vector. 
GLM_FUNC_DECL tdualquat< T, Q > lerp(tdualquat< T, Q > const &x, tdualquat< T, Q > const &y, T const &a)
Returns the linear interpolation of two dual quaternion. 
tdualquat< float, mediump > mediump_dualquat
Dual-quaternion of medium single-qualifier floating-point numbers. 
highp_fdualquat fdualquat
Dual-quaternion of single-qualifier floating-point numbers. 
tdualquat< float, lowp > lowp_dualquat
Dual-quaternion of low single-qualifier floating-point numbers. 
tdualquat< double, mediump > mediump_ddualquat
Dual-quaternion of medium double-qualifier floating-point numbers. 
GLM_FUNC_DECL tdualquat< T, Q > normalize(tdualquat< T, Q > const &q)
Returns the normalized quaternion. 
tdualquat< double, lowp > lowp_ddualquat
Dual-quaternion of low double-qualifier floating-point numbers. 
GLM_FUNC_DECL mat< 3, 4, T, Q > mat3x4_cast(tdualquat< T, Q > const &x)
Converts a quaternion to a 3 * 4 matrix. 
tdualquat< double, highp > highp_ddualquat
Dual-quaternion of high double-qualifier floating-point numbers. 
GLM_FUNC_DECL T length(vec< L, T, Q > const &x)
Returns the length of x, i.e., sqrt(x * x). 
highp_ddualquat ddualquat
Dual-quaternion of default double-qualifier floating-point numbers. 
GLM_FUNC_DECL tdualquat< T, Q > inverse(tdualquat< T, Q > const &q)
Returns the q inverse. 
GLM_FUNC_DECL tdualquat< T, Q > dual_quat_identity()
Creates an identity dual quaternion. 
GLM_FUNC_DECL mat< 2, 4, T, Q > mat2x4_cast(tdualquat< T, Q > const &x)
Converts a quaternion to a 2 * 4 matrix. 
tdualquat< float, lowp > lowp_fdualquat
Dual-quaternion of low single-qualifier floating-point numbers. 
tdualquat< float, highp > highp_fdualquat
Dual-quaternion of high single-qualifier floating-point numbers. 
highp_fdualquat dualquat
Dual-quaternion of floating-point numbers. 
GLM_FUNC_DECL tdualquat< T, Q > dualquat_cast(mat< 3, 4, T, Q > const &x)
Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.