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::tquat<T> operator* ( 
00084                 detail::tquat<T> const & q, 
00085                 detail::tquat<T> const & p); 
00086 
00087         template <typename T> 
00088         detail::tvec3<T> operator* (
00089                 detail::tquat<T> const & q, 
00090                 detail::tvec3<T> const & v);
00091 
00092         template <typename T> 
00093         detail::tvec3<T> operator* (
00094                 detail::tvec3<T> const & v,
00095                 detail::tquat<T> const & q);
00096 
00097         template <typename T> 
00098         detail::tvec4<T> operator* (
00099                 detail::tquat<T> const & q, 
00100                 detail::tvec4<T> const & v);
00101 
00102         template <typename T> 
00103         detail::tvec4<T> operator* (
00104                 detail::tvec4<T> const & v,
00105                 detail::tquat<T> const & q);
00106 
00107         template <typename T> 
00108         detail::tquat<T> operator* (
00109                 detail::tquat<T> const & q, 
00110                 typename detail::tquat<T>::value_type const & s);
00111 
00112         template <typename T> 
00113         detail::tquat<T> operator* (
00114                 typename detail::tquat<T>::value_type const & s,
00115                 detail::tquat<T> const & q);
00116 
00117         template <typename T> 
00118         detail::tquat<T> operator/ (
00119                 detail::tquat<T> const & q, 
00120                 typename detail::tquat<T>::value_type const & s);
00121 
00122 } //namespace detail
00123 
00124 namespace gtc{
00125 namespace quaternion 
00126 {
00129 
00132     template <typename T> 
00133         typename detail::tquat<T>::value_type length(
00134                 detail::tquat<T> const & q);
00135 
00138         template <typename T> 
00139         detail::tquat<T> normalize(
00140                 detail::tquat<T> const & q);
00141                 
00144         template <typename T> 
00145         typename detail::tquat<T>::value_type dot(
00146                 detail::tquat<T> const & q1, 
00147                 detail::tquat<T> const & q2);
00148 
00151         template <typename T> 
00152         GLM_DEPRECATED detail::tquat<T> cross(
00153                 detail::tquat<T> const & q1, 
00154                 detail::tquat<T> const & q2);
00155                 
00158         template <typename T> 
00159         detail::tquat<T> mix(
00160                 detail::tquat<T> const & x, 
00161                 detail::tquat<T> const & y, 
00162                 T const & a);
00163                 
00166     template <typename T> 
00167         detail::tquat<T> conjugate(
00168                 detail::tquat<T> const & q);
00169 
00172     template <typename T> 
00173         detail::tquat<T> inverse(
00174                 detail::tquat<T> const & q);
00175 
00178         template <typename T> 
00179         detail::tquat<T> rotate(
00180                 detail::tquat<T> const & q, 
00181                 typename detail::tquat<T>::value_type const & angle, 
00182                 detail::tvec3<T> const & v);
00183 
00186     template <typename T> 
00187         detail::tmat3x3<T> mat3_cast(
00188                 detail::tquat<T> const & x);
00189 
00192         template <typename T> 
00193         detail::tmat4x4<T> mat4_cast(
00194                 detail::tquat<T> const & x);
00195 
00198         template <typename T> 
00199         detail::tquat<T> quat_cast(
00200                 detail::tmat3x3<T> const & x);
00201 
00204         template <typename T> 
00205         detail::tquat<T> quat_cast(
00206                 detail::tmat4x4<T> const & x);
00207 
00210     typedef detail::tquat<float> quat;
00211 
00214         typedef detail::tquat<detail::thalf>    hquat;
00215 
00218         typedef detail::tquat<float>    fquat;
00219 
00222         typedef detail::tquat<double>   dquat;
00223 
00226         typedef detail::tquat<lowp_float>               lowp_quat;
00227 
00230         typedef detail::tquat<mediump_float>    mediump_quat;
00231 
00234         typedef detail::tquat<highp_float>              highp_quat;
00236 
00237 } //namespace quaternion
00238 } //namespace gtc
00239 } //namespace glm
00240 
00241 #include "quaternion.inl"
00242 
00243 namespace glm{using namespace gtc::quaternion;}
00244 
00245 #endif//glm_gtc_quaternion