GLM Version 0.9.0
|
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