quaternion.hpp
Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 #ifndef GLM_GTC_quaternion
00040 #define GLM_GTC_quaternion GLM_VERSION
00041 
00042 // Dependency:
00043 #include "../glm.hpp"
00044 #include "../gtc/half_float.hpp"
00045 
00046 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
00047 #       pragma message("GLM: GLM_GTC_quaternion extension included")
00048 #endif
00049 
00050 namespace glm{
00051 namespace detail
00052 {
00056         template <typename T> 
00057         struct tquat// : public genType<T, tquat>
00058         {
00059         enum ctor{null};
00060         
00061         typedef T value_type;
00062         typedef std::size_t size_type;
00063 
00064         public:
00065                 value_type x, y, z, w;
00066         
00067         GLM_FUNC_DECL size_type length() const;
00068 
00069                 // Constructors
00070                 tquat();
00071                 explicit tquat(
00072                         value_type const & s, 
00073                         glm::detail::tvec3<T> const & v);
00074                 explicit tquat(
00075                         value_type const & w, 
00076                         value_type const & x, 
00077                         value_type const & y, 
00078                         value_type const & z);
00079 
00080                 // Convertions
00081                 //explicit tquat(valType const & pitch, valType const & yaw, valType const & roll);
00083                 explicit tquat(
00084                         tvec3<T> const & eulerAngles);
00085                 explicit tquat(
00086                         tmat3x3<T> const & m);
00087                 explicit tquat(
00088                         tmat4x4<T> const & m);
00089 
00090                 // Accesses
00091                 value_type & operator[](int i);
00092                 value_type const & operator[](int i) const;
00093 
00094                 // Operators
00095                 tquat<T> & operator*=(value_type const & s);
00096                 tquat<T> & operator/=(value_type const & s);
00097         };
00098 
00099         template <typename T> 
00100         detail::tquat<T> operator- (
00101                 detail::tquat<T> const & q);
00102 
00103         template <typename T> 
00104         detail::tquat<T> operator+ ( 
00105                 detail::tquat<T> const & q, 
00106                 detail::tquat<T> const & p); 
00107 
00108         template <typename T> 
00109         detail::tquat<T> operator* ( 
00110                 detail::tquat<T> const & q, 
00111                 detail::tquat<T> const & p); 
00112 
00113         template <typename T> 
00114         detail::tvec3<T> operator* (
00115                 detail::tquat<T> const & q, 
00116                 detail::tvec3<T> const & v);
00117 
00118         template <typename T> 
00119         detail::tvec3<T> operator* (
00120                 detail::tvec3<T> const & v,
00121                 detail::tquat<T> const & q);
00122 
00123         template <typename T> 
00124         detail::tvec4<T> operator* (
00125                 detail::tquat<T> const & q, 
00126                 detail::tvec4<T> const & v);
00127 
00128         template <typename T> 
00129         detail::tvec4<T> operator* (
00130                 detail::tvec4<T> const & v,
00131                 detail::tquat<T> const & q);
00132 
00133         template <typename T> 
00134         detail::tquat<T> operator* (
00135                 detail::tquat<T> const & q, 
00136                 typename detail::tquat<T>::value_type const & s);
00137 
00138         template <typename T> 
00139         detail::tquat<T> operator* (
00140                 typename detail::tquat<T>::value_type const & s,
00141                 detail::tquat<T> const & q);
00142 
00143         template <typename T> 
00144         detail::tquat<T> operator/ (
00145                 detail::tquat<T> const & q, 
00146                 typename detail::tquat<T>::value_type const & s);
00147 
00148 } //namespace detail
00149 
00152 
00156     template <typename T> 
00157     T length(
00158                 detail::tquat<T> const & q);
00159 
00163         template <typename T> 
00164         detail::tquat<T> normalize(
00165                 detail::tquat<T> const & q);
00166                 
00170         template <typename T> 
00171         T dot(
00172                 detail::tquat<T> const & q1, 
00173                 detail::tquat<T> const & q2);
00174 
00178         template <typename T> 
00179         detail::tquat<T> mix(
00180                 detail::tquat<T> const & x, 
00181                 detail::tquat<T> const & y, 
00182                 T const & a);
00183                 
00187     template <typename T> 
00188         detail::tquat<T> conjugate(
00189                 detail::tquat<T> const & q);
00190 
00194     template <typename T> 
00195         detail::tquat<T> inverse(
00196                 detail::tquat<T> const & q);
00197 
00201         template <typename T> 
00202         detail::tquat<T> rotate(
00203                 detail::tquat<T> const & q, 
00204                 typename detail::tquat<T>::value_type const & angle, 
00205                 detail::tvec3<T> const & v);
00206 
00210     template <typename T> 
00211         detail::tmat3x3<T> mat3_cast(
00212                 detail::tquat<T> const & x);
00213 
00217         template <typename T> 
00218         detail::tmat4x4<T> mat4_cast(
00219                 detail::tquat<T> const & x);
00220 
00224         template <typename T> 
00225         detail::tquat<T> quat_cast(
00226                 detail::tmat3x3<T> const & x);
00227 
00231         template <typename T> 
00232         detail::tquat<T> quat_cast(
00233                 detail::tmat4x4<T> const & x);
00234 
00238     typedef detail::tquat<float> quat;
00239 
00243         typedef detail::tquat<detail::half>     hquat;
00244 
00248         typedef detail::tquat<float>    fquat;
00249 
00253         typedef detail::tquat<double>   dquat;
00254 
00258         typedef detail::tquat<lowp_float>               lowp_quat;
00259 
00263         typedef detail::tquat<mediump_float>    mediump_quat;
00264 
00268         typedef detail::tquat<highp_float>              highp_quat;
00269 
00271 } //namespace glm
00272 
00273 #include "quaternion.inl"
00274 
00275 #endif//GLM_GTC_quaternion