GLM Version 0.9.0

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
00012 // - GLM_GTC_double_float
00014 // ToDo:
00015 // - Study constructors with angles and axis
00016 // - Study constructors with vec3 that are the imaginary component of quaternion
00018 
00019 #ifndef glm_gtc_quaternion
00020 #define glm_gtc_quaternion
00021 
00022 // Dependency:
00023 #include "../glm.hpp"
00024 #include "../gtc/half_float.hpp"
00025 #include "../gtc/double_float.hpp"
00026 
00027 namespace glm
00028 {
00029         namespace test{
00030                 bool main_gtc_quaternion();
00031         }//namespace test
00032 
00033         namespace detail
00034         {
00037                 template <typename T> 
00038                 struct tquat// : public genType<T, tquat>
00039                 {
00040                         typedef T value_type;
00041 
00042                 public:
00043                         value_type x, y, z, w;
00044 
00045                         // Constructors
00046                         tquat();
00047                         explicit tquat(
00048                                 value_type const & s, 
00049                                 tvec3<T> const & v);
00050                         explicit tquat(
00051                                 value_type const & w, 
00052                                 value_type const & x, 
00053                                 value_type const & y, 
00054                                 value_type const & z);
00055 
00056                         // Convertions
00057                         //explicit tquat(valType const & pitch, valType const & yaw, valType const & roll);
00059                         explicit tquat(
00060                                 tvec3<T> const & eulerAngles);
00061                         explicit tquat(
00062                                 tmat3x3<T> const & m);
00063                         explicit tquat(
00064                                 tmat4x4<T> const & m);
00065 
00066                         // Accesses
00067                         value_type & operator[](int i);
00068                         value_type const & operator[](int i) const;
00069 
00070                         // Operators
00071                         tquat<T> & operator*=(value_type const & s);
00072                         tquat<T> & operator/=(value_type const & s);
00073                 };
00074 
00075                 template <typename T> 
00076                 detail::tquat<T> operator- (
00077                         detail::tquat<T> const & q);
00078 
00079                 template <typename T> 
00080                 detail::tquat<T> operator* ( 
00081                         detail::tquat<T> const & q, 
00082                         detail::tquat<T> const & p); 
00083 
00084                 template <typename T> 
00085                 detail::tvec3<T> operator* (
00086                         detail::tquat<T> const & q, 
00087                         detail::tvec3<T> const & v);
00088 
00089                 template <typename T> 
00090                 detail::tvec3<T> operator* (
00091                         detail::tvec3<T> const & v,
00092                         detail::tquat<T> const & q);
00093 
00094                 template <typename T> 
00095                 detail::tvec4<T> operator* (
00096                         detail::tquat<T> const & q, 
00097                         detail::tvec4<T> const & v);
00098 
00099                 template <typename T> 
00100                 detail::tvec4<T> operator* (
00101                         detail::tvec4<T> const & v,
00102                         detail::tquat<T> const & q);
00103 
00104                 template <typename T> 
00105                 detail::tquat<T> operator* (
00106                         detail::tquat<T> const & q, 
00107                         typename detail::tquat<T>::value_type const & s);
00108 
00109                 template <typename T> 
00110                 detail::tquat<T> operator* (
00111                         typename detail::tquat<T>::value_type const & s,
00112                         detail::tquat<T> const & q);
00113 
00114                 template <typename T> 
00115                 detail::tquat<T> operator/ (
00116                         detail::tquat<T> const & q, 
00117                         typename detail::tquat<T>::value_type const & s);
00118 
00119         } //namespace detail
00120 
00121         namespace gtc{
00123     namespace quaternion
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                 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 
00219     }//namespace quaternion
00220     }//namespace gtc
00221 } //namespace glm
00222 
00223 #include "quaternion.inl"
00224 
00225 namespace glm{using namespace gtc::quaternion;}
00226 
00227 #endif//glm_gtc_quaternion