00001
00002
00004
00005
00006
00007
00009
00010
00011
00013
00014
00015
00017
00018 #ifndef glm_gtc_quaternion
00019 #define glm_gtc_quaternion
00020
00021
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 }
00034
00035 namespace detail
00036 {
00040 template <typename T>
00041 struct tquat
00042 {
00043 typedef T value_type;
00044
00045 public:
00046 value_type x, y, z, w;
00047
00048
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
00060
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
00070 value_type & operator[](int i);
00071 value_type const & operator[](int i) const;
00072
00073
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 }
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 }
00228 }
00229 }
00230
00231 #include "quaternion.inl"
00232
00233 namespace glm{using namespace gtc::quaternion;}
00234
00235 #endif//glm_gtc_quaternion