Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #pragma once
00039
00040
00041 #include "../glm.hpp"
00042 #include "../gtc/quaternion.hpp"
00043 #include "../gtx/fast_trigonometry.hpp"
00044
00045 #if(GLM_ARCH != GLM_ARCH_PURE)
00046
00047 #if(GLM_ARCH & GLM_ARCH_SSE2)
00048 # include "../gtx/simd_mat4.hpp"
00049 #else
00050 # error "GLM: GLM_GTX_simd_quat requires compiler support of SSE2 through intrinsics"
00051 #endif
00052
00053 #if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
00054 # pragma message("GLM: GLM_GTX_simd_quat extension included")
00055 #endif
00056
00057
00058
00059 #if (GLM_COMPILER & GLM_COMPILER_VC)
00060 # pragma warning(push)
00061 # pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
00062 #endif
00063
00064
00065 namespace glm{
00066 namespace detail
00067 {
00070 GLM_ALIGNED_STRUCT(16) fquatSIMD
00071 {
00072 enum ctor{null};
00073 typedef __m128 value_type;
00074 typedef std::size_t size_type;
00075 static size_type value_size();
00076
00077 typedef fquatSIMD type;
00078 typedef tquat<bool, defaultp> bool_type;
00079
00080 #ifdef GLM_SIMD_ENABLE_XYZW_UNION
00081 union
00082 {
00083 __m128 Data;
00084 struct {float x, y, z, w;};
00085 };
00086 #else
00087 __m128 Data;
00088 #endif
00089
00091
00092
00093 fquatSIMD();
00094 fquatSIMD(__m128 const & Data);
00095 fquatSIMD(fquatSIMD const & q);
00096
00098
00099
00100 explicit fquatSIMD(
00101 ctor);
00102 explicit fquatSIMD(
00103 float const & w,
00104 float const & x,
00105 float const & y,
00106 float const & z);
00107 explicit fquatSIMD(
00108 quat const & v);
00109 explicit fquatSIMD(
00110 vec3 const & eulerAngles);
00111
00112
00114
00115
00116 fquatSIMD& operator =(fquatSIMD const & q);
00117 fquatSIMD& operator*=(float const & s);
00118 fquatSIMD& operator/=(float const & s);
00119 };
00120
00121
00123
00124
00125 detail::fquatSIMD operator- (
00126 detail::fquatSIMD const & q);
00127
00128 detail::fquatSIMD operator+ (
00129 detail::fquatSIMD const & q,
00130 detail::fquatSIMD const & p);
00131
00132 detail::fquatSIMD operator* (
00133 detail::fquatSIMD const & q,
00134 detail::fquatSIMD const & p);
00135
00136 detail::fvec4SIMD operator* (
00137 detail::fquatSIMD const & q,
00138 detail::fvec4SIMD const & v);
00139
00140 detail::fvec4SIMD operator* (
00141 detail::fvec4SIMD const & v,
00142 detail::fquatSIMD const & q);
00143
00144 detail::fquatSIMD operator* (
00145 detail::fquatSIMD const & q,
00146 float s);
00147
00148 detail::fquatSIMD operator* (
00149 float s,
00150 detail::fquatSIMD const & q);
00151
00152 detail::fquatSIMD operator/ (
00153 detail::fquatSIMD const & q,
00154 float s);
00155
00156 }
00157
00158 typedef glm::detail::fquatSIMD simdQuat;
00159
00162
00165 quat quat_cast(
00166 detail::fquatSIMD const & x);
00167
00170 detail::fquatSIMD quatSIMD_cast(
00171 detail::fmat4x4SIMD const & m);
00172
00175 template <typename T, precision P>
00176 detail::fquatSIMD quatSIMD_cast(
00177 detail::tmat4x4<T, P> const & m);
00178
00181 template <typename T, precision P>
00182 detail::fquatSIMD quatSIMD_cast(
00183 detail::tmat3x3<T, P> const & m);
00184
00187 detail::fmat4x4SIMD mat4SIMD_cast(
00188 detail::fquatSIMD const & q);
00189
00192 mat4 mat4_cast(
00193 detail::fquatSIMD const & q);
00194
00195
00199 float length(
00200 detail::fquatSIMD const & x);
00201
00205 detail::fquatSIMD normalize(
00206 detail::fquatSIMD const & x);
00207
00211 float dot(
00212 detail::fquatSIMD const & q1,
00213 detail::fquatSIMD const & q2);
00214
00225 detail::fquatSIMD mix(
00226 detail::fquatSIMD const & x,
00227 detail::fquatSIMD const & y,
00228 float const & a);
00229
00238 detail::fquatSIMD lerp(
00239 detail::fquatSIMD const & x,
00240 detail::fquatSIMD const & y,
00241 float const & a);
00242
00251 detail::fquatSIMD slerp(
00252 detail::fquatSIMD const & x,
00253 detail::fquatSIMD const & y,
00254 float const & a);
00255
00256
00267 detail::fquatSIMD fastMix(
00268 detail::fquatSIMD const & x,
00269 detail::fquatSIMD const & y,
00270 float const & a);
00271
00279 detail::fquatSIMD fastSlerp(
00280 detail::fquatSIMD const & x,
00281 detail::fquatSIMD const & y,
00282 float const & a);
00283
00284
00288 detail::fquatSIMD conjugate(
00289 detail::fquatSIMD const & q);
00290
00294 detail::fquatSIMD inverse(
00295 detail::fquatSIMD const & q);
00296
00303 detail::fquatSIMD angleAxisSIMD(
00304 float const & angle,
00305 vec3 const & axis);
00306
00315 detail::fquatSIMD angleAxisSIMD(
00316 float const & angle,
00317 float const & x,
00318 float const & y,
00319 float const & z);
00320
00321
00322
00324 __m128 fastSin(__m128 x);
00325
00326
00328 }
00329
00330 #include "simd_quat.inl"
00331
00332
00333 #if (GLM_COMPILER & GLM_COMPILER_VC)
00334 # pragma warning(pop)
00335 #endif
00336
00337
00338 #endif//(GLM_ARCH != GLM_ARCH_PURE)