quaternion.hpp
00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2009-05-21
00005 // Updated : 2010-02-04
00006 // Licence : This source is under MIT License
00007 // File    : glm/gtc/quaternion.hpp
00009 // Dependency:
00010 // - GLM core
00011 // - GLM_GTC_half_float
00013 // ToDo:
00014 // - Study constructors with angles and axis
00015 // - Study constructors with vec3 that are the imaginary component of quaternion
00017 
00018 #ifndef glm_gtc_quaternion
00019 #define glm_gtc_quaternion
00020 
00021 // Dependency:
00022 #include "../glm.hpp"
00023 #include "../gtc/half_float.hpp"
00024 
00025 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
00026 #       pragma message("GLM: GLM_GTC_quaternion extension included")
00027 #endif
00028 
00029 namespace glm{
00030 namespace detail
00031 {
00035         template <typename T> 
00036         struct tquat// : public genType<T, tquat>
00037         {
00038                 typedef T value_type;
00039 
00040         public:
00041                 value_type x, y, z, w;
00042 
00043                 // Constructors
00044                 tquat();
00045                 explicit tquat(
00046                         value_type const & s, 
00047                         tvec3<T> const & v);
00048                 explicit tquat(
00049                         value_type const & w, 
00050                         value_type const & x, 
00051                         value_type const & y, 
00052                         value_type const & z);
00053 
00054                 // Convertions
00055                 //explicit tquat(valType const & pitch, valType const & yaw, valType const & roll);
00057                 explicit tquat(
00058                         tvec3<T> const & eulerAngles);
00059                 explicit tquat(
00060                         tmat3x3<T> const & m);
00061                 explicit tquat(
00062                         tmat4x4<T> const & m);
00063 
00064                 // Accesses
00065                 value_type & operator[](int i);
00066                 value_type const & operator[](int i) const;
00067 
00068                 // Operators
00069                 tquat<T> & operator*=(value_type const & s);
00070                 tquat<T> & operator/=(value_type const & s);
00071         };
00072 
00073         template <typename T> 
00074         detail::tquat<T> operator- (
00075                 detail::tquat<T> const & q);
00076 
00077         template <typename T> 
00078         detail::tquat<T> operator* ( 
00079                 detail::tquat<T> const & q, 
00080                 detail::tquat<T> const & p); 
00081 
00082         template <typename T> 
00083         detail::tvec3<T> operator* (
00084                 detail::tquat<T> const & q, 
00085                 detail::tvec3<T> const & v);
00086 
00087         template <typename T> 
00088         detail::tvec3<T> operator* (
00089                 detail::tvec3<T> const & v,
00090                 detail::tquat<T> const & q);
00091 
00092         template <typename T> 
00093         detail::tvec4<T> operator* (
00094                 detail::tquat<T> const & q, 
00095                 detail::tvec4<T> const & v);
00096 
00097         template <typename T> 
00098         detail::tvec4<T> operator* (
00099                 detail::tvec4<T> const & v,
00100                 detail::tquat<T> const & q);
00101 
00102         template <typename T> 
00103         detail::tquat<T> operator* (
00104                 detail::tquat<T> const & q, 
00105                 typename detail::tquat<T>::value_type const & s);
00106 
00107         template <typename T> 
00108         detail::tquat<T> operator* (
00109                 typename detail::tquat<T>::value_type const & s,
00110                 detail::tquat<T> const & q);
00111 
00112         template <typename T> 
00113         detail::tquat<T> operator/ (
00114                 detail::tquat<T> const & q, 
00115                 typename detail::tquat<T>::value_type const & s);
00116 
00117 } //namespace detail
00118 
00119 namespace gtc{
00120 namespace quaternion 
00121 {
00124 
00127     template <typename T> 
00128         typename detail::tquat<T>::value_type length(
00129                 detail::tquat<T> const & q);
00130 
00133         template <typename T> 
00134         detail::tquat<T> normalize(
00135                 detail::tquat<T> const & q);
00136                 
00139         template <typename T> 
00140         typename detail::tquat<T>::value_type dot(
00141                 detail::tquat<T> const & q1, 
00142                 detail::tquat<T> const & q2);
00143 
00146         template <typename T> 
00147         GLM_DEPRECATED detail::tquat<T> cross(
00148                 detail::tquat<T> const & q1, 
00149                 detail::tquat<T> const & q2);
00150                 
00153         template <typename T> 
00154         detail::tquat<T> mix(
00155                 detail::tquat<T> const & x, 
00156                 detail::tquat<T> const & y, 
00157                 typename detail::tquat<T>::value_type const & a);
00158                 
00161     template <typename T> 
00162         detail::tquat<T> conjugate(
00163                 detail::tquat<T> const & q);
00164 
00167     template <typename T> 
00168         detail::tquat<T> inverse(
00169                 detail::tquat<T> const & q);
00170 
00173         template <typename T> 
00174         detail::tquat<T> rotate(
00175                 detail::tquat<T> const & q, 
00176                 typename detail::tquat<T>::value_type const & angle, 
00177                 detail::tvec3<T> const & v);
00178 
00181     template <typename T> 
00182         detail::tmat3x3<T> mat3_cast(
00183                 detail::tquat<T> const & x);
00184 
00187         template <typename T> 
00188         detail::tmat4x4<T> mat4_cast(
00189                 detail::tquat<T> const & x);
00190 
00193         template <typename T> 
00194         detail::tquat<T> quat_cast(
00195                 detail::tmat3x3<T> const & x);
00196 
00199         template <typename T> 
00200         detail::tquat<T> quat_cast(
00201                 detail::tmat4x4<T> const & x);
00202 
00205     typedef detail::tquat<float> quat;
00206 
00209         typedef detail::tquat<detail::thalf>    hquat;
00210 
00213         typedef detail::tquat<float>    fquat;
00214 
00217         typedef detail::tquat<double>   dquat;
00218 
00220 
00221 } //namespace quaternion
00222 } //namespace gtc
00223 } //namespace glm
00224 
00225 #include "quaternion.inl"
00226 
00227 namespace glm{using namespace gtc::quaternion;}
00228 
00229 #endif//glm_gtc_quaternion