simd_quat.hpp
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 // Dependency:
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 // Warning silencer for nameless struct/union.
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                 // Implicit basic constructors
00092 
00093                 fquatSIMD();
00094                 fquatSIMD(__m128 const & Data);
00095                 fquatSIMD(fquatSIMD const & q);
00096 
00098                 // Explicit basic constructors
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                 // Unary arithmetic operators
00115 
00116                 fquatSIMD& operator =(fquatSIMD const & q);
00117                 fquatSIMD& operator*=(float const & s);
00118                 fquatSIMD& operator/=(float const & s);
00119         };
00120 
00121 
00123         // Arithmetic operators
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 }//namespace detail
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         // TODO: Move this to somewhere more appropriate. Used with fastMix() and fastSlerp().
00324         __m128 fastSin(__m128 x);
00325 
00326 
00328 }//namespace glm
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)


rtabmap
Author(s): Mathieu Labbe
autogenerated on Sat Jul 23 2016 11:44:17