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 {
00031         namespace test{
00032                 bool main_gtc_quaternion();
00033         }//namespace test
00034 
00035         namespace detail
00036         {
00040                 template <typename T> 
00041                 struct tquat// : public genType<T, tquat>
00042                 {
00043                         typedef T value_type;
00044 
00045                 public:
00046                         value_type x, y, z, w;
00047 
00048                         // Constructors
00049                         tquat();
00050                         explicit tquat(
00051                                 value_type const & s, 
00052                                 tvec3<T> const & v);
00053                         explicit tquat(
00054                                 value_type const & w, 
00055                                 value_type const & x, 
00056                                 value_type const & y, 
00057                                 value_type const & z);
00058 
00059                         // Convertions
00060                         //explicit tquat(valType const & pitch, valType const & yaw, valType const & roll);
00062                         explicit tquat(
00063                                 tvec3<T> const & eulerAngles);
00064                         explicit tquat(
00065                                 tmat3x3<T> const & m);
00066                         explicit tquat(
00067                                 tmat4x4<T> const & m);
00068 
00069                         // Accesses
00070                         value_type & operator[](int i);
00071                         value_type const & operator[](int i) const;
00072 
00073                         // Operators
00074                         tquat<T> & operator*=(value_type const & s);
00075                         tquat<T> & operator/=(value_type const & s);
00076                 };
00077 
00078                 template <typename T> 
00079                 detail::tquat<T> operator- (
00080                         detail::tquat<T> const & q);
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{
00126     namespace quaternion
00127     {
00130 
00133         template <typename T> 
00134                 typename detail::tquat<T>::value_type length(
00135                         detail::tquat<T> const & q);
00136 
00139                 template <typename T> 
00140                 detail::tquat<T> normalize(
00141                         detail::tquat<T> const & q);
00142                 
00145                 template <typename T> 
00146                 typename detail::tquat<T>::value_type dot(
00147                         detail::tquat<T> const & q1, 
00148                         detail::tquat<T> const & q2);
00149 
00152                 template <typename T> 
00153                 GLM_DEPRECATED detail::tquat<T> cross(
00154                         detail::tquat<T> const & q1, 
00155                         detail::tquat<T> const & q2);
00156                 
00159                 template <typename T> 
00160                 detail::tquat<T> mix(
00161                         detail::tquat<T> const & x, 
00162                         detail::tquat<T> const & y, 
00163                         typename detail::tquat<T>::value_type const & a);
00164                 
00167         template <typename T> 
00168                 detail::tquat<T> conjugate(
00169                         detail::tquat<T> const & q);
00170 
00173         template <typename T> 
00174                 detail::tquat<T> inverse(
00175                         detail::tquat<T> const & q);
00176 
00179                 template <typename T> 
00180                 detail::tquat<T> rotate(
00181                         detail::tquat<T> const & q, 
00182                         typename detail::tquat<T>::value_type const & angle, 
00183                         detail::tvec3<T> const & v);
00184 
00187         template <typename T> 
00188                 detail::tmat3x3<T> mat3_cast(
00189                         detail::tquat<T> const & x);
00190 
00193                 template <typename T> 
00194                 detail::tmat4x4<T> mat4_cast(
00195                         detail::tquat<T> const & x);
00196 
00199                 template <typename T> 
00200                 detail::tquat<T> quat_cast(
00201                         detail::tmat3x3<T> const & x);
00202 
00205                 template <typename T> 
00206                 detail::tquat<T> quat_cast(
00207                         detail::tmat4x4<T> const & x);
00208 
00211         typedef detail::tquat<float> quat;
00212 
00215                 typedef detail::tquat<detail::thalf>    hquat;
00216 
00219                 typedef detail::tquat<float>    fquat;
00220 
00223                 typedef detail::tquat<double>   dquat;
00224 
00226 
00227     }//namespace quaternion
00228     }//namespace gtc
00229 } //namespace glm
00230 
00231 #include "quaternion.inl"
00232 
00233 namespace glm{using namespace gtc::quaternion;}
00234 
00235 #endif//glm_gtc_quaternion