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 namespace detail
00031 {
00035 template <typename T>
00036 struct tquat
00037 {
00038 typedef T value_type;
00039
00040 public:
00041 value_type x, y, z, w;
00042
00043
00044 tquat();
00045 explicit tquat(
00046 value_type const & s,
00047 tvec3<T> const & v);
00048 explicit tquat(
00049 value_type const & w,
00050 value_type const & x,
00051 value_type const & y,
00052 value_type const & z);
00053
00054
00055
00057 explicit tquat(
00058 tvec3<T> const & eulerAngles);
00059 explicit tquat(
00060 tmat3x3<T> const & m);
00061 explicit tquat(
00062 tmat4x4<T> const & m);
00063
00064
00065 value_type & operator[](int i);
00066 value_type const & operator[](int i) const;
00067
00068
00069 tquat<T> & operator*=(value_type const & s);
00070 tquat<T> & operator/=(value_type const & s);
00071 };
00072
00073 template <typename T>
00074 detail::tquat<T> operator- (
00075 detail::tquat<T> const & q);
00076
00077 template <typename T>
00078 detail::tquat<T> operator* (
00079 detail::tquat<T> const & q,
00080 detail::tquat<T> const & p);
00081
00082 template <typename T>
00083 detail::tvec3<T> operator* (
00084 detail::tquat<T> const & q,
00085 detail::tvec3<T> const & v);
00086
00087 template <typename T>
00088 detail::tvec3<T> operator* (
00089 detail::tvec3<T> const & v,
00090 detail::tquat<T> const & q);
00091
00092 template <typename T>
00093 detail::tvec4<T> operator* (
00094 detail::tquat<T> const & q,
00095 detail::tvec4<T> const & v);
00096
00097 template <typename T>
00098 detail::tvec4<T> operator* (
00099 detail::tvec4<T> const & v,
00100 detail::tquat<T> const & q);
00101
00102 template <typename T>
00103 detail::tquat<T> operator* (
00104 detail::tquat<T> const & q,
00105 typename detail::tquat<T>::value_type const & s);
00106
00107 template <typename T>
00108 detail::tquat<T> operator* (
00109 typename detail::tquat<T>::value_type const & s,
00110 detail::tquat<T> const & q);
00111
00112 template <typename T>
00113 detail::tquat<T> operator/ (
00114 detail::tquat<T> const & q,
00115 typename detail::tquat<T>::value_type const & s);
00116
00117 }
00118
00119 namespace gtc{
00120 namespace quaternion
00121 {
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 GLM_DEPRECATED 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
00220
00221 }
00222 }
00223 }
00224
00225 #include "quaternion.inl"
00226
00227 namespace glm{using namespace gtc::quaternion;}
00228
00229 #endif//glm_gtc_quaternion