00001
00002
00004
00005
00006
00007
00009
00010
00011
00012
00014
00015
00016
00018
00019 #ifndef glm_gtc_quaternion
00020 #define glm_gtc_quaternion
00021
00022
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 }
00032
00033 namespace detail
00034 {
00037 template <typename T>
00038 struct tquat
00039 {
00040 typedef T value_type;
00041
00042 public:
00043 value_type x, y, z, w;
00044
00045
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
00057
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
00067 value_type & operator[](int i);
00068 value_type const & operator[](int i) const;
00069
00070
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::tvec3<T> operator* (
00081 detail::tquat<T> const & q,
00082 detail::tvec3<T> const & v);
00083
00084 template <typename T>
00085 detail::tvec3<T> operator* (
00086 detail::tvec3<T> const & v,
00087 detail::tquat<T> const & q);
00088
00089 template <typename T>
00090 detail::tvec4<T> operator* (
00091 detail::tquat<T> const & q,
00092 detail::tvec4<T> const & v);
00093
00094 template <typename T>
00095 detail::tvec4<T> operator* (
00096 detail::tvec4<T> const & v,
00097 detail::tquat<T> const & q);
00098
00099 template <typename T>
00100 detail::tquat<T> operator* (
00101 detail::tquat<T> const & q,
00102 typename detail::tquat<T>::value_type const & s);
00103
00104 template <typename T>
00105 detail::tquat<T> operator* (
00106 typename detail::tquat<T>::value_type const & s,
00107 detail::tquat<T> const & q);
00108
00109 template <typename T>
00110 detail::tquat<T> operator/ (
00111 detail::tquat<T> const & q,
00112 typename detail::tquat<T>::value_type const & s);
00113
00114 }
00115
00116 namespace gtc{
00118 namespace quaternion
00119 {
00122 template <typename T>
00123 typename detail::tquat<T>::value_type length(
00124 detail::tquat<T> const & q);
00125
00128 template <typename T>
00129 detail::tquat<T> normalize(
00130 detail::tquat<T> const & q);
00131
00134 template <typename T>
00135 typename detail::tquat<T>::value_type dot(
00136 detail::tquat<T> const & q1,
00137 detail::tquat<T> const & q2);
00138
00141 template <typename T>
00142 detail::tquat<T> cross(
00143 detail::tquat<T> const & q1,
00144 detail::tquat<T> const & q2);
00145
00148 template <typename T>
00149 detail::tquat<T> mix(
00150 detail::tquat<T> const & x,
00151 detail::tquat<T> const & y,
00152 typename detail::tquat<T>::value_type const & a);
00153
00156 template <typename T>
00157 detail::tquat<T> conjugate(
00158 detail::tquat<T> const & q);
00159
00162 template <typename T>
00163 detail::tquat<T> inverse(
00164 detail::tquat<T> const & q);
00165
00168 template <typename T>
00169 detail::tquat<T> rotate(
00170 detail::tquat<T> const & q,
00171 typename detail::tquat<T>::value_type const & angle,
00172 detail::tvec3<T> const & v);
00173
00176 template <typename T>
00177 detail::tmat3x3<T> mat3_cast(
00178 detail::tquat<T> const & x);
00179
00182 template <typename T>
00183 detail::tmat4x4<T> mat4_cast(
00184 detail::tquat<T> const & x);
00185
00188 template <typename T>
00189 detail::tquat<T> quat_cast(
00190 detail::tmat3x3<T> const & x);
00191
00194 template <typename T>
00195 detail::tquat<T> quat_cast(
00196 detail::tmat4x4<T> const & x);
00197
00200 typedef detail::tquat<float> quat;
00201
00204 typedef detail::tquat<detail::thalf> hquat;
00205
00208 typedef detail::tquat<float> fquat;
00209
00212 typedef detail::tquat<double> dquat;
00213
00214 }
00215 }
00216 }
00217
00218 #include "quaternion.inl"
00219
00220 namespace glm{using namespace gtc::quaternion;}
00221
00222 #endif//glm_gtc_quaternion