summaryrefslogtreecommitdiffstats
path: root/external/include/glm/gtx/simd_quat.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'external/include/glm/gtx/simd_quat.hpp')
-rw-r--r--external/include/glm/gtx/simd_quat.hpp307
1 files changed, 307 insertions, 0 deletions
diff --git a/external/include/glm/gtx/simd_quat.hpp b/external/include/glm/gtx/simd_quat.hpp
new file mode 100644
index 0000000..b134019
--- /dev/null
+++ b/external/include/glm/gtx/simd_quat.hpp
@@ -0,0 +1,307 @@
+/// @ref gtx_simd_quat
+/// @file glm/gtx/simd_quat.hpp
+///
+/// @see core (dependence)
+///
+/// @defgroup gtx_simd_quat GLM_GTX_simd_quat
+/// @ingroup gtx
+///
+/// @brief SIMD implementation of quat type.
+///
+/// <glm/gtx/simd_quat.hpp> need to be included to use these functionalities.
+
+#pragma once
+
+// Dependency:
+#include "../glm.hpp"
+#include "../gtc/quaternion.hpp"
+#include "../gtx/fast_trigonometry.hpp"
+
+#if GLM_ARCH != GLM_ARCH_PURE
+
+#if GLM_ARCH & GLM_ARCH_SSE2_BIT
+# include "../gtx/simd_mat4.hpp"
+#else
+# error "GLM: GLM_GTX_simd_quat requires compiler support of SSE2 through intrinsics"
+#endif
+
+#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)
+# pragma message("GLM: GLM_GTX_simd_quat extension included")
+# pragma message("GLM: GLM_GTX_simd_quat extension is deprecated and will be removed in GLM 0.9.9. Use GLM_GTC_quaternion instead and use compiler SIMD arguments.")
+#endif
+
+// Warning silencer for nameless struct/union.
+#if (GLM_COMPILER & GLM_COMPILER_VC)
+# pragma warning(push)
+# pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
+#endif
+
+namespace glm{
+namespace detail
+{
+ GLM_ALIGNED_STRUCT(16) fquatSIMD
+ {
+ typedef float value_type;
+ typedef std::size_t size_type;
+
+ typedef fquatSIMD type;
+ typedef tquat<bool, defaultp> bool_type;
+ typedef tquat<float, defaultp> pure_type;
+
+#ifdef GLM_SIMD_ENABLE_XYZW_UNION
+ union
+ {
+ __m128 Data;
+ struct {float x, y, z, w;};
+ };
+#else
+ __m128 Data;
+#endif
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ fquatSIMD() GLM_DEFAULT_CTOR;
+ fquatSIMD(fquatSIMD const & q) GLM_DEFAULT;
+ fquatSIMD(__m128 const & Data);
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ explicit fquatSIMD(
+ ctor);
+ explicit fquatSIMD(
+ float const & w,
+ float const & x,
+ float const & y,
+ float const & z);
+ explicit fquatSIMD(
+ quat const & v);
+ explicit fquatSIMD(
+ vec3 const & eulerAngles);
+
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ fquatSIMD& operator= (fquatSIMD const & q) GLM_DEFAULT;
+ fquatSIMD& operator*=(float const & s);
+ fquatSIMD& operator/=(float const & s);
+ };
+
+
+ //////////////////////////////////////
+ // Arithmetic operators
+
+ detail::fquatSIMD operator- (
+ detail::fquatSIMD const & q);
+
+ detail::fquatSIMD operator+ (
+ detail::fquatSIMD const & q,
+ detail::fquatSIMD const & p);
+
+ detail::fquatSIMD operator* (
+ detail::fquatSIMD const & q,
+ detail::fquatSIMD const & p);
+
+ detail::fvec4SIMD operator* (
+ detail::fquatSIMD const & q,
+ detail::fvec4SIMD const & v);
+
+ detail::fvec4SIMD operator* (
+ detail::fvec4SIMD const & v,
+ detail::fquatSIMD const & q);
+
+ detail::fquatSIMD operator* (
+ detail::fquatSIMD const & q,
+ float s);
+
+ detail::fquatSIMD operator* (
+ float s,
+ detail::fquatSIMD const & q);
+
+ detail::fquatSIMD operator/ (
+ detail::fquatSIMD const & q,
+ float s);
+
+}//namespace detail
+
+ /// @addtogroup gtx_simd_quat
+ /// @{
+
+ typedef glm::detail::fquatSIMD simdQuat;
+
+ //! Convert a simdQuat to a quat.
+ /// @see gtx_simd_quat
+ quat quat_cast(
+ detail::fquatSIMD const & x);
+
+ //! Convert a simdMat4 to a simdQuat.
+ /// @see gtx_simd_quat
+ detail::fquatSIMD quatSIMD_cast(
+ detail::fmat4x4SIMD const & m);
+
+ //! Converts a mat4 to a simdQuat.
+ /// @see gtx_simd_quat
+ template <typename T, precision P>
+ detail::fquatSIMD quatSIMD_cast(
+ tmat4x4<T, P> const & m);
+
+ //! Converts a mat3 to a simdQuat.
+ /// @see gtx_simd_quat
+ template <typename T, precision P>
+ detail::fquatSIMD quatSIMD_cast(
+ tmat3x3<T, P> const & m);
+
+ //! Convert a simdQuat to a simdMat4
+ /// @see gtx_simd_quat
+ detail::fmat4x4SIMD mat4SIMD_cast(
+ detail::fquatSIMD const & q);
+
+ //! Converts a simdQuat to a standard mat4.
+ /// @see gtx_simd_quat
+ mat4 mat4_cast(
+ detail::fquatSIMD const & q);
+
+
+ /// Returns the length of the quaternion.
+ ///
+ /// @see gtx_simd_quat
+ float length(
+ detail::fquatSIMD const & x);
+
+ /// Returns the normalized quaternion.
+ ///
+ /// @see gtx_simd_quat
+ detail::fquatSIMD normalize(
+ detail::fquatSIMD const & x);
+
+ /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...
+ ///
+ /// @see gtx_simd_quat
+ float dot(
+ detail::fquatSIMD const & q1,
+ detail::fquatSIMD const & q2);
+
+ /// Spherical linear interpolation of two quaternions.
+ /// The interpolation is oriented and the rotation is performed at constant speed.
+ /// For short path spherical linear interpolation, use the slerp function.
+ ///
+ /// @param x A quaternion
+ /// @param y A quaternion
+ /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].
+ /// @tparam T Value type used to build the quaternion. Supported: half, float or double.
+ /// @see gtx_simd_quat
+ /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a)
+ detail::fquatSIMD mix(
+ detail::fquatSIMD const & x,
+ detail::fquatSIMD const & y,
+ float const & a);
+
+ /// Linear interpolation of two quaternions.
+ /// The interpolation is oriented.
+ ///
+ /// @param x A quaternion
+ /// @param y A quaternion
+ /// @param a Interpolation factor. The interpolation is defined in the range [0, 1].
+ /// @tparam T Value type used to build the quaternion. Supported: half, float or double.
+ /// @see gtx_simd_quat
+ detail::fquatSIMD lerp(
+ detail::fquatSIMD const & x,
+ detail::fquatSIMD const & y,
+ float const & a);
+
+ /// Spherical linear interpolation of two quaternions.
+ /// The interpolation always take the short path and the rotation is performed at constant speed.
+ ///
+ /// @param x A quaternion
+ /// @param y A quaternion
+ /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].
+ /// @tparam T Value type used to build the quaternion. Supported: half, float or double.
+ /// @see gtx_simd_quat
+ detail::fquatSIMD slerp(
+ detail::fquatSIMD const & x,
+ detail::fquatSIMD const & y,
+ float const & a);
+
+
+ /// Faster spherical linear interpolation of two unit length quaternions.
+ ///
+ /// This is the same as mix(), except for two rules:
+ /// 1) The two quaternions must be unit length.
+ /// 2) The interpolation factor (a) must be in the range [0, 1].
+ ///
+ /// This will use the equivalent to fastAcos() and fastSin().
+ ///
+ /// @see gtx_simd_quat
+ /// @see - mix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a)
+ detail::fquatSIMD fastMix(
+ detail::fquatSIMD const & x,
+ detail::fquatSIMD const & y,
+ float const & a);
+
+ /// Identical to fastMix() except takes the shortest path.
+ ///
+ /// The same rules apply here as those in fastMix(). Both quaternions must be unit length and 'a' must be
+ /// in the range [0, 1].
+ ///
+ /// @see - fastMix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a)
+ /// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const & a)
+ detail::fquatSIMD fastSlerp(
+ detail::fquatSIMD const & x,
+ detail::fquatSIMD const & y,
+ float const & a);
+
+
+ /// Returns the q conjugate.
+ ///
+ /// @see gtx_simd_quat
+ detail::fquatSIMD conjugate(
+ detail::fquatSIMD const & q);
+
+ /// Returns the q inverse.
+ ///
+ /// @see gtx_simd_quat
+ detail::fquatSIMD inverse(
+ detail::fquatSIMD const & q);
+
+ /// Build a quaternion from an angle and a normalized axis.
+ ///
+ /// @param angle Angle expressed in radians.
+ /// @param axis Axis of the quaternion, must be normalized.
+ ///
+ /// @see gtx_simd_quat
+ detail::fquatSIMD angleAxisSIMD(
+ float const & angle,
+ vec3 const & axis);
+
+ /// Build a quaternion from an angle and a normalized axis.
+ ///
+ /// @param angle Angle expressed in radians.
+ /// @param x x component of the x-axis, x, y, z must be a normalized axis
+ /// @param y y component of the y-axis, x, y, z must be a normalized axis
+ /// @param z z component of the z-axis, x, y, z must be a normalized axis
+ ///
+ /// @see gtx_simd_quat
+ detail::fquatSIMD angleAxisSIMD(
+ float const & angle,
+ float const & x,
+ float const & y,
+ float const & z);
+
+ // TODO: Move this to somewhere more appropriate. Used with fastMix() and fastSlerp().
+ /// Performs the equivalent of glm::fastSin() on each component of the given __m128.
+ __m128 fastSin(__m128 x);
+
+ /// @}
+}//namespace glm
+
+#include "simd_quat.inl"
+
+
+#if (GLM_COMPILER & GLM_COMPILER_VC)
+# pragma warning(pop)
+#endif
+
+
+#endif//(GLM_ARCH != GLM_ARCH_PURE)