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::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{
00125 namespace quaternion
00126 {
00129
00132 template <typename T>
00133 typename detail::tquat<T>::value_type length(
00134 detail::tquat<T> const & q);
00135
00138 template <typename T>
00139 detail::tquat<T> normalize(
00140 detail::tquat<T> const & q);
00141
00144 template <typename T>
00145 typename detail::tquat<T>::value_type dot(
00146 detail::tquat<T> const & q1,
00147 detail::tquat<T> const & q2);
00148
00151 template <typename T>
00152 GLM_DEPRECATED detail::tquat<T> cross(
00153 detail::tquat<T> const & q1,
00154 detail::tquat<T> const & q2);
00155
00158 template <typename T>
00159 detail::tquat<T> mix(
00160 detail::tquat<T> const & x,
00161 detail::tquat<T> const & y,
00162 T const & a);
00163
00166 template <typename T>
00167 detail::tquat<T> conjugate(
00168 detail::tquat<T> const & q);
00169
00172 template <typename T>
00173 detail::tquat<T> inverse(
00174 detail::tquat<T> const & q);
00175
00178 template <typename T>
00179 detail::tquat<T> rotate(
00180 detail::tquat<T> const & q,
00181 typename detail::tquat<T>::value_type const & angle,
00182 detail::tvec3<T> const & v);
00183
00186 template <typename T>
00187 detail::tmat3x3<T> mat3_cast(
00188 detail::tquat<T> const & x);
00189
00192 template <typename T>
00193 detail::tmat4x4<T> mat4_cast(
00194 detail::tquat<T> const & x);
00195
00198 template <typename T>
00199 detail::tquat<T> quat_cast(
00200 detail::tmat3x3<T> const & x);
00201
00204 template <typename T>
00205 detail::tquat<T> quat_cast(
00206 detail::tmat4x4<T> const & x);
00207
00210 typedef detail::tquat<float> quat;
00211
00214 typedef detail::tquat<detail::thalf> hquat;
00215
00218 typedef detail::tquat<float> fquat;
00219
00222 typedef detail::tquat<double> dquat;
00223
00226 typedef detail::tquat<lowp_float> lowp_quat;
00227
00230 typedef detail::tquat<mediump_float> mediump_quat;
00231
00234 typedef detail::tquat<highp_float> highp_quat;
00236
00237 }
00238 }
00239 }
00240
00241 #include "quaternion.inl"
00242
00243 namespace glm{using namespace gtc::quaternion;}
00244
00245 #endif//glm_gtc_quaternion