From e62817b8252974b8a98393275874ee303840bf13 Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Fri, 12 May 2017 18:49:50 +0500 Subject: 2017-05-12 --- depedencies/include/glm/gtc/quaternion.hpp | 397 +++++++++++++++++++++++++++++ 1 file changed, 397 insertions(+) create mode 100644 depedencies/include/glm/gtc/quaternion.hpp (limited to 'depedencies/include/glm/gtc/quaternion.hpp') diff --git a/depedencies/include/glm/gtc/quaternion.hpp b/depedencies/include/glm/gtc/quaternion.hpp new file mode 100644 index 0000000..8af1c8b --- /dev/null +++ b/depedencies/include/glm/gtc/quaternion.hpp @@ -0,0 +1,397 @@ +/// @ref gtc_quaternion +/// @file glm/gtc/quaternion.hpp +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtc_constants (dependence) +/// +/// @defgroup gtc_quaternion GLM_GTC_quaternion +/// @ingroup gtc +/// +/// @brief Defines a templated quaternion type and several quaternion operations. +/// +/// need to be included to use these functionalities. + +#pragma once + +// Dependency: +#include "../mat3x3.hpp" +#include "../mat4x4.hpp" +#include "../vec3.hpp" +#include "../vec4.hpp" +#include "../gtc/constants.hpp" + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_quaternion extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_quaternion + /// @{ + + template + struct tquat + { + // -- Implementation detail -- + + typedef tquat type; + typedef T value_type; + + // -- Data -- + +# if GLM_HAS_ALIGNED_TYPE +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +# endif +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +# pragma clang diagnostic ignored "-Wnested-anon-types" +# endif + + union + { + struct { T x, y, z, w;}; + typename detail::storage::value>::type data; + }; + +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# endif +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# endif +# else + T x, y, z, w; +# endif + + // -- Component accesses -- + + typedef length_t length_type; + /// Return the count of components of a quaternion + GLM_FUNC_DECL static length_type length(){return 4;} + + GLM_FUNC_DECL T & operator[](length_type i); + GLM_FUNC_DECL T const & operator[](length_type i) const; + + // -- Implicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR tquat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat const & q) GLM_DEFAULT; + template + GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat const & q); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tquat(ctor); + GLM_FUNC_DECL GLM_CONSTEXPR tquat(T const & s, tvec3 const & v); + GLM_FUNC_DECL GLM_CONSTEXPR tquat(T const & w, T const & x, T const & y, T const & z); + + // -- Conversion constructors -- + + template + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tquat(tquat const & q); + + /// Explicit conversion operators +# if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS + GLM_FUNC_DECL explicit operator tmat3x3(); + GLM_FUNC_DECL explicit operator tmat4x4(); +# endif + + /// Create a quaternion from two normalized axis + /// + /// @param u A first normalized axis + /// @param v A second normalized axis + /// @see gtc_quaternion + /// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors + GLM_FUNC_DECL tquat(tvec3 const & u, tvec3 const & v); + + /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. + GLM_FUNC_DECL GLM_EXPLICIT tquat(tvec3 const & eulerAngles); + GLM_FUNC_DECL GLM_EXPLICIT tquat(tmat3x3 const & m); + GLM_FUNC_DECL GLM_EXPLICIT tquat(tmat4x4 const & m); + + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL tquat & operator=(tquat const & m) GLM_DEFAULT; + + template + GLM_FUNC_DECL tquat & operator=(tquat const & m); + template + GLM_FUNC_DECL tquat & operator+=(tquat const & q); + template + GLM_FUNC_DECL tquat & operator-=(tquat const & q); + template + GLM_FUNC_DECL tquat & operator*=(tquat const & q); + template + GLM_FUNC_DECL tquat & operator*=(U s); + template + GLM_FUNC_DECL tquat & operator/=(U s); + }; + + // -- Unary bit operators -- + + template + GLM_FUNC_DECL tquat operator+(tquat const & q); + + template + GLM_FUNC_DECL tquat operator-(tquat const & q); + + // -- Binary operators -- + + template + GLM_FUNC_DECL tquat operator+(tquat const & q, tquat const & p); + + template + GLM_FUNC_DECL tquat operator*(tquat const & q, tquat const & p); + + template + GLM_FUNC_DECL tvec3 operator*(tquat const & q, tvec3 const & v); + + template + GLM_FUNC_DECL tvec3 operator*(tvec3 const & v, tquat const & q); + + template + GLM_FUNC_DECL tvec4 operator*(tquat const & q, tvec4 const & v); + + template + GLM_FUNC_DECL tvec4 operator*(tvec4 const & v, tquat const & q); + + template + GLM_FUNC_DECL tquat operator*(tquat const & q, T const & s); + + template + GLM_FUNC_DECL tquat operator*(T const & s, tquat const & q); + + template + GLM_FUNC_DECL tquat operator/(tquat const & q, T const & s); + + // -- Boolean operators -- + + template + GLM_FUNC_DECL bool operator==(tquat const & q1, tquat const & q2); + + template + GLM_FUNC_DECL bool operator!=(tquat const & q1, tquat const & q2); + + /// Returns the length of the quaternion. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T length(tquat const & q); + + /// Returns the normalized quaternion. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat normalize(tquat const & q); + + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... + /// + /// @see gtc_quaternion + template class quatType> + GLM_FUNC_DECL T dot(quatType const & x, quatType const & y); + + /// 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 gtc_quaternion + /// @see - slerp(tquat const & x, tquat const & y, T const & a) + template + GLM_FUNC_DECL tquat mix(tquat const & x, tquat const & y, T 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 gtc_quaternion + template + GLM_FUNC_DECL tquat lerp(tquat const & x, tquat const & y, T 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 gtc_quaternion + template + GLM_FUNC_DECL tquat slerp(tquat const & x, tquat const & y, T a); + + /// Returns the q conjugate. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat conjugate(tquat const & q); + + /// Returns the q inverse. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat inverse(tquat const & q); + + /// Rotates a quaternion from a vector of 3 components axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians. + /// @param axis Axis of the rotation + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat rotate(tquat const & q, T const & angle, tvec3 const & axis); + + /// Returns euler angles, pitch as x, yaw as y, roll as z. + /// The result is expressed in radians if GLM_FORCE_RADIANS is defined or degrees otherwise. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec3 eulerAngles(tquat const & x); + + /// Returns roll value of euler angles expressed in radians. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL T roll(tquat const & x); + + /// Returns pitch value of euler angles expressed in radians. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL T pitch(tquat const & x); + + /// Returns yaw value of euler angles expressed in radians. + /// + /// @see gtx_quaternion + template + GLM_FUNC_DECL T yaw(tquat const & x); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tmat3x3 mat3_cast(tquat const & x); + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tmat4x4 mat4_cast(tquat const & x); + + /// Converts a 3 * 3 matrix to a quaternion. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat quat_cast(tmat3x3 const & x); + + /// Converts a 4 * 4 matrix to a quaternion. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tquat quat_cast(tmat4x4 const & x); + + /// Returns the quaternion rotation angle. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL T angle(tquat const & x); + + /// Returns the q rotation axis. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec3 axis(tquat const & x); + + /// 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 gtc_quaternion + template + GLM_FUNC_DECL tquat angleAxis(T const & angle, tvec3 const & axis); + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 lessThan(tquat const & x, tquat const & y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 lessThanEqual(tquat const & x, tquat const & y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 greaterThan(tquat const & x, tquat const & y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 greaterThanEqual(tquat const & x, tquat const & y); + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 equal(tquat const & x, tquat const & y); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam quatType Floating-point quaternion types. + /// + /// @see gtc_quaternion + template + GLM_FUNC_DECL tvec4 notEqual(tquat const & x, tquat const & y); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam genType Floating-point scalar or vector types. + template + GLM_FUNC_DECL tvec4 isnan(tquat const & x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam genType Floating-point scalar or vector types. + template + GLM_FUNC_DECL tvec4 isinf(tquat const & x); + + /// @} +} //namespace glm + +#include "quaternion.inl" -- cgit v1.2.3