diff options
author | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2018-08-21 17:40:38 +0200 |
---|---|---|
committer | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2018-08-21 17:40:38 +0200 |
commit | 2877f4eda3d1b0c7431039e3142ecf1a282a34b1 (patch) | |
tree | 58ad35e27ab2a3b8955f5adbf28f296670681ffc /external/include/glm | |
parent | Smooth sun movement (diff) | |
download | AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar.gz AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar.bz2 AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar.lz AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar.xz AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.tar.zst AltCraft-2877f4eda3d1b0c7431039e3142ecf1a282a34b1.zip |
Diffstat (limited to 'external/include/glm')
265 files changed, 24609 insertions, 21407 deletions
diff --git a/external/include/glm/CMakeLists.txt b/external/include/glm/CMakeLists.txt new file mode 100644 index 0000000..df9c9ee --- /dev/null +++ b/external/include/glm/CMakeLists.txt @@ -0,0 +1,77 @@ +file(GLOB ROOT_SOURCE *.cpp) +file(GLOB ROOT_INLINE *.inl) +file(GLOB ROOT_HEADER *.hpp) +file(GLOB ROOT_TEXT ../*.txt) +file(GLOB ROOT_MD ../*.md) +file(GLOB ROOT_NAT ../util/glm.natvis) + +file(GLOB_RECURSE CORE_SOURCE ./detail/*.cpp) +file(GLOB_RECURSE CORE_INLINE ./detail/*.inl) +file(GLOB_RECURSE CORE_HEADER ./detail/*.hpp) + +file(GLOB_RECURSE EXT_SOURCE ./ext/*.cpp) +file(GLOB_RECURSE EXT_INLINE ./ext/*.inl) +file(GLOB_RECURSE EXT_HEADER ./ext/*.hpp) + +file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) +file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) +file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +file(GLOB_RECURSE SIMD_SOURCE ./simd/*.cpp) +file(GLOB_RECURSE SIMD_INLINE ./simd/*.inl) +file(GLOB_RECURSE SIMD_HEADER ./simd/*.h) + +source_group("Text Files" FILES ${ROOT_TEXT} ${ROOT_MD}) +source_group("Core Files" FILES ${CORE_SOURCE}) +source_group("Core Files" FILES ${CORE_INLINE}) +source_group("Core Files" FILES ${CORE_HEADER}) +source_group("EXT Files" FILES ${EXT_SOURCE}) +source_group("EXT Files" FILES ${EXT_INLINE}) +source_group("EXT Files" FILES ${EXT_HEADER}) +source_group("GTC Files" FILES ${GTC_SOURCE}) +source_group("GTC Files" FILES ${GTC_INLINE}) +source_group("GTC Files" FILES ${GTC_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) +source_group("SIMD Files" FILES ${SIMD_SOURCE}) +source_group("SIMD Files" FILES ${SIMD_INLINE}) +source_group("SIMD Files" FILES ${SIMD_HEADER}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) + +if(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE) + if(GLM_STATIC_LIBRARY_ENABLE) + add_library(glm_static STATIC ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + endif(GLM_STATIC_LIBRARY_ENABLE) + + if(GLM_DYNAMIC_LIBRARY_ENABLE) + add_library(glm_shared SHARED ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + endif(GLM_DYNAMIC_LIBRARY_ENABLE) + +else(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE) + add_executable(glm_dummy ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${EXT_SOURCE} ${EXT_INLINE} ${EXT_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${SIMD_SOURCE} ${SIMD_INLINE} ${SIMD_HEADER}) + +endif(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE) diff --git a/external/include/glm/common.hpp b/external/include/glm/common.hpp index f57e800..8972284 100644 --- a/external/include/glm/common.hpp +++ b/external/include/glm/common.hpp @@ -1,6 +1,534 @@ /// @ref core /// @file glm/common.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> +/// +/// @defgroup core_func_common Common functions +/// @ingroup core +/// +/// Include <glm/common.hpp> to use these core features. +/// +/// These all operate component-wise. The description is per component. #pragma once -#include "detail/func_common.hpp" +#include "detail/setup.hpp" +#include "detail/qualifier.hpp" +#include "detail/type_int.hpp" +#include "detail/_fixes.hpp" + +namespace glm +{ + /// @addtogroup core_func_common + /// @{ + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam genType floating-point or signed integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// @see qualifier + template<typename genType> + GLM_FUNC_DECL genType abs(genType x); + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> abs(vec<L, T, Q> const& x); + + /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml">GLSL sign man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> sign(vec<L, T, Q> const& x); + + /// Returns a value equal to the nearest integer that is less then or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml">GLSL floor man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> floor(vec<L, T, Q> const& x); + + /// Returns a value equal to the nearest integer to x + /// whose absolute value is not larger than the absolute value of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml">GLSL trunc man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> trunc(vec<L, T, Q> const& x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// This includes the possibility that round(x) returns the + /// same value as roundEven(x) for all values of x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> round(vec<L, T, Q> const& x); + + /// Returns a value equal to the nearest integer to x. + /// A fractional part of 0.5 will round toward the nearest even + /// integer. (Both 3.5 and 4.5 for x will return 4.0.) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml">GLSL roundEven man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// @see <a href="http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx">New round to even technique</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> roundEven(vec<L, T, Q> const& x); + + /// Returns a value equal to the nearest integer + /// that is greater than or equal to x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml">GLSL ceil man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> ceil(vec<L, T, Q> const& x); + + /// Return x - floor(x). + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType fract(genType x); + + /// Return x - floor(x). + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fract(vec<L, T, Q> const& x); + + template<typename genType> + GLM_FUNC_DECL genType mod(genType x, genType y); + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> mod(vec<L, T, Q> const& x, T y); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types, include glm/gtc/integer for integer scalar types support + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> mod(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the fractional part of x and sets i to the integer + /// part (as a whole number floating point value). Both the + /// return value and the output parameter will have the same + /// sign as x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml">GLSL modf man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType modf(genType x, genType& i); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType min(genType x, genType y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> min(vec<L, T, Q> const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> min(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType max(genType x, genType y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> max(vec<L, T, Q> const& x, T y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> max(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> clamp(vec<L, T, Q> const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> clamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal); + + /// If genTypeU is a floating scalar or vector: + /// Returns x * (1.0 - a) + y * a, i.e., the linear blend of + /// x and y using the floating-point value a. + /// The value for a is not restricted to the range [0, 1]. + /// + /// If genTypeU is a boolean scalar or vector: + /// Selects which vector each returned component comes + /// from. For a component of 'a' that is false, the + /// corresponding component of 'x' is returned. For a + /// component of 'a' that is true, the corresponding + /// component of 'y' is returned. Components of 'x' and 'y' that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml">GLSL mix man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// + /// @param[in] x Value to interpolate. + /// @param[in] y Value to interpolate. + /// @param[in] a Interpolant. + /// + /// @tparam genTypeT Floating point scalar or vector. + /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. + /// + /// @code + /// #include <glm/glm.hpp> + /// ... + /// float a; + /// bool b; + /// glm::dvec3 e; + /// glm::dvec3 f; + /// glm::vec4 g; + /// glm::vec4 h; + /// ... + /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. + /// glm::vec4 s = glm::mix(g, h, b); // Returns g or h; + /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. + /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. + /// @endcode + template<typename genTypeT, typename genTypeU> + GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); + + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a); + + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U a); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType step(genType edge, genType x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> step(T edge, vec<L, T, Q> const& x); + + /// Returns 0.0 if x < edge, otherwise it returns 1.0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> step(vec<L, T, Q> const& edge, vec<L, T, Q> const& x); + + /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + /// performs smooth Hermite interpolation between 0 and 1 + /// when edge0 < x < edge1. This is useful in cases where + /// you would want a threshold function with a smooth + /// transition. This is equivalent to: + /// genType t; + /// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); + /// return t * t * (3 - 2 * t); + /// Results are undefined if edge0 >= edge1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml">GLSL smoothstep man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x); + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> smoothstep(T edge0, T edge1, vec<L, T, Q> const& x); + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> smoothstep(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x); + + /// 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 L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isnan(vec<L, T, Q> 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 L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml">GLSL isinf man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isinf(vec<L, T, Q> const& x); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floating-point + /// value's bit-level representation is preserved. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + GLM_FUNC_DECL int floatBitsToInt(float const& v); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, int, Q> floatBitsToInt(vec<L, float, Q> const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + GLM_FUNC_DECL uint floatBitsToUint(float const& v); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, uint, Q> floatBitsToUint(vec<L, float, Q> const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + GLM_FUNC_DECL float intBitsToFloat(int const& v); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, float, Q> intBitsToFloat(vec<L, int, Q> const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + GLM_FUNC_DECL float uintBitsToFloat(uint const& v); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, float, Q> uintBitsToFloat(vec<L, uint, Q> const& v); + + /// Computes and returns a * b + c. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml">GLSL fma man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType> + GLM_FUNC_DECL genType fma(genType const& a, genType const& b, genType const& c); + + /// Splits x into a floating-point significand in the range + /// [0.5, 1.0) and an integral exponent of two, such that: + /// x = significand * exp(2, exponent) + /// + /// The significand is returned by the function and the + /// exponent is returned in the parameter exp. For a + /// floating-point value of zero, the significant and exponent + /// are both zero. For a floating-point value that is an + /// infinity or is not a number, the results are undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml">GLSL frexp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType, typename genIType> + GLM_FUNC_DECL genType frexp(genType const& x, genIType& exp); + + /// Builds a floating-point number from x and the + /// corresponding integral exponent of two in exp, returning: + /// significand * exp(2, exponent) + /// + /// If this product is too large to be represented in the + /// floating-point type, the result is undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml">GLSL ldexp man page</a>; + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template<typename genType, typename genIType> + GLM_FUNC_DECL genType ldexp(genType const& x, genIType const& exp); + + /// @} +}//namespace glm + +#include "detail/func_common.inl" + diff --git a/external/include/glm/detail/_features.hpp b/external/include/glm/detail/_features.hpp index 97dd633..cee1272 100644 --- a/external/include/glm/detail/_features.hpp +++ b/external/include/glm/detail/_features.hpp @@ -26,7 +26,7 @@ // Variadic templates - GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf -// +// // Extending variadic template template parameters - GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf @@ -34,7 +34,7 @@ // Initializer lists - GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm -// #define GLM_CXX11_STATIC_ASSERT +// #define GLM_CXX11_STATIC_ASSERT // Static assertions - GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html @@ -62,15 +62,15 @@ // Declared type of an expression - GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf -// +// // Right angle brackets - GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html -// +// // Default template arguments for function templates DR226 GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226 -// +// // Solving the SFINAE problem for expressions DR339 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html @@ -78,7 +78,7 @@ // Template aliases N2258 GCC 4.7 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf -// +// // Extern templates N1987 Yes // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm @@ -90,19 +90,19 @@ // Strongly-typed enums N2347 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf -// +// // Forward declarations for enums N2764 GCC 4.6 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf -// +// // Generalized attributes N2761 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf -// +// // Generalized constant expressions N2235 GCC 4.6 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf -// +// // Alignment support N2341 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf @@ -110,7 +110,7 @@ // Delegating constructors N1986 GCC 4.7 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf -// +// // Inheriting constructors N2540 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm @@ -118,19 +118,19 @@ // Explicit conversion operators N2437 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf -// +// // New character types N2249 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html -// +// // Unicode string literals N2442 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm -// +// // Raw string literals N2442 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm -// +// // Universal character name literals N2170 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html @@ -138,7 +138,7 @@ // User-defined literals N2765 GCC 4.7 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf -// +// // Standard Layout Types N2342 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm @@ -147,11 +147,11 @@ // Defaulted and deleted functions N2346 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm -// +// // Extended friend declarations N1791 GCC 4.7 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf -// +// // Extending sizeof N2253 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html @@ -177,7 +177,7 @@ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm -// +// // Minimal support for garbage collection and reachability-based leak detection N2670 No // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm @@ -185,75 +185,73 @@ // Allowing move constructors to throw [noexcept] N3050 GCC 4.6 (core language only) // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html -// +// // Defining move special member functions N3053 GCC 4.6 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html -// +// // Sequence points N2239 Yes // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html -// +// // Atomic operations N2427 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html -// +// // Strong Compare and Exchange N2748 GCC 4.5 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html -// +// // Bidirectional Fences N2752 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm -// +// // Memory model N2429 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm -// +// // Data-dependency ordering: atomics and memory model N2664 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm -// +// // Propagating exceptions N2179 GCC 4.4 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html -// +// // Abandoning a process and at_quick_exit N2440 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm -// +// // Allow atomics use in signal handlers N2547 Yes // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm -// +// // Thread-local storage N2659 GCC 4.8 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm -// +// // Dynamic initialization and destruction with concurrency N2660 GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm -// +// // __func__ predefined identifier N2340 GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm -// +// // C99 preprocessor N1653 GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm -// +// // long long N1811 GCC 4.3 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf -// +// // Extended integral types N1988 Yes // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf #if(GLM_COMPILER & GLM_COMPILER_GCC) -# if(GLM_COMPILER >= GLM_COMPILER_GCC43) -# define GLM_CXX11_STATIC_ASSERT -# endif +# define GLM_CXX11_STATIC_ASSERT #elif(GLM_COMPILER & GLM_COMPILER_CLANG) # if(__has_feature(cxx_exceptions)) diff --git a/external/include/glm/detail/_noise.hpp b/external/include/glm/detail/_noise.hpp index 89403f4..946148c 100644 --- a/external/include/glm/detail/_noise.hpp +++ b/external/include/glm/detail/_noise.hpp @@ -11,97 +11,77 @@ namespace glm{ namespace detail { - template <typename T> - GLM_FUNC_QUALIFIER T mod289(T const & x) + template<typename T> + GLM_FUNC_QUALIFIER T mod289(T const& x) { - return x - floor(x * static_cast<T>(1.0) / static_cast<T>(289.0)) * static_cast<T>(289.0); + return x - floor(x * (static_cast<T>(1.0) / static_cast<T>(289.0))) * static_cast<T>(289.0); } - template <typename T> - GLM_FUNC_QUALIFIER T permute(T const & x) + template<typename T> + GLM_FUNC_QUALIFIER T permute(T const& x) { return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> permute(tvec2<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> permute(vec<2, T, Q> const& x) { return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> permute(tvec3<T, P> const & x) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> permute(vec<3, T, Q> const& x) { return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> permute(tvec4<T, P> const & x) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x) { return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x); } -/* - template <typename T, precision P, template<typename> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> permute(vecType<T, P> const & x) - { - return mod289(((x * T(34)) + T(1)) * x); - } -*/ - template <typename T> - GLM_FUNC_QUALIFIER T taylorInvSqrt(T const & r) - { - return T(1.79284291400159) - T(0.85373472095314) * r; - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> taylorInvSqrt(tvec2<T, P> const & r) + + template<typename T> + GLM_FUNC_QUALIFIER T taylorInvSqrt(T const& r) { return T(1.79284291400159) - T(0.85373472095314) * r; } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> taylorInvSqrt(tvec3<T, P> const & r) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> taylorInvSqrt(vec<2, T, Q> const& r) { return T(1.79284291400159) - T(0.85373472095314) * r; } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> taylorInvSqrt(tvec4<T, P> const & r) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> taylorInvSqrt(vec<3, T, Q> const& r) { return T(1.79284291400159) - T(0.85373472095314) * r; } -/* - template <typename T, precision P, template<typename> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> taylorInvSqrt(vecType<T, P> const & r) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r) { return T(1.79284291400159) - T(0.85373472095314) * r; } -*/ - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> fade(tvec2<T, P> const & t) - { - return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> fade(tvec3<T, P> const & t) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> fade(vec<2, T, Q> const& t) { return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> fade(tvec4<T, P> const & t) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> fade(vec<3, T, Q> const& t) { return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); } -/* - template <typename T, precision P, template <typename> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fade(vecType<T, P> const & t) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t) { return (t * t * t) * (t * (t * T(6) - T(15)) + T(10)); } -*/ }//namespace detail }//namespace glm diff --git a/external/include/glm/detail/_swizzle.hpp b/external/include/glm/detail/_swizzle.hpp index 8e134d9..2609e79 100644 --- a/external/include/glm/detail/_swizzle.hpp +++ b/external/include/glm/detail/_swizzle.hpp @@ -7,7 +7,7 @@ namespace glm{ namespace detail { // Internal class for implementing swizzle operators - template <typename T, int N> + template<typename T, int N> struct _swizzle_base0 { protected: @@ -16,47 +16,46 @@ namespace detail // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. // The size 1 buffer is assumed to aligned to the actual members so that the - // elem() + // elem() char _buffer[1]; }; - template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, bool Aligned> + template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, bool Aligned> struct _swizzle_base1 : public _swizzle_base0<T, N> { }; - template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, bool Aligned> - struct _swizzle_base1<2, T, P, vecType, E0,E1,-1,-2, Aligned> : public _swizzle_base0<T, 2> + template<typename T, qualifier Q, int E0, int E1, bool Aligned> + struct _swizzle_base1<2, T, Q, E0,E1,-1,-2, Aligned> : public _swizzle_base0<T, 2> { - GLM_FUNC_QUALIFIER vecType<T, P> operator ()() const { return vecType<T, P>(this->elem(E0), this->elem(E1)); } + GLM_FUNC_QUALIFIER vec<2, T, Q> operator ()() const { return vec<2, T, Q>(this->elem(E0), this->elem(E1)); } }; - template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, bool Aligned> - struct _swizzle_base1<3, T, P, vecType, E0,E1,E2,-1, Aligned> : public _swizzle_base0<T, 3> + template<typename T, qualifier Q, int E0, int E1, int E2, bool Aligned> + struct _swizzle_base1<3, T, Q, E0,E1,E2,-1, Aligned> : public _swizzle_base0<T, 3> { - GLM_FUNC_QUALIFIER vecType<T, P> operator ()() const { return vecType<T, P>(this->elem(E0), this->elem(E1), this->elem(E2)); } + GLM_FUNC_QUALIFIER vec<3, T, Q> operator ()() const { return vec<3, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2)); } }; - template <typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, bool Aligned> - struct _swizzle_base1<4, T, P, vecType, E0,E1,E2,E3, Aligned> : public _swizzle_base0<T, 4> - { - GLM_FUNC_QUALIFIER vecType<T, P> operator ()() const { return vecType<T, P>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } + template<typename T, qualifier Q, int E0, int E1, int E2, int E3, bool Aligned> + struct _swizzle_base1<4, T, Q, E0,E1,E2,E3, Aligned> : public _swizzle_base0<T, 4> + { + GLM_FUNC_QUALIFIER vec<4, T, Q> operator ()() const { return vec<4, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } }; // Internal class for implementing swizzle operators /* Template parameters: - ValueType = type of scalar values (e.g. float, double) - VecType = class the swizzle is applies to (e.g. tvec3<float>) - N = number of components in the vector (e.g. 3) - E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec + T = type of scalar values (e.g. float, double) + N = number of components in the vector (e.g. 3) + E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles - containing duplicate elements so that they cannot be used as r-values). + containing duplicate elements so that they cannot be used as r-values). */ - template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS> - struct _swizzle_base2 : public _swizzle_base1<N, T, P, vecType, E0,E1,E2,E3, detail::is_aligned<P>::value> + template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS> + struct _swizzle_base2 : public _swizzle_base1<N, T, Q, E0,E1,E2,E3, detail::is_aligned<Q>::value> { GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const T& t) { @@ -65,43 +64,43 @@ namespace detail return *this; } - GLM_FUNC_QUALIFIER _swizzle_base2& operator= (vecType<T, P> const& that) + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (vec<N, T, Q> const& that) { - struct op { - GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e = t; } + struct op { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e = t; } }; _apply_op(that, op()); return *this; } - GLM_FUNC_QUALIFIER void operator -= (vecType<T, P> const& that) + GLM_FUNC_QUALIFIER void operator -= (vec<N, T, Q> const& that) { - struct op { - GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e -= t; } + struct op { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e -= t; } }; _apply_op(that, op()); } - GLM_FUNC_QUALIFIER void operator += (vecType<T, P> const& that) + GLM_FUNC_QUALIFIER void operator += (vec<N, T, Q> const& that) { - struct op { - GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e += t; } + struct op { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e += t; } }; _apply_op(that, op()); } - GLM_FUNC_QUALIFIER void operator *= (vecType<T, P> const& that) + GLM_FUNC_QUALIFIER void operator *= (vec<N, T, Q> const& that) { - struct op { - GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e *= t; } + struct op { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e *= t; } }; _apply_op(that, op()); } - GLM_FUNC_QUALIFIER void operator /= (vecType<T, P> const& that) + GLM_FUNC_QUALIFIER void operator /= (vec<N, T, Q> const& that) { - struct op { - GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e /= t; } + struct op { + GLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e /= t; } }; _apply_op(that, op()); } @@ -118,8 +117,8 @@ namespace detail } protected: - template <typename U> - GLM_FUNC_QUALIFIER void _apply_op(vecType<T, P> const& that, U op) + template<typename U> + GLM_FUNC_QUALIFIER void _apply_op(vec<N, T, Q> const& that, U op) { // Make a copy of the data in this == &that. // The copier should optimize out the copy in cases where the function is @@ -133,12 +132,12 @@ namespace detail }; // Specialization for swizzles containing duplicate elements. These cannot be modified. - template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> - struct _swizzle_base2<N, T, P, vecType, E0,E1,E2,E3, 1> : public _swizzle_base1<N, T, P, vecType, E0,E1,E2,E3, detail::is_aligned<P>::value> + template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3> + struct _swizzle_base2<N, T, Q, E0,E1,E2,E3, 1> : public _swizzle_base1<N, T, Q, E0,E1,E2,E3, detail::is_aligned<Q>::value> { struct Stub {}; - GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const &) { return *this; } + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const&) { return *this; } GLM_FUNC_QUALIFIER T operator[] (size_t i) const { @@ -147,40 +146,40 @@ namespace detail } }; - template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> - struct _swizzle : public _swizzle_base2<N, T, P, vecType, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> + template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3> + struct _swizzle : public _swizzle_base2<N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> { - typedef _swizzle_base2<N, T, P, vecType, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> base_type; + typedef _swizzle_base2<N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> base_type; using base_type::operator=; - GLM_FUNC_QUALIFIER operator vecType<T, P> () const { return (*this)(); } + GLM_FUNC_QUALIFIER operator vec<N, T, Q> () const { return (*this)(); } }; // // To prevent the C++ syntax from getting entirely overwhelming, define some alias macros // -#define _GLM_SWIZZLE_TEMPLATE1 template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3> -#define _GLM_SWIZZLE_TEMPLATE2 template <int N, typename T, precision P, template <typename, precision> class vecType, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3> -#define _GLM_SWIZZLE_TYPE1 _swizzle<N, T, P, vecType, E0, E1, E2, E3> -#define _GLM_SWIZZLE_TYPE2 _swizzle<N, T, P, vecType, F0, F1, F2, F3> +#define GLM_SWIZZLE_TEMPLATE1 template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3> +#define GLM_SWIZZLE_TEMPLATE2 template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3> +#define GLM_SWIZZLE_TYPE1 _swizzle<N, T, Q, E0, E1, E2, E3> +#define GLM_SWIZZLE_TYPE2 _swizzle<N, T, Q, F0, F1, F2, F3> // // Wrapper for a binary operator (e.g. u.yy + v.zy) // -#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ - _GLM_SWIZZLE_TEMPLATE2 \ - GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ +#define GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ { \ return a() OPERAND b(); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const vecType<T, P>& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const vec<N, T, Q>& b) \ { \ return a() OPERAND b; \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const vecType<T, P>& a, const _GLM_SWIZZLE_TYPE1& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const vec<N, T, Q>& a, const GLM_SWIZZLE_TYPE1& b) \ { \ return a OPERAND b(); \ } @@ -188,14 +187,14 @@ namespace detail // // Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) // -#define _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \ +#define GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const T& b) \ { \ return a() OPERAND b; \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER vecType<T, P> operator OPERAND ( const T& a, const _GLM_SWIZZLE_TYPE1& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const T& a, const GLM_SWIZZLE_TYPE1& b) \ { \ return a OPERAND b(); \ } @@ -203,9 +202,9 @@ namespace detail // // Macro for wrapping a function taking one argument (e.g. abs()) // -#define _GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a) \ +#define GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a) \ { \ return FUNCTION(a()); \ } @@ -213,66 +212,66 @@ namespace detail // // Macro for wrapping a function taking two vector arguments (e.g. dot()). // -#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE2 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ +#define GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \ { \ return FUNCTION(a(), b()); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b) \ { \ return FUNCTION(a(), b()); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename V& b) \ { \ return FUNCTION(a(), b); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const GLM_SWIZZLE_TYPE1& b) \ { \ return FUNCTION(a, b()); \ - } + } // // Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). // -#define _GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE2 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b, const T& c) \ +#define GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ + GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b, const T& c) \ { \ return FUNCTION(a(), b(), c); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ { \ return FUNCTION(a(), b(), c); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ { \ return FUNCTION(a(), b, c); \ } \ - _GLM_SWIZZLE_TEMPLATE1 \ - GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const GLM_SWIZZLE_TYPE1& b, const T& c) \ { \ return FUNCTION(a, b(), c); \ - } - -}//namespace detail + } + +}//namespace detail }//namespace glm namespace glm { namespace detail { - _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) - _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) + GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) } // @@ -285,513 +284,513 @@ namespace glm // to explicitly convert the swizzled type to the unswizzled type. // - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); + //GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); - //_GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); - //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); - //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); - //_GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); + //GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); + //GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); + //GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); } -#define _GLM_SWIZZLE2_2_MEMBERS(T, P, V, E0,E1) \ - struct { detail::_swizzle<2, T, P, V, 0,0,-1,-2> E0 ## E0; }; \ - struct { detail::_swizzle<2, T, P, V, 0,1,-1,-2> E0 ## E1; }; \ - struct { detail::_swizzle<2, T, P, V, 1,0,-1,-2> E1 ## E0; }; \ - struct { detail::_swizzle<2, T, P, V, 1,1,-1,-2> E1 ## E1; }; - -#define _GLM_SWIZZLE2_3_MEMBERS(T, P, V, E0,E1) \ - struct { detail::_swizzle<3,T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<3,T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<3,T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<3,T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<3,T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<3,T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<3,T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<3,T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; - -#define _GLM_SWIZZLE2_4_MEMBERS(T, P, V, E0,E1) \ - struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; - -#define _GLM_SWIZZLE3_2_MEMBERS(T, P, V, E0,E1,E2) \ - struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; - -#define _GLM_SWIZZLE3_3_MEMBERS(T, P, V ,E0,E1,E2) \ - struct { detail::_swizzle<3, T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,2,-1> E2 ## E2 ## E2; }; - -#define _GLM_SWIZZLE3_4_MEMBERS(T, P, V, E0,E1,E2) \ - struct { detail::_swizzle<4,T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4,T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; - -#define _GLM_SWIZZLE4_2_MEMBERS(T, P, V, E0,E1,E2,E3) \ - struct { detail::_swizzle<2,T, P, V, 0,0,-1,-2> E0 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 0,1,-1,-2> E0 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 0,2,-1,-2> E0 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 0,3,-1,-2> E0 ## E3; }; \ - struct { detail::_swizzle<2,T, P, V, 1,0,-1,-2> E1 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 1,1,-1,-2> E1 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 1,2,-1,-2> E1 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 1,3,-1,-2> E1 ## E3; }; \ - struct { detail::_swizzle<2,T, P, V, 2,0,-1,-2> E2 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 2,1,-1,-2> E2 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 2,2,-1,-2> E2 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 2,3,-1,-2> E2 ## E3; }; \ - struct { detail::_swizzle<2,T, P, V, 3,0,-1,-2> E3 ## E0; }; \ - struct { detail::_swizzle<2,T, P, V, 3,1,-1,-2> E3 ## E1; }; \ - struct { detail::_swizzle<2,T, P, V, 3,2,-1,-2> E3 ## E2; }; \ - struct { detail::_swizzle<2,T, P, V, 3,3,-1,-2> E3 ## E3; }; - -#define _GLM_SWIZZLE4_3_MEMBERS(T, P, V, E0,E1,E2,E3) \ - struct { detail::_swizzle<3, T, P, V, 0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,0,2,-1> E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,0,3,-1> E0 ## E0 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,2,-1> E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,1,3,-1> E0 ## E1 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,0,-1> E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,1,-1> E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,2,-1> E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,2,3,-1> E0 ## E2 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 0,3,0,-1> E0 ## E3 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 0,3,1,-1> E0 ## E3 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 0,3,2,-1> E0 ## E3 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 0,3,3,-1> E0 ## E3 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,2,-1> E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,0,3,-1> E1 ## E0 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,1,-1> E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,2,-1> E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,1,3,-1> E1 ## E1 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,0,-1> E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,1,-1> E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,2,-1> E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,2,3,-1> E1 ## E2 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 1,3,0,-1> E1 ## E3 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 1,3,1,-1> E1 ## E3 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 1,3,2,-1> E1 ## E3 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 1,3,3,-1> E1 ## E3 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,0,-1> E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,1,-1> E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,2,-1> E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,0,3,-1> E2 ## E0 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,0,-1> E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,1,-1> E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,2,-1> E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,1,3,-1> E2 ## E1 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,0,-1> E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,1,-1> E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,2,-1> E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,2,3,-1> E2 ## E2 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 2,3,0,-1> E2 ## E3 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 2,3,1,-1> E2 ## E3 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 2,3,2,-1> E2 ## E3 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 2,3,3,-1> E2 ## E3 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 3,0,0,-1> E3 ## E0 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 3,0,1,-1> E3 ## E0 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 3,0,2,-1> E3 ## E0 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 3,0,3,-1> E3 ## E0 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 3,1,0,-1> E3 ## E1 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 3,1,1,-1> E3 ## E1 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 3,1,2,-1> E3 ## E1 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 3,1,3,-1> E3 ## E1 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 3,2,0,-1> E3 ## E2 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 3,2,1,-1> E3 ## E2 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 3,2,2,-1> E3 ## E2 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 3,2,3,-1> E3 ## E2 ## E3; }; \ - struct { detail::_swizzle<3, T, P, V, 3,3,0,-1> E3 ## E3 ## E0; }; \ - struct { detail::_swizzle<3, T, P, V, 3,3,1,-1> E3 ## E3 ## E1; }; \ - struct { detail::_swizzle<3, T, P, V, 3,3,2,-1> E3 ## E3 ## E2; }; \ - struct { detail::_swizzle<3, T, P, V, 3,3,3,-1> E3 ## E3 ## E3; }; - -#define _GLM_SWIZZLE4_4_MEMBERS(T, P, V, E0,E1,E2,E3) \ - struct { detail::_swizzle<4, T, P, V, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ - struct { detail::_swizzle<4, T, P, V, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; +#define GLM_SWIZZLE2_2_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<2, T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2, T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2, T, Q, 1,1,-1,-2> E1 ## E1; }; + +#define GLM_SWIZZLE2_3_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<3,T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3,T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE2_4_MEMBERS(T, Q, E0,E1) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; + +#define GLM_SWIZZLE3_2_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; + +#define GLM_SWIZZLE3_3_MEMBERS(T, Q ,E0,E1,E2) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE3_4_MEMBERS(T, Q, E0,E1,E2) \ + struct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4,T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; + +#define GLM_SWIZZLE4_2_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 0,3,-1,-2> E0 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 1,3,-1,-2> E1 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 2,3,-1,-2> E2 ## E3; }; \ + struct { detail::_swizzle<2,T, Q, 3,0,-1,-2> E3 ## E0; }; \ + struct { detail::_swizzle<2,T, Q, 3,1,-1,-2> E3 ## E1; }; \ + struct { detail::_swizzle<2,T, Q, 3,2,-1,-2> E3 ## E2; }; \ + struct { detail::_swizzle<2,T, Q, 3,3,-1,-2> E3 ## E3; }; + +#define GLM_SWIZZLE4_3_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,0,3,-1> E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,1,3,-1> E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,2,3,-1> E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,0,-1> E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,1,-1> E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,2,-1> E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 0,3,3,-1> E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,0,3,-1> E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,1,3,-1> E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,2,3,-1> E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,0,-1> E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,1,-1> E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,2,-1> E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 1,3,3,-1> E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,0,3,-1> E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,1,3,-1> E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,2,3,-1> E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,0,-1> E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,1,-1> E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,2,-1> E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 2,3,3,-1> E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,0,-1> E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,1,-1> E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,2,-1> E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,0,3,-1> E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,0,-1> E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,1,-1> E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,2,-1> E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,1,3,-1> E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,0,-1> E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,1,-1> E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,2,-1> E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,2,3,-1> E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,0,-1> E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,1,-1> E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,2,-1> E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<3, T, Q, 3,3,3,-1> E3 ## E3 ## E3; }; + +#define GLM_SWIZZLE4_4_MEMBERS(T, Q, E0,E1,E2,E3) \ + struct { detail::_swizzle<4, T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ + struct { detail::_swizzle<4, T, Q, 3,3,3,3> E3 ## E3 ## E3 ## E3; }; diff --git a/external/include/glm/detail/_swizzle_func.hpp b/external/include/glm/detail/_swizzle_func.hpp index 4b37edb..d218337 100644 --- a/external/include/glm/detail/_swizzle_func.hpp +++ b/external/include/glm/detail/_swizzle_func.hpp @@ -3,694 +3,683 @@ #pragma once -#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ - SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B); \ +#define GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, CONST, A, B) \ + vec<2, T, Q> A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ } -#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ - SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B ## C() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C); \ +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, CONST, A, B, C) \ + vec<3, T, Q> A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ } -#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ - SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A ## B ## C ## D() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, this->D); \ +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, CONST, A, B, C, D) \ + vec<4, T, Q> A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ } -#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ - template <typename TMPL_TYPE> \ - SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B); \ +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(T, P, L, CONST, A, B) \ + template<typename T> \ + vec<L, T, Q> vec<L, T, Q>::A ## B() CONST \ + { \ + return vec<2, T, Q>(this->A, this->B); \ } -#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ - template <typename TMPL_TYPE> \ - SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B ## C() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C); \ +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(T, P, L, CONST, A, B, C) \ + template<typename T> \ + vec<3, T, Q> vec<L, T, Q>::A ## B ## C() CONST \ + { \ + return vec<3, T, Q>(this->A, this->B, this->C); \ } -#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ - template <typename TMPL_TYPE> \ - SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A ## B ## C ## D() CONST \ - { \ - return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, this->D); \ +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(T, P, L, CONST, A, B, C, D) \ + template<typename T> \ + vec<4, T, Q> vec<L, T, Q>::A ## B ## C ## D() CONST \ + { \ + return vec<4, T, Q>(this->A, this->B, this->C, this->D); \ } #define GLM_MUTABLE -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, s, t) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2) - -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) - -#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, p) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3) - -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C) - -#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B) - -#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2, detail::ref3, detail::ref4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2, detail::vec3, detail::vec4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2, detail::vec3, detail::vec4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, p, q) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4) +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, x, y) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, r, g) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, s, t) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, C) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, B) + +#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, C, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, s, t, p, q) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, x, y) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, r, g) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, s, t) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, x, y, z) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, r, g, b) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, s, t, p) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, D) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, x, y, z, w) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, r, g, b, a) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, s, t, p, q) + diff --git a/external/include/glm/detail/_vectorize.hpp b/external/include/glm/detail/_vectorize.hpp index a08ed34..2e577a8 100644 --- a/external/include/glm/detail/_vectorize.hpp +++ b/external/include/glm/detail/_vectorize.hpp @@ -11,120 +11,120 @@ namespace glm{ namespace detail { - template <typename R, typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename R, typename T, qualifier Q> struct functor1{}; - template <typename R, typename T, precision P> - struct functor1<R, T, P, tvec1> + template<typename R, typename T, qualifier Q> + struct functor1<1, R, T, Q> { - GLM_FUNC_QUALIFIER static tvec1<R, P> call(R (*Func) (T x), tvec1<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<1, R, Q> call(R (*Func) (T x), vec<1, T, Q> const& v) { - return tvec1<R, P>(Func(v.x)); + return vec<1, R, Q>(Func(v.x)); } }; - template <typename R, typename T, precision P> - struct functor1<R, T, P, tvec2> + template<typename R, typename T, qualifier Q> + struct functor1<2, R, T, Q> { - GLM_FUNC_QUALIFIER static tvec2<R, P> call(R (*Func) (T x), tvec2<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<2, R, Q> call(R (*Func) (T x), vec<2, T, Q> const& v) { - return tvec2<R, P>(Func(v.x), Func(v.y)); + return vec<2, R, Q>(Func(v.x), Func(v.y)); } }; - template <typename R, typename T, precision P> - struct functor1<R, T, P, tvec3> + template<typename R, typename T, qualifier Q> + struct functor1<3, R, T, Q> { - GLM_FUNC_QUALIFIER static tvec3<R, P> call(R (*Func) (T x), tvec3<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<3, R, Q> call(R (*Func) (T x), vec<3, T, Q> const& v) { - return tvec3<R, P>(Func(v.x), Func(v.y), Func(v.z)); + return vec<3, R, Q>(Func(v.x), Func(v.y), Func(v.z)); } }; - template <typename R, typename T, precision P> - struct functor1<R, T, P, tvec4> + template<typename R, typename T, qualifier Q> + struct functor1<4, R, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<R, P> call(R (*Func) (T x), tvec4<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, R, Q> call(R (*Func) (T x), vec<4, T, Q> const& v) { - return tvec4<R, P>(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); + return vec<4, R, Q>(Func(v.x), Func(v.y), Func(v.z), Func(v.w)); } }; - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct functor2{}; - template <typename T, precision P> - struct functor2<T, P, tvec1> + template<typename T, qualifier Q> + struct functor2<1, T, Q> { - GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, tvec1<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, vec<1, T, Q> const& b) { - return tvec1<T, P>(Func(a.x, b.x)); + return vec<1, T, Q>(Func(a.x, b.x)); } }; - template <typename T, precision P> - struct functor2<T, P, tvec2> + template<typename T, qualifier Q> + struct functor2<2, T, Q> { - GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, tvec2<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, vec<2, T, Q> const& b) { - return tvec2<T, P>(Func(a.x, b.x), Func(a.y, b.y)); + return vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y)); } }; - template <typename T, precision P> - struct functor2<T, P, tvec3> + template<typename T, qualifier Q> + struct functor2<3, T, Q> { - GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, tvec3<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, vec<3, T, Q> const& b) { - return tvec3<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); + return vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z)); } }; - template <typename T, precision P> - struct functor2<T, P, tvec4> + template<typename T, qualifier Q> + struct functor2<4, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); + return vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w)); } }; - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct functor2_vec_sca{}; - template <typename T, precision P> - struct functor2_vec_sca<T, P, tvec1> + template<typename T, qualifier Q> + struct functor2_vec_sca<1, T, Q> { - GLM_FUNC_QUALIFIER static tvec1<T, P> call(T (*Func) (T x, T y), tvec1<T, P> const & a, T b) + GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, T b) { - return tvec1<T, P>(Func(a.x, b)); + return vec<1, T, Q>(Func(a.x, b)); } }; - template <typename T, precision P> - struct functor2_vec_sca<T, P, tvec2> + template<typename T, qualifier Q> + struct functor2_vec_sca<2, T, Q> { - GLM_FUNC_QUALIFIER static tvec2<T, P> call(T (*Func) (T x, T y), tvec2<T, P> const & a, T b) + GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, T b) { - return tvec2<T, P>(Func(a.x, b), Func(a.y, b)); + return vec<2, T, Q>(Func(a.x, b), Func(a.y, b)); } }; - template <typename T, precision P> - struct functor2_vec_sca<T, P, tvec3> + template<typename T, qualifier Q> + struct functor2_vec_sca<3, T, Q> { - GLM_FUNC_QUALIFIER static tvec3<T, P> call(T (*Func) (T x, T y), tvec3<T, P> const & a, T b) + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, T b) { - return tvec3<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b)); + return vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b)); } }; - template <typename T, precision P> - struct functor2_vec_sca<T, P, tvec4> + template<typename T, qualifier Q> + struct functor2_vec_sca<4, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(T (*Func) (T x, T y), tvec4<T, P> const & a, T b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, T b) { - return tvec4<T, P>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); + return vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b)); } }; }//namespace detail diff --git a/external/include/glm/detail/compute_vector_relational.hpp b/external/include/glm/detail/compute_vector_relational.hpp new file mode 100644 index 0000000..e5610ef --- /dev/null +++ b/external/include/glm/detail/compute_vector_relational.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "setup.hpp" +#include <cstring> +#include <limits> + +namespace glm{ +namespace detail +{ + template <typename T, bool isFloat = std::numeric_limits<T>::is_iec559> + struct compute_equal + { + GLM_FUNC_QUALIFIER static bool call(T a, T b) + { + return a == b; + } + }; + + template <typename T> + struct compute_equal<T, true> + { + GLM_FUNC_QUALIFIER static bool call(T a, T b) + { + return std::memcmp(&a, &b, sizeof(T)) == 0; + } + }; +}//namespace detail +}//namespace glm diff --git a/external/include/glm/detail/dummy.cpp b/external/include/glm/detail/dummy.cpp index a519a6d..01e4ba8 100644 --- a/external/include/glm/detail/dummy.cpp +++ b/external/include/glm/detail/dummy.cpp @@ -1,7 +1,7 @@ /// @ref core /// @file glm/core/dummy.cpp /// -/// GLM is a header only library. There is nothing to compile. +/// GLM is a header only library. There is nothing to compile. /// dummy.cpp exist only a wordaround for CMake file. /* @@ -44,9 +44,9 @@ struct light glm::vec3 computeNormal ( - glm::vec3 const & a, - glm::vec3 const & b, - glm::vec3 const & c + glm::vec3 const& a, + glm::vec3 const& b, + glm::vec3 const& c ) { return glm::normalize(glm::cross(c - a, b - a)); @@ -62,7 +62,7 @@ void glUniformMatrix4fv(GLuint, int, int, float*){} #include <glm/mat4x4.hpp> // glm::mat4 #include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective #include <glm/gtc/type_ptr.hpp> // glm::value_ptr -void func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) +void func(GLuint LocationMVP, float Translate, glm::vec2 const& Rotate) { glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); @@ -132,10 +132,10 @@ struct intersection #include <glm/gtc/random.hpp>// glm::vecRand3 glm::vec3 lighting ( - intersection const & Intersection, - material const & Material, - light const & Light, - glm::vec3 const & View + intersection const& Intersection, + material const& Material, + light const& Light, + glm::vec3 const& View ) { glm::vec3 Color(0.0f); @@ -165,27 +165,6 @@ glm::vec3 lighting } */ -/* -template <typename T, glm::precision P, template<typename, glm::precision> class vecType> -T normalizeDotA(vecType<T, P> const & x, vecType<T, P> const & y) -{ - return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); -} - -#define GLM_TEMPLATE_GENTYPE typename T, glm::precision P, template<typename, glm::precision> class - -template <GLM_TEMPLATE_GENTYPE vecType> -T normalizeDotB(vecType<T, P> const & x, vecType<T, P> const & y) -{ - return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); -} - -template <typename vecType> -typename vecType::value_type normalizeDotC(vecType const & a, vecType const & b) -{ - return glm::dot(a, b) * glm::inversesqrt(glm::dot(a, a) * glm::dot(b, b)); -} -*/ int main() { /* diff --git a/external/include/glm/detail/func_common.hpp b/external/include/glm/detail/func_common.hpp deleted file mode 100644 index 871fed6..0000000 --- a/external/include/glm/detail/func_common.hpp +++ /dev/null @@ -1,427 +0,0 @@ -/// @ref core -/// @file glm/detail/func_common.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> -/// -/// @defgroup core_func_common Common functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. - -#pragma once - -#include "setup.hpp" -#include "precision.hpp" -#include "type_int.hpp" -#include "_fixes.hpp" - -namespace glm -{ - /// @addtogroup core_func_common - /// @{ - - /// Returns x if x >= 0; otherwise, it returns -x. - /// - /// @tparam genType floating-point or signed integer; scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType abs(genType x); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> abs(vecType<T, P> const & x); - - /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. - /// - /// @tparam genType Floating-point or signed integer; scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml">GLSL sign man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> sign(vecType<T, P> const & x); - - /// Returns a value equal to the nearest integer that is less then or equal to x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml">GLSL floor man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> floor(vecType<T, P> const & x); - - /// Returns a value equal to the nearest integer to x - /// whose absolute value is not larger than the absolute value of x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml">GLSL trunc man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> trunc(vecType<T, P> const & x); - - /// Returns a value equal to the nearest integer to x. - /// The fraction 0.5 will round in a direction chosen by the - /// implementation, presumably the direction that is fastest. - /// This includes the possibility that round(x) returns the - /// same value as roundEven(x) for all values of x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> round(vecType<T, P> const & x); - - /// Returns a value equal to the nearest integer to x. - /// A fractional part of 0.5 will round toward the nearest even - /// integer. (Both 3.5 and 4.5 for x will return 4.0.) - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml">GLSL roundEven man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - /// @see <a href="http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx">New round to even technique</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> roundEven(vecType<T, P> const & x); - - /// Returns a value equal to the nearest integer - /// that is greater than or equal to x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml">GLSL ceil man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> ceil(vecType<T, P> const & x); - - /// Return x - floor(x). - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType fract(genType x); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fract(vecType<T, P> const & x); - - /// Modulus. Returns x - y * floor(x / y) - /// for each component in x using the floating point value y. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType mod(genType x, genType y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, T y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the fractional part of x and sets i to the integer - /// part (as a whole number floating point value). Both the - /// return value and the output parameter will have the same - /// sign as x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml">GLSL modf man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType modf(genType x, genType & i); - - /// Returns y if y < x; otherwise, it returns x. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType min(genType x, genType y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> min(vecType<T, P> const & x, T y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> min(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns y if x < y; otherwise, it returns x. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType max(genType x, genType y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> max(vecType<T, P> const & x, T y); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> max(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns min(max(x, minVal), maxVal) for each component in x - /// using the floating-point values minVal and maxVal. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> clamp(vecType<T, P> const & x, T minVal, T maxVal); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> clamp(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> const & maxVal); - - /// If genTypeU is a floating scalar or vector: - /// Returns x * (1.0 - a) + y * a, i.e., the linear blend of - /// x and y using the floating-point value a. - /// The value for a is not restricted to the range [0, 1]. - /// - /// If genTypeU is a boolean scalar or vector: - /// Selects which vector each returned component comes - /// from. For a component of <a> that is false, the - /// corresponding component of x is returned. For a - /// component of a that is true, the corresponding - /// component of y is returned. Components of x and y that - /// are not selected are allowed to be invalid floating point - /// values and will have no effect on the results. Thus, this - /// provides different functionality than - /// genType mix(genType x, genType y, genType(a)) - /// where a is a Boolean vector. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml">GLSL mix man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - /// - /// @param[in] x Value to interpolate. - /// @param[in] y Value to interpolate. - /// @param[in] a Interpolant. - /// - /// @tparam genTypeT Floating point scalar or vector. - /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. - /// - /// @code - /// #include <glm/glm.hpp> - /// ... - /// float a; - /// bool b; - /// glm::dvec3 e; - /// glm::dvec3 f; - /// glm::vec4 g; - /// glm::vec4 h; - /// ... - /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. - /// glm::vec4 s = glm::mix(g, h, b); // Teturns g or h; - /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. - /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. - /// @endcode - template <typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a); - - template <typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, U a); - - template <typename genTypeT, typename genTypeU> - GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a); - - /// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType step(genType edge, genType x); - - /// Returns 0.0 if x < edge, otherwise it returns 1.0. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, typename T, precision P> - GLM_FUNC_DECL vecType<T, P> step(T edge, vecType<T, P> const & x); - - /// Returns 0.0 if x < edge, otherwise it returns 1.0. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, typename T, precision P> - GLM_FUNC_DECL vecType<T, P> step(vecType<T, P> const & edge, vecType<T, P> const & x); - - /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and - /// performs smooth Hermite interpolation between 0 and 1 - /// when edge0 < x < edge1. This is useful in cases where - /// you would want a threshold function with a smooth - /// transition. This is equivalent to: - /// genType t; - /// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); - /// return t * t * (3 - 2 * t); - /// Results are undefined if edge0 >= edge1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml">GLSL smoothstep man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> smoothstep(T edge0, T edge1, vecType<T, P> const & x); - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> smoothstep(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> const & x); - - /// 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. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isnan(vecType<T, P> 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. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml">GLSL isinf man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isinf(vecType<T, P> const & x); - - /// Returns a signed integer value representing - /// the encoding of a floating-point value. The floating-point - /// value's bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - GLM_FUNC_DECL int floatBitsToInt(float const & v); - - /// Returns a signed integer value representing - /// the encoding of a floating-point value. The floatingpoint - /// value's bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_DECL vecType<int, P> floatBitsToInt(vecType<float, P> const & v); - - /// Returns a unsigned integer value representing - /// the encoding of a floating-point value. The floatingpoint - /// value's bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - GLM_FUNC_DECL uint floatBitsToUint(float const & v); - - /// Returns a unsigned integer value representing - /// the encoding of a floating-point value. The floatingpoint - /// value's bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_DECL vecType<uint, P> floatBitsToUint(vecType<float, P> const & v); - - /// Returns a floating-point value corresponding to a signed - /// integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - GLM_FUNC_DECL float intBitsToFloat(int const & v); - - /// Returns a floating-point value corresponding to a signed - /// integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_DECL vecType<float, P> intBitsToFloat(vecType<int, P> const & v); - - /// Returns a floating-point value corresponding to a - /// unsigned integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - GLM_FUNC_DECL float uintBitsToFloat(uint const & v); - - /// Returns a floating-point value corresponding to a - /// unsigned integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_DECL vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v); - - /// Computes and returns a * b + c. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml">GLSL fma man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL genType fma(genType const & a, genType const & b, genType const & c); - - /// Splits x into a floating-point significand in the range - /// [0.5, 1.0) and an integral exponent of two, such that: - /// x = significand * exp(2, exponent) - /// - /// The significand is returned by the function and the - /// exponent is returned in the parameter exp. For a - /// floating-point value of zero, the significant and exponent - /// are both zero. For a floating-point value that is an - /// infinity or is not a number, the results are undefined. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml">GLSL frexp man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType, typename genIType> - GLM_FUNC_DECL genType frexp(genType const & x, genIType & exp); - - /// Builds a floating-point number from x and the - /// corresponding integral exponent of two in exp, returning: - /// significand * exp(2, exponent) - /// - /// If this product is too large to be represented in the - /// floating-point type, the result is undefined. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml">GLSL ldexp man page</a>; - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType, typename genIType> - GLM_FUNC_DECL genType ldexp(genType const & x, genIType const & exp); - - /// @} -}//namespace glm - -#include "func_common.inl" - diff --git a/external/include/glm/detail/func_common.inl b/external/include/glm/detail/func_common.inl index 327b058..8b2d0b0 100644 --- a/external/include/glm/detail/func_common.inl +++ b/external/include/glm/detail/func_common.inl @@ -1,7 +1,7 @@ /// @ref core /// @file glm/detail/func_common.inl -#include "func_vector_relational.hpp" +#include "../vector_relational.hpp" #include "type_vec2.hpp" #include "type_vec3.hpp" #include "type_vec4.hpp" @@ -11,24 +11,24 @@ namespace glm { // min - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType min(genType x, genType y) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'min' only accept floating-point or integer inputs"); - return x < y ? x : y; + return (y < x) ? y : x; } // max - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType max(genType x, genType y) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'max' only accept floating-point or integer inputs"); - return x > y ? x : y; + return (x < y) ? y : x; } // abs - template <> + template<> GLM_FUNC_QUALIFIER int32 abs(int32 x) { int32 const y = x >> 31; @@ -39,7 +39,7 @@ namespace glm # if GLM_HAS_CXX11_STL using ::std::round; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType round(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'round' only accept floating-point inputs"); @@ -52,7 +52,7 @@ namespace glm # if GLM_HAS_CXX11_STL using ::std::trunc; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType trunc(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'trunc' only accept floating-point inputs"); @@ -66,11 +66,11 @@ namespace glm namespace glm{ namespace detail { - template <typename genFIType, bool /*signed*/> + template<typename genFIType, bool /*signed*/> struct compute_abs {}; - template <typename genFIType> + template<typename genFIType> struct compute_abs<genFIType, true> { GLM_FUNC_QUALIFIER static genFIType call(genFIType x) @@ -85,7 +85,7 @@ namespace detail }; #if GLM_COMPILER & GLM_COMPILER_CUDA - template <> + template<> struct compute_abs<float, true> { GLM_FUNC_QUALIFIER static float call(float x) @@ -95,7 +95,7 @@ namespace detail }; #endif - template <typename genFIType> + template<typename genFIType> struct compute_abs<genFIType, false> { GLM_FUNC_QUALIFIER static genFIType call(genFIType x) @@ -107,62 +107,62 @@ namespace detail } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_abs_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(abs, x); + return detail::functor1<L, T, T, Q>::call(abs, x); } }; - template <typename T, typename U, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, typename U, qualifier Q, bool Aligned> struct compute_mix_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a) { GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); - return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x)); + return vec<L, T, Q>(vec<L, U, Q>(x) + a * vec<L, U, Q>(y - x)); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> - struct compute_mix_vector<T, bool, P, vecType, Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_mix_vector<L, T, bool, Q, Aligned> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, vecType<bool, P> const & a) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, bool, Q> const& a) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = a[i] ? y[i] : x[i]; return Result; } }; - template <typename T, typename U, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, typename U, qualifier Q, bool Aligned> struct compute_mix_scalar { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, U const & a) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U const& a) { GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); - return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x)); + return vec<L, T, Q>(vec<L, U, Q>(x) + a * vec<L, U, Q>(y - x)); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> - struct compute_mix_scalar<T, bool, P, vecType, Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_mix_scalar<L, T, bool, Q, Aligned> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y, bool const & a) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, bool const& a) { return a ? y : x; } }; - template <typename T, typename U> + template<typename T, typename U> struct compute_mix { - GLM_FUNC_QUALIFIER static T call(T const & x, T const & y, U const & a) + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, U const& a) { GLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'mix' only accept floating-point inputs for the interpolator a"); @@ -170,201 +170,201 @@ namespace detail } }; - template <typename T> + template<typename T> struct compute_mix<T, bool> { - GLM_FUNC_QUALIFIER static T call(T const & x, T const & y, bool const & a) + GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, bool const& a) { return a ? y : x; } }; - template <typename T, precision P, template <typename, precision> class vecType, bool isFloat, bool Aligned> + template<length_t L, typename T, qualifier Q, bool isFloat, bool Aligned> struct compute_sign { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return vecType<T, P>(glm::lessThan(vecType<T, P>(0), x)) - vecType<T, P>(glm::lessThan(x, vecType<T, P>(0))); + return vec<L, T, Q>(glm::lessThan(vec<L, T, Q>(0), x)) - vec<L, T, Q>(glm::lessThan(x, vec<L, T, Q>(0))); } }; # if GLM_ARCH == GLM_ARCH_X86 - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> - struct compute_sign<T, P, vecType, false, Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_sign<L, T, Q, false, Aligned> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { T const Shift(static_cast<T>(sizeof(T) * 8 - 1)); - vecType<T, P> const y(vecType<typename make_unsigned<T>::type, P>(-x) >> typename make_unsigned<T>::type(Shift)); + vec<L, T, Q> const y(vec<L, typename make_unsigned<T>::type, Q>(-x) >> typename make_unsigned<T>::type(Shift)); return (x >> Shift) | y; } }; # endif - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_floor { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(std::floor, x); + return detail::functor1<L, T, T, Q>::call(std::floor, x); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_ceil { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(std::ceil, x); + return detail::functor1<L, T, T, Q>::call(std::ceil, x); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_fract { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { return x - floor(x); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_trunc { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(trunc, x); + return detail::functor1<L, T, T, Q>::call(trunc, x); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_round { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(round, x); + return detail::functor1<L, T, T, Q>::call(round, x); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_mod { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'mod' only accept floating-point inputs. Include <glm/gtc/integer.hpp> for integer inputs."); return a - b * floor(a / b); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_min_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { - return detail::functor2<T, P, vecType>::call(min, x, y); + return detail::functor2<L, T, Q>::call(min, x, y); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_max_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & y) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { - return detail::functor2<T, P, vecType>::call(max, x, y); + return detail::functor2<L, T, Q>::call(max, x, y); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_clamp_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> const & maxVal) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal) { return min(max(x, minVal), maxVal); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_step_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & edge, vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& edge, vec<L, T, Q> const& x) { - return mix(vecType<T, P>(1), vecType<T, P>(0), glm::lessThan(x, edge)); + return mix(vec<L, T, Q>(1), vec<L, T, Q>(0), glm::lessThan(x, edge)); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_smoothstep_vector { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'step' only accept floating-point inputs"); - vecType<T, P> const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast<T>(0), static_cast<T>(1))); + vec<L, T, Q> const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast<T>(0), static_cast<T>(1))); return tmp * tmp * (static_cast<T>(3) - static_cast<T>(2) * tmp); } }; }//namespace detail - template <typename genFIType> + template<typename genFIType> GLM_FUNC_QUALIFIER genFIType abs(genFIType x) { return detail::compute_abs<genFIType, std::numeric_limits<genFIType>::is_signed>::call(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> abs(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> abs(vec<L, T, Q> const& x) { - return detail::compute_abs_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_abs_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // sign // fast and works for any type - template <typename genFIType> + template<typename genFIType> GLM_FUNC_QUALIFIER genFIType sign(genFIType x) { GLM_STATIC_ASSERT( std::numeric_limits<genFIType>::is_iec559 || (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), "'sign' only accept signed inputs"); - - return detail::compute_sign<genFIType, defaultp, tvec1, std::numeric_limits<genFIType>::is_iec559, highp>::call(tvec1<genFIType>(x)).x; + + return detail::compute_sign<1, genFIType, defaultp, std::numeric_limits<genFIType>::is_iec559, highp>::call(vec<1, genFIType>(x)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sign(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sign(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT( std::numeric_limits<T>::is_iec559 || (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer), "'sign' only accept signed inputs"); - return detail::compute_sign<T, P, vecType, std::numeric_limits<T>::is_iec559, detail::is_aligned<P>::value>::call(x); + return detail::compute_sign<L, T, Q, std::numeric_limits<T>::is_iec559, detail::is_aligned<Q>::value>::call(x); } // floor using ::std::floor; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> floor(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> floor(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'floor' only accept floating-point inputs."); - return detail::compute_floor<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_floor<L, T, Q, detail::is_aligned<Q>::value>::call(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> trunc(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> trunc(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'trunc' only accept floating-point inputs"); - return detail::compute_trunc<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_trunc<L, T, Q, detail::is_aligned<Q>::value>::call(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> round(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> round(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'round' only accept floating-point inputs"); - return detail::compute_round<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_round<L, T, Q, detail::is_aligned<Q>::value>::call(x); } /* // roundEven - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType roundEven(genType const& x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'roundEven' only accept floating-point inputs"); @@ -374,11 +374,11 @@ namespace detail */ // roundEven - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType roundEven(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'roundEven' only accept floating-point inputs"); - + int Integer = static_cast<int>(x); genType IntegerPart = static_cast<genType>(Integer); genType FractionalPart = fract(x); @@ -391,7 +391,7 @@ namespace detail { return IntegerPart; } - else if(x <= static_cast<genType>(0)) // Work around... + else if(x <= static_cast<genType>(0)) // Work around... { return IntegerPart - static_cast<genType>(1); } @@ -405,97 +405,97 @@ namespace detail //} } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> roundEven(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> roundEven(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'roundEven' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(roundEven, x); + return detail::functor1<L, T, T, Q>::call(roundEven, x); } // ceil using ::std::ceil; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> ceil(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> ceil(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'ceil' only accept floating-point inputs"); - return detail::compute_ceil<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_ceil<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // fract - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fract(genType x) { - return fract(tvec1<genType>(x)).x; + return fract(vec<1, genType>(x)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fract(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fract(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'fract' only accept floating-point inputs"); - return detail::compute_fract<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_fract<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // mod - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType mod(genType x, genType y) { # if GLM_COMPILER & GLM_COMPILER_CUDA // Another Cuda compiler bug https://github.com/g-truc/glm/issues/530 - tvec1<genType, defaultp> Result(mod(tvec1<genType, defaultp>(x), y)); + vec<1, genType, defaultp> Result(mod(vec<1, genType, defaultp>(x), y)); return Result.x; # else - return mod(tvec1<genType, defaultp>(x), y).x; + return mod(vec<1, genType, defaultp>(x), y).x; # endif } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mod(vecType<T, P> const & x, T y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mod(vec<L, T, Q> const& x, T y) { - return detail::compute_mod<T, P, vecType, detail::is_aligned<P>::value>::call(x, vecType<T, P>(y)); + return detail::compute_mod<L, T, Q, detail::is_aligned<Q>::value>::call(x, vec<L, T, Q>(y)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mod(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { - return detail::compute_mod<T, P, vecType, detail::is_aligned<P>::value>::call(x, y); + return detail::compute_mod<L, T, Q, detail::is_aligned<Q>::value>::call(x, y); } // modf - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType modf(genType x, genType & i) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'modf' only accept floating-point inputs"); return std::modf(x, &i); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> modf(tvec1<T, P> const & x, tvec1<T, P> & i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> modf(vec<1, T, Q> const& x, vec<1, T, Q> & i) { - return tvec1<T, P>( + return vec<1, T, Q>( modf(x.x, i.x)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> modf(tvec2<T, P> const & x, tvec2<T, P> & i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> modf(vec<2, T, Q> const& x, vec<2, T, Q> & i) { - return tvec2<T, P>( + return vec<2, T, Q>( modf(x.x, i.x), modf(x.y, i.y)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> modf(tvec3<T, P> const & x, tvec3<T, P> & i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> modf(vec<3, T, Q> const& x, vec<3, T, Q> & i) { - return tvec3<T, P>( + return vec<3, T, Q>( modf(x.x, i.x), modf(x.y, i.y), modf(x.z, i.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> modf(tvec4<T, P> const & x, tvec4<T, P> & i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> modf(vec<4, T, Q> const& x, vec<4, T, Q> & i) { - return tvec4<T, P>( + return vec<4, T, Q>( modf(x.x, i.x), modf(x.y, i.y), modf(x.z, i.z), @@ -511,94 +511,94 @@ namespace detail //CHAR_BIT - 1))); // min - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> min(vecType<T, P> const & a, T b) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> min(vec<L, T, Q> const& a, T b) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'min' only accept floating-point inputs for the interpolator a"); - return detail::compute_min_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, vecType<T, P>(b)); + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'min' only accept floating-point or integer inputs"); + return detail::compute_min_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, vec<L, T, Q>(b)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> min(vecType<T, P> const & a, vecType<T, P> const & b) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> min(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { - return detail::compute_min_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, b); + return detail::compute_min_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, b); } // max - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> max(vecType<T, P> const & a, T b) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> max(vec<L, T, Q> const& a, T b) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'max' only accept floating-point inputs for the interpolator a"); - return detail::compute_max_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, vecType<T, P>(b)); + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'max' only accept floating-point or integer inputs"); + return detail::compute_max_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, vec<L, T, Q>(b)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> max(vecType<T, P> const & a, vecType<T, P> const & b) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> max(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { - return detail::compute_max_vector<T, P, vecType, detail::is_aligned<P>::value>::call(a, b); + return detail::compute_max_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, b); } // clamp - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType clamp(genType x, genType minVal, genType maxVal) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || std::numeric_limits<genType>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); return min(max(x, minVal), maxVal); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const & x, T minVal, T maxVal) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& x, T minVal, T maxVal) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); - return detail::compute_clamp_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x, vecType<T, P>(minVal), vecType<T, P>(maxVal)); + return detail::compute_clamp_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x, vec<L, T, Q>(minVal), vec<L, T, Q>(maxVal)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const & x, vecType<T, P> const & minVal, vecType<T, P> const & maxVal) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer || GLM_UNRESTRICTED_GENTYPE, "'clamp' only accept floating-point or integer inputs"); - return detail::compute_clamp_vector<T, P, vecType, detail::is_aligned<P>::value>::call(x, minVal, maxVal); + return detail::compute_clamp_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x, minVal, maxVal); } - template <typename genTypeT, typename genTypeU> + template<typename genTypeT, typename genTypeU> GLM_FUNC_QUALIFIER genTypeT mix(genTypeT x, genTypeT y, genTypeU a) { return detail::compute_mix<genTypeT, genTypeU>::call(x, y, a); } - template <typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, U a) + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U a) { - return detail::compute_mix_scalar<T, U, P, vecType, detail::is_aligned<P>::value>::call(x, y, a); + return detail::compute_mix_scalar<L, T, U, Q, detail::is_aligned<Q>::value>::call(x, y, a); } - - template <typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const & x, vecType<T, P> const & y, vecType<U, P> const & a) + + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a) { - return detail::compute_mix_vector<T, U, P, vecType, detail::is_aligned<P>::value>::call(x, y, a); + return detail::compute_mix_vector<L, T, U, Q, detail::is_aligned<Q>::value>::call(x, y, a); } // step - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType step(genType edge, genType x) { - return mix(static_cast<genType>(1), static_cast<genType>(0), glm::lessThan(x, edge)); + return mix(static_cast<genType>(1), static_cast<genType>(0), x < edge); } - template <template <typename, precision> class vecType, typename T, precision P> - GLM_FUNC_QUALIFIER vecType<T, P> step(T edge, vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> step(T edge, vec<L, T, Q> const& x) { - return detail::compute_step_vector<T, P, vecType, detail::is_aligned<P>::value>::call(vecType<T, P>(edge), x); + return detail::compute_step_vector<L, T, Q, detail::is_aligned<Q>::value>::call(vec<L, T, Q>(edge), x); } - template <template <typename, precision> class vecType, typename T, precision P> - GLM_FUNC_QUALIFIER vecType<T, P> step(vecType<T, P> const & edge, vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> step(vec<L, T, Q> const& edge, vec<L, T, Q> const& x) { - return detail::compute_step_vector<T, P, vecType, detail::is_aligned<P>::value>::call(edge, x); + return detail::compute_step_vector<L, T, Q, detail::is_aligned<Q>::value>::call(edge, x); } // smoothstep - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType smoothstep(genType edge0, genType edge1, genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'smoothstep' only accept floating-point inputs"); @@ -607,22 +607,22 @@ namespace detail return tmp * tmp * (genType(3) - genType(2) * tmp); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> smoothstep(T edge0, T edge1, vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> smoothstep(T edge0, T edge1, vec<L, T, Q> const& x) { - return detail::compute_smoothstep_vector<T, P, vecType, detail::is_aligned<P>::value>::call(vecType<T, P>(edge0), vecType<T, P>(edge1), x); + return detail::compute_smoothstep_vector<L, T, Q, detail::is_aligned<Q>::value>::call(vec<L, T, Q>(edge0), vec<L, T, Q>(edge1), x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> smoothstep(vecType<T, P> const & edge0, vecType<T, P> const & edge1, vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> smoothstep(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x) { - return detail::compute_smoothstep_vector<T, P, vecType, detail::is_aligned<P>::value>::call(edge0, edge1, x); + return detail::compute_smoothstep_vector<L, T, Q, detail::is_aligned<Q>::value>::call(edge0, edge1, x); } # if GLM_HAS_CXX11_STL using std::isnan; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool isnan(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'isnan' only accept floating-point inputs"); @@ -640,25 +640,28 @@ namespace detail # elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) && (GLM_PLATFORM & GLM_PLATFORM_ANDROID) && __cplusplus < 201103L return _isnan(x) != 0; # elif GLM_COMPILER & GLM_COMPILER_CUDA - return isnan(x) != 0; + return ::isnan(x) != 0; # else return std::isnan(x); # endif } # endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isnan(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isnan(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isnan' only accept floating-point inputs"); - return detail::functor1<bool, T, P, vecType>::call(isnan, x); + vec<L, bool, Q> Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isnan(v[l]); + return Result; } # if GLM_HAS_CXX11_STL using std::isinf; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool isinf(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'isinf' only accept floating-point inputs"); @@ -679,168 +682,142 @@ namespace detail # endif # elif GLM_COMPILER & GLM_COMPILER_CUDA // http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab - return isinf(double(x)) != 0; + return ::isinf(double(x)) != 0; # else return std::isinf(x); # endif } # endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isinf(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isinf(vec<L, T, Q> const& v) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isnan' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isinf' only accept floating-point inputs"); - return detail::functor1<bool, T, P, vecType>::call(isinf, x); + vec<L, bool, Q> Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = glm::isinf(v[l]); + return Result; } - GLM_FUNC_QUALIFIER int floatBitsToInt(float const & v) + GLM_FUNC_QUALIFIER int floatBitsToInt(float const& v) { - return reinterpret_cast<int&>(const_cast<float&>(v)); - } + union + { + float in; + int out; + } u; - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_QUALIFIER vecType<int, P> floatBitsToInt(vecType<float, P> const & v) - { - return reinterpret_cast<vecType<int, P>&>(const_cast<vecType<float, P>&>(v)); - } + u.in = v; - GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & v) - { - return reinterpret_cast<uint&>(const_cast<float&>(v)); + return u.out; } - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_QUALIFIER vecType<uint, P> floatBitsToUint(vecType<float, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, int, Q> floatBitsToInt(vec<L, float, Q> const& v) { - return reinterpret_cast<vecType<uint, P>&>(const_cast<vecType<float, P>&>(v)); + return reinterpret_cast<vec<L, int, Q>&>(const_cast<vec<L, float, Q>&>(v)); } - GLM_FUNC_QUALIFIER float intBitsToFloat(int const & v) + GLM_FUNC_QUALIFIER uint floatBitsToUint(float const& v) { - return reinterpret_cast<float&>(const_cast<int&>(v)); - } + union + { + float in; + uint out; + } u; - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_QUALIFIER vecType<float, P> intBitsToFloat(vecType<int, P> const & v) - { - return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<int, P>&>(v)); - } + u.in = v; - GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & v) - { - return reinterpret_cast<float&>(const_cast<uint&>(v)); + return u.out; } - template <template <typename, precision> class vecType, precision P> - GLM_FUNC_QUALIFIER vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint, Q> floatBitsToUint(vec<L, float, Q> const& v) { - return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<uint, P>&>(v)); - } - - template <typename genType> - GLM_FUNC_QUALIFIER genType fma(genType const & a, genType const & b, genType const & c) - { - return a * b + c; + return reinterpret_cast<vec<L, uint, Q>&>(const_cast<vec<L, float, Q>&>(v)); } - template <typename genType> - GLM_FUNC_QUALIFIER genType frexp(genType x, int & exp) + GLM_FUNC_QUALIFIER float intBitsToFloat(int const& v) { - GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); + union + { + int in; + float out; + } u; - return std::frexp(x, &exp); - } + u.in = v; - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> frexp(tvec1<T, P> const & x, tvec1<int, P> & exp) - { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); - - return tvec1<T, P>(std::frexp(x.x, &exp.x)); + return u.out; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> frexp(tvec2<T, P> const & x, tvec2<int, P> & exp) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, float, Q> intBitsToFloat(vec<L, int, Q> const& v) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); - - return tvec2<T, P>( - frexp(x.x, exp.x), - frexp(x.y, exp.y)); + return reinterpret_cast<vec<L, float, Q>&>(const_cast<vec<L, int, Q>&>(v)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> frexp(tvec3<T, P> const & x, tvec3<int, P> & exp) + GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const& v) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); + union + { + uint in; + float out; + } u; - return tvec3<T, P>( - frexp(x.x, exp.x), - frexp(x.y, exp.y), - frexp(x.z, exp.z)); + u.in = v; + + return u.out; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> frexp(tvec4<T, P> const & x, tvec4<int, P> & exp) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, float, Q> uintBitsToFloat(vec<L, uint, Q> const& v) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); - - return tvec4<T, P>( - frexp(x.x, exp.x), - frexp(x.y, exp.y), - frexp(x.z, exp.z), - frexp(x.w, exp.w)); + return reinterpret_cast<vec<L, float, Q>&>(const_cast<vec<L, uint, Q>&>(v)); } - template <typename genType> - GLM_FUNC_QUALIFIER genType ldexp(genType const & x, int const & exp) + template<typename genType> + GLM_FUNC_QUALIFIER genType fma(genType const& a, genType const& b, genType const& c) { - GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); - - return std::ldexp(x, exp); + return a * b + c; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> ldexp(tvec1<T, P> const & x, tvec1<int, P> const & exp) + template<typename genType> + GLM_FUNC_QUALIFIER genType frexp(genType x, int& exp) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); - return tvec1<T, P>( - ldexp(x.x, exp.x)); + return std::frexp(x, &exp); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> ldexp(tvec2<T, P> const & x, tvec2<int, P> const & exp) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> frexp(vec<L, T, Q> const& v, vec<L, int, Q>& exp) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'frexp' only accept floating-point inputs"); - return tvec2<T, P>( - ldexp(x.x, exp.x), - ldexp(x.y, exp.y)); + vec<L, T, Q> Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::frexp(v[l], &exp[l]); + return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> ldexp(tvec3<T, P> const & x, tvec3<int, P> const & exp) + template<typename genType> + GLM_FUNC_QUALIFIER genType ldexp(genType const& x, int const& exp) { - GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); - return tvec3<T, P>( - ldexp(x.x, exp.x), - ldexp(x.y, exp.y), - ldexp(x.z, exp.z)); + return std::ldexp(x, exp); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> ldexp(tvec4<T, P> const & x, tvec4<int, P> const & exp) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> ldexp(vec<L, T, Q> const& v, vec<L, int, Q> const& exp) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'ldexp' only accept floating-point inputs"); - return tvec4<T, P>( - ldexp(x.x, exp.x), - ldexp(x.y, exp.y), - ldexp(x.z, exp.z), - ldexp(x.w, exp.w)); + vec<L, T, Q> Result; + for (length_t l = 0; l < v.length(); ++l) + Result[l] = std::ldexp(v[l], exp[l]); + return Result; } }//namespace glm diff --git a/external/include/glm/detail/func_common_simd.inl b/external/include/glm/detail/func_common_simd.inl index c76f180..a3482ff 100644 --- a/external/include/glm/detail/func_common_simd.inl +++ b/external/include/glm/detail/func_common_simd.inl @@ -10,191 +10,191 @@ namespace glm{ namespace detail { - template <precision P> - struct compute_abs_vector<float, P, tvec4, true> + template<qualifier Q> + struct compute_abs_vector<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_abs(v.data); return result; } }; - template <precision P> - struct compute_abs_vector<int, P, tvec4, true> + template<qualifier Q> + struct compute_abs_vector<4, int, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<int, P> call(tvec4<int, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) { - tvec4<int, P> result(uninitialize); + vec<4, int, Q> result; result.data = glm_ivec4_abs(v.data); return result; } }; - template <precision P> - struct compute_floor<float, P, tvec4, true> + template<qualifier Q> + struct compute_floor<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_floor(v.data); return result; } }; - template <precision P> - struct compute_ceil<float, P, tvec4, true> + template<qualifier Q> + struct compute_ceil<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_ceil(v.data); return result; } }; - template <precision P> - struct compute_fract<float, P, tvec4, true> + template<qualifier Q> + struct compute_fract<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_fract(v.data); return result; } }; - template <precision P> - struct compute_round<float, P, tvec4, true> + template<qualifier Q> + struct compute_round<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_round(v.data); return result; } }; - template <precision P> - struct compute_mod<float, P, tvec4, true> + template<qualifier Q> + struct compute_mod<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & y) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = glm_vec4_mod(x.data, y.data); return result; } }; - template <precision P> - struct compute_min_vector<float, P, tvec4, true> + template<qualifier Q> + struct compute_min_vector<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = _mm_min_ps(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_min_vector<int32, P, tvec4, true> + template<qualifier Q> + struct compute_min_vector<4, int32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) { - tvec4<int32, P> result(uninitialize); + vec<4, int32, Q> result; result.data = _mm_min_epi32(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_min_vector<uint32, P, tvec4, true> + template<qualifier Q> + struct compute_min_vector<4, uint32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<uint32, P> const & v1, tvec4<uint32, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, uint32, Q> const& v1, vec<4, uint32, Q> const& v2) { - tvec4<uint32, P> result(uninitialize); + vec<4, uint32, Q> result; result.data = _mm_min_epu32(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_max_vector<float, P, tvec4, true> + template<qualifier Q> + struct compute_max_vector<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = _mm_max_ps(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_max_vector<int32, P, tvec4, true> + template<qualifier Q> + struct compute_max_vector<4, int32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) { - tvec4<int32, P> result(uninitialize); + vec<4, int32, Q> result; result.data = _mm_max_epi32(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_max_vector<uint32, P, tvec4, true> + template<qualifier Q> + struct compute_max_vector<4, uint32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v1, tvec4<uint32, P> const & v2) + GLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v1, vec<4, uint32, Q> const& v2) { - tvec4<uint32, P> result(uninitialize); + vec<4, uint32, Q> result; result.data = _mm_max_epu32(v1.data, v2.data); return result; } }; - template <precision P> - struct compute_clamp_vector<float, P, tvec4, true> + template<qualifier Q> + struct compute_clamp_vector<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & minVal, tvec4<float, P> const & maxVal) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& minVal, vec<4, float, Q> const& maxVal) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> result; result.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data); return result; } }; - template <precision P> - struct compute_clamp_vector<int32, P, tvec4, true> + template<qualifier Q> + struct compute_clamp_vector<4, int32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<int32, P> call(tvec4<int32, P> const & x, tvec4<int32, P> const & minVal, tvec4<int32, P> const & maxVal) + GLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& x, vec<4, int32, Q> const& minVal, vec<4, int32, Q> const& maxVal) { - tvec4<int32, P> result(uninitialize); + vec<4, int32, Q> result; result.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data); return result; } }; - template <precision P> - struct compute_clamp_vector<uint32, P, tvec4, true> + template<qualifier Q> + struct compute_clamp_vector<4, uint32, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & x, tvec4<uint32, P> const & minVal, tvec4<uint32, P> const & maxVal) + GLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& x, vec<4, uint32, Q> const& minVal, vec<4, uint32, Q> const& maxVal) { - tvec4<uint32, P> result(uninitialize); + vec<4, uint32, Q> result; result.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data); return result; } }; - template <precision P> - struct compute_mix_vector<float, bool, P, tvec4, true> + template<qualifier Q> + struct compute_mix_vector<4, float, bool, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & x, tvec4<float, P> const & y, tvec4<bool, P> const & a) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y, vec<4, bool, Q> const& a) { - __m128i const Load = _mm_set_epi32(-(int)a.w, -(int)a.z, -(int)a.y, -(int)a.x); + __m128i const Load = _mm_set_epi32(-static_cast<int>(a.w), -static_cast<int>(a.z), -static_cast<int>(a.y), -static_cast<int>(a.x)); __m128 const Mask = _mm_castsi128_ps(Load); - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; # if 0 && GLM_ARCH & GLM_ARCH_AVX Result.data = _mm_blendv_ps(x.data, y.data, Mask); # else @@ -204,25 +204,25 @@ namespace detail } }; /* FIXME - template <precision P> - struct compute_step_vector<float, P, tvec4> + template<qualifier Q> + struct compute_step_vector<float, Q, tvec4> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& edge, tvec4<float, P> const& x) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge, vec<4, float, Q> const& x) { - tvec4<float, P> result(uninitialize); + vec<4, float, Q> Result; result.data = glm_vec4_step(edge.data, x.data); return result; } }; */ - template <precision P> - struct compute_smoothstep_vector<float, P, tvec4, true> + template<qualifier Q> + struct compute_smoothstep_vector<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& edge0, tvec4<float, P> const& edge1, tvec4<float, P> const& x) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge0, vec<4, float, Q> const& edge1, vec<4, float, Q> const& x) { - tvec4<float, P> result(uninitialize); - result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data); - return result; + vec<4, float, Q> Result; + Result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data); + return Result; } }; }//namespace detail diff --git a/external/include/glm/detail/func_exponential.hpp b/external/include/glm/detail/func_exponential.hpp deleted file mode 100644 index a83de0b..0000000 --- a/external/include/glm/detail/func_exponential.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/// @ref core -/// @file glm/detail/func_exponential.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> -/// -/// @defgroup core_func_exponential Exponential functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. - -#pragma once - -#include "type_vec1.hpp" -#include "type_vec2.hpp" -#include "type_vec3.hpp" -#include "type_vec4.hpp" -#include <cmath> - -namespace glm -{ - /// @addtogroup core_func_exponential - /// @{ - - /// Returns 'base' raised to the power 'exponent'. - /// - /// @param base Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type precision. - /// @param exponent Floating point value representing the 'exponent'. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml">GLSL pow man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> pow(vecType<T, P> const & base, vecType<T, P> const & exponent); - - /// Returns the natural exponentiation of x, i.e., e^x. - /// - /// @param v exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml">GLSL exp man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> exp(vecType<T, P> const & v); - - /// Returns the natural logarithm of v, i.e., - /// returns the value y which satisfies the equation x = e^y. - /// Results are undefined if v <= 0. - /// - /// @param v log function is defined for input values of v defined in the range (0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml">GLSL log man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> log(vecType<T, P> const & v); - - /// Returns 2 raised to the v power. - /// - /// @param v exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml">GLSL exp2 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> exp2(vecType<T, P> const & v); - - /// Returns the base 2 log of x, i.e., returns the value y, - /// which satisfies the equation x = 2 ^ y. - /// - /// @param v log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml">GLSL log2 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> log2(vecType<T, P> const & v); - - /// Returns the positive square root of v. - /// - /// @param v sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml">GLSL sqrt man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - //template <typename genType> - //GLM_FUNC_DECL genType sqrt(genType const & x); - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> sqrt(vecType<T, P> const & v); - - /// Returns the reciprocal of the positive square root of v. - /// - /// @param v inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml">GLSL inversesqrt man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> inversesqrt(vecType<T, P> const & v); - - /// @} -}//namespace glm - -#include "func_exponential.inl" diff --git a/external/include/glm/detail/func_exponential.inl b/external/include/glm/detail/func_exponential.inl index 227fe91..b962674 100644 --- a/external/include/glm/detail/func_exponential.inl +++ b/external/include/glm/detail/func_exponential.inl @@ -1,7 +1,7 @@ /// @ref core /// @file glm/detail/func_exponential.inl -#include "func_vector_relational.hpp" +#include "../vector_relational.hpp" #include "_vectorize.hpp" #include <limits> #include <cmath> @@ -13,50 +13,52 @@ namespace detail # if GLM_HAS_CXX11_STL using std::log2; # else - template <typename genType> + template<typename genType> genType log2(genType Value) { return std::log(Value) * static_cast<genType>(1.4426950408889634073599246810019); } # endif - template <typename T, precision P, template <class, precision> class vecType, bool isFloat, bool Aligned> + template<length_t L, typename T, qualifier Q, bool isFloat, bool Aligned> struct compute_log2 { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & vec) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(log2, vec); + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'log2' only accept floating-point inputs. Include <glm/gtc/integer.hpp> for integer inputs."); + + return detail::functor1<L, T, T, Q>::call(log2, v); } }; - template <template <class, precision> class vecType, typename T, precision P, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_sqrt { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(std::sqrt, x); + return detail::functor1<L, T, T, Q>::call(std::sqrt, x); } }; - template <template <class, precision> class vecType, typename T, precision P, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_inversesqrt { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { return static_cast<T>(1) / sqrt(x); } }; - - template <template <class, precision> class vecType, bool Aligned> - struct compute_inversesqrt<vecType, float, lowp, Aligned> + + template<length_t L, bool Aligned> + struct compute_inversesqrt<L, float, lowp, Aligned> { - GLM_FUNC_QUALIFIER static vecType<float, lowp> call(vecType<float, lowp> const & x) + GLM_FUNC_QUALIFIER static vec<L, float, lowp> call(vec<L, float, lowp> const& x) { - vecType<float, lowp> tmp(x); - vecType<float, lowp> xhalf(tmp * 0.5f); - vecType<uint, lowp>* p = reinterpret_cast<vecType<uint, lowp>*>(const_cast<vecType<float, lowp>*>(&x)); - vecType<uint, lowp> i = vecType<uint, lowp>(0x5f375a86) - (*p >> vecType<uint, lowp>(1)); - vecType<float, lowp>* ptmp = reinterpret_cast<vecType<float, lowp>*>(&i); + vec<L, float, lowp> tmp(x); + vec<L, float, lowp> xhalf(tmp * 0.5f); + vec<L, uint, lowp>* p = reinterpret_cast<vec<L, uint, lowp>*>(const_cast<vec<L, float, lowp>*>(&x)); + vec<L, uint, lowp> i = vec<L, uint, lowp>(0x5f375a86) - (*p >> vec<L, uint, lowp>(1)); + vec<L, float, lowp>* ptmp = reinterpret_cast<vec<L, float, lowp>*>(&i); tmp = *ptmp; tmp = tmp * (1.5f - xhalf * tmp * tmp); return tmp; @@ -66,77 +68,81 @@ namespace detail // pow using std::pow; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> pow(vecType<T, P> const & base, vecType<T, P> const & exponent) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> pow(vec<L, T, Q> const& base, vec<L, T, Q> const& exponent) { - return detail::functor2<T, P, vecType>::call(pow, base, exponent); + return detail::functor2<L, T, Q>::call(pow, base, exponent); } // exp using std::exp; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> exp(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> exp(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(exp, x); + return detail::functor1<L, T, T, Q>::call(exp, x); } // log using std::log; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> log(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(log, x); + return detail::functor1<L, T, T, Q>::call(log, x); } +# if GLM_HAS_CXX11_STL + using std::exp2; +# else //exp2, ln2 = 0.69314718055994530941723212145818f - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType exp2(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'exp2' only accept floating-point inputs"); return std::exp(static_cast<genType>(0.69314718055994530941723212145818) * x); } +# endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> exp2(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> exp2(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(exp2, x); + return detail::functor1<L, T, T, Q>::call(exp2, x); } // log2, ln2 = 0.69314718055994530941723212145818f - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType log2(genType x) { - return log2(tvec1<genType>(x)).x; + return log2(vec<1, genType>(x)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> log2(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> log2(vec<L, T, Q> const& x) { - return detail::compute_log2<T, P, vecType, std::numeric_limits<T>::is_iec559, detail::is_aligned<P>::value>::call(x); + return detail::compute_log2<L, T, Q, std::numeric_limits<T>::is_iec559, detail::is_aligned<Q>::value>::call(x); } // sqrt using std::sqrt; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sqrt(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sqrt(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sqrt' only accept floating-point inputs"); - return detail::compute_sqrt<vecType, T, P, detail::is_aligned<P>::value>::call(x); + return detail::compute_sqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // inversesqrt - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType inversesqrt(genType x) { return static_cast<genType>(1) / sqrt(x); } - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> inversesqrt(vecType<T, P> const & x) + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> inversesqrt(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'inversesqrt' only accept floating-point inputs"); - return detail::compute_inversesqrt<vecType, T, P, detail::is_aligned<P>::value>::call(x); + return detail::compute_inversesqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x); } }//namespace glm diff --git a/external/include/glm/detail/func_exponential_simd.inl b/external/include/glm/detail/func_exponential_simd.inl index d7529ba..4b2ef45 100644 --- a/external/include/glm/detail/func_exponential_simd.inl +++ b/external/include/glm/detail/func_exponential_simd.inl @@ -8,25 +8,25 @@ namespace glm{ namespace detail { - template <precision P> - struct compute_sqrt<tvec4, float, P, true> + template<qualifier Q> + struct compute_sqrt<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); - result.data = _mm_sqrt_ps(v.data); - return result; + vec<4, float, Q> Result; + Result.data = _mm_sqrt_ps(v.data); + return Result; } }; - template <> - struct compute_sqrt<tvec4, float, aligned_lowp, true> + template<> + struct compute_sqrt<4, float, aligned_lowp, true> { - GLM_FUNC_QUALIFIER static tvec4<float, aligned_lowp> call(tvec4<float, aligned_lowp> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& v) { - tvec4<float, aligned_lowp> result(uninitialize); - result.data = glm_vec4_sqrt_lowp(v.data); - return result; + vec<4, float, aligned_lowp> Result; + Result.data = glm_vec4_sqrt_lowp(v.data); + return Result; } }; }//namespace detail diff --git a/external/include/glm/detail/func_geometric.hpp b/external/include/glm/detail/func_geometric.hpp deleted file mode 100644 index 2f39bf5..0000000 --- a/external/include/glm/detail/func_geometric.hpp +++ /dev/null @@ -1,113 +0,0 @@ -/// @ref core -/// @file glm/detail/func_geometric.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> -/// -/// @defgroup core_func_geometric Geometric functions -/// @ingroup core -/// -/// These operate on vectors as vectors, not component-wise. - -#pragma once - -#include "type_vec3.hpp" - -namespace glm -{ - /// @addtogroup core_func_geometric - /// @{ - - /// Returns the length of x, i.e., sqrt(x * x). - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml">GLSL length man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T length( - vecType<T, P> const & x); - - /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml">GLSL distance man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T distance( - vecType<T, P> const & p0, - vecType<T, P> const & p1); - - /// Returns the dot product of x and y, i.e., result = x * y. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml">GLSL dot man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T dot( - vecType<T, P> const & x, - vecType<T, P> const & y); - - /// Returns the cross product of x and y. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml">GLSL cross man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> cross( - tvec3<T, P> const & x, - tvec3<T, P> const & y); - - /// Returns a vector in the same direction as x but with length of 1. - /// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml">GLSL normalize man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> normalize( - vecType<T, P> const & x); - - /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml">GLSL faceforward man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> faceforward( - vecType<T, P> const & N, - vecType<T, P> const & I, - vecType<T, P> const & Nref); - - /// For the incident vector I and surface orientation N, - /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml">GLSL reflect man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename genType> - GLM_FUNC_DECL genType reflect( - genType const & I, - genType const & N); - - /// For the incident vector I and surface normal N, - /// and the ratio of indices of refraction eta, - /// return the refraction vector. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> refract( - vecType<T, P> const & I, - vecType<T, P> const & N, - T eta); - - /// @} -}//namespace glm - -#include "func_geometric.inl" diff --git a/external/include/glm/detail/func_geometric.inl b/external/include/glm/detail/func_geometric.inl index 07137c3..67255d4 100644 --- a/external/include/glm/detail/func_geometric.inl +++ b/external/include/glm/detail/func_geometric.inl @@ -1,8 +1,8 @@ /// @ref core /// @file glm/detail/func_geometric.inl -#include "func_exponential.hpp" -#include "func_common.hpp" +#include "../exponential.hpp" +#include "../common.hpp" #include "type_vec2.hpp" #include "type_vec4.hpp" #include "type_float.hpp" @@ -10,84 +10,84 @@ namespace glm{ namespace detail { - template <template <typename, precision> class vecType, typename T, precision P, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_length { - GLM_FUNC_QUALIFIER static T call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& v) { return sqrt(dot(v, v)); } }; - template <template <typename, precision> class vecType, typename T, precision P, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_distance { - GLM_FUNC_QUALIFIER static T call(vecType<T, P> const & p0, vecType<T, P> const & p1) + GLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1) { return length(p1 - p0); } }; - template <template <class, precision> class vecType, typename T, precision P, bool Aligned> + template<typename V, typename T, bool Aligned> struct compute_dot{}; - template <typename T, precision P, bool Aligned> - struct compute_dot<tvec1, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_dot<vec<1, T, Q>, T, Aligned> { - GLM_FUNC_QUALIFIER static T call(tvec1<T, P> const & a, tvec1<T, P> const & b) + GLM_FUNC_QUALIFIER static T call(vec<1, T, Q> const& a, vec<1, T, Q> const& b) { return a.x * b.x; } }; - template <typename T, precision P, bool Aligned> - struct compute_dot<tvec2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_dot<vec<2, T, Q>, T, Aligned> { - GLM_FUNC_QUALIFIER static T call(tvec2<T, P> const & x, tvec2<T, P> const & y) + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& a, vec<2, T, Q> const& b) { - tvec2<T, P> tmp(x * y); + vec<2, T, Q> tmp(a * b); return tmp.x + tmp.y; } }; - template <typename T, precision P, bool Aligned> - struct compute_dot<tvec3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_dot<vec<3, T, Q>, T, Aligned> { - GLM_FUNC_QUALIFIER static T call(tvec3<T, P> const & x, tvec3<T, P> const & y) + GLM_FUNC_QUALIFIER static T call(vec<3, T, Q> const& a, vec<3, T, Q> const& b) { - tvec3<T, P> tmp(x * y); + vec<3, T, Q> tmp(a * b); return tmp.x + tmp.y + tmp.z; } }; - template <typename T, precision P, bool Aligned> - struct compute_dot<tvec4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_dot<vec<4, T, Q>, T, Aligned> { - GLM_FUNC_QUALIFIER static T call(tvec4<T, P> const & x, tvec4<T, P> const & y) + GLM_FUNC_QUALIFIER static T call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> tmp(x * y); + vec<4, T, Q> tmp(a * b); return (tmp.x + tmp.y) + (tmp.z + tmp.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_cross { - GLM_FUNC_QUALIFIER static tvec3<T, P> call(tvec3<T, P> const & x, tvec3<T, P> const & y) + GLM_FUNC_QUALIFIER static vec<3, T, Q> call(vec<3, T, Q> const& x, vec<3, T, Q> const& y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cross' accepts only floating-point inputs"); - return tvec3<T, P>( + return vec<3, T, Q>( x.y * y.z - y.y * x.z, x.z * y.x - y.z * x.x, x.x * y.y - y.x * x.y); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_normalize { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); @@ -95,10 +95,10 @@ namespace detail } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_faceforward { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & N, vecType<T, P> const & I, vecType<T, P> const & Nref) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& N, vec<L, T, Q> const& I, vec<L, T, Q> const& Nref) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); @@ -106,19 +106,19 @@ namespace detail } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_reflect { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & I, vecType<T, P> const & N) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& I, vec<L, T, Q> const& N) { return I - N * dot(N, I) * static_cast<T>(2); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_refract { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & I, vecType<T, P> const & N, T eta) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& I, vec<L, T, Q> const& N, T eta) { T const dotValue(dot(N, I)); T const k(static_cast<T>(1) - eta * eta * (static_cast<T>(1) - dotValue * dotValue)); @@ -128,7 +128,7 @@ namespace detail }//namespace detail // length - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType length(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'length' accepts only floating-point inputs"); @@ -136,97 +136,97 @@ namespace detail return abs(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T length(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T length(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'length' accepts only floating-point inputs"); - return detail::compute_length<vecType, T, P, detail::is_aligned<P>::value>::call(v); + return detail::compute_length<L, T, Q, detail::is_aligned<Q>::value>::call(v); } // distance - template <typename genType> - GLM_FUNC_QUALIFIER genType distance(genType const & p0, genType const & p1) + template<typename genType> + GLM_FUNC_QUALIFIER genType distance(genType const& p0, genType const& p1) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'distance' accepts only floating-point inputs"); return length(p1 - p0); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T distance(vecType<T, P> const & p0, vecType<T, P> const & p1) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T distance(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1) { - return detail::compute_distance<vecType, T, P, detail::is_aligned<P>::value>::call(p0, p1); + return detail::compute_distance<L, T, Q, detail::is_aligned<Q>::value>::call(p0, p1); } // dot - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T dot(T x, T y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs"); return x * y; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T dot(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs"); - return detail::compute_dot<vecType, T, P, detail::is_aligned<P>::value>::call(x, y); + return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y); } // cross - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> cross(tvec3<T, P> const & x, tvec3<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y) { - return detail::compute_cross<T, P, detail::is_aligned<P>::value>::call(x, y); + return detail::compute_cross<T, Q, detail::is_aligned<Q>::value>::call(x, y); } // normalize - template <typename genType> - GLM_FUNC_QUALIFIER genType normalize(genType const & x) + template<typename genType> + GLM_FUNC_QUALIFIER genType normalize(genType const& x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'normalize' accepts only floating-point inputs"); return x < genType(0) ? genType(-1) : genType(1); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> normalize(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> normalize(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'normalize' accepts only floating-point inputs"); - return detail::compute_normalize<T, P, vecType, detail::is_aligned<P>::value>::call(x); + return detail::compute_normalize<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // faceforward - template <typename genType> - GLM_FUNC_QUALIFIER genType faceforward(genType const & N, genType const & I, genType const & Nref) + template<typename genType> + GLM_FUNC_QUALIFIER genType faceforward(genType const& N, genType const& I, genType const& Nref) { return dot(Nref, I) < static_cast<genType>(0) ? N : -N; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> faceforward(vecType<T, P> const & N, vecType<T, P> const & I, vecType<T, P> const & Nref) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> faceforward(vec<L, T, Q> const& N, vec<L, T, Q> const& I, vec<L, T, Q> const& Nref) { - return detail::compute_faceforward<T, P, vecType, detail::is_aligned<P>::value>::call(N, I, Nref); + return detail::compute_faceforward<L, T, Q, detail::is_aligned<Q>::value>::call(N, I, Nref); } // reflect - template <typename genType> - GLM_FUNC_QUALIFIER genType reflect(genType const & I, genType const & N) + template<typename genType> + GLM_FUNC_QUALIFIER genType reflect(genType const& I, genType const& N) { return I - N * dot(N, I) * genType(2); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> reflect(vecType<T, P> const & I, vecType<T, P> const & N) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> reflect(vec<L, T, Q> const& I, vec<L, T, Q> const& N) { - return detail::compute_reflect<T, P, vecType, detail::is_aligned<P>::value>::call(I, N); + return detail::compute_reflect<L, T, Q, detail::is_aligned<Q>::value>::call(I, N); } // refract - template <typename genType> - GLM_FUNC_QUALIFIER genType refract(genType const & I, genType const & N, genType eta) + template<typename genType> + GLM_FUNC_QUALIFIER genType refract(genType const& I, genType const& N, genType eta) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'refract' accepts only floating-point inputs"); genType const dotValue(dot(N, I)); @@ -234,11 +234,11 @@ namespace detail return (eta * I - (eta * dotValue + sqrt(k)) * N) * static_cast<genType>(k >= static_cast<genType>(0)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> refract(vecType<T, P> const & I, vecType<T, P> const & N, T eta) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> refract(vec<L, T, Q> const& I, vec<L, T, Q> const& N, T eta) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'refract' accepts only floating-point inputs"); - return detail::compute_refract<T, P, vecType, detail::is_aligned<P>::value>::call(I, N, eta); + return detail::compute_refract<L, T, Q, detail::is_aligned<Q>::value>::call(I, N, eta); } }//namespace glm diff --git a/external/include/glm/detail/func_geometric_simd.inl b/external/include/glm/detail/func_geometric_simd.inl index f0d14a2..e6c8d85 100644 --- a/external/include/glm/detail/func_geometric_simd.inl +++ b/external/include/glm/detail/func_geometric_simd.inl @@ -8,89 +8,89 @@ namespace glm{ namespace detail { - template <precision P> - struct compute_length<tvec4, float, P, true> + template<qualifier Q> + struct compute_length<4, float, Q, true> { - GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v) { return _mm_cvtss_f32(glm_vec4_length(v.data)); } }; - template <precision P> - struct compute_distance<tvec4, float, P, true> + template<qualifier Q> + struct compute_distance<4, float, Q, true> { - GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & p0, tvec4<float, P> const & p1) + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1) { return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data)); } }; - template <precision P> - struct compute_dot<tvec4, float, P, true> + template<qualifier Q> + struct compute_dot<vec<4, float, Q>, float, true> { - GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const& x, tvec4<float, P> const& y) + GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y) { return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); } }; - template <precision P> - struct compute_cross<float, P, true> + template<qualifier Q> + struct compute_cross<float, Q, true> { - GLM_FUNC_QUALIFIER static tvec3<float, P> call(tvec3<float, P> const & a, tvec3<float, P> const & b) + GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<3, float, Q> const& a, vec<3, float, Q> const& b) { __m128 const set0 = _mm_set_ps(0.0f, a.z, a.y, a.x); __m128 const set1 = _mm_set_ps(0.0f, b.z, b.y, b.x); __m128 const xpd0 = glm_vec4_cross(set0, set1); - tvec4<float, P> result(uninitialize); - result.data = xpd0; - return tvec3<float, P>(result); + vec<4, float, Q> Result; + Result.data = xpd0; + return vec<3, float, Q>(Result); } }; - template <precision P> - struct compute_normalize<float, P, tvec4, true> + template<qualifier Q> + struct compute_normalize<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v) { - tvec4<float, P> result(uninitialize); - result.data = glm_vec4_normalize(v.data); - return result; + vec<4, float, Q> Result; + Result.data = glm_vec4_normalize(v.data); + return Result; } }; - template <precision P> - struct compute_faceforward<float, P, tvec4, true> + template<qualifier Q> + struct compute_faceforward<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& N, tvec4<float, P> const& I, tvec4<float, P> const& Nref) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& N, vec<4, float, Q> const& I, vec<4, float, Q> const& Nref) { - tvec4<float, P> result(uninitialize); - result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); - return result; + vec<4, float, Q> Result; + Result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); + return Result; } }; - template <precision P> - struct compute_reflect<float, P, tvec4, true> + template<qualifier Q> + struct compute_reflect<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N) { - tvec4<float, P> result(uninitialize); - result.data = glm_vec4_reflect(I.data, N.data); - return result; + vec<4, float, Q> Result; + Result.data = glm_vec4_reflect(I.data, N.data); + return Result; } }; - template <precision P> - struct compute_refract<float, P, tvec4, true> + template<qualifier Q> + struct compute_refract<4, float, Q, true> { - GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N, float eta) + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N, float eta) { - tvec4<float, P> result(uninitialize); - result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); - return result; + vec<4, float, Q> Result; + Result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); + return Result; } }; }//namespace detail diff --git a/external/include/glm/detail/func_integer.hpp b/external/include/glm/detail/func_integer.hpp deleted file mode 100644 index bd195a9..0000000 --- a/external/include/glm/detail/func_integer.hpp +++ /dev/null @@ -1,203 +0,0 @@ -/// @ref core -/// @file glm/detail/func_integer.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> -/// -/// @defgroup core_func_integer Integer functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. -/// The notation [a, b] means the set of bits from bit-number a through bit-number -/// b, inclusive. The lowest-order bit is bit 0. - -#pragma once - -#include "setup.hpp" -#include "precision.hpp" -#include "func_common.hpp" -#include "func_vector_relational.hpp" - -namespace glm -{ - /// @addtogroup core_func_integer - /// @{ - - /// Adds 32-bit unsigned integer x and y, returning the sum - /// modulo pow(2, 32). The value carry is set to 0 if the sum was - /// less than pow(2, 32), or to 1 otherwise. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml">GLSL uaddCarry man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<uint, P> uaddCarry( - vecType<uint, P> const & x, - vecType<uint, P> const & y, - vecType<uint, P> & carry); - - /// Subtracts the 32-bit unsigned integer y from x, returning - /// the difference if non-negative, or pow(2, 32) plus the difference - /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml">GLSL usubBorrow man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<uint, P> usubBorrow( - vecType<uint, P> const & x, - vecType<uint, P> const & y, - vecType<uint, P> & borrow); - - /// Multiplies 32-bit integers x and y, producing a 64-bit - /// result. The 32 least-significant bits are returned in lsb. - /// The 32 most-significant bits are returned in msb. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml">GLSL umulExtended man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL void umulExtended( - vecType<uint, P> const & x, - vecType<uint, P> const & y, - vecType<uint, P> & msb, - vecType<uint, P> & lsb); - - /// Multiplies 32-bit integers x and y, producing a 64-bit - /// result. The 32 least-significant bits are returned in lsb. - /// The 32 most-significant bits are returned in msb. - /// - /// @tparam genIType Signed integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml">GLSL imulExtended man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL void imulExtended( - vecType<int, P> const & x, - vecType<int, P> const & y, - vecType<int, P> & msb, - vecType<int, P> & lsb); - - /// Extracts bits [offset, offset + bits - 1] from value, - /// returning them in the least significant bits of the result. - /// For unsigned data types, the most significant bits of the - /// result will be set to zero. For signed data types, the - /// most significant bits will be set to the value of bit offset + base - 1. - /// - /// If bits is zero, the result will be zero. The result will be - /// undefined if offset or bits is negative, or if the sum of - /// offset and bits is greater than the number of bits used - /// to store the operand. - /// - /// @tparam T Signed or unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml">GLSL bitfieldExtract man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldExtract( - vecType<T, P> const & Value, - int Offset, - int Bits); - - /// Returns the insertion the bits least-significant bits of insert into base. - /// - /// The result will have bits [offset, offset + bits - 1] taken - /// from bits [0, bits - 1] of insert, and all other bits taken - /// directly from the corresponding bits of base. If bits is - /// zero, the result will simply be base. The result will be - /// undefined if offset or bits is negative, or if the sum of - /// offset and bits is greater than the number of bits used to - /// store the operand. - /// - /// @tparam T Signed or unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml">GLSL bitfieldInsert man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldInsert( - vecType<T, P> const & Base, - vecType<T, P> const & Insert, - int Offset, - int Bits); - - /// Returns the reversal of the bits of value. - /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, - /// where bits is the total number of bits used to represent value. - /// - /// @tparam T Signed or unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml">GLSL bitfieldReverse man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldReverse(vecType<T, P> const & v); - - /// Returns the number of bits set to 1 in the binary representation of value. - /// - /// @tparam T Signed or unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename genType> - GLM_FUNC_DECL int bitCount(genType v); - - /// Returns the number of bits set to 1 in the binary representation of value. - /// - /// @tparam T Signed or unsigned integer scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<int, P> bitCount(vecType<T, P> const & v); - - /// Returns the bit number of the least significant bit set to - /// 1 in the binary representation of value. - /// If value is zero, -1 will be returned. - /// - /// @tparam T Signed or unsigned integer scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename genIUType> - GLM_FUNC_DECL int findLSB(genIUType x); - - /// Returns the bit number of the least significant bit set to - /// 1 in the binary representation of value. - /// If value is zero, -1 will be returned. - /// - /// @tparam T Signed or unsigned integer scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<int, P> findLSB(vecType<T, P> const & v); - - /// Returns the bit number of the most significant bit in the binary representation of value. - /// For positive integers, the result will be the bit number of the most significant bit set to 1. - /// For negative integers, the result will be the bit number of the most significant - /// bit set to 0. For a value of zero or negative one, -1 will be returned. - /// - /// @tparam T Signed or unsigned integer scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename genIUType> - GLM_FUNC_DECL int findMSB(genIUType x); - - /// Returns the bit number of the most significant bit in the binary representation of value. - /// For positive integers, the result will be the bit number of the most significant bit set to 1. - /// For negative integers, the result will be the bit number of the most significant - /// bit set to 0. For a value of zero or negative one, -1 will be returned. - /// - /// @tparam T Signed or unsigned integer scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<int, P> findMSB(vecType<T, P> const & v); - - /// @} -}//namespace glm - -#include "func_integer.inl" diff --git a/external/include/glm/detail/func_integer.inl b/external/include/glm/detail/func_integer.inl index 25910eb..8f9ed43 100644 --- a/external/include/glm/detail/func_integer.inl +++ b/external/include/glm/detail/func_integer.inl @@ -1,6 +1,7 @@ /// @ref core /// @file glm/detail/func_integer.inl +#include "../ext/vec1.hpp" #include "type_vec2.hpp" #include "type_vec3.hpp" #include "type_vec4.hpp" @@ -24,49 +25,49 @@ namespace glm{ namespace detail { - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T mask(T Bits) { - return Bits >= sizeof(T) * 8 ? ~static_cast<T>(0) : (static_cast<T>(1) << Bits) - static_cast<T>(1); + return Bits >= static_cast<T>(sizeof(T) * 8) ? ~static_cast<T>(0) : (static_cast<T>(1) << Bits) - static_cast<T>(1); } - template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned, bool EXEC> + template<length_t L, typename T, qualifier Q, bool Aligned, bool EXEC> struct compute_bitfieldReverseStep { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T, T) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T, T) { return v; } }; - template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned> - struct compute_bitfieldReverseStep<T, P, vecType, Aligned, true> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_bitfieldReverseStep<L, T, Q, Aligned, true> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Mask, T Shift) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Mask, T Shift) { return (v & Mask) << Shift | (v & (~Mask)) >> Shift; } }; - template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned, bool EXEC> + template<length_t L, typename T, qualifier Q, bool Aligned, bool EXEC> struct compute_bitfieldBitCountStep { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T, T) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T, T) { return v; } }; - template <typename T, glm::precision P, template <typename, glm::precision> class vecType, bool Aligned> - struct compute_bitfieldBitCountStep<T, P, vecType, Aligned, true> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_bitfieldBitCountStep<L, T, Q, Aligned, true> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Mask, T Shift) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Mask, T Shift) { return (v & Mask) + ((v >> Shift) & Mask); } }; - template <typename genIUType, size_t Bits> + template<typename genIUType, size_t Bits> struct compute_findLSB { GLM_FUNC_QUALIFIER static int call(genIUType Value) @@ -79,7 +80,7 @@ namespace detail }; # if GLM_HAS_BITSCAN_WINDOWS - template <typename genIUType> + template<typename genIUType> struct compute_findLSB<genIUType, 32> { GLM_FUNC_QUALIFIER static int call(genIUType Value) @@ -91,7 +92,7 @@ namespace detail }; # if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) - template <typename genIUType> + template<typename genIUType> struct compute_findLSB<genIUType, 64> { GLM_FUNC_QUALIFIER static int call(genIUType Value) @@ -104,42 +105,42 @@ namespace detail # endif # endif//GLM_HAS_BITSCAN_WINDOWS - template <typename T, glm::precision P, template <class, glm::precision> class vecType, bool EXEC = true> + template<length_t L, typename T, qualifier Q, bool EXEC = true> struct compute_findMSB_step_vec { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, T Shift) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, T Shift) { return x | (x >> Shift); } }; - template <typename T, glm::precision P, template <typename, glm::precision> class vecType> - struct compute_findMSB_step_vec<T, P, vecType, false> + template<length_t L, typename T, qualifier Q> + struct compute_findMSB_step_vec<L, T, Q, false> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x, T) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, T) { return x; } }; - template <typename T, glm::precision P, template <typename, glm::precision> class vecType, int> + template<length_t L, typename T, qualifier Q, int> struct compute_findMSB_vec { - GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & vec) + GLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& v) { - vecType<T, P> x(vec); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 1)); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 2)); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 4)); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 16>::call(x, static_cast<T>( 8)); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 32>::call(x, static_cast<T>(16)); - x = compute_findMSB_step_vec<T, P, vecType, sizeof(T) * 8 >= 64>::call(x, static_cast<T>(32)); - return vecType<int, P>(sizeof(T) * 8 - 1) - glm::bitCount(~x); + vec<L, T, Q> x(v); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 1)); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 2)); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 8>::call(x, static_cast<T>( 4)); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 16>::call(x, static_cast<T>( 8)); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 32>::call(x, static_cast<T>(16)); + x = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 64>::call(x, static_cast<T>(32)); + return vec<L, int, Q>(sizeof(T) * 8 - 1) - glm::bitCount(~x); } }; # if GLM_HAS_BITSCAN_WINDOWS - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER int compute_findMSB_32(genIUType Value) { unsigned long Result(0); @@ -147,17 +148,17 @@ namespace detail return IsNotNull ? int(Result) : -1; } - template <typename T, glm::precision P, template<typename, glm::precision> class vecType> - struct compute_findMSB_vec<T, P, vecType, 32> + template<length_t L, typename T, qualifier Q> + struct compute_findMSB_vec<L, T, Q, 32> { - GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<int, T, P, vecType>::call(compute_findMSB_32, x); + return detail::functor1<L, int, T, Q>::call(compute_findMSB_32, x); } }; # if !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32)) - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER int compute_findMSB_64(genIUType Value) { unsigned long Result(0); @@ -165,12 +166,12 @@ namespace detail return IsNotNull ? int(Result) : -1; } - template <typename T, glm::precision P, template <class, glm::precision> class vecType> - struct compute_findMSB_vec<T, P, vecType, 64> + template<length_t L, typename T, qualifier Q> + struct compute_findMSB_vec<L, T, Q, 64> { - GLM_FUNC_QUALIFIER static vecType<int, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& x) { - return detail::functor1<int, T, P, vecType>::call(compute_findMSB_64, x); + return detail::functor1<L, int, T, Q>::call(compute_findMSB_64, x); } }; # endif @@ -178,7 +179,7 @@ namespace detail }//namespace detail // uaddCarry - GLM_FUNC_QUALIFIER uint uaddCarry(uint const & x, uint const & y, uint & Carry) + GLM_FUNC_QUALIFIER uint uaddCarry(uint const& x, uint const& y, uint & Carry) { uint64 const Value64(static_cast<uint64>(x) + static_cast<uint64>(y)); uint64 const Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1)); @@ -186,17 +187,17 @@ namespace detail return static_cast<uint32>(Value64 % (Max32 + static_cast<uint64>(1))); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uint, P> uaddCarry(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & Carry) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint, Q> uaddCarry(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& Carry) { - vecType<uint64, P> Value64(vecType<uint64, P>(x) + vecType<uint64, P>(y)); - vecType<uint64, P> Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1)); - Carry = mix(vecType<uint32, P>(0), vecType<uint32, P>(1), greaterThan(Value64, Max32)); - return vecType<uint32,P>(Value64 % (Max32 + static_cast<uint64>(1))); + vec<L, uint64, Q> Value64(vec<L, uint64, Q>(x) + vec<L, uint64, Q>(y)); + vec<L, uint64, Q> Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1)); + Carry = mix(vec<L, uint32, Q>(0), vec<L, uint32, Q>(1), greaterThan(Value64, Max32)); + return vec<L, uint32, Q>(Value64 % (Max32 + static_cast<uint64>(1))); } // usubBorrow - GLM_FUNC_QUALIFIER uint usubBorrow(uint const & x, uint const & y, uint & Borrow) + GLM_FUNC_QUALIFIER uint usubBorrow(uint const& x, uint const& y, uint & Borrow) { GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); @@ -207,17 +208,17 @@ namespace detail return static_cast<uint32>((static_cast<int64>(1) << static_cast<int64>(32)) + (static_cast<int64>(y) - static_cast<int64>(x))); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uint, P> usubBorrow(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & Borrow) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint, Q> usubBorrow(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& Borrow) { - Borrow = mix(vecType<uint, P>(1), vecType<uint, P>(0), greaterThanEqual(x, y)); - vecType<uint, P> const YgeX(y - x); - vecType<uint, P> const XgeY(vecType<uint32, P>((static_cast<int64>(1) << static_cast<int64>(32)) + (vecType<int64, P>(y) - vecType<int64, P>(x)))); + Borrow = mix(vec<L, uint, Q>(1), vec<L, uint, Q>(0), greaterThanEqual(x, y)); + vec<L, uint, Q> const YgeX(y - x); + vec<L, uint, Q> const XgeY(vec<L, uint32, Q>((static_cast<int64>(1) << static_cast<int64>(32)) + (vec<L, int64, Q>(y) - vec<L, int64, Q>(x)))); return mix(XgeY, YgeX, greaterThanEqual(y, x)); } // umulExtended - GLM_FUNC_QUALIFIER void umulExtended(uint const & x, uint const & y, uint & msb, uint & lsb) + GLM_FUNC_QUALIFIER void umulExtended(uint const& x, uint const& y, uint & msb, uint & lsb) { GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); @@ -226,18 +227,18 @@ namespace detail lsb = static_cast<uint>(Value64); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER void umulExtended(vecType<uint, P> const & x, vecType<uint, P> const & y, vecType<uint, P> & msb, vecType<uint, P> & lsb) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER void umulExtended(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& msb, vec<L, uint, Q>& lsb) { GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), "uint and uint32 size mismatch"); - vecType<uint64, P> Value64(vecType<uint64, P>(x) * vecType<uint64, P>(y)); - msb = vecType<uint32, P>(Value64 >> static_cast<uint64>(32)); - lsb = vecType<uint32, P>(Value64); + vec<L, uint64, Q> Value64(vec<L, uint64, Q>(x) * vec<L, uint64, Q>(y)); + msb = vec<L, uint32, Q>(Value64 >> static_cast<uint64>(32)); + lsb = vec<L, uint32, Q>(Value64); } // imulExtended - GLM_FUNC_QUALIFIER void imulExtended(int x, int y, int & msb, int & lsb) + GLM_FUNC_QUALIFIER void imulExtended(int x, int y, int& msb, int& lsb) { GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); @@ -246,25 +247,25 @@ namespace detail lsb = static_cast<int>(Value64); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER void imulExtended(vecType<int, P> const & x, vecType<int, P> const & y, vecType<int, P> & msb, vecType<int, P> & lsb) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER void imulExtended(vec<L, int, Q> const& x, vec<L, int, Q> const& y, vec<L, int, Q>& msb, vec<L, int, Q>& lsb) { GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), "int and int32 size mismatch"); - vecType<int64, P> Value64(vecType<int64, P>(x) * vecType<int64, P>(y)); - lsb = vecType<int32, P>(Value64 & static_cast<int64>(0xFFFFFFFF)); - msb = vecType<int32, P>((Value64 >> static_cast<int64>(32)) & static_cast<int64>(0xFFFFFFFF)); + vec<L, int64, Q> Value64(vec<L, int64, Q>(x) * vec<L, int64, Q>(y)); + lsb = vec<L, int32, Q>(Value64 & static_cast<int64>(0xFFFFFFFF)); + msb = vec<L, int32, Q>((Value64 >> static_cast<int64>(32)) & static_cast<int64>(0xFFFFFFFF)); } // bitfieldExtract - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType Value, int Offset, int Bits) { - return bitfieldExtract(tvec1<genIUType>(Value), Offset, Bits).x; + return bitfieldExtract(vec<1, genIUType>(Value), Offset, Bits).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldExtract(vecType<T, P> const & Value, int Offset, int Bits) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldExtract(vec<L, T, Q> const& Value, int Offset, int Bits) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldExtract' only accept integer inputs"); @@ -272,14 +273,14 @@ namespace detail } // bitfieldInsert - template <typename genIUType> - GLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const & Base, genIUType const & Insert, int Offset, int Bits) + template<typename genIUType> + GLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const& Base, genIUType const& Insert, int Offset, int Bits) { - return bitfieldInsert(tvec1<genIUType>(Base), tvec1<genIUType>(Insert), Offset, Bits).x; + return bitfieldInsert(vec<1, genIUType>(Base), vec<1, genIUType>(Insert), Offset, Bits).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldInsert(vecType<T, P> const & Base, vecType<T, P> const & Insert, int Offset, int Bits) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldInsert(vec<L, T, Q> const& Base, vec<L, T, Q> const& Insert, int Offset, int Bits) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldInsert' only accept integer values"); @@ -288,47 +289,56 @@ namespace detail } // bitfieldReverse - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType bitfieldReverse(genType x) { - return bitfieldReverse(glm::tvec1<genType, glm::defaultp>(x)).x; + return bitfieldReverse(glm::vec<1, genType, glm::defaultp>(x)).x; } - template <typename T, glm::precision P, template <typename, glm::precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldReverse(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldReverse(vec<L, T, Q> const& v) { - vecType<T, P> x(v); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 2>::call(x, T(0x5555555555555555ull), static_cast<T>( 1)); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 4>::call(x, T(0x3333333333333333ull), static_cast<T>( 2)); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 8>::call(x, T(0x0F0F0F0F0F0F0F0Full), static_cast<T>( 4)); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 16>::call(x, T(0x00FF00FF00FF00FFull), static_cast<T>( 8)); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 32>::call(x, T(0x0000FFFF0000FFFFull), static_cast<T>(16)); - x = detail::compute_bitfieldReverseStep<T, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 64>::call(x, T(0x00000000FFFFFFFFull), static_cast<T>(32)); + vec<L, T, Q> x(v); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 2>::call(x, static_cast<T>(0x5555555555555555ull), static_cast<T>( 1)); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 4>::call(x, static_cast<T>(0x3333333333333333ull), static_cast<T>( 2)); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 8>::call(x, static_cast<T>(0x0F0F0F0F0F0F0F0Full), static_cast<T>( 4)); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 16>::call(x, static_cast<T>(0x00FF00FF00FF00FFull), static_cast<T>( 8)); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 32>::call(x, static_cast<T>(0x0000FFFF0000FFFFull), static_cast<T>(16)); + x = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 64>::call(x, static_cast<T>(0x00000000FFFFFFFFull), static_cast<T>(32)); return x; } // bitCount - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER int bitCount(genType x) { - return bitCount(glm::tvec1<genType, glm::defaultp>(x)).x; + return bitCount(glm::vec<1, genType, glm::defaultp>(x)).x; } - template <typename T, glm::precision P, template <typename, glm::precision> class vecType> - GLM_FUNC_QUALIFIER vecType<int, P> bitCount(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, int, Q> bitCount(vec<L, T, Q> const& v) { - vecType<typename detail::make_unsigned<T>::type, P> x(*reinterpret_cast<vecType<typename detail::make_unsigned<T>::type, P> const *>(&v)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 2>::call(x, typename detail::make_unsigned<T>::type(0x5555555555555555ull), typename detail::make_unsigned<T>::type( 1)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 4>::call(x, typename detail::make_unsigned<T>::type(0x3333333333333333ull), typename detail::make_unsigned<T>::type( 2)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 8>::call(x, typename detail::make_unsigned<T>::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned<T>::type( 4)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned<T>::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned<T>::type( 8)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned<T>::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned<T>::type(16)); - x = detail::compute_bitfieldBitCountStep<typename detail::make_unsigned<T>::type, P, vecType, detail::is_aligned<P>::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned<T>::type(0x00000000FFFFFFFFull), typename detail::make_unsigned<T>::type(32)); - return vecType<int, P>(x); +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4310) //cast truncates constant value +# endif + + vec<L, typename detail::make_unsigned<T>::type, Q> x(*reinterpret_cast<vec<L, typename detail::make_unsigned<T>::type, Q> const *>(&v)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 2>::call(x, typename detail::make_unsigned<T>::type(0x5555555555555555ull), typename detail::make_unsigned<T>::type( 1)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 4>::call(x, typename detail::make_unsigned<T>::type(0x3333333333333333ull), typename detail::make_unsigned<T>::type( 2)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 8>::call(x, typename detail::make_unsigned<T>::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned<T>::type( 4)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned<T>::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned<T>::type( 8)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned<T>::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned<T>::type(16)); + x = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned<T>::type(0x00000000FFFFFFFFull), typename detail::make_unsigned<T>::type(32)); + return vec<L, int, Q>(x); + +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif } // findLSB - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER int findLSB(genIUType Value) { GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findLSB' only accept integer values"); @@ -336,29 +346,29 @@ namespace detail return detail::compute_findLSB<genIUType, sizeof(genIUType) * 8>::call(Value); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<int, P> findLSB(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, int, Q> findLSB(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'findLSB' only accept integer values"); - return detail::functor1<int, T, P, vecType>::call(findLSB, x); + return detail::functor1<L, int, T, Q>::call(findLSB, x); } // findMSB - template <typename genIUType> - GLM_FUNC_QUALIFIER int findMSB(genIUType x) + template<typename genIUType> + GLM_FUNC_QUALIFIER int findMSB(genIUType v) { GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values"); - return findMSB(tvec1<genIUType>(x)).x; + return findMSB(vec<1, genIUType>(v)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<int, P> findMSB(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, int, Q> findMSB(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'findMSB' only accept integer values"); - return detail::compute_findMSB_vec<T, P, vecType, sizeof(T) * 8>::call(x); + return detail::compute_findMSB_vec<L, T, Q, sizeof(T) * 8>::call(v); } }//namespace glm diff --git a/external/include/glm/detail/func_integer_simd.inl b/external/include/glm/detail/func_integer_simd.inl index 6175860..690671a 100644 --- a/external/include/glm/detail/func_integer_simd.inl +++ b/external/include/glm/detail/func_integer_simd.inl @@ -8,54 +8,54 @@ namespace glm{ namespace detail { - template <glm::precision P> - struct compute_bitfieldReverseStep<uint32, P, tvec4, true, true> + template<qualifier Q> + struct compute_bitfieldReverseStep<4, uint32, Q, true, true> { - GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v, uint32 Mask, uint32 Shift) + GLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v, uint32 Mask, uint32 Shift) { __m128i const set0 = v.data; - __m128i const set1 = _mm_set1_epi32(Mask); + __m128i const set1 = _mm_set1_epi32(static_cast<int>(Mask)); __m128i const and1 = _mm_and_si128(set0, set1); __m128i const sft1 = _mm_slli_epi32(and1, Shift); __m128i const set2 = _mm_andnot_si128(set0, _mm_set1_epi32(-1)); __m128i const and2 = _mm_and_si128(set0, set2); __m128i const sft2 = _mm_srai_epi32(and2, Shift); - + __m128i const or0 = _mm_or_si128(sft1, sft2); - + return or0; } }; - template <glm::precision P> - struct compute_bitfieldBitCountStep<uint32, P, tvec4, true, true> + template<qualifier Q> + struct compute_bitfieldBitCountStep<4, uint32, Q, true, true> { - GLM_FUNC_QUALIFIER static tvec4<uint32, P> call(tvec4<uint32, P> const & v, uint32 Mask, uint32 Shift) + GLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v, uint32 Mask, uint32 Shift) { __m128i const set0 = v.data; - __m128i const set1 = _mm_set1_epi32(Mask); + __m128i const set1 = _mm_set1_epi32(static_cast<int>(Mask)); __m128i const and0 = _mm_and_si128(set0, set1); __m128i const sft0 = _mm_slli_epi32(set0, Shift); __m128i const and1 = _mm_and_si128(sft0, set1); __m128i const add0 = _mm_add_epi32(and0, and1); - + return add0; } }; }//namespace detail # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <> + template<> GLM_FUNC_QUALIFIER int bitCount(uint32 x) { return _mm_popcnt_u32(x); } # if(GLM_MODEL == GLM_MODEL_64) - template <> + template<> GLM_FUNC_QUALIFIER int bitCount(uint64 x) { return static_cast<int>(_mm_popcnt_u64(x)); diff --git a/external/include/glm/detail/func_matrix.hpp b/external/include/glm/detail/func_matrix.hpp deleted file mode 100644 index 9be3449..0000000 --- a/external/include/glm/detail/func_matrix.hpp +++ /dev/null @@ -1,149 +0,0 @@ -/// @ref core -/// @file glm/detail/func_matrix.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> -/// -/// @defgroup core_func_matrix Matrix functions -/// @ingroup core -/// -/// For each of the following built-in matrix functions, there is both a -/// single-precision floating point version, where all arguments and return values -/// are single precision, and a double-precision floating version, where all -/// arguments and return values are double precision. Only the single-precision -/// floating point version is shown. - -#pragma once - -// Dependencies -#include "../detail/precision.hpp" -#include "../detail/setup.hpp" -#include "../detail/type_mat.hpp" -#include "../vec2.hpp" -#include "../vec3.hpp" -#include "../vec4.hpp" -#include "../mat2x2.hpp" -#include "../mat2x3.hpp" -#include "../mat2x4.hpp" -#include "../mat3x2.hpp" -#include "../mat3x3.hpp" -#include "../mat3x4.hpp" -#include "../mat4x2.hpp" -#include "../mat4x3.hpp" -#include "../mat4x4.hpp" - -namespace glm{ -namespace detail -{ - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec2, tvec2> - { - typedef tmat2x2<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec2, tvec3> - { - typedef tmat3x2<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec2, tvec4> - { - typedef tmat4x2<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec3, tvec2> - { - typedef tmat2x3<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec3, tvec3> - { - typedef tmat3x3<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec3, tvec4> - { - typedef tmat4x3<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec4, tvec2> - { - typedef tmat2x4<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec4, tvec3> - { - typedef tmat3x4<T, P> type; - }; - - template <typename T, precision P> - struct outerProduct_trait<T, P, tvec4, tvec4> - { - typedef tmat4x4<T, P> type; - }; - -}//namespace detail - - /// @addtogroup core_func_matrix - /// @{ - - /// Multiply matrix x by matrix y component-wise, i.e., - /// result[i][j] is the scalar product of x[i][j] and y[i][j]. - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml">GLSL matrixCompMult man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL matType<T, P> matrixCompMult(matType<T, P> const & x, matType<T, P> const & y); - - /// Treats the first parameter c as a column vector - /// and the second parameter r as a row vector - /// and does a linear algebraic matrix multiply c * r. - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml">GLSL outerProduct man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> - template <typename T, precision P, template <typename, precision> class vecTypeA, template <typename, precision> class vecTypeB> - GLM_FUNC_DECL typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r); - - /// Returns the transposed matrix of x - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml">GLSL transpose man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> -# if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL typename matType<T, P>::transpose_type transpose(matType<T, P> const & x); -# endif - - /// Return the determinant of a squared matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL T determinant(matType<T, P> const & m); - - /// Return the inverse of a squared matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL matType<T, P> inverse(matType<T, P> const & m); - - /// @} -}//namespace glm - -#include "func_matrix.inl" diff --git a/external/include/glm/detail/func_matrix.inl b/external/include/glm/detail/func_matrix.inl index 6d1746b..d823d76 100644 --- a/external/include/glm/detail/func_matrix.inl +++ b/external/include/glm/detail/func_matrix.inl @@ -7,213 +7,213 @@ namespace glm{ namespace detail { - template <template <typename, precision> class matType, typename T, precision P, bool Aligned> + template<length_t C, length_t R, typename T, qualifier Q, bool Aligned> struct compute_matrixCompMult { - GLM_FUNC_QUALIFIER static matType<T, P> call(matType<T, P> const& x, matType<T, P> const& y) + GLM_FUNC_QUALIFIER static mat<C, R, T, Q> call(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y) { - matType<T, P> result(uninitialize); - for(length_t i = 0; i < result.length(); ++i) - result[i] = x[i] * y[i]; - return result; + mat<C, R, T, Q> Result; + for(length_t i = 0; i < Result.length(); ++i) + Result[i] = x[i] * y[i]; + return Result; } }; - template <template <class, precision> class matType, typename T, precision P, bool Aligned> + template<length_t C, length_t R, typename T, qualifier Q, bool Aligned> struct compute_transpose{}; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat2x2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<2, 2, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat2x2<T, P> call(tmat2x2<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) { - tmat2x2<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - return result; + mat<2, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat2x3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<2, 3, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat3x2<T, P> call(tmat2x3<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<3, 2, T, Q> call(mat<2, 3, T, Q> const& m) { - tmat3x2<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - return result; + mat<3,2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat2x4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<2, 4, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat4x2<T, P> call(tmat2x4<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<4, 2, T, Q> call(mat<2, 4, T, Q> const& m) { - tmat4x2<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - return result; + mat<4, 2, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat3x2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<3, 2, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat2x3<T, P> call(tmat3x2<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<2, 3, T, Q> call(mat<3, 2, T, Q> const& m) { - tmat2x3<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - return result; + mat<2, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat3x3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<3, 3, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat3x3<T, P> call(tmat3x3<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) { - tmat3x3<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - return result; + mat<3, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat3x4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<3, 4, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat4x3<T, P> call(tmat3x4<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<4, 3, T, Q> call(mat<3, 4, T, Q> const& m) { - tmat4x3<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - result[3][2] = m[2][3]; - return result; + mat<4, 3, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat4x2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<4, 2, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat2x4<T, P> call(tmat4x2<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<2, 4, T, Q> call(mat<4, 2, T, Q> const& m) { - tmat2x4<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - return result; + mat<2, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat4x3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<4, 3, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat3x4<T, P> call(tmat4x3<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<3, 4, T, Q> call(mat<4, 3, T, Q> const& m) { - tmat3x4<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[2][3] = m[3][2]; - return result; + mat<3, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + return Result; } }; - template <typename T, precision P, bool Aligned> - struct compute_transpose<tmat4x4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_transpose<4, 4, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat4x4<T, P> call(tmat4x4<T, P> const & m) + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) { - tmat4x4<T, P> result(uninitialize); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[2][3] = m[3][2]; - - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - result[3][2] = m[2][3]; - result[3][3] = m[3][3]; - return result; + mat<4, 4, T, Q> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; } }; - template <template <typename, precision> class matType, typename T, precision P, bool Aligned> + template<length_t C, length_t R, typename T, qualifier Q, bool Aligned> struct compute_determinant{}; - template <typename T, precision P, bool Aligned> - struct compute_determinant<tmat2x2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_determinant<2, 2, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static T call(tmat2x2<T, P> const & m) + GLM_FUNC_QUALIFIER static T call(mat<2, 2, T, Q> const& m) { return m[0][0] * m[1][1] - m[1][0] * m[0][1]; } }; - template <typename T, precision P, bool Aligned> - struct compute_determinant<tmat3x3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_determinant<3, 3, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static T call(tmat3x3<T, P> const & m) + GLM_FUNC_QUALIFIER static T call(mat<3, 3, T, Q> const& m) { return + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) @@ -222,10 +222,10 @@ namespace detail } }; - template <typename T, precision P, bool Aligned> - struct compute_determinant<tmat4x4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_determinant<4, 4, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static T call(tmat4x4<T, P> const & m) + GLM_FUNC_QUALIFIER static T call(mat<4, 4, T, Q> const& m) { T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; @@ -234,7 +234,7 @@ namespace detail T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; - tvec4<T, P> DetCof( + vec<4, T, Q> DetCof( + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), @@ -246,19 +246,19 @@ namespace detail } }; - template <template <typename, precision> class matType, typename T, precision P, bool Aligned> + template<length_t C, length_t R, typename T, qualifier Q, bool Aligned> struct compute_inverse{}; - template <typename T, precision P, bool Aligned> - struct compute_inverse<tmat2x2, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_inverse<2, 2, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat2x2<T, P> call(tmat2x2<T, P> const& m) + GLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m) { T OneOverDeterminant = static_cast<T>(1) / ( + m[0][0] * m[1][1] - m[1][0] * m[0][1]); - tmat2x2<T, P> Inverse( + mat<2, 2, T, Q> Inverse( + m[1][1] * OneOverDeterminant, - m[0][1] * OneOverDeterminant, - m[1][0] * OneOverDeterminant, @@ -268,17 +268,17 @@ namespace detail } }; - template <typename T, precision P, bool Aligned> - struct compute_inverse<tmat3x3, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_inverse<3, 3, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat3x3<T, P> call(tmat3x3<T, P> const& m) + GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m) { T OneOverDeterminant = static_cast<T>(1) / ( + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2])); - tmat3x3<T, P> Inverse(uninitialize); + mat<3, 3, T, Q> Inverse; Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDeterminant; Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDeterminant; Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDeterminant; @@ -293,10 +293,10 @@ namespace detail } }; - template <typename T, precision P, bool Aligned> - struct compute_inverse<tmat4x4, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_inverse<4, 4, T, Q, Aligned> { - GLM_FUNC_QUALIFIER static tmat4x4<T, P> call(tmat4x4<T, P> const& m) + GLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m) { T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; @@ -322,30 +322,30 @@ namespace detail T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; - tvec4<T, P> Fac0(Coef00, Coef00, Coef02, Coef03); - tvec4<T, P> Fac1(Coef04, Coef04, Coef06, Coef07); - tvec4<T, P> Fac2(Coef08, Coef08, Coef10, Coef11); - tvec4<T, P> Fac3(Coef12, Coef12, Coef14, Coef15); - tvec4<T, P> Fac4(Coef16, Coef16, Coef18, Coef19); - tvec4<T, P> Fac5(Coef20, Coef20, Coef22, Coef23); + vec<4, T, Q> Fac0(Coef00, Coef00, Coef02, Coef03); + vec<4, T, Q> Fac1(Coef04, Coef04, Coef06, Coef07); + vec<4, T, Q> Fac2(Coef08, Coef08, Coef10, Coef11); + vec<4, T, Q> Fac3(Coef12, Coef12, Coef14, Coef15); + vec<4, T, Q> Fac4(Coef16, Coef16, Coef18, Coef19); + vec<4, T, Q> Fac5(Coef20, Coef20, Coef22, Coef23); - tvec4<T, P> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); - tvec4<T, P> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); - tvec4<T, P> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); - tvec4<T, P> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); + vec<4, T, Q> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); + vec<4, T, Q> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); + vec<4, T, Q> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); + vec<4, T, Q> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); - tvec4<T, P> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); - tvec4<T, P> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); - tvec4<T, P> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); - tvec4<T, P> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); + vec<4, T, Q> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); + vec<4, T, Q> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); + vec<4, T, Q> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); + vec<4, T, Q> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); - tvec4<T, P> SignA(+1, -1, +1, -1); - tvec4<T, P> SignB(-1, +1, -1, +1); - tmat4x4<T, P> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB); + vec<4, T, Q> SignA(+1, -1, +1, -1); + vec<4, T, Q> SignB(-1, +1, -1, +1); + mat<4, 4, T, Q> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB); - tvec4<T, P> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); + vec<4, T, Q> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); - tvec4<T, P> Dot0(m[0] * Row0); + vec<4, T, Q> Dot0(m[0] * Row0); T Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w); T OneOverDeterminant = static_cast<T>(1) / Dot1; @@ -355,43 +355,43 @@ namespace detail }; }//namespace detail - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER matType<T, P> matrixCompMult(matType<T, P> const & x, matType<T, P> const & y) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<C, R, T, Q> matrixCompMult(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'matrixCompMult' only accept floating-point inputs"); - return detail::compute_matrixCompMult<matType, T, P, detail::is_aligned<P>::value>::call(x, y); + return detail::compute_matrixCompMult<C, R, T, Q, detail::is_aligned<Q>::value>::call(x, y); } - template<typename T, precision P, template <typename, precision> class vecTypeA, template <typename, precision> class vecTypeB> - GLM_FUNC_QUALIFIER typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r) + template<length_t DA, length_t DB, typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename detail::outerProduct_trait<DA, DB, T, Q>::type outerProduct(vec<DA, T, Q> const& c, vec<DB, T, Q> const& r) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'outerProduct' only accept floating-point inputs"); - typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type m(uninitialize); + typename detail::outerProduct_trait<DA, DB, T, Q>::type m; for(length_t i = 0; i < m.length(); ++i) m[i] = c * r[i]; return m; } - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER typename matType<T, P>::transpose_type transpose(matType<T, P> const & m) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<C, R, T, Q>::transpose_type transpose(mat<C, R, T, Q> const& m) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'transpose' only accept floating-point inputs"); - return detail::compute_transpose<matType, T, P, detail::is_aligned<P>::value>::call(m); + return detail::compute_transpose<C, R, T, Q, detail::is_aligned<Q>::value>::call(m); } - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER T determinant(matType<T, P> const & m) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T determinant(mat<C, R, T, Q> const& m) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'determinant' only accept floating-point inputs"); - return detail::compute_determinant<matType, T, P, detail::is_aligned<P>::value>::call(m); + return detail::compute_determinant<C, R, T, Q, detail::is_aligned<Q>::value>::call(m); } - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER matType<T, P> inverse(matType<T, P> const & m) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, "'inverse' only accept floating-point inputs"); - return detail::compute_inverse<matType, T, P, detail::is_aligned<P>::value>::call(m); + return detail::compute_inverse<C, R, T, Q, detail::is_aligned<Q>::value>::call(m); } }//namespace glm diff --git a/external/include/glm/detail/func_matrix_simd.inl b/external/include/glm/detail/func_matrix_simd.inl index 61b0a5b..b96c028 100644 --- a/external/include/glm/detail/func_matrix_simd.inl +++ b/external/include/glm/detail/func_matrix_simd.inl @@ -4,56 +4,57 @@ #if GLM_ARCH & GLM_ARCH_SSE2_BIT #include "type_mat4x4.hpp" -#include "func_geometric.hpp" +#include "../geometric.hpp" #include "../simd/matrix.h" +#include <cstring> namespace glm{ namespace detail { - template <precision P> - struct compute_matrixCompMult<tmat4x4, float, P, true> + template<qualifier Q> + struct compute_matrixCompMult<4, 4, float, Q, true> { - GLM_STATIC_ASSERT(detail::is_aligned<P>::value, "Specialization requires aligned"); + GLM_STATIC_ASSERT(detail::is_aligned<Q>::value, "Specialization requires aligned"); - GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const & x, tmat4x4<float, P> const & y) + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& x, mat<4, 4, float, Q> const& y) { - tmat4x4<float, P> result(uninitialize); + mat<4, 4, float, Q> Result; glm_mat4_matrixCompMult( - *(glm_vec4 const (*)[4])&x[0].data, - *(glm_vec4 const (*)[4])&y[0].data, - *(glm_vec4(*)[4])&result[0].data); - return result; + *static_cast<glm_vec4 const (*)[4]>(&x[0].data), + *static_cast<glm_vec4 const (*)[4]>(&y[0].data), + *static_cast<glm_vec4(*)[4]>(&Result[0].data)); + return Result; } }; - template <precision P> - struct compute_transpose<tmat4x4, float, P, true> + template<qualifier Q> + struct compute_transpose<4, 4, float, Q, true> { - GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const & m) + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) { - tmat4x4<float, P> result(uninitialize); + mat<4, 4, float, Q> Result; glm_mat4_transpose( - *(glm_vec4 const (*)[4])&m[0].data, - *(glm_vec4(*)[4])&result[0].data); - return result; + *static_cast<glm_vec4 const (*)[4]>(&m[0].data), + *static_cast<glm_vec4(*)[4]>(&Result[0].data)); + return Result; } }; - template <precision P> - struct compute_determinant<tmat4x4, float, P, true> + template<qualifier Q> + struct compute_determinant<4, 4, float, Q, true> { - GLM_FUNC_QUALIFIER static float call(tmat4x4<float, P> const& m) + GLM_FUNC_QUALIFIER static float call(mat<4, 4, float, Q> const& m) { return _mm_cvtss_f32(glm_mat4_determinant(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data))); } }; - template <precision P> - struct compute_inverse<tmat4x4, float, P, true> + template<qualifier Q> + struct compute_inverse<4, 4, float, Q, true> { - GLM_FUNC_QUALIFIER static tmat4x4<float, P> call(tmat4x4<float, P> const& m) + GLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m) { - tmat4x4<float, P> Result(uninitialize); + mat<4, 4, float, Q> Result; glm_mat4_inverse(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data), *reinterpret_cast<__m128(*)[4]>(&Result[0].data)); return Result; } @@ -61,27 +62,33 @@ namespace detail }//namespace detail template<> - GLM_FUNC_QUALIFIER tmat4x4<float, aligned_lowp> outerProduct<float, aligned_lowp, tvec4, tvec4>(tvec4<float, aligned_lowp> const & c, tvec4<float, aligned_lowp> const & r) + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_lowp> outerProduct<4, 4, float, aligned_lowp>(vec<4, float, aligned_lowp> const& c, vec<4, float, aligned_lowp> const& r) { - tmat4x4<float, aligned_lowp> m(uninitialize); - glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); - return m; + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_lowp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; } template<> - GLM_FUNC_QUALIFIER tmat4x4<float, aligned_mediump> outerProduct<float, aligned_mediump, tvec4, tvec4>(tvec4<float, aligned_mediump> const & c, tvec4<float, aligned_mediump> const & r) + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_mediump> outerProduct<4, 4, float, aligned_mediump>(vec<4, float, aligned_mediump> const& c, vec<4, float, aligned_mediump> const& r) { - tmat4x4<float, aligned_mediump> m(uninitialize); - glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); - return m; + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_mediump> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; } template<> - GLM_FUNC_QUALIFIER tmat4x4<float, aligned_highp> outerProduct<float, aligned_highp, tvec4, tvec4>(tvec4<float, aligned_highp> const & c, tvec4<float, aligned_highp> const & r) + GLM_FUNC_QUALIFIER mat<4, 4, float, aligned_highp> outerProduct<4, 4, float, aligned_highp>(vec<4, float, aligned_highp> const& c, vec<4, float, aligned_highp> const& r) { - tmat4x4<float, aligned_highp> m(uninitialize); - glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); - return m; + __m128 NativeResult[4]; + glm_mat4_outerProduct(c.data, r.data, NativeResult); + mat<4, 4, float, aligned_highp> Result; + std::memcpy(&Result[0], &NativeResult[0], sizeof(Result)); + return Result; } }//namespace glm diff --git a/external/include/glm/detail/func_packing.hpp b/external/include/glm/detail/func_packing.hpp deleted file mode 100644 index 47e074b..0000000 --- a/external/include/glm/detail/func_packing.hpp +++ /dev/null @@ -1,168 +0,0 @@ -/// @ref core -/// @file glm/detail/func_packing.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> -/// @see gtc_packing -/// -/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions -/// @ingroup core -/// -/// These functions do not operate component-wise, rather as described in each case. - -#pragma once - -#include "type_vec2.hpp" -#include "type_vec4.hpp" - -namespace glm -{ - /// @addtogroup core_func_packing - /// @{ - - /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - /// Then, the results are packed into the returned 32-bit unsigned integer. - /// - /// The conversion for component c of v to fixed point is done as follows: - /// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) - /// - /// The first component of the vector will be written to the least significant bits of the output; - /// the last component will be written to the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint packUnorm2x16(vec2 const & v); - - /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - /// Then, the results are packed into the returned 32-bit unsigned integer. - /// - /// The conversion for component c of v to fixed point is done as follows: - /// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) - /// - /// The first component of the vector will be written to the least significant bits of the output; - /// the last component will be written to the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint packSnorm2x16(vec2 const & v); - - /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - /// Then, the results are packed into the returned 32-bit unsigned integer. - /// - /// The conversion for component c of v to fixed point is done as follows: - /// packUnorm4x8: round(clamp(c, 0, +1) * 255.0) - /// - /// The first component of the vector will be written to the least significant bits of the output; - /// the last component will be written to the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint packUnorm4x8(vec4 const & v); - - /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - /// Then, the results are packed into the returned 32-bit unsigned integer. - /// - /// The conversion for component c of v to fixed point is done as follows: - /// packSnorm4x8: round(clamp(c, -1, +1) * 127.0) - /// - /// The first component of the vector will be written to the least significant bits of the output; - /// the last component will be written to the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint packSnorm4x8(vec4 const & v); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackUnorm2x16: f / 65535.0 - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackSnorm2x16: clamp(f / 32767.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackUnorm4x8: f / 255.0 - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); - - /// Returns a double-precision value obtained by packing the components of v into a 64-bit value. - /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. - /// Otherwise, the bit- level representation of v is preserved. - /// The first vector component specifies the 32 least significant bits; - /// the second component specifies the 32 most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml">GLSL packDouble2x32 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL double packDouble2x32(uvec2 const & v); - - /// Returns a two-component unsigned integer vector representation of v. - /// The bit-level representation of v is preserved. - /// The first component of the vector contains the 32 least significant bits of the double; - /// the second component consists the 32 most significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml">GLSL unpackDouble2x32 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uvec2 unpackDouble2x32(double v); - - /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector - /// to the 16-bit floating-point representation found in the OpenGL Specification, - /// and then packing these two 16- bit integers into a 32-bit unsigned integer. - /// The first vector component specifies the 16 least-significant bits of the result; - /// the second component specifies the 16 most-significant bits. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint packHalf2x16(vec2 const & v); - - /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, - /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, - /// and converting them to 32-bit floating-point values. - /// The first component of the vector is obtained from the 16 least-significant bits of v; - /// the second component is obtained from the 16 most-significant bits of v. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); - - /// @} -}//namespace glm - -#include "func_packing.inl" diff --git a/external/include/glm/detail/func_packing.inl b/external/include/glm/detail/func_packing.inl index 505c80a..7c22eb9 100644 --- a/external/include/glm/detail/func_packing.inl +++ b/external/include/glm/detail/func_packing.inl @@ -1,13 +1,13 @@ /// @ref core /// @file glm/detail/func_packing.inl -#include "func_common.hpp" +#include "../common.hpp" #include "type_half.hpp" #include "../fwd.hpp" namespace glm { - GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const & v) + GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const& v) { union { @@ -36,7 +36,7 @@ namespace glm return vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f; } - GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const & v) + GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const& v) { union { @@ -65,7 +65,7 @@ namespace glm return clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f); } - GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const & v) + GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const& v) { union { @@ -95,8 +95,8 @@ namespace glm return vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f; } - - GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const & v) + + GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const& v) { union { @@ -113,7 +113,7 @@ namespace glm return u.out; } - + GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) { union @@ -127,7 +127,7 @@ namespace glm return clamp(vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0078740157480315f, -1.0f, 1.0f); } - GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const & v) + GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const& v) { union { @@ -154,7 +154,7 @@ namespace glm return uvec2(u.out[0], u.out[1]); } - GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const & v) + GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const& v) { union { diff --git a/external/include/glm/detail/func_trigonometric.hpp b/external/include/glm/detail/func_trigonometric.hpp deleted file mode 100644 index 719cff0..0000000 --- a/external/include/glm/detail/func_trigonometric.hpp +++ /dev/null @@ -1,176 +0,0 @@ -/// @ref core -/// @file glm/detail/func_trigonometric.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> -/// -/// @defgroup core_func_trigonometric Angle and Trigonometry Functions -/// @ingroup core -/// -/// Function parameters specified as angle are assumed to be in units of radians. -/// In no case will any of these functions result in a divide by zero error. If -/// the divisor of a ratio is 0, then results will be undefined. -/// -/// These all operate component-wise. The description is per component. - -#pragma once - -#include "setup.hpp" -#include "precision.hpp" - -namespace glm -{ - /// @addtogroup core_func_trigonometric - /// @{ - - /// Converts degrees to radians and returns the result. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & degrees); - - /// Converts radians to degrees and returns the result. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> degrees(vecType<T, P> const & radians); - - /// The standard trigonometric sine function. - /// The values returned by this function will range from [-1, 1]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml">GLSL sin man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> sin(vecType<T, P> const & angle); - - /// The standard trigonometric cosine function. - /// The values returned by this function will range from [-1, 1]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml">GLSL cos man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> cos(vecType<T, P> const & angle); - - /// The standard trigonometric tangent function. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml">GLSL tan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> tan(vecType<T, P> const & angle); - - /// Arc sine. Returns an angle whose sine is x. - /// The range of values returned by this function is [-PI/2, PI/2]. - /// Results are undefined if |x| > 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml">GLSL asin man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> asin(vecType<T, P> const & x); - - /// Arc cosine. Returns an angle whose sine is x. - /// The range of values returned by this function is [0, PI]. - /// Results are undefined if |x| > 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml">GLSL acos man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> acos(vecType<T, P> const & x); - - /// Arc tangent. Returns an angle whose tangent is y/x. - /// The signs of x and y are used to determine what - /// quadrant the angle is in. The range of values returned - /// by this function is [-PI, PI]. Results are undefined - /// if x and y are both 0. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> atan(vecType<T, P> const & y, vecType<T, P> const & x); - - /// Arc tangent. Returns an angle whose tangent is y_over_x. - /// The range of values returned by this function is [-PI/2, PI/2]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> atan(vecType<T, P> const & y_over_x); - - /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml">GLSL sinh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> sinh(vecType<T, P> const & angle); - - /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml">GLSL cosh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> cosh(vecType<T, P> const & angle); - - /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml">GLSL tanh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> tanh(vecType<T, P> const & angle); - - /// Arc hyperbolic sine; returns the inverse of sinh. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml">GLSL asinh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> asinh(vecType<T, P> const & x); - - /// Arc hyperbolic cosine; returns the non-negative inverse - /// of cosh. Results are undefined if x < 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml">GLSL acosh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> acosh(vecType<T, P> const & x); - - /// Arc hyperbolic tangent; returns the inverse of tanh. - /// Results are undefined if abs(x) >= 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml">GLSL atanh man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> atanh(vecType<T, P> const & x); - - /// @} -}//namespace glm - -#include "func_trigonometric.inl" diff --git a/external/include/glm/detail/func_trigonometric.inl b/external/include/glm/detail/func_trigonometric.inl index 2986673..291fccd 100644 --- a/external/include/glm/detail/func_trigonometric.inl +++ b/external/include/glm/detail/func_trigonometric.inl @@ -8,7 +8,7 @@ namespace glm { // radians - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input"); @@ -16,14 +16,14 @@ namespace glm return degrees * static_cast<genType>(0.01745329251994329576923690768489); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> radians(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(radians, v); + return detail::functor1<L, T, T, Q>::call(radians, v); } - + // degrees - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'degrees' only accept floating-point input"); @@ -31,59 +31,59 @@ namespace glm return radians * static_cast<genType>(57.295779513082320876798154814105); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR vecType<T, P> degrees(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> degrees(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(degrees, v); + return detail::functor1<L, T, T, Q>::call(degrees, v); } // sin using ::std::sin; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sin(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sin(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(sin, v); + return detail::functor1<L, T, T, Q>::call(sin, v); } // cos using std::cos; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> cos(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> cos(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(cos, v); + return detail::functor1<L, T, T, Q>::call(cos, v); } // tan using std::tan; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> tan(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> tan(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(tan, v); + return detail::functor1<L, T, T, Q>::call(tan, v); } // asin using std::asin; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> asin(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> asin(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(asin, v); + return detail::functor1<L, T, T, Q>::call(asin, v); } // acos using std::acos; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acos(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acos(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(acos, v); + return detail::functor1<L, T, T, Q>::call(acos, v); } // atan - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType atan(genType y, genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atan' only accept floating-point input"); @@ -91,52 +91,52 @@ namespace glm return ::std::atan2(y, x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> atan(vecType<T, P> const & a, vecType<T, P> const & b) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { - return detail::functor2<T, P, vecType>::call(::std::atan2, a, b); + return detail::functor2<L, T, Q>::call(::std::atan2, a, b); } using std::atan; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> atan(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(atan, v); + return detail::functor1<L, T, T, Q>::call(atan, v); } // sinh using std::sinh; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sinh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sinh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(sinh, v); + return detail::functor1<L, T, T, Q>::call(sinh, v); } // cosh using std::cosh; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> cosh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> cosh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(cosh, v); + return detail::functor1<L, T, T, Q>::call(cosh, v); } // tanh using std::tanh; - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> tanh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> tanh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(tanh, v); + return detail::functor1<L, T, T, Q>::call(tanh, v); } // asinh # if GLM_HAS_CXX11_STL using std::asinh; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType asinh(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asinh' only accept floating-point input"); @@ -145,17 +145,17 @@ namespace glm } # endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> asinh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> asinh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(asinh, v); + return detail::functor1<L, T, T, Q>::call(asinh, v); } // acosh # if GLM_HAS_CXX11_STL using std::acosh; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType acosh(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acosh' only accept floating-point input"); @@ -166,31 +166,31 @@ namespace glm } # endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acosh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acosh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(acosh, v); + return detail::functor1<L, T, T, Q>::call(acosh, v); } // atanh # if GLM_HAS_CXX11_STL using std::atanh; # else - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType atanh(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atanh' only accept floating-point input"); - + if(std::abs(x) >= static_cast<genType>(1)) return 0; return static_cast<genType>(0.5) * log((static_cast<genType>(1) + x) / (static_cast<genType>(1) - x)); } # endif - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> atanh(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> atanh(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(atanh, v); + return detail::functor1<L, T, T, Q>::call(atanh, v); } }//namespace glm diff --git a/external/include/glm/detail/func_vector_relational.hpp b/external/include/glm/detail/func_vector_relational.hpp deleted file mode 100644 index ec0f68a..0000000 --- a/external/include/glm/detail/func_vector_relational.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/// @ref core -/// @file glm/detail/func_vector_relational.hpp -/// -/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> -/// -/// @defgroup core_func_vector_relational Vector Relational Functions -/// @ingroup core -/// -/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to -/// operate on scalars and produce scalar Boolean results. For vector results, -/// use the following built-in functions. -/// -/// In all cases, the sizes of all the input and return vectors for any particular -/// call must match. - -#pragma once - -#include "precision.hpp" -#include "setup.hpp" - -namespace glm -{ - /// @addtogroup core_func_vector_relational - /// @{ - - /// Returns the component-wise comparison result of x < y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml">GLSL lessThan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> lessThan(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the component-wise comparison of result x <= y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml">GLSL lessThanEqual man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> lessThanEqual(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the component-wise comparison of result x > y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml">GLSL greaterThan man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> greaterThan(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the component-wise comparison of result x >= y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml">GLSL greaterThanEqual man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> greaterThanEqual(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the component-wise comparison of result x == y. - /// - /// @tparam vecType Floating-point, integer or boolean vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml">GLSL equal man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> equal(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns the component-wise comparison of result x != y. - /// - /// @tparam vecType Floating-point, integer or boolean vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml">GLSL notEqual man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> notEqual(vecType<T, P> const & x, vecType<T, P> const & y); - - /// Returns true if any component of x is true. - /// - /// @tparam vecType Boolean vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml">GLSL any man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool any(vecType<bool, P> const & v); - - /// Returns true if all components of x are true. - /// - /// @tparam vecType Boolean vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml">GLSL all man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool all(vecType<bool, P> const & v); - - /// Returns the component-wise logical complement of x. - /// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead. - /// - /// @tparam vecType Boolean vector types. - /// - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml">GLSL not man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> not_(vecType<bool, P> const & v); - - /// @} -}//namespace glm - -#include "func_vector_relational.inl" diff --git a/external/include/glm/detail/func_vector_relational.inl b/external/include/glm/detail/func_vector_relational.inl index 3d8d2b7..b081a90 100644 --- a/external/include/glm/detail/func_vector_relational.inl +++ b/external/include/glm/detail/func_vector_relational.inl @@ -1,79 +1,79 @@ /// @ref core /// @file glm/detail/func_vector_relational.inl -#include <limits> +#include "compute_vector_relational.hpp" namespace glm { - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> lessThan(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> lessThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] < y[i]; return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> lessThanEqual(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> lessThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] <= y[i]; return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> greaterThan(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> greaterThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] > y[i]; return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> greaterThanEqual(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> greaterThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] >= y[i]; return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> equal(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) - Result[i] = x[i] == y[i]; + Result[i] = detail::compute_equal<T>::call(x[i], y[i]); return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> notEqual(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { assert(x.length() == y.length()); - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) - Result[i] = x[i] != y[i]; + Result[i] = !detail::compute_equal<T>::call(x[i], y[i]); return Result; } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool any(vecType<bool, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER bool any(vec<L, bool, Q> const& v) { bool Result = false; for(length_t i = 0; i < v.length(); ++i) @@ -81,8 +81,8 @@ namespace glm return Result; } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool all(vecType<bool, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER bool all(vec<L, bool, Q> const& v) { bool Result = true; for(length_t i = 0; i < v.length(); ++i) @@ -90,10 +90,10 @@ namespace glm return Result; } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> not_(vecType<bool, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> not_(vec<L, bool, Q> const& v) { - vecType<bool, P> Result(uninitialize); + vec<L, bool, Q> Result; for(length_t i = 0; i < v.length(); ++i) Result[i] = !v[i]; return Result; diff --git a/external/include/glm/detail/glm.cpp b/external/include/glm/detail/glm.cpp index da3be4e..f4224ac 100644 --- a/external/include/glm/detail/glm.cpp +++ b/external/include/glm/detail/glm.cpp @@ -1,237 +1,239 @@ /// @ref core /// @file glm/glm.cpp +#define GLM_ENABLE_EXPERIMENTAL #include <glm/glm.hpp> +#include <glm/ext/vec1.hpp> #include <glm/gtc/quaternion.hpp> #include <glm/gtx/dual_quaternion.hpp> namespace glm { // tvec1 type explicit instantiation -template struct tvec1<uint8, lowp>; -template struct tvec1<uint16, lowp>; -template struct tvec1<uint32, lowp>; -template struct tvec1<uint64, lowp>; -template struct tvec1<int8, lowp>; -template struct tvec1<int16, lowp>; -template struct tvec1<int32, lowp>; -template struct tvec1<int64, lowp>; -template struct tvec1<float32, lowp>; -template struct tvec1<float64, lowp>; - -template struct tvec1<uint8, mediump>; -template struct tvec1<uint16, mediump>; -template struct tvec1<uint32, mediump>; -template struct tvec1<uint64, mediump>; -template struct tvec1<int8, mediump>; -template struct tvec1<int16, mediump>; -template struct tvec1<int32, mediump>; -template struct tvec1<int64, mediump>; -template struct tvec1<float32, mediump>; -template struct tvec1<float64, mediump>; - -template struct tvec1<uint8, highp>; -template struct tvec1<uint16, highp>; -template struct tvec1<uint32, highp>; -template struct tvec1<uint64, highp>; -template struct tvec1<int8, highp>; -template struct tvec1<int16, highp>; -template struct tvec1<int32, highp>; -template struct tvec1<int64, highp>; -template struct tvec1<float32, highp>; -template struct tvec1<float64, highp>; +template struct vec<1, uint8, lowp>; +template struct vec<1, uint16, lowp>; +template struct vec<1, uint32, lowp>; +template struct vec<1, uint64, lowp>; +template struct vec<1, int8, lowp>; +template struct vec<1, int16, lowp>; +template struct vec<1, int32, lowp>; +template struct vec<1, int64, lowp>; +template struct vec<1, float32, lowp>; +template struct vec<1, float64, lowp>; + +template struct vec<1, uint8, mediump>; +template struct vec<1, uint16, mediump>; +template struct vec<1, uint32, mediump>; +template struct vec<1, uint64, mediump>; +template struct vec<1, int8, mediump>; +template struct vec<1, int16, mediump>; +template struct vec<1, int32, mediump>; +template struct vec<1, int64, mediump>; +template struct vec<1, float32, mediump>; +template struct vec<1, float64, mediump>; + +template struct vec<1, uint8, highp>; +template struct vec<1, uint16, highp>; +template struct vec<1, uint32, highp>; +template struct vec<1, uint64, highp>; +template struct vec<1, int8, highp>; +template struct vec<1, int16, highp>; +template struct vec<1, int32, highp>; +template struct vec<1, int64, highp>; +template struct vec<1, float32, highp>; +template struct vec<1, float64, highp>; // tvec2 type explicit instantiation -template struct tvec2<uint8, lowp>; -template struct tvec2<uint16, lowp>; -template struct tvec2<uint32, lowp>; -template struct tvec2<uint64, lowp>; -template struct tvec2<int8, lowp>; -template struct tvec2<int16, lowp>; -template struct tvec2<int32, lowp>; -template struct tvec2<int64, lowp>; -template struct tvec2<float32, lowp>; -template struct tvec2<float64, lowp>; - -template struct tvec2<uint8, mediump>; -template struct tvec2<uint16, mediump>; -template struct tvec2<uint32, mediump>; -template struct tvec2<uint64, mediump>; -template struct tvec2<int8, mediump>; -template struct tvec2<int16, mediump>; -template struct tvec2<int32, mediump>; -template struct tvec2<int64, mediump>; -template struct tvec2<float32, mediump>; -template struct tvec2<float64, mediump>; - -template struct tvec2<uint8, highp>; -template struct tvec2<uint16, highp>; -template struct tvec2<uint32, highp>; -template struct tvec2<uint64, highp>; -template struct tvec2<int8, highp>; -template struct tvec2<int16, highp>; -template struct tvec2<int32, highp>; -template struct tvec2<int64, highp>; -template struct tvec2<float32, highp>; -template struct tvec2<float64, highp>; +template struct vec<2, uint8, lowp>; +template struct vec<2, uint16, lowp>; +template struct vec<2, uint32, lowp>; +template struct vec<2, uint64, lowp>; +template struct vec<2, int8, lowp>; +template struct vec<2, int16, lowp>; +template struct vec<2, int32, lowp>; +template struct vec<2, int64, lowp>; +template struct vec<2, float32, lowp>; +template struct vec<2, float64, lowp>; + +template struct vec<2, uint8, mediump>; +template struct vec<2, uint16, mediump>; +template struct vec<2, uint32, mediump>; +template struct vec<2, uint64, mediump>; +template struct vec<2, int8, mediump>; +template struct vec<2, int16, mediump>; +template struct vec<2, int32, mediump>; +template struct vec<2, int64, mediump>; +template struct vec<2, float32, mediump>; +template struct vec<2, float64, mediump>; + +template struct vec<2, uint8, highp>; +template struct vec<2, uint16, highp>; +template struct vec<2, uint32, highp>; +template struct vec<2, uint64, highp>; +template struct vec<2, int8, highp>; +template struct vec<2, int16, highp>; +template struct vec<2, int32, highp>; +template struct vec<2, int64, highp>; +template struct vec<2, float32, highp>; +template struct vec<2, float64, highp>; // tvec3 type explicit instantiation -template struct tvec3<uint8, lowp>; -template struct tvec3<uint16, lowp>; -template struct tvec3<uint32, lowp>; -template struct tvec3<uint64, lowp>; -template struct tvec3<int8, lowp>; -template struct tvec3<int16, lowp>; -template struct tvec3<int32, lowp>; -template struct tvec3<int64, lowp>; -template struct tvec3<float32, lowp>; -template struct tvec3<float64, lowp>; - -template struct tvec3<uint8, mediump>; -template struct tvec3<uint16, mediump>; -template struct tvec3<uint32, mediump>; -template struct tvec3<uint64, mediump>; -template struct tvec3<int8, mediump>; -template struct tvec3<int16, mediump>; -template struct tvec3<int32, mediump>; -template struct tvec3<int64, mediump>; -template struct tvec3<float32, mediump>; -template struct tvec3<float64, mediump>; - -template struct tvec3<uint8, highp>; -template struct tvec3<uint16, highp>; -template struct tvec3<uint32, highp>; -template struct tvec3<uint64, highp>; -template struct tvec3<int8, highp>; -template struct tvec3<int16, highp>; -template struct tvec3<int32, highp>; -template struct tvec3<int64, highp>; -template struct tvec3<float32, highp>; -template struct tvec3<float64, highp>; +template struct vec<3, uint8, lowp>; +template struct vec<3, uint16, lowp>; +template struct vec<3, uint32, lowp>; +template struct vec<3, uint64, lowp>; +template struct vec<3, int8, lowp>; +template struct vec<3, int16, lowp>; +template struct vec<3, int32, lowp>; +template struct vec<3, int64, lowp>; +template struct vec<3, float32, lowp>; +template struct vec<3, float64, lowp>; + +template struct vec<3, uint8, mediump>; +template struct vec<3, uint16, mediump>; +template struct vec<3, uint32, mediump>; +template struct vec<3, uint64, mediump>; +template struct vec<3, int8, mediump>; +template struct vec<3, int16, mediump>; +template struct vec<3, int32, mediump>; +template struct vec<3, int64, mediump>; +template struct vec<3, float32, mediump>; +template struct vec<3, float64, mediump>; + +template struct vec<3, uint8, highp>; +template struct vec<3, uint16, highp>; +template struct vec<3, uint32, highp>; +template struct vec<3, uint64, highp>; +template struct vec<3, int8, highp>; +template struct vec<3, int16, highp>; +template struct vec<3, int32, highp>; +template struct vec<3, int64, highp>; +template struct vec<3, float32, highp>; +template struct vec<3, float64, highp>; // tvec4 type explicit instantiation -template struct tvec4<uint8, lowp>; -template struct tvec4<uint16, lowp>; -template struct tvec4<uint32, lowp>; -template struct tvec4<uint64, lowp>; -template struct tvec4<int8, lowp>; -template struct tvec4<int16, lowp>; -template struct tvec4<int32, lowp>; -template struct tvec4<int64, lowp>; -template struct tvec4<float32, lowp>; -template struct tvec4<float64, lowp>; - -template struct tvec4<uint8, mediump>; -template struct tvec4<uint16, mediump>; -template struct tvec4<uint32, mediump>; -template struct tvec4<uint64, mediump>; -template struct tvec4<int8, mediump>; -template struct tvec4<int16, mediump>; -template struct tvec4<int32, mediump>; -template struct tvec4<int64, mediump>; -template struct tvec4<float32, mediump>; -template struct tvec4<float64, mediump>; - -template struct tvec4<uint8, highp>; -template struct tvec4<uint16, highp>; -template struct tvec4<uint32, highp>; -template struct tvec4<uint64, highp>; -template struct tvec4<int8, highp>; -template struct tvec4<int16, highp>; -template struct tvec4<int32, highp>; -template struct tvec4<int64, highp>; -template struct tvec4<float32, highp>; -template struct tvec4<float64, highp>; +template struct vec<4, uint8, lowp>; +template struct vec<4, uint16, lowp>; +template struct vec<4, uint32, lowp>; +template struct vec<4, uint64, lowp>; +template struct vec<4, int8, lowp>; +template struct vec<4, int16, lowp>; +template struct vec<4, int32, lowp>; +template struct vec<4, int64, lowp>; +template struct vec<4, float32, lowp>; +template struct vec<4, float64, lowp>; + +template struct vec<4, uint8, mediump>; +template struct vec<4, uint16, mediump>; +template struct vec<4, uint32, mediump>; +template struct vec<4, uint64, mediump>; +template struct vec<4, int8, mediump>; +template struct vec<4, int16, mediump>; +template struct vec<4, int32, mediump>; +template struct vec<4, int64, mediump>; +template struct vec<4, float32, mediump>; +template struct vec<4, float64, mediump>; + +template struct vec<4, uint8, highp>; +template struct vec<4, uint16, highp>; +template struct vec<4, uint32, highp>; +template struct vec<4, uint64, highp>; +template struct vec<4, int8, highp>; +template struct vec<4, int16, highp>; +template struct vec<4, int32, highp>; +template struct vec<4, int64, highp>; +template struct vec<4, float32, highp>; +template struct vec<4, float64, highp>; // tmat2x2 type explicit instantiation -template struct tmat2x2<float32, lowp>; -template struct tmat2x2<float64, lowp>; +template struct mat<2, 2, float32, lowp>; +template struct mat<2, 2, float64, lowp>; -template struct tmat2x2<float32, mediump>; -template struct tmat2x2<float64, mediump>; +template struct mat<2, 2, float32, mediump>; +template struct mat<2, 2, float64, mediump>; -template struct tmat2x2<float32, highp>; -template struct tmat2x2<float64, highp>; +template struct mat<2, 2, float32, highp>; +template struct mat<2, 2, float64, highp>; // tmat2x3 type explicit instantiation -template struct tmat2x3<float32, lowp>; -template struct tmat2x3<float64, lowp>; +template struct mat<2, 3, float32, lowp>; +template struct mat<2, 3, float64, lowp>; -template struct tmat2x3<float32, mediump>; -template struct tmat2x3<float64, mediump>; +template struct mat<2, 3, float32, mediump>; +template struct mat<2, 3, float64, mediump>; -template struct tmat2x3<float32, highp>; -template struct tmat2x3<float64, highp>; +template struct mat<2, 3, float32, highp>; +template struct mat<2, 3, float64, highp>; // tmat2x4 type explicit instantiation -template struct tmat2x4<float32, lowp>; -template struct tmat2x4<float64, lowp>; +template struct mat<2, 4, float32, lowp>; +template struct mat<2, 4, float64, lowp>; -template struct tmat2x4<float32, mediump>; -template struct tmat2x4<float64, mediump>; +template struct mat<2, 4, float32, mediump>; +template struct mat<2, 4, float64, mediump>; -template struct tmat2x4<float32, highp>; -template struct tmat2x4<float64, highp>; +template struct mat<2, 4, float32, highp>; +template struct mat<2, 4, float64, highp>; // tmat3x2 type explicit instantiation -template struct tmat3x2<float32, lowp>; -template struct tmat3x2<float64, lowp>; +template struct mat<3, 2, float32, lowp>; +template struct mat<3, 2, float64, lowp>; -template struct tmat3x2<float32, mediump>; -template struct tmat3x2<float64, mediump>; +template struct mat<3, 2, float32, mediump>; +template struct mat<3, 2, float64, mediump>; -template struct tmat3x2<float32, highp>; -template struct tmat3x2<float64, highp>; +template struct mat<3, 2, float32, highp>; +template struct mat<3, 2, float64, highp>; // tmat3x3 type explicit instantiation -template struct tmat3x3<float32, lowp>; -template struct tmat3x3<float64, lowp>; +template struct mat<3, 3, float32, lowp>; +template struct mat<3, 3, float64, lowp>; -template struct tmat3x3<float32, mediump>; -template struct tmat3x3<float64, mediump>; +template struct mat<3, 3, float32, mediump>; +template struct mat<3, 3, float64, mediump>; -template struct tmat3x3<float32, highp>; -template struct tmat3x3<float64, highp>; +template struct mat<3, 3, float32, highp>; +template struct mat<3, 3, float64, highp>; // tmat3x4 type explicit instantiation -template struct tmat3x4<float32, lowp>; -template struct tmat3x4<float64, lowp>; +template struct mat<3, 4, float32, lowp>; +template struct mat<3, 4, float64, lowp>; -template struct tmat3x4<float32, mediump>; -template struct tmat3x4<float64, mediump>; +template struct mat<3, 4, float32, mediump>; +template struct mat<3, 4, float64, mediump>; -template struct tmat3x4<float32, highp>; -template struct tmat3x4<float64, highp>; +template struct mat<3, 4, float32, highp>; +template struct mat<3, 4, float64, highp>; // tmat4x2 type explicit instantiation -template struct tmat4x2<float32, lowp>; -template struct tmat4x2<float64, lowp>; +template struct mat<4, 2, float32, lowp>; +template struct mat<4, 2, float64, lowp>; -template struct tmat4x2<float32, mediump>; -template struct tmat4x2<float64, mediump>; +template struct mat<4, 2, float32, mediump>; +template struct mat<4, 2, float64, mediump>; -template struct tmat4x2<float32, highp>; -template struct tmat4x2<float64, highp>; +template struct mat<4, 2, float32, highp>; +template struct mat<4, 2, float64, highp>; // tmat4x3 type explicit instantiation -template struct tmat4x3<float32, lowp>; -template struct tmat4x3<float64, lowp>; +template struct mat<4, 3, float32, lowp>; +template struct mat<4, 3, float64, lowp>; -template struct tmat4x3<float32, mediump>; -template struct tmat4x3<float64, mediump>; +template struct mat<4, 3, float32, mediump>; +template struct mat<4, 3, float64, mediump>; -template struct tmat4x3<float32, highp>; -template struct tmat4x3<float64, highp>; +template struct mat<4, 3, float32, highp>; +template struct mat<4, 3, float64, highp>; // tmat4x4 type explicit instantiation -template struct tmat4x4<float32, lowp>; -template struct tmat4x4<float64, lowp>; +template struct mat<4, 4, float32, lowp>; +template struct mat<4, 4, float64, lowp>; -template struct tmat4x4<float32, mediump>; -template struct tmat4x4<float64, mediump>; +template struct mat<4, 4, float32, mediump>; +template struct mat<4, 4, float64, mediump>; -template struct tmat4x4<float32, highp>; -template struct tmat4x4<float64, highp>; +template struct mat<4, 4, float32, highp>; +template struct mat<4, 4, float64, highp>; // tquat type explicit instantiation template struct tquat<float32, lowp>; diff --git a/external/include/glm/detail/precision.hpp b/external/include/glm/detail/precision.hpp deleted file mode 100644 index 7c54437..0000000 --- a/external/include/glm/detail/precision.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/// @ref core -/// @file glm/detail/precision.hpp - -#pragma once - -#include "setup.hpp" - -namespace glm -{ - enum precision - { - packed_highp, - packed_mediump, - packed_lowp, - -# if GLM_HAS_ALIGNED_TYPE - aligned_highp, - aligned_mediump, - aligned_lowp, - aligned = aligned_highp, -# endif - - highp = packed_highp, - mediump = packed_mediump, - lowp = packed_lowp, - packed = packed_highp, - -# if GLM_HAS_ALIGNED_TYPE && defined(GLM_FORCE_ALIGNED) - defaultp = aligned_highp -# else - defaultp = highp -# endif - }; - -namespace detail -{ - template <glm::precision P> - struct is_aligned - { - static const bool value = false; - }; - -# if GLM_HAS_ALIGNED_TYPE - template<> - struct is_aligned<glm::aligned_lowp> - { - static const bool value = true; - }; - - template<> - struct is_aligned<glm::aligned_mediump> - { - static const bool value = true; - }; - - template<> - struct is_aligned<glm::aligned_highp> - { - static const bool value = true; - }; -# endif -}//namespace detail -}//namespace glm diff --git a/external/include/glm/detail/qualifier.hpp b/external/include/glm/detail/qualifier.hpp new file mode 100644 index 0000000..262ec32 --- /dev/null +++ b/external/include/glm/detail/qualifier.hpp @@ -0,0 +1,69 @@ +/// @ref core +/// @file glm/detail/qualifier.hpp + +#pragma once + +#include "setup.hpp" + +namespace glm +{ + /// Qualify GLM types in term of alignment (packed, aligned) and precision in term of ULPs (lowp, mediump, highp) + enum qualifier + { + packed_highp, ///< Typed data is tightly packed in memory and operations are executed with high precision in term of ULPs + packed_mediump, ///< Typed data is tightly packed in memory and operations are executed with medium precision in term of ULPs for higher performance + packed_lowp, ///< Typed data is tightly packed in memory and operations are executed with low precision in term of ULPs to maximize performance + +# if GLM_HAS_ALIGNED_TYPE + aligned_highp, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs + aligned_mediump, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs for higher performance + aligned_lowp, // ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs to maximize performance + aligned = aligned_highp, ///< By default aligned qualifier is also high precision +# endif + + highp = packed_highp, ///< By default highp qualifier is also packed + mediump = packed_mediump, ///< By default mediump qualifier is also packed + lowp = packed_lowp, ///< By default lowp qualifier is also packed + packed = packed_highp, ///< By default packed qualifier is also high precision + +# if GLM_HAS_ALIGNED_TYPE && defined(GLM_FORCE_ALIGNED) + defaultp = aligned_highp +# else + defaultp = highp +# endif + }; + + typedef qualifier precision; + + template<length_t L, typename T, qualifier Q = defaultp> struct vec; + template<length_t C, length_t R, typename T, qualifier Q = defaultp> struct mat; + +namespace detail +{ + template<glm::qualifier P> + struct is_aligned + { + static const bool value = false; + }; + +# if GLM_HAS_ALIGNED_TYPE + template<> + struct is_aligned<glm::aligned_lowp> + { + static const bool value = true; + }; + + template<> + struct is_aligned<glm::aligned_mediump> + { + static const bool value = true; + }; + + template<> + struct is_aligned<glm::aligned_highp> + { + static const bool value = true; + }; +# endif +}//namespace detail +}//namespace glm diff --git a/external/include/glm/detail/setup.hpp b/external/include/glm/detail/setup.hpp index 68c8cb4..7475916 100644 --- a/external/include/glm/detail/setup.hpp +++ b/external/include/glm/detail/setup.hpp @@ -1,46 +1,46 @@ /// @ref core /// @file glm/detail/setup.hpp -#pragma once +#ifndef GLM_SETUP_INCLUDED -#if (defined(GLM_FORCE_SWIZZLE) || defined(GLM_SWIZZLE)) && defined(GLM_FORCE_UNRESTRICTED_GENTYPE) +#define GLM_VERSION_MAJOR 0 +#define GLM_VERSION_MINOR 9 +#define GLM_VERSION_PATCH 9 +#define GLM_VERSION_REVISION 0 +#define GLM_VERSION 990 + +#define GLM_SETUP_INCLUDED GLM_VERSION + +#if defined(GLM_FORCE_SWIZZLE) && defined(GLM_FORCE_UNRESTRICTED_GENTYPE) # error "Both GLM_FORCE_SWIZZLE and GLM_FORCE_UNRESTRICTED_GENTYPE can't be defined at the same time" #endif +#include <cassert> +#include <cstddef> + /////////////////////////////////////////////////////////////////////////////////// // Messages -#ifdef GLM_MESSAGES -# pragma message("GLM: GLM_MESSAGES is deprecated, use GLM_FORCE_MESSAGES instead") -#endif - #define GLM_MESSAGES_ENABLED 1 #define GLM_MESSAGES_DISABLE 0 -#if defined(GLM_FORCE_MESSAGES) || defined(GLM_MESSAGES) -# undef GLM_MESSAGES +#if defined(GLM_FORCE_MESSAGES) # define GLM_MESSAGES GLM_MESSAGES_ENABLED #else -# undef GLM_MESSAGES # define GLM_MESSAGES GLM_MESSAGES_DISABLE #endif -#include <cassert> -#include <cstddef> +/////////////////////////////////////////////////////////////////////////////////// +// Detect the platform + #include "../simd/platform.h" /////////////////////////////////////////////////////////////////////////////////// // Version -#define GLM_VERSION 98 -#define GLM_VERSION_MAJOR 0 -#define GLM_VERSION_MINOR 9 -#define GLM_VERSION_PATCH 8 -#define GLM_VERSION_REVISION 4 - #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_VERSION_DISPLAYED) # define GLM_MESSAGE_VERSION_DISPLAYED -# pragma message ("GLM: version 0.9.8.4") +# pragma message ("GLM: version 0.9.9.0") #endif//GLM_MESSAGES // Report compiler detection @@ -194,28 +194,18 @@ # ifdef _MSC_EXTENSIONS # if __cplusplus >= 201402L # define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_CXXMS_FLAG) -//# elif GLM_COMPILER >= GLM_COMPILER_VC14 -//# define GLM_LANG (GLM_LANG_CXX1Y | GLM_LANG_CXXMS_FLAG) # elif __cplusplus >= 201103L # define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_CXXMS_FLAG) -# elif GLM_COMPILER >= GLM_COMPILER_VC10 -# define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG) -# elif __cplusplus >= 199711L -# define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_CXXMS_FLAG) # else -# define GLM_LANG (GLM_LANG_CXX | GLM_LANG_CXXMS_FLAG) +# define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG) # endif # else # if __cplusplus >= 201402L # define GLM_LANG GLM_LANG_CXX14 # elif __cplusplus >= 201103L # define GLM_LANG GLM_LANG_CXX11 -# elif GLM_COMPILER >= GLM_COMPILER_VC10 -# define GLM_LANG GLM_LANG_CXX0X -# elif __cplusplus >= 199711L -# define GLM_LANG GLM_LANG_CXX98 # else -# define GLM_LANG GLM_LANG_CXX +# define GLM_LANG GLM_LANG_CXX0X # endif # endif # elif GLM_COMPILER & GLM_COMPILER_INTEL @@ -328,7 +318,7 @@ # define GLM_HAS_EXTENDED_INTEGER_TYPE 1 #else # define GLM_HAS_EXTENDED_INTEGER_TYPE (\ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \ ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \ ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC)) || \ ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG))) @@ -383,7 +373,7 @@ # define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ ((GLM_COMPILER & GLM_COMPILER_GCC)) || \ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ - ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL12)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ (GLM_COMPILER & GLM_COMPILER_CUDA))) #endif @@ -395,8 +385,8 @@ #else # define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ ((GLM_COMPILER & GLM_COMPILER_GCC)) || \ - ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) || \ - ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) #endif // N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf @@ -406,10 +396,10 @@ # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1 #else # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ - ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC45)) || \ + ((GLM_COMPILER & GLM_COMPILER_GCC)) || \ ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ - ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) #endif // N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf @@ -419,10 +409,10 @@ # define GLM_HAS_TEMPLATE_ALIASES 1 #else # define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ - ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL12_1)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ - ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) #endif // N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html @@ -433,9 +423,9 @@ #else # define GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ - ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL13)) || \ - ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11)) || \ - ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) + ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC)) || \ + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) #endif // N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf @@ -474,7 +464,7 @@ #else # define GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \ - ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA50)))) + ((GLM_COMPILER & GLM_COMPILER_CUDA)))) #endif #if GLM_ARCH == GLM_ARCH_PURE @@ -494,10 +484,6 @@ # define GLM_HAS_OPENMP 40 # elif GLM_COMPILER >= GLM_COMPILER_GCC47 # define GLM_HAS_OPENMP 31 -# elif GLM_COMPILER >= GLM_COMPILER_GCC44 -# define GLM_HAS_OPENMP 30 -# elif GLM_COMPILER >= GLM_COMPILER_GCC42 -# define GLM_HAS_OPENMP 25 # else # define GLM_HAS_OPENMP 0 # endif @@ -508,22 +494,34 @@ # define GLM_HAS_OPENMP 0 # endif # elif GLM_COMPILER & GLM_COMPILER_VC -# if GLM_COMPILER >= GLM_COMPILER_VC10 -# define GLM_HAS_OPENMP 20 -# else -# define GLM_HAS_OPENMP 0 -# endif +# define GLM_HAS_OPENMP 20 # elif GLM_COMPILER & GLM_COMPILER_INTEL # if GLM_COMPILER >= GLM_COMPILER_INTEL16 # define GLM_HAS_OPENMP 40 -# elif GLM_COMPILER >= GLM_COMPILER_INTEL12 -# define GLM_HAS_OPENMP 31 # else # define GLM_HAS_OPENMP 0 # endif # else # define GLM_HAS_OPENMP 0 -# endif// GLM_COMPILER & GLM_COMPILER_VC +# endif +#else +# define GLM_HAS_OPENMP 0 +#endif + +/////////////////////////////////////////////////////////////////////////////////// +// nullptr + +// +#if GLM_LANG & GLM_LANG_CXX0X_FLAG +# define GLM_HAS_NULLPTR 1 +#else +# define GLM_HAS_NULLPTR 0 +#endif + +#if GLM_HAS_NULLPTR +# define GLM_NULLPTR nullptr +#else +# define GLM_NULLPTR 0 #endif /////////////////////////////////////////////////////////////////////////////////// @@ -531,8 +529,6 @@ #if GLM_HAS_STATIC_ASSERT # define GLM_STATIC_ASSERT(x, message) static_assert(x, message) -#elif defined(BOOST_STATIC_ASSERT) -# define GLM_STATIC_ASSERT(x, message) BOOST_STATIC_ASSERT(x) #elif GLM_COMPILER & GLM_COMPILER_VC # define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1] #else @@ -584,18 +580,12 @@ // User defines: GLM_FORCE_SWIZZLE -#ifdef GLM_SWIZZLE -# pragma message("GLM: GLM_SWIZZLE is deprecated, use GLM_FORCE_SWIZZLE instead") -#endif - #define GLM_SWIZZLE_ENABLED 1 #define GLM_SWIZZLE_DISABLE 0 -#if defined(GLM_FORCE_SWIZZLE) || defined(GLM_SWIZZLE) -# undef GLM_SWIZZLE +#if defined(GLM_FORCE_SWIZZLE) # define GLM_SWIZZLE GLM_SWIZZLE_ENABLED #else -# undef GLM_SWIZZLE # define GLM_SWIZZLE GLM_SWIZZLE_DISABLE #endif @@ -627,11 +617,17 @@ #endif//GLM_MESSAGES /////////////////////////////////////////////////////////////////////////////////// -// Clip control +// Force single only (remove explicit float64 types) -#ifdef GLM_DEPTH_ZERO_TO_ONE // Legacy 0.9.8 development -# error Define GLM_FORCE_DEPTH_ZERO_TO_ONE instead of GLM_DEPTH_ZERO_TO_ONE to use 0 to 1 clip space. -#endif +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SINGLE_ONLY_DISPLAYED) +# define GLM_MESSAGE_SINGLE_ONLY_DISPLAYED +# ifdef GLM_FORCE_SINGLE_ONLY +# pragma message("GLM: Using only single precision floating-point types") +# endif +#endif//GLM_MESSAGES + +/////////////////////////////////////////////////////////////////////////////////// +// Clip control #define GLM_DEPTH_ZERO_TO_ONE 0x00000001 #define GLM_DEPTH_NEGATIVE_ONE_TO_ONE 0x00000002 @@ -655,10 +651,6 @@ // Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM // to use left handed coordinate system by default. -#ifdef GLM_LEFT_HANDED // Legacy 0.9.8 development -# error Define GLM_FORCE_LEFT_HANDED instead of GLM_LEFT_HANDED left handed coordinate system by default. -#endif - #define GLM_LEFT_HANDED 0x00000001 // For DirectX, Metal, Vulkan #define GLM_RIGHT_HANDED 0x00000002 // For OpenGL, default in GLM @@ -728,10 +720,15 @@ #if GLM_HAS_DEFAULTED_FUNCTIONS # define GLM_DEFAULT = default + # ifdef GLM_FORCE_NO_CTOR_INIT -# define GLM_DEFAULT_CTOR = default -# else +# undef GLM_FORCE_CTOR_INIT +# endif + +# ifdef GLM_FORCE_CTOR_INIT # define GLM_DEFAULT_CTOR +# else +# define GLM_DEFAULT_CTOR = default # endif #else # define GLM_DEFAULT @@ -740,7 +737,7 @@ #if GLM_HAS_CONSTEXPR || GLM_HAS_CONSTEXPR_PARTIAL # define GLM_CONSTEXPR constexpr -# if GLM_COMPILER & GLM_COMPILER_VC // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594 +# if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER <= GLM_COMPILER_VC14)) // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594 # define GLM_CONSTEXPR_CTOR # else # define GLM_CONSTEXPR_CTOR constexpr @@ -756,6 +753,18 @@ # define GLM_RELAXED_CONSTEXPR const #endif +#if GLM_LANG >= GLM_LANG_CXX14 +# if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER <= GLM_COMPILER_VC14)) // Visual C++ < 2017 does not support extended const expressions https://msdn.microsoft.com/en-us/library/hh567368.aspx https://github.com/g-truc/glm/issues/749 +# define GLM_CONSTEXPR_CXX14 +# else +# define GLM_CONSTEXPR_CXX14 GLM_CONSTEXPR +# endif +# define GLM_CONSTEXPR_CTOR_CXX14 GLM_CONSTEXPR_CTOR +#else +# define GLM_CONSTEXPR_CXX14 +# define GLM_CONSTEXPR_CTOR_CXX14 +#endif + #if GLM_ARCH == GLM_ARCH_PURE # define GLM_CONSTEXPR_SIMD GLM_CONSTEXPR_CTOR #else @@ -773,9 +782,11 @@ #define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS /////////////////////////////////////////////////////////////////////////////////// -// Length type +// Length type: all length functions returns a length_t type. +// When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise +// length_t is a typedef of int like GLSL defines it. -// User defines: GLM_FORCE_SIZE_T_LENGTH GLM_FORCE_SIZE_FUNC +// User define: GLM_FORCE_SIZE_T_LENGTH namespace glm { @@ -799,14 +810,10 @@ namespace glm /////////////////////////////////////////////////////////////////////////////////// // countof -#ifndef __has_feature -# define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif - #if GLM_HAS_CONSTEXPR_PARTIAL namespace glm { - template <typename T, std::size_t N> + template<typename T, std::size_t N> constexpr std::size_t countof(T const (&)[N]) { return N; @@ -820,9 +827,10 @@ namespace glm #endif /////////////////////////////////////////////////////////////////////////////////// -// Uninitialize constructors +// Check inclusions of different versions of GLM -namespace glm -{ - enum ctor{uninitialize}; -}//namespace glm +#elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION)) +# error "GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error." +#elif GLM_SETUP_INCLUDED == GLM_VERSION + +#endif//GLM_SETUP_INCLUDED diff --git a/external/include/glm/detail/type_float.hpp b/external/include/glm/detail/type_float.hpp index 900a3fb..28abb5f 100644 --- a/external/include/glm/detail/type_float.hpp +++ b/external/include/glm/detail/type_float.hpp @@ -9,9 +9,12 @@ namespace glm{ namespace detail { typedef float float32; - typedef double float64; + +# ifndef GLM_FORCE_SINGLE_ONLY + typedef double float64; +# endif//GLM_FORCE_SINGLE_ONLY }//namespace detail - + typedef float lowp_float_t; typedef float mediump_float_t; typedef double highp_float_t; @@ -19,23 +22,23 @@ namespace detail /// @addtogroup core_precision /// @{ - /// Low precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// + /// Low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef lowp_float_t lowp_float; - /// Medium precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// + /// Medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef mediump_float_t mediump_float; - /// High precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// + /// High qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef highp_float_t highp_float; @@ -53,13 +56,18 @@ namespace detail #endif typedef float float32; - typedef double float64; + +# ifndef GLM_FORCE_SINGLE_ONLY + typedef double float64; +# endif//GLM_FORCE_SINGLE_ONLY //////////////////// // check type sizes #ifndef GLM_STATIC_ASSERT_NULL GLM_STATIC_ASSERT(sizeof(glm::float32) == 4, "float32 size isn't 4 bytes on this platform"); - GLM_STATIC_ASSERT(sizeof(glm::float64) == 8, "float64 size isn't 8 bytes on this platform"); +# ifndef GLM_FORCE_SINGLE_ONLY + GLM_STATIC_ASSERT(sizeof(glm::float64) == 8, "float64 size isn't 8 bytes on this platform"); +# endif//GLM_FORCE_SINGLE_ONLY #endif//GLM_STATIC_ASSERT_NULL /// @} diff --git a/external/include/glm/detail/type_gentype.hpp b/external/include/glm/detail/type_gentype.hpp index 8fd202e..b45cdf4 100644 --- a/external/include/glm/detail/type_gentype.hpp +++ b/external/include/glm/detail/type_gentype.hpp @@ -13,13 +13,13 @@ namespace glm }; typedef std::size_t sizeType; - + namespace detail { template < - typename VALTYPE, - template <typename> class TYPE + typename VALTYPE, + template<typename> class TYPE > struct genType { @@ -35,15 +35,15 @@ namespace detail typedef sizeType size_type; static bool is_vector(); static bool is_matrix(); - + typedef TYPE<VALTYPE> type; typedef TYPE<VALTYPE> * pointer; typedef TYPE<VALTYPE> const * const_pointer; typedef TYPE<VALTYPE> const * const const_pointer_const; typedef TYPE<VALTYPE> * const pointer_const; typedef TYPE<VALTYPE> & reference; - typedef TYPE<VALTYPE> const & const_reference; - typedef TYPE<VALTYPE> const & param_type; + typedef TYPE<VALTYPE> const& const_reference; + typedef TYPE<VALTYPE> const& param_type; ////////////////////////////////////// // Address (Implementation details) @@ -64,15 +64,15 @@ namespace detail template < - typename VALTYPE, - template <typename> class TYPE + typename VALTYPE, + template<typename> class TYPE > bool genType<VALTYPE, TYPE>::is_vector() { return true; } /* - template <typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice> + template<typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice> class base { public: @@ -97,46 +97,46 @@ namespace detail static bool is_matrix(); private: - // Data - col_type value[colT]; + // Data + col_type value[colT]; public: ////////////////////////////////////// // Constructors base(); - base(class_type const & m); + base(class_type const& m); - explicit base(T const & x); + explicit base(T const& x); explicit base(value_type const * const x); explicit base(col_type const * const x); ////////////////////////////////////// // Conversions - template <typename vU, uint cU, uint rU, profile pU> - explicit base(base<vU, cU, rU, pU> const & m); + template<typename vU, uint cU, uint rU, profile pU> + explicit base(base<vU, cU, rU, pU> const& m); ////////////////////////////////////// // Accesses col_type& operator[](size_type i); - col_type const & operator[](size_type i) const; + col_type const& operator[](size_type i) const; ////////////////////////////////////// // Unary updatable operators - class_type& operator= (class_type const & x); - class_type& operator+= (T const & x); - class_type& operator+= (class_type const & x); - class_type& operator-= (T const & x); - class_type& operator-= (class_type const & x); - class_type& operator*= (T const & x); - class_type& operator*= (class_type const & x); - class_type& operator/= (T const & x); - class_type& operator/= (class_type const & x); + class_type& operator= (class_type const& x); + class_type& operator+= (T const& x); + class_type& operator+= (class_type const& x); + class_type& operator-= (T const& x); + class_type& operator-= (class_type const& x); + class_type& operator*= (T const& x); + class_type& operator*= (class_type const& x); + class_type& operator/= (T const& x); + class_type& operator/= (class_type const& x); class_type& operator++ (); class_type& operator-- (); }; */ - - //template <typename T> + + //template<typename T> //struct traits //{ // static const bool is_signed = false; @@ -147,29 +147,29 @@ namespace detail // static const bool is_genIType = false; // static const bool is_genUType = false; //}; - - //template <> + + //template<> //struct traits<half> //{ // static const bool is_float = true; // static const bool is_genType = true; //}; - - //template <> + + //template<> //struct traits<float> //{ // static const bool is_float = true; // static const bool is_genType = true; //}; - - //template <> + + //template<> //struct traits<double> //{ // static const bool is_float = true; // static const bool is_genType = true; //}; - - //template <typename genType> + + //template<typename genType> //struct desc //{ // typedef genType type; @@ -180,15 +180,15 @@ namespace detail // typedef genType & reference; // typedef genType const& const_reference; // typedef genType const& param_type; - + // typedef typename genType::value_type value_type; // typedef typename genType::size_type size_type; // static const typename size_type value_size; //}; - - //template <typename genType> + + //template<typename genType> //const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size(); - + }//namespace detail }//namespace glm diff --git a/external/include/glm/detail/type_gentype.inl b/external/include/glm/detail/type_gentype.inl index 6a90288..60ffa9a 100644 --- a/external/include/glm/detail/type_gentype.inl +++ b/external/include/glm/detail/type_gentype.inl @@ -7,37 +7,37 @@ namespace detail{ ///////////////////////////////// // Static functions -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size() { return cT; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size() { return rT; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size() { return rT * cT; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> bool base<vT, cT, rT, pT>::is_scalar() { return rT == 1 && cT == 1; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> bool base<vT, cT, rT, pT>::is_vector() { return rT == 1; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> bool base<vT, cT, rT, pT>::is_matrix() { return rT != 1; @@ -46,16 +46,16 @@ bool base<vT, cT, rT, pT>::is_matrix() ///////////////////////////////// // Constructor -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> base<vT, cT, rT, pT>::base() { memset(&this->value, 0, cT * rT * sizeof(vT)); } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> base<vT, cT, rT, pT>::base ( - typename base<vT, cT, rT, pT>::class_type const & m + typename base<vT, cT, rT, pT>::class_type const& m ) { for @@ -69,10 +69,10 @@ base<vT, cT, rT, pT>::base } } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> base<vT, cT, rT, pT>::base ( - typename base<vT, cT, rT, pT>::T const & x + typename base<vT, cT, rT, pT>::T const& x ) { if(rT == 1) // vector @@ -105,7 +105,7 @@ base<vT, cT, rT, pT>::base } } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> base<vT, cT, rT, pT>::base ( typename base<vT, cT, rT, pT>::value_type const * const x @@ -114,7 +114,7 @@ base<vT, cT, rT, pT>::base memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> base<vT, cT, rT, pT>::base ( typename base<vT, cT, rT, pT>::col_type const * const x @@ -131,11 +131,11 @@ base<vT, cT, rT, pT>::base } } -template <typename vT, uint cT, uint rT, profile pT> -template <typename vU, uint cU, uint rU, profile pU> +template<typename vT, uint cT, uint rT, profile pT> +template<typename vU, uint cU, uint rU, profile pU> base<vT, cT, rT, pT>::base ( - base<vU, cU, rU, pU> const & m + base<vU, cU, rU, pU> const& m ) { for @@ -152,7 +152,7 @@ base<vT, cT, rT, pT>::base ////////////////////////////////////// // Accesses -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[] ( typename base<vT, cT, rT, pT>::size_type i @@ -161,8 +161,8 @@ typename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[] return this->value[i]; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::col_type const & base<vT, cT, rT, pT>::operator[] +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::col_type const& base<vT, cT, rT, pT>::operator[] ( typename base<vT, cT, rT, pT>::size_type i ) const @@ -173,20 +173,20 @@ typename base<vT, cT, rT, pT>::col_type const & base<vT, cT, rT, pT>::operator[] ////////////////////////////////////// // Unary updatable operators -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator= ( - typename base<vT, cT, rT, pT>::class_type const & x + typename base<vT, cT, rT, pT>::class_type const& x ) { memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= ( - typename base<vT, cT, rT, pT>::T const & x + typename base<vT, cT, rT, pT>::T const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -199,10 +199,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= ( - typename base<vT, cT, rT, pT>::class_type const & x + typename base<vT, cT, rT, pT>::class_type const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -215,10 +215,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= ( - typename base<vT, cT, rT, pT>::T const & x + typename base<vT, cT, rT, pT>::T const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -231,10 +231,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= ( - typename base<vT, cT, rT, pT>::class_type const & x + typename base<vT, cT, rT, pT>::class_type const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -247,10 +247,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= ( - typename base<vT, cT, rT, pT>::T const & x + typename base<vT, cT, rT, pT>::T const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -263,10 +263,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= ( - typename base<vT, cT, rT, pT>::class_type const & x + typename base<vT, cT, rT, pT>::class_type const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -279,10 +279,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= ( - typename base<vT, cT, rT, pT>::T const & x + typename base<vT, cT, rT, pT>::T const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -295,10 +295,10 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= return *this; } -template <typename vT, uint cT, uint rT, profile pT> -typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= +template<typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= ( - typename base<vT, cT, rT, pT>::class_type const & x + typename base<vT, cT, rT, pT>::class_type const& x ) { typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); @@ -311,7 +311,7 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= return *this; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ () { typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); @@ -324,7 +324,7 @@ typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ () return *this; } -template <typename vT, uint cT, uint rT, profile pT> +template<typename vT, uint cT, uint rT, profile pT> typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-- () { typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); diff --git a/external/include/glm/detail/type_half.hpp b/external/include/glm/detail/type_half.hpp index c3ef617..57f7dec 100644 --- a/external/include/glm/detail/type_half.hpp +++ b/external/include/glm/detail/type_half.hpp @@ -11,7 +11,7 @@ namespace detail typedef short hdata; GLM_FUNC_DECL float toFloat32(hdata value); - GLM_FUNC_DECL hdata toFloat16(float const & value); + GLM_FUNC_DECL hdata toFloat16(float const& value); }//namespace detail }//namespace glm diff --git a/external/include/glm/detail/type_half.inl b/external/include/glm/detail/type_half.inl index 78d3e26..29e8160 100644 --- a/external/include/glm/detail/type_half.inl +++ b/external/include/glm/detail/type_half.inl @@ -8,7 +8,7 @@ namespace detail { volatile float f = 1e10; - for(int i = 0; i < 10; ++i) + for(int i = 0; i < 10; ++i) f *= f; // this will overflow before the for loop terminates return f; } @@ -46,7 +46,7 @@ namespace detail // detail::uif32 result; - result.i = (unsigned int)(s << 31); + result.i = static_cast<unsigned int>(s << 31); return result.f; } else @@ -74,7 +74,7 @@ namespace detail // uif32 result; - result.i = (unsigned int)((s << 31) | 0x7f800000); + result.i = static_cast<unsigned int>((s << 31) | 0x7f800000); return result.f; } else @@ -84,7 +84,7 @@ namespace detail // uif32 result; - result.i = (unsigned int)((s << 31) | 0x7f800000 | (m << 13)); + result.i = static_cast<unsigned int>((s << 31) | 0x7f800000 | (m << 13)); return result.f; } } @@ -101,15 +101,15 @@ namespace detail // uif32 Result; - Result.i = (unsigned int)((s << 31) | (e << 23) | m); + Result.i = static_cast<unsigned int>((s << 31) | (e << 23) | m); return Result.f; } - GLM_FUNC_QUALIFIER hdata toFloat16(float const & f) + GLM_FUNC_QUALIFIER hdata toFloat16(float const& f) { uif32 Entry; Entry.f = f; - int i = (int)Entry.i; + int i = static_cast<int>(Entry.i); // // Our floating point number, f, is represented by the bit @@ -149,7 +149,7 @@ namespace detail // whose magnitude is less than __half_NRM_MIN. // // We convert f to a denormalized half. - // + // m = (m | 0x00800000) >> (1 - e); @@ -160,9 +160,9 @@ namespace detail // our number normalized. Because of the way a half's bits // are laid out, we don't have to treat this case separately; // the code below will handle it correctly. - // + // - if(m & 0x00001000) + if(m & 0x00001000) m += 0x00002000; // @@ -188,7 +188,7 @@ namespace detail // F is a NAN; we produce a half NAN that preserves // the sign bit and the 10 leftmost bits of the // significand of f, with one exception: If the 10 - // leftmost bits are all zero, the NAN would turn + // leftmost bits are all zero, the NAN would turn // into an infinity, so we have to set at least one // bit in the significand. // diff --git a/external/include/glm/detail/type_int.hpp b/external/include/glm/detail/type_int.hpp index 764a32c..c8b1d15 100644 --- a/external/include/glm/detail/type_int.hpp +++ b/external/include/glm/detail/type_int.hpp @@ -20,7 +20,7 @@ namespace detail typedef std::int16_t int16; typedef std::int32_t int32; typedef std::int64_t int64; - + typedef std::uint8_t uint8; typedef std::uint16_t uint16; typedef std::uint32_t uint32; @@ -29,41 +29,41 @@ namespace detail # if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available typedef int64_t sint64; typedef uint64_t uint64; - + # elif GLM_COMPILER & GLM_COMPILER_VC typedef signed __int64 sint64; typedef unsigned __int64 uint64; - + # elif GLM_COMPILER & GLM_COMPILER_GCC # pragma GCC diagnostic ignored "-Wlong-long" __extension__ typedef signed long long sint64; __extension__ typedef unsigned long long uint64; - + # elif (GLM_COMPILER & GLM_COMPILER_CLANG) # pragma clang diagnostic ignored "-Wc++11-long-long" typedef signed long long sint64; typedef unsigned long long uint64; - + # else//unknown compiler typedef signed long long sint64; typedef unsigned long long uint64; # endif//GLM_COMPILER - + typedef signed char int8; typedef signed short int16; typedef signed int int32; typedef sint64 int64; - + typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; typedef uint64 uint64; #endif// - + typedef signed int lowp_int_t; typedef signed int mediump_int_t; typedef signed int highp_int_t; - + typedef unsigned int lowp_uint_t; typedef unsigned int mediump_uint_t; typedef unsigned int highp_uint_t; @@ -73,129 +73,129 @@ namespace detail using std::make_unsigned; # else//GLM_HAS_MAKE_SIGNED - template <typename genType> + template<typename genType> struct make_signed {}; - template <> + template<> struct make_signed<char> { typedef char type; }; - template <> + template<> struct make_signed<short> { typedef short type; }; - template <> + template<> struct make_signed<int> { typedef int type; }; - template <> + template<> struct make_signed<long> { typedef long type; }; - - template <> + + template<> struct make_signed<unsigned char> { typedef char type; }; - template <> + template<> struct make_signed<unsigned short> { typedef short type; }; - template <> + template<> struct make_signed<unsigned int> { typedef int type; }; - template <> + template<> struct make_signed<unsigned long> { typedef long type; }; - template <typename genType> + template<typename genType> struct make_unsigned {}; - template <> + template<> struct make_unsigned<char> { typedef unsigned char type; }; - template <> + template<> struct make_unsigned<short> { typedef unsigned short type; }; - template <> + template<> struct make_unsigned<int> { typedef unsigned int type; }; - template <> + template<> struct make_unsigned<long> { typedef unsigned long type; }; - template <> + template<> struct make_unsigned<unsigned char> { typedef unsigned char type; }; - template <> + template<> struct make_unsigned<unsigned short> { typedef unsigned short type; }; - template <> + template<> struct make_unsigned<unsigned int> { typedef unsigned int type; }; - template <> + template<> struct make_unsigned<unsigned long> { typedef unsigned long type; }; - template <> + template<> struct make_signed<long long> { typedef long long type; }; - - template <> + + template<> struct make_signed<unsigned long long> { typedef long long type; }; - - template <> + + template<> struct make_unsigned<long long> { typedef unsigned long long type; }; - - template <> + + template<> struct make_unsigned<unsigned long long> { typedef unsigned long long type; @@ -207,7 +207,7 @@ namespace detail typedef detail::int16 int16; typedef detail::int32 int32; typedef detail::int64 int64; - + typedef detail::uint8 uint8; typedef detail::uint16 uint16; typedef detail::uint32 uint32; @@ -216,44 +216,44 @@ namespace detail /// @addtogroup core_precision /// @{ - /// Low precision signed integer. - /// There is no guarantee on the actual precision. - /// + /// Low qualifier signed integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::lowp_int_t lowp_int; - /// Medium precision signed integer. - /// There is no guarantee on the actual precision. - /// + /// Medium qualifier signed integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::mediump_int_t mediump_int; - /// High precision signed integer. - /// There is no guarantee on the actual precision. - /// + /// High qualifier signed integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::highp_int_t highp_int; - /// Low precision unsigned integer. - /// There is no guarantee on the actual precision. - /// + /// Low qualifier unsigned integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::lowp_uint_t lowp_uint; - /// Medium precision unsigned integer. - /// There is no guarantee on the actual precision. - /// + /// Medium qualifier unsigned integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::mediump_uint_t mediump_uint; - /// High precision unsigned integer. - /// There is no guarantee on the actual precision. - /// + /// High qualifier unsigned integer. + /// There is no guarantee on the actual qualifier. + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> typedef detail::highp_uint_t highp_uint; @@ -283,7 +283,7 @@ namespace detail #endif /// Unsigned integer type. - /// + /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> typedef unsigned int uint; diff --git a/external/include/glm/detail/type_mat.hpp b/external/include/glm/detail/type_mat.hpp index aad74e5..db839b3 100644 --- a/external/include/glm/detail/type_mat.hpp +++ b/external/include/glm/detail/type_mat.hpp @@ -3,335 +3,334 @@ #pragma once -#include "precision.hpp" +#include "qualifier.hpp" namespace glm{ namespace detail { - template <typename T, precision P, template <class, precision> class colType, template <class, precision> class rowType> + template<length_t C, length_t R, typename T, qualifier Q> struct outerProduct_trait{}; }//namespace detail - template <typename T, precision P> struct tvec2; - template <typename T, precision P> struct tvec3; - template <typename T, precision P> struct tvec4; - template <typename T, precision P> struct tmat2x2; - template <typename T, precision P> struct tmat2x3; - template <typename T, precision P> struct tmat2x4; - template <typename T, precision P> struct tmat3x2; - template <typename T, precision P> struct tmat3x3; - template <typename T, precision P> struct tmat3x4; - template <typename T, precision P> struct tmat4x2; - template <typename T, precision P> struct tmat4x3; - template <typename T, precision P> struct tmat4x4; - - template <typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL matType<T, P> inverse(matType<T, P> const & m); +#if GLM_HAS_TEMPLATE_ALIASES + template <typename T, qualifier Q = defaultp> using tmat2x2 = mat<2, 2, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat2x3 = mat<2, 3, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat2x4 = mat<2, 4, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat3x2 = mat<3, 2, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat3x3 = mat<3, 3, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat3x4 = mat<3, 4, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat4x2 = mat<4, 2, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat4x3 = mat<4, 3, T, Q>; + template <typename T, qualifier Q = defaultp> using tmat4x4 = mat<4, 4, T, Q>; +#endif//GLM_HAS_TEMPLATE_ALIASES + + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m); /// @addtogroup core_precision /// @{ - - /// 2 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, lowp> lowp_mat2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, lowp> lowp_mat2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, mediump> mediump_mat2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, mediump> mediump_mat2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, highp> highp_mat2; - - /// 2 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, highp> highp_mat2; + + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, lowp> lowp_mat2x2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, lowp> lowp_mat2x2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, mediump> mediump_mat2x2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, mediump> mediump_mat2x2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, highp> highp_mat2x2; - + typedef mat<2, 2, float, highp> highp_mat2x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 2 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 2 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, lowp> lowp_mat2x3; - - /// 2 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 3, float, lowp> lowp_mat2x3; + + /// 2 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, mediump> mediump_mat2x3; - - /// 2 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 3, float, mediump> mediump_mat2x3; + + /// 2 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, highp> highp_mat2x3; - + typedef mat<2, 3, float, highp> highp_mat2x3; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 2 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 2 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, lowp> lowp_mat2x4; - - /// 2 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 4, float, lowp> lowp_mat2x4; + + /// 2 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, mediump> mediump_mat2x4; - - /// 2 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 4, float, mediump> mediump_mat2x4; + + /// 2 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, highp> highp_mat2x4; - + typedef mat<2, 4, float, highp> highp_mat2x4; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 3 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, lowp> lowp_mat3x2; - - /// 3 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 2, float, lowp> lowp_mat3x2; + + /// 3 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, mediump> mediump_mat3x2; - - /// 3 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 2, float, mediump> mediump_mat3x2; + + /// 3 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, highp> highp_mat3x2; - + typedef mat<3, 2, float, highp> highp_mat3x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, lowp> lowp_mat3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, lowp> lowp_mat3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, mediump> mediump_mat3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, mediump> mediump_mat3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, highp> highp_mat3; - - /// 3 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, highp> highp_mat3; + + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, lowp> lowp_mat3x3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, lowp> lowp_mat3x3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, mediump> mediump_mat3x3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, mediump> mediump_mat3x3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, highp> highp_mat3x3; - + typedef mat<3, 3, float, highp> highp_mat3x3; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 3 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, lowp> lowp_mat3x4; - - /// 3 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 4, float, lowp> lowp_mat3x4; + + /// 3 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, mediump> mediump_mat3x4; - - /// 3 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 4, float, mediump> mediump_mat3x4; + + /// 3 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, highp> highp_mat3x4; - + typedef mat<3, 4, float, highp> highp_mat3x4; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 4 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 4 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, lowp> lowp_mat4x2; - - /// 4 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 2, float, lowp> lowp_mat4x2; + + /// 4 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, mediump> mediump_mat4x2; - - /// 4 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 2, float, mediump> mediump_mat4x2; + + /// 4 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, highp> highp_mat4x2; - + typedef mat<4, 2, float, highp> highp_mat4x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 4 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 4 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, lowp> lowp_mat4x3; - - /// 4 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 3, float, lowp> lowp_mat4x3; + + /// 4 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, mediump> mediump_mat4x3; - - /// 4 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 3, float, mediump> mediump_mat4x3; + + /// 4 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, highp> highp_mat4x3; - + typedef mat<4, 3, float, highp> highp_mat4x3; + /// @} - - + + /// @addtogroup core_precision /// @{ - - /// 4 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, lowp> lowp_mat4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, lowp> lowp_mat4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, mediump> mediump_mat4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, mediump> mediump_mat4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, highp> highp_mat4; - - /// 4 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, highp> highp_mat4; + + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, lowp> lowp_mat4x4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, lowp> lowp_mat4x4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, mediump> mediump_mat4x4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, mediump> mediump_mat4x4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, highp> highp_mat4x4; - + typedef mat<4, 4, float, highp> highp_mat4x4; + /// @} - + /// @addtogroup core_types /// @{ - + ////////////////////////// // Float definition - + #if(defined(GLM_PRECISION_LOWP_FLOAT)) typedef lowp_mat2x2 mat2x2; typedef lowp_mat2x3 mat2x3; @@ -352,333 +351,333 @@ namespace detail typedef mediump_mat4x2 mat4x2; typedef mediump_mat4x3 mat4x3; typedef mediump_mat4x4 mat4x4; -#else +#else //! 2 columns of 2 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat2x2 mat2x2; - + //! 2 columns of 3 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat2x3 mat2x3; - + //! 2 columns of 4 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat2x4 mat2x4; - + //! 3 columns of 2 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat3x2 mat3x2; - + //! 3 columns of 3 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat3x3 mat3x3; - + //! 3 columns of 4 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat3x4 mat3x4; - + //! 4 columns of 2 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat4x2 mat4x2; - + //! 4 columns of 3 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat4x3 mat4x3; - + //! 4 columns of 4 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_mat4x4 mat4x4; - + #endif//GLM_PRECISION - + //! 2 columns of 2 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef mat2x2 mat2; - + //! 3 columns of 3 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef mat3x3 mat3; - + //! 4 columns of 4 components matrix of floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef mat4x4 mat4; - + ////////////////////////// // Double definition - + /// @addtogroup core_precision /// @{ - - /// 2 columns of 2 components matrix of low precision floating-point numbers. + + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, lowp> lowp_dmat2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. + typedef mat<2, 2, double, lowp> lowp_dmat2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, mediump> mediump_dmat2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. + typedef mat<2, 2, double, mediump> mediump_dmat2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, highp> highp_dmat2; - - /// 2 columns of 2 components matrix of low precision floating-point numbers. + typedef mat<2, 2, double, highp> highp_dmat2; + + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, lowp> lowp_dmat2x2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. + typedef mat<2, 2, double, lowp> lowp_dmat2x2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, mediump> mediump_dmat2x2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. + typedef mat<2, 2, double, mediump> mediump_dmat2x2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<double, highp> highp_dmat2x2; - + typedef mat<2, 2, double, highp> highp_dmat2x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 2 columns of 3 components matrix of low precision floating-point numbers. + + /// 2 columns of 3 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<double, lowp> lowp_dmat2x3; - - /// 2 columns of 3 components matrix of medium precision floating-point numbers. + typedef mat<2, 3, double, lowp> lowp_dmat2x3; + + /// 2 columns of 3 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<double, mediump> mediump_dmat2x3; - - /// 2 columns of 3 components matrix of high precision floating-point numbers. + typedef mat<2, 3, double, mediump> mediump_dmat2x3; + + /// 2 columns of 3 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<double, highp> highp_dmat2x3; - + typedef mat<2, 3, double, highp> highp_dmat2x3; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 2 columns of 4 components matrix of low precision floating-point numbers. + + /// 2 columns of 4 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<double, lowp> lowp_dmat2x4; - - /// 2 columns of 4 components matrix of medium precision floating-point numbers. + typedef mat<2, 4, double, lowp> lowp_dmat2x4; + + /// 2 columns of 4 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<double, mediump> mediump_dmat2x4; - - /// 2 columns of 4 components matrix of high precision floating-point numbers. + typedef mat<2, 4, double, mediump> mediump_dmat2x4; + + /// 2 columns of 4 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<double, highp> highp_dmat2x4; - + typedef mat<2, 4, double, highp> highp_dmat2x4; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 2 components matrix of low precision floating-point numbers. + + /// 3 columns of 2 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<double, lowp> lowp_dmat3x2; - - /// 3 columns of 2 components matrix of medium precision floating-point numbers. + typedef mat<3, 2, double, lowp> lowp_dmat3x2; + + /// 3 columns of 2 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<double, mediump> mediump_dmat3x2; - - /// 3 columns of 2 components matrix of high precision floating-point numbers. + typedef mat<3, 2, double, mediump> mediump_dmat3x2; + + /// 3 columns of 2 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<double, highp> highp_dmat3x2; - + typedef mat<3, 2, double, highp> highp_dmat3x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 3 components matrix of low precision floating-point numbers. + + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, lowp> lowp_dmat3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. + typedef mat<3, 3, float, lowp> lowp_dmat3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<double, mediump> mediump_dmat3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. + typedef mat<3, 3, double, mediump> mediump_dmat3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<double, highp> highp_dmat3; - - /// 3 columns of 3 components matrix of low precision floating-point numbers. + typedef mat<3, 3, double, highp> highp_dmat3; + + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<double, lowp> lowp_dmat3x3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. + typedef mat<3, 3, double, lowp> lowp_dmat3x3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<double, mediump> mediump_dmat3x3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. + typedef mat<3, 3, double, mediump> mediump_dmat3x3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<double, highp> highp_dmat3x3; - + typedef mat<3, 3, double, highp> highp_dmat3x3; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 3 columns of 4 components matrix of low precision floating-point numbers. + + /// 3 columns of 4 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<double, lowp> lowp_dmat3x4; - - /// 3 columns of 4 components matrix of medium precision floating-point numbers. + typedef mat<3, 4, double, lowp> lowp_dmat3x4; + + /// 3 columns of 4 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<double, mediump> mediump_dmat3x4; - - /// 3 columns of 4 components matrix of high precision floating-point numbers. + typedef mat<3, 4, double, mediump> mediump_dmat3x4; + + /// 3 columns of 4 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<double, highp> highp_dmat3x4; - + typedef mat<3, 4, double, highp> highp_dmat3x4; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 4 columns of 2 components matrix of low precision floating-point numbers. + + /// 4 columns of 2 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<double, lowp> lowp_dmat4x2; - - /// 4 columns of 2 components matrix of medium precision floating-point numbers. + typedef mat<4, 2, double, lowp> lowp_dmat4x2; + + /// 4 columns of 2 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<double, mediump> mediump_dmat4x2; - - /// 4 columns of 2 components matrix of high precision floating-point numbers. + typedef mat<4, 2, double, mediump> mediump_dmat4x2; + + /// 4 columns of 2 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<double, highp> highp_dmat4x2; - + typedef mat<4, 2, double, highp> highp_dmat4x2; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 4 columns of 3 components matrix of low precision floating-point numbers. + + /// 4 columns of 3 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<double, lowp> lowp_dmat4x3; - - /// 4 columns of 3 components matrix of medium precision floating-point numbers. + typedef mat<4, 3, double, lowp> lowp_dmat4x3; + + /// 4 columns of 3 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<double, mediump> mediump_dmat4x3; - - /// 4 columns of 3 components matrix of high precision floating-point numbers. + typedef mat<4, 3, double, mediump> mediump_dmat4x3; + + /// 4 columns of 3 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<double, highp> highp_dmat4x3; - + typedef mat<4, 3, double, highp> highp_dmat4x3; + /// @} - + /// @addtogroup core_precision /// @{ - - /// 4 columns of 4 components matrix of low precision floating-point numbers. + + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, lowp> lowp_dmat4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. + typedef mat<4, 4, double, lowp> lowp_dmat4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, mediump> mediump_dmat4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. + typedef mat<4, 4, double, mediump> mediump_dmat4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, highp> highp_dmat4; - - /// 4 columns of 4 components matrix of low precision floating-point numbers. + typedef mat<4, 4, double, highp> highp_dmat4; + + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, lowp> lowp_dmat4x4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. + typedef mat<4, 4, double, lowp> lowp_dmat4x4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, mediump> mediump_dmat4x4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. + typedef mat<4, 4, double, mediump> mediump_dmat4x4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<double, highp> highp_dmat4x4; - + typedef mat<4, 4, double, highp> highp_dmat4x4; + /// @} - + #if(defined(GLM_PRECISION_LOWP_DOUBLE)) typedef lowp_dmat2x2 dmat2x2; typedef lowp_dmat2x3 dmat2x3; @@ -700,68 +699,68 @@ namespace detail typedef mediump_dmat4x3 dmat4x3; typedef mediump_dmat4x4 dmat4x4; #else //defined(GLM_PRECISION_HIGHP_DOUBLE) - - //! 2 * 2 matrix of double-precision floating-point numbers. + + //! 2 * 2 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat2x2 dmat2; - - //! 3 * 3 matrix of double-precision floating-point numbers. + + //! 3 * 3 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat3x3 dmat3; - - //! 4 * 4 matrix of double-precision floating-point numbers. + + //! 4 * 4 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat4x4 dmat4; - - //! 2 * 2 matrix of double-precision floating-point numbers. + + //! 2 * 2 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat2x2 dmat2x2; - - //! 2 * 3 matrix of double-precision floating-point numbers. + + //! 2 * 3 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat2x3 dmat2x3; - - //! 2 * 4 matrix of double-precision floating-point numbers. + + //! 2 * 4 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat2x4 dmat2x4; - - //! 3 * 2 matrix of double-precision floating-point numbers. + + //! 3 * 2 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat3x2 dmat3x2; - - /// 3 * 3 matrix of double-precision floating-point numbers. + + /// 3 * 3 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat3x3 dmat3x3; - - /// 3 * 4 matrix of double-precision floating-point numbers. + + /// 3 * 4 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat3x4 dmat3x4; - - /// 4 * 2 matrix of double-precision floating-point numbers. + + /// 4 * 2 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat4x2 dmat4x2; - - /// 4 * 3 matrix of double-precision floating-point numbers. + + /// 4 * 3 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat4x3 dmat4x3; - - /// 4 * 4 matrix of double-precision floating-point numbers. + + /// 4 * 4 matrix of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> typedef highp_dmat4x4 dmat4x4; #endif//GLM_PRECISION - + /// @} }//namespace glm diff --git a/external/include/glm/detail/type_mat2x2.hpp b/external/include/glm/detail/type_mat2x2.hpp index e7fde26..47e28cb 100644 --- a/external/include/glm/detail/type_mat2x2.hpp +++ b/external/include/glm/detail/type_mat2x2.hpp @@ -11,171 +11,170 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat2x2 + template<typename T, qualifier Q> + struct mat<2, 2, T, Q> { - typedef tvec2<T, P> col_type; - typedef tvec2<T, P> row_type; - typedef tmat2x2<T, P> type; - typedef tmat2x2<T, P> transpose_type; + typedef vec<2, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 2, T, Q> type; + typedef mat<2, 2, T, Q> transpose_type; typedef T value_type; private: col_type value[2]; public: - // -- Constructors -- + // -- Accesses -- - GLM_FUNC_DECL tmat2x2() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat2x2(tmat2x2<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat2x2(tmat2x2<T, Q> const & m); + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x2(ctor); - GLM_FUNC_DECL explicit tmat2x2(T scalar); - GLM_FUNC_DECL tmat2x2( - T const & x1, T const & y1, - T const & x2, T const & y2); - GLM_FUNC_DECL tmat2x2( - col_type const & v1, - col_type const & v2); + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; - // -- Conversions -- + // -- Constructors -- - template <typename U, typename V, typename M, typename N> - GLM_FUNC_DECL tmat2x2( - U const & x1, V const & y1, - M const & x2, N const & y2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, P> const& m); - template <typename U, typename V> - GLM_FUNC_DECL tmat2x2( - tvec2<U, P> const & v1, - tvec2<V, P> const & v2); + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + T const& x1, T const& y1, + T const& x2, T const& y2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v1, + col_type const& v2); - // -- Matrix conversions -- + // -- Conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x2<U, Q> const & m); + template<typename U, typename V, typename M, typename N> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + U const& x1, V const& y1, + M const& x2, N const& y2); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x2(tmat4x3<T, P> const & x); + template<typename U, typename V> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<2, U, Q> const& v1, + vec<2, V, Q> const& v2); - // -- Accesses -- + // -- Matrix conversions -- - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 2;} + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, U, P> const& m); - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat2x2<T, P> & operator=(tmat2x2<T, P> const & v) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator=(tmat2x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator+=(tmat2x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator-=(tmat2x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator*=(tmat2x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator/=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x2<T, P> & operator/=(tmat2x2<U, P> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 2, T, Q> & operator=(mat<2, 2, T, Q> const& v) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 2, T, Q> & operator=(mat<2, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(mat<2, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(mat<2, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(mat<2, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(mat<2, 2, U, Q> const& m); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat2x2<T, P> & operator++ (); - GLM_FUNC_DECL tmat2x2<T, P> & operator-- (); - GLM_FUNC_DECL tmat2x2<T, P> operator++(int); - GLM_FUNC_DECL tmat2x2<T, P> operator--(int); + GLM_FUNC_DECL mat<2, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 2, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator+(T scalar, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator-(T scalar, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator*(T scalar, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator*(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator*(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator*(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator*(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator/(T scalar, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator/(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator/(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2); } //namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat2x2.inl b/external/include/glm/detail/type_mat2x2.inl index 02c5ee8..72971d8 100644 --- a/external/include/glm/detail/type_mat2x2.inl +++ b/external/include/glm/detail/type_mat2x2.inl @@ -1,17 +1,17 @@ /// @ref core /// @file glm/detail/type_mat2x2.inl -#include "func_matrix.hpp" +#include "../matrix.hpp" namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0); this->value[1] = col_type(0, 1); # endif @@ -19,46 +19,42 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x2<T, P>::tmat2x2(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0); this->value[1] = col_type(0, scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat ( - T const & x0, T const & y0, - T const & x1, T const & y1 + T const& x0, T const& y0, + T const& x1, T const& y1 ) { this->value[0] = col_type(x0, y0); this->value[1] = col_type(x1, y1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(col_type const & v0, col_type const & v1) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1) { this->value[0] = v0; this->value[1] = v1; @@ -66,21 +62,21 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template <typename X1, typename Y1, typename X2, typename Y2> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2 + template<typename T, qualifier Q> + template<typename X1, typename Y1, typename X2, typename Y2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat ( - X1 const & x1, Y1 const & y1, - X2 const & x2, Y2 const & y2 + X1 const& x1, Y1 const& y1, + X2 const& x2, Y2 const& y2 ) { this->value[0] = col_type(static_cast<T>(x1), value_type(y1)); this->value[1] = col_type(static_cast<T>(x2), value_type(y2)); } - - template <typename T, precision P> - template <typename V1, typename V2> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tvec2<V1, P> const & v1, tvec2<V2, P> const & v2) + + template<typename T, qualifier Q> + template<typename V1, typename V2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2) { this->value[0] = col_type(v1); this->value[1] = col_type(v2); @@ -88,65 +84,65 @@ namespace glm // -- mat2x2 matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -154,15 +150,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type & tmat2x2<T, P>::operator[](typename tmat2x2<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type const & tmat2x2<T, P>::operator[](typename tmat2x2<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -171,8 +167,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -180,237 +176,237 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(tmat2x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar) { this->value[0] += scalar; this->value[1] += scalar; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(tmat2x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar) { this->value[0] -= scalar; this->value[1] -= scalar; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(tmat2x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar) { this->value[0] *= scalar; this->value[1] *= scalar; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(tmat2x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m) { return (*this = *this * m); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar) { this->value[0] /= scalar; this->value[1] /= scalar; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(tmat2x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m) { return *this *= inverse(m); } // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--() { --this->value[0]; --this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int) { - tmat2x2<T, P> Result(*this); + mat<2, 2, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int) { - tmat2x2<T, P> Result(*this); + mat<2, 2, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m) { - return tmat2x2<T, P>( - -m[0], + return mat<2, 2, T, Q>( + -m[0], -m[1]); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] + scalar, m[1] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(T scalar, tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] + scalar, m[1] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m1[0] + m2[0], m1[1] + m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] - scalar, m[1] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(T scalar, tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( scalar - m[0], scalar - m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m1[0] - m2[0], m1[1] - m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(T scalar, tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator* ( - tmat2x2<T, P> const & m, - typename tmat2x2<T, P>::row_type const & v + mat<2, 2, T, Q> const& m, + typename mat<2, 2, T, Q>::row_type const& v ) { - return tvec2<T, P>( + return vec<2, T, Q>( m[0][0] * v.x + m[1][0] * v.y, m[0][1] * v.x + m[1][1] * v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator* ( - typename tmat2x2<T, P>::col_type const & v, - tmat2x2<T, P> const & m + typename mat<2, 2, T, Q>::col_type const& v, + mat<2, 2, T, Q> const& m ) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x * m[0][0] + v.y * m[0][1], v.x * m[1][0] + v.y * m[1][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], @@ -419,10 +415,10 @@ namespace glm m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat2x2<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], @@ -433,51 +429,51 @@ namespace glm m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( m[0] / scalar, m[1] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(T scalar, tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m) { - return tmat2x2<T, P>( + return mat<2, 2, T, Q>( scalar / m[0], scalar / m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator/(tmat2x2<T, P> const & m, typename tmat2x2<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v) { return inverse(m) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator/(typename tmat2x2<T, P>::col_type const & v, tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m) { return v * inverse(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) - { - tmat2x2<T, P> m1_copy(m1); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) + { + mat<2, 2, T, Q> m1_copy(m1); return m1_copy /= m2; } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat2x2<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]); } diff --git a/external/include/glm/detail/type_mat2x3.hpp b/external/include/glm/detail/type_mat2x3.hpp index db55886..0f4b43a 100644 --- a/external/include/glm/detail/type_mat2x3.hpp +++ b/external/include/glm/detail/type_mat2x3.hpp @@ -12,152 +12,151 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat2x3 + template<typename T, qualifier Q> + struct mat<2, 3, T, Q> { - typedef tvec3<T, P> col_type; - typedef tvec2<T, P> row_type; - typedef tmat2x3<T, P> type; - typedef tmat3x2<T, P> transpose_type; + typedef vec<3, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 3, T, Q> type; + typedef mat<3, 2, T, Q> transpose_type; typedef T value_type; private: col_type value[2]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat2x3() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat2x3(tmat2x3<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat2x3(tmat2x3<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x3(ctor); - GLM_FUNC_DECL explicit tmat2x3(T scalar); - GLM_FUNC_DECL tmat2x3( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T z0, T x1, T y1, T z1); - GLM_FUNC_DECL tmat2x3( - col_type const & v0, - col_type const & v1); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1); // -- Conversions -- - template <typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2> - GLM_FUNC_DECL tmat2x3( + template<typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, Z1 z1, X2 x2, Y2 y2, Z2 z2); - template <typename U, typename V> - GLM_FUNC_DECL tmat2x3( - tvec3<U, P> const & v1, - tvec3<V, P> const & v2); + template<typename U, typename V> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<3, U, Q> const& v1, + vec<3, V, Q> const& v2); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x3<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x3(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 2;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat2x3<T, P> & operator=(tmat2x3<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator=(tmat2x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator+=(tmat2x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator-=(tmat2x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x3<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 3, T, Q> & operator=(mat<2, 3, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 3, T, Q> & operator=(mat<2, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(mat<2, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(mat<2, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 3, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat2x3<T, P> & operator++ (); - GLM_FUNC_DECL tmat2x3<T, P> & operator-- (); - GLM_FUNC_DECL tmat2x3<T, P> operator++(int); - GLM_FUNC_DECL tmat2x3<T, P> operator--(int); + GLM_FUNC_DECL mat<2, 3, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 3, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 3, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator*(T scalar, tmat2x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x3<T, P>::col_type operator*(tmat2x3<T, P> const & m, typename tmat2x3<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 3, T, Q>::col_type operator*(mat<2, 3, T, Q> const& m, typename mat<2, 3, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x3<T, P>::row_type operator*(typename tmat2x3<T, P>::col_type const & v, tmat2x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 3, T, Q>::row_type operator*(typename mat<2, 3, T, Q>::col_type const& v, mat<2, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator/(tmat2x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator/(T scalar, tmat2x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat2x3.inl b/external/include/glm/detail/type_mat2x3.inl index b0f8337..de9cbf0 100644 --- a/external/include/glm/detail/type_mat2x3.inl +++ b/external/include/glm/detail/type_mat2x3.inl @@ -5,11 +5,11 @@ namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0); this->value[1] = col_type(0, 1, 0); # endif @@ -17,35 +17,31 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<2, 3, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x3<T, P>::tmat2x3(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0, 0); this->value[1] = col_type(0, scalar, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat ( T x0, T y0, T z0, T x1, T y1, T z1 @@ -55,8 +51,8 @@ namespace glm this->value[1] = col_type(x1, y1, z1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(col_type const & v0, col_type const & v1) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(col_type const& v0, col_type const& v1) { this->value[0] = v0; this->value[1] = v1; @@ -64,11 +60,11 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat ( X1 x1, Y1 y1, Z1 z1, X2 x2, Y2 y2, Z2 z2 @@ -77,10 +73,10 @@ namespace glm this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1)); this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2)); } - - template <typename T, precision P> - template <typename V1, typename V2> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tvec3<V1, P> const & v1, tvec3<V2, P> const & v2) + + template<typename T, qualifier Q> + template<typename V1, typename V2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2) { this->value[0] = col_type(v1); this->value[1] = col_type(v2); @@ -88,65 +84,65 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<2, 3, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -154,15 +150,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type & tmat2x3<T, P>::operator[](typename tmat2x3<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type & mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type const & tmat2x3<T, P>::operator[](typename tmat2x3<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type const& mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -171,8 +167,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -180,63 +176,63 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(tmat2x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator+=(tmat2x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator+=(mat<2, 3, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(tmat2x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(mat<2, 3, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -245,131 +241,131 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> & tmat2x3<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator--() { --this->value[0]; --this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator++(int) { - tmat2x3<T, P> Result(*this); + mat<2, 3, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator--(int) { - tmat2x3<T, P> Result(*this); + mat<2, 3, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( -m[0], -m[1]); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m[0] + scalar, m[1] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m1[0] + m2[0], m1[1] + m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m[0] - scalar, m[1] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m1[0] - m2[0], m1[1] - m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(T scalar, tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type operator* ( - tmat2x3<T, P> const & m, - typename tmat2x3<T, P>::row_type const & v) + mat<2, 3, T, Q> const& m, + typename mat<2, 3, T, Q>::row_type const& v) { - return typename tmat2x3<T, P>::col_type( + return typename mat<2, 3, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y, m[0][1] * v.x + m[1][1] * v.y, m[0][2] * v.x + m[1][2] * v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x3<T, P>::row_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::row_type operator* ( - typename tmat2x3<T, P>::col_type const & v, - tmat2x3<T, P> const & m) + typename mat<2, 3, T, Q>::col_type const& v, + mat<2, 3, T, Q> const& m) { - return typename tmat2x3<T, P>::row_type( + return typename mat<2, 3, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], @@ -378,8 +374,8 @@ namespace glm m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { T SrcA00 = m1[0][0]; T SrcA01 = m1[0][1]; @@ -395,7 +391,7 @@ namespace glm T SrcB20 = m2[2][0]; T SrcB21 = m2[2][1]; - tmat3x3<T, P> Result(uninitialize); + mat<3, 3, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; @@ -408,10 +404,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat2x3<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], @@ -426,32 +422,32 @@ namespace glm m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(tmat2x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m[0] / scalar, m[1] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(T scalar, tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( scalar / m[0], scalar / m[1]); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat2x3<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]); } diff --git a/external/include/glm/detail/type_mat2x4.hpp b/external/include/glm/detail/type_mat2x4.hpp index c9d195f..366f783 100644 --- a/external/include/glm/detail/type_mat2x4.hpp +++ b/external/include/glm/detail/type_mat2x4.hpp @@ -12,154 +12,153 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat2x4 + template<typename T, qualifier Q> + struct mat<2, 4, T, Q> { - typedef tvec4<T, P> col_type; - typedef tvec2<T, P> row_type; - typedef tmat2x4<T, P> type; - typedef tmat4x2<T, P> transpose_type; + typedef vec<4, T, Q> col_type; + typedef vec<2, T, Q> row_type; + typedef mat<2, 4, T, Q> type; + typedef mat<4, 2, T, Q> transpose_type; typedef T value_type; private: col_type value[2]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat2x4() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat2x4(tmat2x4<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat2x4(tmat2x4<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat2x4(ctor); - GLM_FUNC_DECL explicit tmat2x4(T scalar); - GLM_FUNC_DECL tmat2x4( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T z0, T w0, T x1, T y1, T z1, T w1); - GLM_FUNC_DECL tmat2x4( - col_type const & v0, - col_type const & v1); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1); // -- Conversions -- - template < + template< typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2> - GLM_FUNC_DECL tmat2x4( + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, Z1 z1, W1 w1, X2 x2, Y2 y2, Z2 z2, W2 w2); - template <typename U, typename V> - GLM_FUNC_DECL tmat2x4( - tvec4<U, P> const & v1, - tvec4<V, P> const & v2); + template<typename U, typename V> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<4, U, Q> const& v1, + vec<4, V, Q> const& v2); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x4<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat2x4(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 2;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat2x4<T, P> & operator=(tmat2x4<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator=(tmat2x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator+=(tmat2x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator-=(tmat2x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat2x4<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 4, T, Q> & operator=(mat<2, 4, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<2, 4, T, Q> & operator=(mat<2, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(mat<2, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(mat<2, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<2, 4, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat2x4<T, P> & operator++ (); - GLM_FUNC_DECL tmat2x4<T, P> & operator-- (); - GLM_FUNC_DECL tmat2x4<T, P> operator++(int); - GLM_FUNC_DECL tmat2x4<T, P> operator--(int); + GLM_FUNC_DECL mat<2, 4, T, Q> & operator++ (); + GLM_FUNC_DECL mat<2, 4, T, Q> & operator-- (); + GLM_FUNC_DECL mat<2, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<2, 4, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator*(T scalar, tmat2x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x4<T, P>::col_type operator*(tmat2x4<T, P> const & m, typename tmat2x4<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat2x4<T, P>::row_type operator*(typename tmat2x4<T, P>::col_type const & v, tmat2x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat2x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator/(tmat2x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator/(T scalar, tmat2x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat2x4.inl b/external/include/glm/detail/type_mat2x4.inl index 74af34c..0f3f631 100644 --- a/external/include/glm/detail/type_mat2x4.inl +++ b/external/include/glm/detail/type_mat2x4.inl @@ -5,11 +5,11 @@ namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0, 0); this->value[1] = col_type(0, 1, 0, 0); # endif @@ -17,36 +17,32 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<2, 4, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat2x4<T, P>::tmat2x4(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(T scalar) { value_type const Zero(0); this->value[0] = col_type(scalar, Zero, Zero, Zero); this->value[1] = col_type(Zero, scalar, Zero, Zero); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat ( T x0, T y0, T z0, T w0, T x1, T y1, T z1, T w1 @@ -56,8 +52,8 @@ namespace glm this->value[1] = col_type(x1, y1, z1, w1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(col_type const & v0, col_type const & v1) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(col_type const& v0, col_type const& v1) { this->value[0] = v0; this->value[1] = v1; @@ -65,11 +61,11 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat ( X1 x1, Y1 y1, Z1 z1, W1 w1, X2 x2, Y2 y2, Z2 z2, W2 w2 @@ -78,10 +74,10 @@ namespace glm this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1)); this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2)); } - - template <typename T, precision P> - template <typename V1, typename V2> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tvec4<V1, P> const & v1, tvec4<V2, P> const & v2) + + template<typename T, qualifier Q> + template<typename V1, typename V2> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2) { this->value[0] = col_type(v1); this->value[1] = col_type(v2); @@ -89,65 +85,65 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<2, 4, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<2, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -155,15 +151,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type & tmat2x4<T, P>::operator[](typename tmat2x4<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type & mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type const & tmat2x4<T, P>::operator[](typename tmat2x4<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type const& mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -172,8 +168,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -181,63 +177,63 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(tmat2x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(tmat2x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(mat<2, 4, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(tmat2x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(mat<2, 4, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat2x4<T, P> & tmat2x4<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> & mat<2, 4, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -246,124 +242,124 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator--() { --this->value[0]; --this->value[1]; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator++(int) { - tmat2x4<T, P> Result(*this); + mat<2, 4, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator--(int) { - tmat2x4<T, P> Result(*this); + mat<2, 4, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m) { - return tmat2x4<T, P>( - -m[0], + return mat<2, 4, T, Q>( + -m[0], -m[1]); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m[0] + scalar, m[1] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m1[0] + m2[0], m1[1] + m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m[0] - scalar, m[1] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m1[0] - m2[0], m1[1] - m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(T scalar, tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m[0] * scalar, m[1] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type operator*(tmat2x4<T, P> const & m, typename tmat2x4<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v) { - return typename tmat2x4<T, P>::col_type( + return typename mat<2, 4, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y, m[0][1] * v.x + m[1][1] * v.y, m[0][2] * v.x + m[1][2] * v.y, m[0][3] * v.x + m[1][3] * v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat2x4<T, P>::row_type operator*(typename tmat2x4<T, P>::col_type const & v, tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m) { - return typename tmat2x4<T, P>::row_type( + return typename mat<2, 4, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { T SrcA00 = m1[0][0]; T SrcA01 = m1[0][1]; @@ -383,7 +379,7 @@ namespace glm T SrcB30 = m2[3][0]; T SrcB31 = m2[3][1]; - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; @@ -403,10 +399,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat2x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], @@ -417,10 +413,10 @@ namespace glm m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat2x4<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], @@ -435,32 +431,32 @@ namespace glm m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(tmat2x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m[0] / scalar, m[1] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(T scalar, tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( scalar / m[0], scalar / m[1]); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat2x4<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]); } diff --git a/external/include/glm/detail/type_mat3x2.hpp b/external/include/glm/detail/type_mat3x2.hpp index 8549745..cb7f0bb 100644 --- a/external/include/glm/detail/type_mat3x2.hpp +++ b/external/include/glm/detail/type_mat3x2.hpp @@ -12,36 +12,43 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat3x2 + template<typename T, qualifier Q> + struct mat<3, 2, T, Q> { - typedef tvec2<T, P> col_type; - typedef tvec3<T, P> row_type; - typedef tmat3x2<T, P> type; - typedef tmat2x3<T, P> transpose_type; + typedef vec<2, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 2, T, Q> type; + typedef mat<2, 3, T, Q> transpose_type; typedef T value_type; private: col_type value[3]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat3x2() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat3x2(tmat3x2<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat3x2(tmat3x2<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x2(ctor); - GLM_FUNC_DECL explicit tmat3x2(T scalar); - GLM_FUNC_DECL tmat3x2( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T x1, T y1, T x2, T y2); - GLM_FUNC_DECL tmat3x2( - col_type const & v0, - col_type const & v1, - col_type const & v2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); // -- Conversions -- @@ -49,122 +56,114 @@ namespace glm typename X1, typename Y1, typename X2, typename Y2, typename X3, typename Y3> - GLM_FUNC_DECL tmat3x2( + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, X2 x2, Y2 y2, X3 x3, Y3 y3); - template <typename V1, typename V2, typename V3> - GLM_FUNC_DECL tmat3x2( - tvec2<V1, P> const & v1, - tvec2<V2, P> const & v2, - tvec2<V3, P> const & v3); + template<typename V1, typename V2, typename V3> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x2<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x2(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 3;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat3x2<T, P> & operator=(tmat3x2<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator=(tmat3x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator+=(tmat3x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator-=(tmat3x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x2<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 2, T, Q> & operator=(mat<3, 2, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 2, T, Q> & operator=(mat<3, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(mat<3, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(mat<3, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 2, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat3x2<T, P> & operator++ (); - GLM_FUNC_DECL tmat3x2<T, P> & operator-- (); - GLM_FUNC_DECL tmat3x2<T, P> operator++(int); - GLM_FUNC_DECL tmat3x2<T, P> operator--(int); + GLM_FUNC_DECL mat<3, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<3, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<3, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 2, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator*(T scalar, tmat3x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x2<T, P>::col_type operator*(tmat3x2<T, P> const & m, typename tmat3x2<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x2<T, P>::row_type operator*(typename tmat3x2<T, P>::col_type const & v, tmat3x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator/(tmat3x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator/(T scalar, tmat3x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2); }//namespace glm diff --git a/external/include/glm/detail/type_mat3x2.inl b/external/include/glm/detail/type_mat3x2.inl index 2a1b8bd..9b789d0 100644 --- a/external/include/glm/detail/type_mat3x2.inl +++ b/external/include/glm/detail/type_mat3x2.inl @@ -5,11 +5,11 @@ namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0); this->value[1] = col_type(0, 1); this->value[2] = col_type(0, 0); @@ -18,8 +18,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -27,29 +27,25 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<3, 2, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; this->value[2] = m.value[2]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x2<T, P>::tmat3x2(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0); this->value[1] = col_type(0, scalar); this->value[2] = col_type(0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat ( T x0, T y0, T x1, T y1, @@ -61,12 +57,12 @@ namespace glm this->value[2] = col_type(x2, y2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2 + col_type const& v0, + col_type const& v1, + col_type const& v2 ) { this->value[0] = v0; @@ -76,12 +72,12 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename X2, typename Y2, typename X3, typename Y3> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat ( X1 x1, Y1 y1, X2 x2, Y2 y2, @@ -93,13 +89,13 @@ namespace glm this->value[2] = col_type(static_cast<T>(x3), value_type(y3)); } - template <typename T, precision P> - template <typename V1, typename V2, typename V3> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat ( - tvec2<V1, P> const & v1, - tvec2<V2, P> const & v2, - tvec2<V3, P> const & v3 + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3 ) { this->value[0] = col_type(v1); @@ -109,73 +105,73 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<3, 2, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; this->value[2] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(T(0)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(T(0)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; this->value[2] = m[2]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -184,15 +180,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type & tmat3x2<T, P>::operator[](typename tmat3x2<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type & mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type const & tmat3x2<T, P>::operator[](typename tmat3x2<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type const& mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -201,8 +197,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -211,9 +207,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(tmat3x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -221,9 +217,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -231,9 +227,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(tmat3x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(mat<3, 2, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -241,9 +237,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -251,9 +247,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(tmat3x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(mat<3, 2, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -261,9 +257,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -271,9 +267,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x2<T, P> & tmat3x2<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> & mat<3, 2, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -283,8 +279,8 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -292,8 +288,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -301,34 +297,34 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator++(int) { - tmat3x2<T, P> Result(*this); + mat<3, 2, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator--(int) { - tmat3x2<T, P> Result(*this); + mat<3, 2, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( -m[0], -m[1], -m[2]); @@ -336,79 +332,79 @@ namespace glm // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m[0] + scalar, m[1] + scalar, m[2] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m[0] - scalar, m[1] - scalar, m[2] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(T scalar, tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type operator*(tmat3x2<T, P> const & m, typename tmat3x2<T, P>::row_type const & v) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v) { - return typename tmat3x2<T, P>::col_type( + return typename mat<3, 2, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::row_type operator*(typename tmat3x2<T, P>::col_type const & v, tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m) { - return typename tmat3x2<T, P>::row_type( + return typename mat<3, 2, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1], v.x * m[1][0] + v.y * m[1][1], v.x * m[2][0] + v.y * m[2][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { const T SrcA00 = m1[0][0]; const T SrcA01 = m1[0][1]; @@ -424,7 +420,7 @@ namespace glm const T SrcB11 = m2[1][1]; const T SrcB12 = m2[1][2]; - tmat2x2<T, P> Result(uninitialize); + mat<2, 2, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; @@ -432,10 +428,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], @@ -444,10 +440,10 @@ namespace glm m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat3x2<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], @@ -458,19 +454,19 @@ namespace glm m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(tmat3x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m[0] / scalar, m[1] / scalar, m[2] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(T scalar, tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( scalar / m[0], scalar / m[1], scalar / m[2]); @@ -478,14 +474,14 @@ namespace glm // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat3x2<T, P> const & m1, tmat3x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); } diff --git a/external/include/glm/detail/type_mat3x3.hpp b/external/include/glm/detail/type_mat3x3.hpp index d5ebe62..f6e2d15 100644 --- a/external/include/glm/detail/type_mat3x3.hpp +++ b/external/include/glm/detail/type_mat3x3.hpp @@ -11,36 +11,43 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat3x3 + template<typename T, qualifier Q> + struct mat<3, 3, T, Q> { - typedef tvec3<T, P> col_type; - typedef tvec3<T, P> row_type; - typedef tmat3x3<T, P> type; - typedef tmat3x3<T, P> transpose_type; + typedef vec<3, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 3, T, Q> type; + typedef mat<3, 3, T, Q> transpose_type; typedef T value_type; private: col_type value[3]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat3x3() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat3x3(tmat3x3<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat3x3(tmat3x3<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x3(ctor); - GLM_FUNC_DECL explicit tmat3x3(T scalar); - GLM_FUNC_DECL tmat3x3( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T z0, T x1, T y1, T z1, T x2, T y2, T z2); - GLM_FUNC_DECL tmat3x3( - col_type const & v0, - col_type const & v1, - col_type const & v2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); // -- Conversions -- @@ -48,141 +55,133 @@ namespace glm typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2, typename X3, typename Y3, typename Z3> - GLM_FUNC_DECL tmat3x3( + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, Z1 z1, X2 x2, Y2 y2, Z2 z2, X3 x3, Y3 y3, Z3 z3); - template <typename V1, typename V2, typename V3> - GLM_FUNC_DECL tmat3x3( - tvec3<V1, P> const & v1, - tvec3<V2, P> const & v2, - tvec3<V3, P> const & v3); + template<typename V1, typename V2, typename V3> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x3<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x3(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 3;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat3x3<T, P> & operator=(tmat3x3<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator=(tmat3x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator+=(tmat3x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator-=(tmat3x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator*=(tmat3x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator/=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x3<T, P> & operator/=(tmat3x3<U, P> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 3, T, Q> & operator=(mat<3, 3, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 3, T, Q> & operator=(mat<3, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(mat<3, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(mat<3, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(mat<3, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(mat<3, 3, U, Q> const& m); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat3x3<T, P> & operator++(); - GLM_FUNC_DECL tmat3x3<T, P> & operator--(); - GLM_FUNC_DECL tmat3x3<T, P> operator++(int); - GLM_FUNC_DECL tmat3x3<T, P> operator--(int); + GLM_FUNC_DECL mat<3, 3, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 3, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 3, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator+(T scalar, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator-(T scalar, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator*(T scalar, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator*(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator*(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator/(T scalar, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator/(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator/(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat3x3.inl b/external/include/glm/detail/type_mat3x3.inl index 324cca3..81338a3 100644 --- a/external/include/glm/detail/type_mat3x3.inl +++ b/external/include/glm/detail/type_mat3x3.inl @@ -1,17 +1,17 @@ /// @ref core /// @file glm/detail/type_mat3x3.inl -#include "func_matrix.hpp" +#include "../matrix.hpp" namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0); this->value[1] = col_type(0, 1, 0); this->value[2] = col_type(0, 0, 1); @@ -20,8 +20,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -29,29 +29,25 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<3, 3, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; this->value[2] = m.value[2]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x3<T, P>::tmat3x3(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0, 0); this->value[1] = col_type(0, scalar, 0); this->value[2] = col_type(0, 0, scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat ( T x0, T y0, T z0, T x1, T y1, T z1, @@ -63,12 +59,12 @@ namespace glm this->value[2] = col_type(x2, y2, z2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2 + col_type const& v0, + col_type const& v1, + col_type const& v2 ) { this->value[0] = v0; @@ -78,12 +74,12 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2, typename X3, typename Y3, typename Z3> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat ( X1 x1, Y1 y1, Z1 z1, X2 x2, Y2 y2, Z2 z2, @@ -94,14 +90,14 @@ namespace glm this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2)); this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3)); } - - template <typename T, precision P> - template <typename V1, typename V2, typename V3> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3 + + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat ( - tvec3<V1, P> const & v1, - tvec3<V2, P> const & v2, - tvec3<V3, P> const & v3 + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3 ) { this->value[0] = col_type(v1); @@ -111,73 +107,73 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<3, 3, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); this->value[2] = col_type(0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; this->value[2] = col_type(0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); this->value[2] = col_type(m[2], 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); this->value[2] = col_type(m[2], 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -186,15 +182,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type & tmat3x3<T, P>::operator[](typename tmat3x3<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type & mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type const & tmat3x3<T, P>::operator[](typename tmat3x3<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type const& mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -203,8 +199,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator=(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -213,9 +209,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator=(tmat3x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -223,9 +219,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -233,9 +229,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator+=(tmat3x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(mat<3, 3, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -243,9 +239,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -253,9 +249,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator-=(tmat3x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(mat<3, 3, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -263,9 +259,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -273,16 +269,16 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator*=(tmat3x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(mat<3, 3, U, Q> const& m) { return (*this = *this * m); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -290,17 +286,17 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator/=(tmat3x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(mat<3, 3, U, Q> const& m) { return *this *= inverse(m); } // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -308,8 +304,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> & tmat3x3<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -317,133 +313,133 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator++(int) { - tmat3x3<T, P> Result(*this); + mat<3, 3, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator--(int) { - tmat3x3<T, P> Result(*this); + mat<3, 3, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m) { - return tmat3x3<T, P>( - -m[0], + return mat<3, 3, T, Q>( + -m[0], -m[1], -m[2]); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] + scalar, m[1] + scalar, m[2] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(T scalar, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] + scalar, m[1] + scalar, m[2] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] - scalar, m[1] - scalar, m[2] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(T scalar, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( scalar - m[0], scalar - m[1], scalar - m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(T scalar, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator*(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) { - return typename tmat3x3<T, P>::col_type( + return typename mat<3, 3, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator*(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) { - return typename tmat3x3<T, P>::row_type( + return typename mat<3, 3, T, Q>::row_type( m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { T const SrcA00 = m1[0][0]; T const SrcA01 = m1[0][1]; @@ -465,7 +461,7 @@ namespace glm T const SrcB21 = m2[2][1]; T const SrcB22 = m2[2][2]; - tmat3x3<T, P> Result(uninitialize); + mat<3, 3, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; @@ -478,10 +474,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], @@ -490,10 +486,10 @@ namespace glm m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat3x3<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], @@ -508,53 +504,53 @@ namespace glm m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( m[0] / scalar, m[1] / scalar, m[2] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(T scalar, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m) { - return tmat3x3<T, P>( + return mat<3, 3, T, Q>( scalar / m[0], scalar / m[1], scalar / m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator/(tmat3x3<T, P> const & m, typename tmat3x3<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v) { return inverse(m) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator/(typename tmat3x3<T, P>::col_type const & v, tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m) { return v * inverse(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { - tmat3x3<T, P> m1_copy(m1); + mat<3, 3, T, Q> m1_copy(m1); return m1_copy /= m2; } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat3x3<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); } diff --git a/external/include/glm/detail/type_mat3x4.hpp b/external/include/glm/detail/type_mat3x4.hpp index c5bb9a9..7e02d6e 100644 --- a/external/include/glm/detail/type_mat3x4.hpp +++ b/external/include/glm/detail/type_mat3x4.hpp @@ -12,36 +12,43 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat3x4 + template<typename T, qualifier Q> + struct mat<3, 4, T, Q> { - typedef tvec4<T, P> col_type; - typedef tvec3<T, P> row_type; - typedef tmat3x4<T, P> type; - typedef tmat4x3<T, P> transpose_type; + typedef vec<4, T, Q> col_type; + typedef vec<3, T, Q> row_type; + typedef mat<3, 4, T, Q> type; + typedef mat<4, 3, T, Q> transpose_type; typedef T value_type; private: col_type value[3]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat3x4() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat3x4(tmat3x4<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat3x4(tmat3x4<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat3x4(ctor); - GLM_FUNC_DECL explicit tmat3x4(T scalar); - GLM_FUNC_DECL tmat3x4( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T z0, T w0, T x1, T y1, T z1, T w1, T x2, T y2, T z2, T w2); - GLM_FUNC_DECL tmat3x4( - col_type const & v0, - col_type const & v1, - col_type const & v2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2); // -- Conversions -- @@ -49,122 +56,114 @@ namespace glm typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2, typename X3, typename Y3, typename Z3, typename W3> - GLM_FUNC_DECL tmat3x4( + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, Z1 z1, W1 w1, X2 x2, Y2 y2, Z2 z2, W2 w2, X3 x3, Y3 y3, Z3 z3, W3 w3); - template <typename V1, typename V2, typename V3> - GLM_FUNC_DECL tmat3x4( - tvec4<V1, P> const & v1, - tvec4<V2, P> const & v2, - tvec4<V3, P> const & v3); + template<typename V1, typename V2, typename V3> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x4<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat3x4(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 3;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat3x4<T, P> & operator=(tmat3x4<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator=(tmat3x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator+=(tmat3x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator-=(tmat3x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat3x4<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 4, T, Q> & operator=(mat<3, 4, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<3, 4, T, Q> & operator=(mat<3, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(mat<3, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(mat<3, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<3, 4, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat3x4<T, P> & operator++(); - GLM_FUNC_DECL tmat3x4<T, P> & operator--(); - GLM_FUNC_DECL tmat3x4<T, P> operator++(int); - GLM_FUNC_DECL tmat3x4<T, P> operator--(int); + GLM_FUNC_DECL mat<3, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<3, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<3, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<3, 4, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator*(T scalar, tmat3x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x4<T, P>::col_type operator*(tmat3x4<T, P> const & m, typename tmat3x4<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 4, T, Q>::col_type operator*(mat<3, 4, T, Q> const& m, typename mat<3, 4, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat3x4<T, P>::row_type operator*(typename tmat3x4<T, P>::col_type const & v, tmat3x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<3, 4, T, Q>::row_type operator*(typename mat<3, 4, T, Q>::col_type const& v, mat<3, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat2x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat3x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator/(tmat3x4<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator/(T scalar, tmat3x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat3x4.inl b/external/include/glm/detail/type_mat3x4.inl index 3596f26..c8562d1 100644 --- a/external/include/glm/detail/type_mat3x4.inl +++ b/external/include/glm/detail/type_mat3x4.inl @@ -5,11 +5,11 @@ namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0, 0); this->value[1] = col_type(0, 1, 0, 0); this->value[2] = col_type(0, 0, 1, 0); @@ -18,8 +18,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -27,29 +27,25 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<3, 4, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; this->value[2] = m.value[2]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat3x4<T, P>::tmat3x4(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0, 0, 0); this->value[1] = col_type(0, scalar, 0, 0); this->value[2] = col_type(0, 0, scalar, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat ( T x0, T y0, T z0, T w0, T x1, T y1, T z1, T w1, @@ -61,12 +57,12 @@ namespace glm this->value[2] = col_type(x2, y2, z2, w2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2 + col_type const& v0, + col_type const& v1, + col_type const& v2 ) { this->value[0] = v0; @@ -76,12 +72,12 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2, typename X3, typename Y3, typename Z3, typename W3> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat ( X1 x1, Y1 y1, Z1 z1, W1 w1, X2 x2, Y2 y2, Z2 z2, W2 w2, @@ -92,90 +88,90 @@ namespace glm this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2)); this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3)); } - - template <typename T, precision P> - template <typename V1, typename V2, typename V3> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4 + + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat ( - tvec4<V1, P> const & v1, - tvec4<V2, P> const & v2, - tvec4<V3, P> const & v3 + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3 ) { this->value[0] = col_type(v1); this->value[1] = col_type(v2); this->value[2] = col_type(v3); } - + // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<3, 4, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); this->value[2] = col_type(0, 0, 1, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); this->value[2] = col_type(m[2], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(m[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); this->value[2] = col_type(0, 0, 1, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); this->value[2] = col_type(m[2], 1, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); this->value[2] = col_type(0, 0, 1, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); this->value[2] = col_type(m[2], 1, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<3, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -184,15 +180,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type & tmat3x4<T, P>::operator[](typename tmat3x4<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type & mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type const & tmat3x4<T, P>::operator[](typename tmat3x4<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type const& mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -201,8 +197,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -211,9 +207,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(tmat3x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -221,9 +217,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -231,9 +227,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(tmat3x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(mat<3, 4, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -241,9 +237,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -251,9 +247,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(tmat3x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(mat<3, 4, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -261,9 +257,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -271,9 +267,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat3x4<T, P> & tmat3x4<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> & mat<3, 4, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -283,8 +279,8 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -292,8 +288,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -301,34 +297,34 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator++(int) { - tmat3x4<T, P> Result(*this); + mat<3, 4, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator--(int) { - tmat3x4<T, P> Result(*this); + mat<3, 4, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( -m[0], -m[1], -m[2]); @@ -336,89 +332,89 @@ namespace glm // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m[0] + scalar, m[1] + scalar, m[2] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m[0] - scalar, m[1] - scalar, m[2] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(T scalar, tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type operator* ( - tmat3x4<T, P> const & m, - typename tmat3x4<T, P>::row_type const & v + mat<3, 4, T, Q> const& m, + typename mat<3, 4, T, Q>::row_type const& v ) { - return typename tmat3x4<T, P>::col_type( + return typename mat<3, 4, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z, m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat3x4<T, P>::row_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::row_type operator* ( - typename tmat3x4<T, P>::col_type const & v, - tmat3x4<T, P> const & m + typename mat<3, 4, T, Q>::col_type const& v, + mat<3, 4, T, Q> const& m ) { - return typename tmat3x4<T, P>::row_type( + return typename mat<3, 4, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3], v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { const T SrcA00 = m1[0][0]; const T SrcA01 = m1[0][1]; @@ -446,7 +442,7 @@ namespace glm const T SrcB31 = m2[3][1]; const T SrcB32 = m2[3][2]; - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; @@ -466,10 +462,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat2x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], @@ -480,10 +476,10 @@ namespace glm m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const & m1, tmat3x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], @@ -498,19 +494,19 @@ namespace glm m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(tmat3x4<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m[0] / scalar, m[1] / scalar, m[2] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(T scalar, tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( scalar / m[0], scalar / m[1], scalar / m[2]); @@ -518,14 +514,14 @@ namespace glm // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat3x4<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); } diff --git a/external/include/glm/detail/type_mat4x2.hpp b/external/include/glm/detail/type_mat4x2.hpp index a899d94..9064dd3 100644 --- a/external/include/glm/detail/type_mat4x2.hpp +++ b/external/include/glm/detail/type_mat4x2.hpp @@ -12,164 +12,163 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat4x2 + template<typename T, qualifier Q> + struct mat<4, 2, T, Q> { - typedef tvec2<T, P> col_type; - typedef tvec4<T, P> row_type; - typedef tmat4x2<T, P> type; - typedef tmat2x4<T, P> transpose_type; + typedef vec<2, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 2, T, Q> type; + typedef mat<2, 4, T, Q> transpose_type; typedef T value_type; private: col_type value[4]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat4x2() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat4x2(tmat4x2<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat4x2(tmat4x2<T, Q> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, P> const& m); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat4x2(ctor); - GLM_FUNC_DECL explicit tmat4x2(T scalar); - GLM_FUNC_DECL tmat4x2( + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( T x0, T y0, T x1, T y1, T x2, T y2, T x3, T y3); - GLM_FUNC_DECL tmat4x2( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); // -- Conversions -- - template < + template< typename X1, typename Y1, typename X2, typename Y2, typename X3, typename Y3, typename X4, typename Y4> - GLM_FUNC_DECL tmat4x2( + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( X1 x1, Y1 y1, X2 x2, Y2 y2, X3 x3, Y3 y3, X4 x4, Y4 y4); - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_DECL tmat4x2( - tvec2<V1, P> const & v1, - tvec2<V2, P> const & v2, - tvec2<V3, P> const & v3, - tvec2<V4, P> const & v4); + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3, + vec<2, V4, Q> const& v4); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x2<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat4x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x2(tmat3x4<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 4;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat4x2<T, P> & operator=(tmat4x2<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator=(tmat4x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator+=(tmat4x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator-=(tmat4x2<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x2<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 2, T, Q> & operator=(mat<4, 2, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 2, T, Q> & operator=(mat<4, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(mat<4, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(mat<4, 2, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 2, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat4x2<T, P> & operator++ (); - GLM_FUNC_DECL tmat4x2<T, P> & operator-- (); - GLM_FUNC_DECL tmat4x2<T, P> operator++(int); - GLM_FUNC_DECL tmat4x2<T, P> operator--(int); + GLM_FUNC_DECL mat<4, 2, T, Q> & operator++ (); + GLM_FUNC_DECL mat<4, 2, T, Q> & operator-- (); + GLM_FUNC_DECL mat<4, 2, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 2, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator*(T scalar, tmat4x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x2<T, P>::col_type operator*(tmat4x2<T, P> const & m, typename tmat4x2<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x2<T, P>::row_type operator*(typename tmat4x2<T, P>::col_type const & v, tmat4x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator/(tmat4x2<T, P> const & m, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> operator/(T scalar, tmat4x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat4x2.inl b/external/include/glm/detail/type_mat4x2.inl index 6d83229..f0ac30f 100644 --- a/external/include/glm/detail/type_mat4x2.inl +++ b/external/include/glm/detail/type_mat4x2.inl @@ -3,20 +3,13 @@ namespace glm { -# ifdef GLM_STATIC_CONST_MEMBERS - template<typename T, precision P> - const tmat4x2<T, P> tmat4x2<T, P>::ZERO(static_cast<T>(0)); - - template<typename T, precision P> - const tmat4x2<T, P> tmat4x2<T, P>::IDENTITY(static_cast<T>(1)); -# endif // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0); this->value[1] = col_type(0, 1); this->value[2] = col_type(0, 0); @@ -26,8 +19,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -36,9 +29,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<4, 2, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -46,12 +39,8 @@ namespace glm this->value[3] = m.value[3]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat4x2<T, P>::tmat4x2(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(T scalar) { this->value[0] = col_type(scalar, 0); this->value[1] = col_type(0, scalar); @@ -59,8 +48,8 @@ namespace glm this->value[3] = col_type(0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat ( T x0, T y0, T x1, T y1, @@ -74,13 +63,13 @@ namespace glm this->value[3] = col_type(x3, y3); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3 + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3 ) { this->value[0] = v0; @@ -91,13 +80,13 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename X2, typename Y2, typename X3, typename Y3, typename X4, typename Y4> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat ( X1 x1, Y1 y1, X2 x2, Y2 y2, @@ -110,15 +99,15 @@ namespace glm this->value[2] = col_type(static_cast<T>(x3), value_type(y3)); this->value[3] = col_type(static_cast<T>(x4), value_type(y4)); } - - template <typename T, precision P> - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2 + + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat ( - tvec2<V1, P> const & v1, - tvec2<V2, P> const & v2, - tvec2<V3, P> const & v3, - tvec2<V4, P> const & v4 + vec<2, V1, Q> const& v1, + vec<2, V2, Q> const& v2, + vec<2, V3, Q> const& v3, + vec<2, V4, Q> const& v4 ) { this->value[0] = col_type(v1); @@ -129,9 +118,9 @@ namespace glm // -- Conversion -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<4, 2, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -139,8 +128,8 @@ namespace glm this->value[3] = col_type(m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -148,8 +137,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -157,8 +146,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -166,8 +155,8 @@ namespace glm this->value[3] = col_type(m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -175,8 +164,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -184,8 +173,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -193,8 +182,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -202,8 +191,8 @@ namespace glm this->value[3] = col_type(m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 2, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -213,15 +202,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type & tmat4x2<T, P>::operator[](typename tmat4x2<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type & mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type const & tmat4x2<T, P>::operator[](typename tmat4x2<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type const& mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -230,8 +219,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -241,9 +230,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(tmat4x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -252,9 +241,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -263,9 +252,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator+=(tmat4x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(mat<4, 2, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -274,9 +263,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -285,9 +274,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator-=(tmat4x2<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(mat<4, 2, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -296,9 +285,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -307,9 +296,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -320,8 +309,8 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -330,8 +319,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> & tmat4x2<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -340,34 +329,34 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator++(int) { - tmat4x2<T, P> Result(*this); + mat<4, 2, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator--(int) { - tmat4x2<T, P> Result(*this); + mat<4, 2, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( -m[0], -m[1], -m[2], @@ -376,86 +365,86 @@ namespace glm // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m[0] + scalar, m[1] + scalar, m[2] + scalar, m[3] + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2], m1[3] + m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m[0] - scalar, m[1] - scalar, m[2] - scalar, m[3] - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2], m1[3] - m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar, m[3] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(T scalar, tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m[0] * scalar, m[1] * scalar, m[2] * scalar, m[3] * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type operator*(tmat4x2<T, P> const & m, typename tmat4x2<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v) { - return typename tmat4x2<T, P>::col_type( + return typename mat<4, 2, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x2<T, P>::row_type operator*(typename tmat4x2<T, P>::col_type const & v, tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m) { - return typename tmat4x2<T, P>::row_type( + return typename mat<4, 2, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1], v.x * m[1][0] + v.y * m[1][1], v.x * m[2][0] + v.y * m[2][1], v.x * m[3][0] + v.y * m[3][1]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { T const SrcA00 = m1[0][0]; T const SrcA01 = m1[0][1]; @@ -475,7 +464,7 @@ namespace glm T const SrcB12 = m2[1][2]; T const SrcB13 = m2[1][3]; - tmat2x2<T, P> Result(uninitialize); + mat<2, 2, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; @@ -483,10 +472,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { - return tmat3x2<T, P>( + return mat<3, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], @@ -495,10 +484,10 @@ namespace glm m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], @@ -509,20 +498,20 @@ namespace glm m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(tmat4x2<T, P> const & m, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( m[0] / scalar, m[1] / scalar, m[2] / scalar, m[3] / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(T scalar, tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m) { - return tmat4x2<T, P>( + return mat<4, 2, T, Q>( scalar / m[0], scalar / m[1], scalar / m[2], @@ -531,14 +520,14 @@ namespace glm // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat4x2<T, P> const & m1, tmat4x2<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); } diff --git a/external/include/glm/detail/type_mat4x3.hpp b/external/include/glm/detail/type_mat4x3.hpp index c696735..a17add5 100644 --- a/external/include/glm/detail/type_mat4x3.hpp +++ b/external/include/glm/detail/type_mat4x3.hpp @@ -12,164 +12,163 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat4x3 + template<typename T, qualifier Q> + struct mat<4, 3, T, Q> { - typedef tvec3<T, P> col_type; - typedef tvec4<T, P> row_type; - typedef tmat4x3<T, P> type; - typedef tmat3x4<T, P> transpose_type; + typedef vec<3, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 3, T, Q> type; + typedef mat<3, 4, T, Q> transpose_type; typedef T value_type; private: col_type value[4]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; } + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat4x3() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat4x3(tmat4x3<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat4x3(tmat4x3<T, Q> const & m); - - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tmat4x3(ctor); - GLM_FUNC_DECL explicit tmat4x3(T const & x); - GLM_FUNC_DECL tmat4x3( - T const & x0, T const & y0, T const & z0, - T const & x1, T const & y1, T const & z1, - T const & x2, T const & y2, T const & z2, - T const & x3, T const & y3, T const & z3); - GLM_FUNC_DECL tmat4x3( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); // -- Conversions -- - template < + template< typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2, typename X3, typename Y3, typename Z3, typename X4, typename Y4, typename Z4> - GLM_FUNC_DECL tmat4x3( - X1 const & x1, Y1 const & y1, Z1 const & z1, - X2 const & x2, Y2 const & y2, Z2 const & z2, - X3 const & x3, Y3 const & y3, Z3 const & z3, - X4 const & x4, Y4 const & y4, Z4 const & z4); - - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_DECL tmat4x3( - tvec3<V1, P> const & v1, - tvec3<V2, P> const & v2, - tvec3<V3, P> const & v3, - tvec3<V4, P> const & v4); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + X1 const& x1, Y1 const& y1, Z1 const& z1, + X2 const& x2, Y2 const& y2, Z2 const& z2, + X3 const& x3, Y3 const& y3, Z3 const& z3, + X4 const& x4, Y4 const& y4, Z4 const& z4); + + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3, + vec<3, V4, Q> const& v4); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x3<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x3(tmat3x4<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 4;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat4x3<T, P> & operator=(tmat4x3<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator=(tmat4x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator+=(tmat4x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator-=(tmat4x3<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x3<T, P> & operator/=(U s); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 3, T, Q> & operator=(mat<4, 3, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 3, T, Q> & operator=(mat<4, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(mat<4, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(mat<4, 3, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 3, T, Q> & operator/=(U s); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat4x3<T, P> & operator++(); - GLM_FUNC_DECL tmat4x3<T, P> & operator--(); - GLM_FUNC_DECL tmat4x3<T, P> operator++(int); - GLM_FUNC_DECL tmat4x3<T, P> operator--(int); + GLM_FUNC_DECL mat<4, 3, T, Q>& operator++(); + GLM_FUNC_DECL mat<4, 3, T, Q>& operator--(); + GLM_FUNC_DECL mat<4, 3, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 3, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator*(T const & s, tmat4x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x3<T, P>::col_type operator*(tmat4x3<T, P> const & m, typename tmat4x3<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 3, T, Q>::col_type operator*(mat<4, 3, T, Q> const& m, typename mat<4, 3, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x3<T, P>::row_type operator*(typename tmat4x3<T, P>::col_type const & v, tmat4x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 3, T, Q>::row_type operator*(typename mat<4, 3, T, Q>::col_type const& v, mat<4, 3, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator/(tmat4x3<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> operator/(T const & s, tmat4x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat4x3.inl b/external/include/glm/detail/type_mat4x3.inl index cfb408b..df50b00 100644 --- a/external/include/glm/detail/type_mat4x3.inl +++ b/external/include/glm/detail/type_mat4x3.inl @@ -5,11 +5,11 @@ namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0); this->value[1] = col_type(0, 1, 0); this->value[2] = col_type(0, 0, 1); @@ -19,8 +19,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -29,9 +29,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<4, 3, T, P> const& m) { this->value[0] = m.value[0]; this->value[1] = m.value[1]; @@ -39,12 +39,8 @@ namespace glm this->value[3] = m.value[3]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tmat4x3<T, P>::tmat4x3(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(T const& s) { this->value[0] = col_type(s, 0, 0); this->value[1] = col_type(0, s, 0); @@ -52,13 +48,13 @@ namespace glm this->value[3] = col_type(0, 0, 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat ( - T const & x0, T const & y0, T const & z0, - T const & x1, T const & y1, T const & z1, - T const & x2, T const & y2, T const & z2, - T const & x3, T const & y3, T const & z3 + T const& x0, T const& y0, T const& z0, + T const& x1, T const& y1, T const& z1, + T const& x2, T const& y2, T const& z2, + T const& x3, T const& y3, T const& z3 ) { this->value[0] = col_type(x0, y0, z0); @@ -67,13 +63,13 @@ namespace glm this->value[3] = col_type(x3, y3, z3); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3 + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3 ) { this->value[0] = v0; @@ -84,18 +80,18 @@ namespace glm // -- Conversion constructors -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2, typename X3, typename Y3, typename Z3, typename X4, typename Y4, typename Z4> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat ( - X1 const & x1, Y1 const & y1, Z1 const & z1, - X2 const & x2, Y2 const & y2, Z2 const & z2, - X3 const & x3, Y3 const & y3, Z3 const & z3, - X4 const & x4, Y4 const & y4, Z4 const & z4 + X1 const& x1, Y1 const& y1, Z1 const& z1, + X2 const& x2, Y2 const& y2, Z2 const& z2, + X3 const& x3, Y3 const& y3, Z3 const& z3, + X4 const& x4, Y4 const& y4, Z4 const& z4 ) { this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1)); @@ -103,15 +99,15 @@ namespace glm this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3)); this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4)); } - - template <typename T, precision P> - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3 + + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat ( - tvec3<V1, P> const & v1, - tvec3<V2, P> const & v2, - tvec3<V3, P> const & v3, - tvec3<V4, P> const & v4 + vec<3, V1, Q> const& v1, + vec<3, V2, Q> const& v2, + vec<3, V3, Q> const& v3, + vec<3, V4, Q> const& v4 ) { this->value[0] = col_type(v1); @@ -122,9 +118,9 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<U, Q> const & m) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<4, 3, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -132,8 +128,8 @@ namespace glm this->value[3] = col_type(m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -141,8 +137,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -150,8 +146,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -159,8 +155,8 @@ namespace glm this->value[3] = col_type(m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -168,8 +164,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -177,8 +173,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -186,8 +182,8 @@ namespace glm this->value[3] = col_type(0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -195,8 +191,8 @@ namespace glm this->value[3] = col_type(m[3], 0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 3, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -206,15 +202,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type & tmat4x3<T, P>::operator[](typename tmat4x3<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type & mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type const & tmat4x3<T, P>::operator[](typename tmat4x3<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type const& mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -223,8 +219,8 @@ namespace glm // -- Unary updatable operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -234,9 +230,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(tmat4x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, U, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -245,9 +241,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -256,9 +252,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator+=(tmat4x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(mat<4, 3, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -267,9 +263,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -278,9 +274,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator-=(tmat4x3<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(mat<4, 3, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -289,9 +285,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -300,9 +296,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -313,8 +309,8 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -323,8 +319,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> & tmat4x3<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -333,34 +329,34 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator++(int) { - tmat4x3<T, P> Result(*this); + mat<4, 3, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator--(int) { - tmat4x3<T, P> Result(*this); + mat<4, 3, T, Q> Result(*this); --*this; return Result; } // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( -m[0], -m[1], -m[2], @@ -369,95 +365,95 @@ namespace glm // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m[0] + s, m[1] + s, m[2] + s, m[3] + s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2], m1[3] + m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m[0] - s, m[1] - s, m[2] - s, m[3] - s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2], m1[3] - m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m[0] * s, m[1] * s, m[2] * s, m[3] * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(T const & s, tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m[0] * s, m[1] * s, m[2] * s, m[3] * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type operator* ( - tmat4x3<T, P> const & m, - typename tmat4x3<T, P>::row_type const & v) + mat<4, 3, T, Q> const& m, + typename mat<4, 3, T, Q>::row_type const& v) { - return typename tmat4x3<T, P>::col_type( + return typename mat<4, 3, T, Q>::col_type( m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w, m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x3<T, P>::row_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::row_type operator* ( - typename tmat4x3<T, P>::col_type const & v, - tmat4x3<T, P> const & m) + typename mat<4, 3, T, Q>::col_type const& v, + mat<4, 3, T, Q> const& m) { - return typename tmat4x3<T, P>::row_type( + return typename mat<4, 3, T, Q>::row_type( v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2], v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2], v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { - return tmat2x3<T, P>( + return mat<2, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], @@ -466,8 +462,8 @@ namespace glm m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { T const SrcA00 = m1[0][0]; T const SrcA01 = m1[0][1]; @@ -495,7 +491,7 @@ namespace glm T const SrcB22 = m2[2][2]; T const SrcB23 = m2[2][3]; - tmat3x3<T, P> Result(uninitialize); + mat<3, 3, T, Q> Result; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03; @@ -508,10 +504,10 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], @@ -526,20 +522,20 @@ namespace glm m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(tmat4x3<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( m[0] / s, m[1] / s, m[2] / s, m[3] / s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(T const & s, tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m) { - return tmat4x3<T, P>( + return mat<4, 3, T, Q>( s / m[0], s / m[1], s / m[2], @@ -548,14 +544,14 @@ namespace glm // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat4x3<T, P> const & m1, tmat4x3<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); } diff --git a/external/include/glm/detail/type_mat4x4.hpp b/external/include/glm/detail/type_mat4x4.hpp index 2222d10..694dcd0 100644 --- a/external/include/glm/detail/type_mat4x4.hpp +++ b/external/include/glm/detail/type_mat4x4.hpp @@ -11,183 +11,182 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tmat4x4 + template<typename T, qualifier Q> + struct mat<4, 4, T, Q> { - typedef tvec4<T, P> col_type; - typedef tvec4<T, P> row_type; - typedef tmat4x4<T, P> type; - typedef tmat4x4<T, P> transpose_type; + typedef vec<4, T, Q> col_type; + typedef vec<4, T, Q> row_type; + typedef mat<4, 4, T, Q> type; + typedef mat<4, 4, T, Q> transpose_type; typedef T value_type; private: col_type value[4]; public: + // -- Accesses -- + + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} + + GLM_FUNC_DECL col_type & operator[](length_type i); + GLM_FUNC_DECL col_type const& operator[](length_type i) const; + // -- Constructors -- - GLM_FUNC_DECL tmat4x4() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL tmat4x4(tmat4x4<T, P> const & m) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL tmat4x4(tmat4x4<T, Q> const & m); - - GLM_FUNC_DECL explicit tmat4x4(ctor); - GLM_FUNC_DECL explicit tmat4x4(T const & x); - GLM_FUNC_DECL tmat4x4( - T const & x0, T const & y0, T const & z0, T const & w0, - T const & x1, T const & y1, T const & z1, T const & w1, - T const & x2, T const & y2, T const & z2, T const & w2, - T const & x3, T const & y3, T const & z3, T const & w3); - GLM_FUNC_DECL tmat4x4( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, Q> const& m) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, T, P> const& m); + + GLM_FUNC_DECL explicit GLM_CONSTEXPR_CTOR_CXX14 mat(T const& x); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3); // -- Conversions -- - template < + template< typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2, typename X3, typename Y3, typename Z3, typename W3, typename X4, typename Y4, typename Z4, typename W4> - GLM_FUNC_DECL tmat4x4( - X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, - X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, - X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3, - X4 const & x4, Y4 const & y4, Z4 const & z4, W4 const & w4); - - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_DECL tmat4x4( - tvec4<V1, P> const & v1, - tvec4<V2, P> const & v2, - tvec4<V3, P> const & v3, - tvec4<V4, P> const & v4); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1, + X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2, + X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4); + + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR_CXX14 mat( + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3, + vec<4, V4, Q> const& v4); // -- Matrix conversions -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x4<U, Q> const & m); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 4, U, P> const& m); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x3<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat2x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x2<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat3x4<T, P> const & x); - GLM_FUNC_DECL GLM_EXPLICIT tmat4x4(tmat4x3<T, P> const & x); - - // -- Accesses -- - - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 4;} - - GLM_FUNC_DECL col_type & operator[](length_type i); - GLM_FUNC_DECL col_type const & operator[](length_type i) const; + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 3, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<2, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 2, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<3, 4, T, Q> const& x); + GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR_CTOR_CXX14 mat(mat<4, 3, T, Q> const& x); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tmat4x4<T, P> & operator=(tmat4x4<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator=(tmat4x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator+=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator+=(tmat4x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator-=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator-=(tmat4x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator*=(tmat4x4<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator/=(U s); - template <typename U> - GLM_FUNC_DECL tmat4x4<T, P> & operator/=(tmat4x4<U, P> const & m); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 4, T, Q> & operator=(mat<4, 4, T, Q> const& m) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 mat<4, 4, T, Q> & operator=(mat<4, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(mat<4, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(mat<4, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(mat<4, 4, U, Q> const& m); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(U s); + template<typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(mat<4, 4, U, Q> const& m); // -- Increment and decrement operators -- - GLM_FUNC_DECL tmat4x4<T, P> & operator++(); - GLM_FUNC_DECL tmat4x4<T, P> & operator--(); - GLM_FUNC_DECL tmat4x4<T, P> operator++(int); - GLM_FUNC_DECL tmat4x4<T, P> operator--(int); + GLM_FUNC_DECL mat<4, 4, T, Q> & operator++(); + GLM_FUNC_DECL mat<4, 4, T, Q> & operator--(); + GLM_FUNC_DECL mat<4, 4, T, Q> operator++(int); + GLM_FUNC_DECL mat<4, 4, T, Q> operator--(int); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator+(T const & s, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator-(T const & s, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator*(T const & s, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator*(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator*(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator*(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator*(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat2x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat3x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const & m, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator/(T const & s, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator/(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v); - template <typename T, precision P> - GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator/(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m); - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_mat4x4.inl b/external/include/glm/detail/type_mat4x4.inl index 4b75d94..26157c6 100644 --- a/external/include/glm/detail/type_mat4x4.inl +++ b/external/include/glm/detail/type_mat4x4.inl @@ -1,17 +1,17 @@ /// @ref core /// @file glm/detail/type_mat4x4.inl -#include "func_matrix.hpp" +#include "../matrix.hpp" namespace glm { // -- Constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4() +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat() { -# ifndef GLM_FORCE_NO_CTOR_INIT +# ifdef GLM_FORCE_CTOR_INIT this->value[0] = col_type(1, 0, 0, 0); this->value[1] = col_type(0, 1, 0, 0); this->value[2] = col_type(0, 0, 1, 0); @@ -21,8 +21,8 @@ namespace glm # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<4, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -31,9 +31,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, Q> const & m) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<4, 4, T, P> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -41,12 +41,8 @@ namespace glm this->value[3] = m[3]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(T const& s) { this->value[0] = col_type(s, 0, 0, 0); this->value[1] = col_type(0, s, 0, 0); @@ -54,13 +50,13 @@ namespace glm this->value[3] = col_type(0, 0, 0, s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat ( - T const & x0, T const & y0, T const & z0, T const & w0, - T const & x1, T const & y1, T const & z1, T const & w1, - T const & x2, T const & y2, T const & z2, T const & w2, - T const & x3, T const & y3, T const & z3, T const & w3 + T const& x0, T const& y0, T const& z0, T const& w0, + T const& x1, T const& y1, T const& z1, T const& w1, + T const& x2, T const& y2, T const& z2, T const& w2, + T const& x3, T const& y3, T const& z3, T const& w3 ) { this->value[0] = col_type(x0, y0, z0, w0); @@ -69,13 +65,13 @@ namespace glm this->value[3] = col_type(x3, y3, z3, w3); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat ( - col_type const & v0, - col_type const & v1, - col_type const & v2, - col_type const & v3 + col_type const& v0, + col_type const& v1, + col_type const& v2, + col_type const& v3 ) { this->value[0] = v0; @@ -84,12 +80,9 @@ namespace glm this->value[3] = v3; } - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 - ( - tmat4x4<U, Q> const & m - ) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<4, 4, U, P> const& m) { this->value[0] = col_type(m[0]); this->value[1] = col_type(m[1]); @@ -99,18 +92,18 @@ namespace glm // -- Conversions -- - template <typename T, precision P> - template < + template<typename T, qualifier Q> + template< typename X1, typename Y1, typename Z1, typename W1, typename X2, typename Y2, typename Z2, typename W2, typename X3, typename Y3, typename Z3, typename W3, typename X4, typename Y4, typename Z4, typename W4> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat ( - X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, - X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, - X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3, - X4 const & x4, Y4 const & y4, Z4 const & z4, W4 const & w4 + X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1, + X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2, + X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3, + X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4 ) { GLM_STATIC_ASSERT(std::numeric_limits<X1>::is_iec559 || std::numeric_limits<X1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); @@ -138,16 +131,16 @@ namespace glm this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3)); this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4), value_type(w4)); } - - template <typename T, precision P> - template <typename V1, typename V2, typename V3, typename V4> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4 + + template<typename T, qualifier Q> + template<typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat ( - tvec4<V1, P> const & v1, - tvec4<V2, P> const & v2, - tvec4<V3, P> const & v3, - tvec4<V4, P> const & v4 - ) + vec<4, V1, Q> const& v1, + vec<4, V2, Q> const& v2, + vec<4, V3, Q> const& v3, + vec<4, V4, Q> const& v4 + ) { GLM_STATIC_ASSERT(std::numeric_limits<V1>::is_iec559 || std::numeric_limits<V1>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); GLM_STATIC_ASSERT(std::numeric_limits<V2>::is_iec559 || std::numeric_limits<V2>::is_integer || GLM_UNRESTRICTED_GENTYPE, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); @@ -162,8 +155,8 @@ namespace glm // -- Matrix conversions -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<2, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); @@ -171,8 +164,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<3, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -180,8 +173,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<2, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -189,8 +182,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<3, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); @@ -198,8 +191,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<2, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -207,8 +200,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<4, 2, T, Q> const& m) { this->value[0] = col_type(m[0], 0, 0); this->value[1] = col_type(m[1], 0, 0); @@ -216,8 +209,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<3, 4, T, Q> const& m) { this->value[0] = m[0]; this->value[1] = m[1]; @@ -225,8 +218,8 @@ namespace glm this->value[3] = col_type(0, 0, 0, 1); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR_CXX14 mat<4, 4, T, Q>::mat(mat<4, 3, T, Q> const& m) { this->value[0] = col_type(m[0], 0); this->value[1] = col_type(m[1], 0); @@ -236,15 +229,15 @@ namespace glm // -- Accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type & tmat4x4<T, P>::operator[](typename tmat4x4<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) { assert(i < this->length()); return this->value[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type const & tmat4x4<T, P>::operator[](typename tmat4x4<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type const& mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) const { assert(i < this->length()); return this->value[i]; @@ -253,8 +246,8 @@ namespace glm // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, T, Q> const& m) { //memcpy could be faster //memcpy(&this->value, &m.value, 16 * sizeof(valType)); @@ -266,9 +259,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(tmat4x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, U, Q> const& m) { //memcpy could be faster //memcpy(&this->value, &m.value, 16 * sizeof(valType)); @@ -279,9 +272,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(U s) { this->value[0] += s; this->value[1] += s; @@ -290,9 +283,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(tmat4x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(mat<4, 4, U, Q> const& m) { this->value[0] += m[0]; this->value[1] += m[1]; @@ -301,9 +294,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator-=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(U s) { this->value[0] -= s; this->value[1] -= s; @@ -312,9 +305,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator-=(tmat4x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(mat<4, 4, U, Q> const& m) { this->value[0] -= m[0]; this->value[1] -= m[1]; @@ -323,9 +316,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(U s) { this->value[0] *= s; this->value[1] *= s; @@ -334,16 +327,16 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator*=(tmat4x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(mat<4, 4, U, Q> const& m) { return (*this = *this * m); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(U s) { this->value[0] /= s; this->value[1] /= s; @@ -352,17 +345,17 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator/=(tmat4x4<U, P> const & m) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(mat<4, 4, U, Q> const& m) { return *this *= inverse(m); } // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator++() { ++this->value[0]; ++this->value[1]; @@ -371,8 +364,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> & tmat4x4<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator--() { --this->value[0]; --this->value[1]; @@ -381,34 +374,34 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator++(int) { - tmat4x4<T, P> Result(*this); + mat<4, 4, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator--(int) { - tmat4x4<T, P> Result(*this); + mat<4, 4, T, Q> Result(*this); --*this; return Result; } // -- Unary constant operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m) { return m; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( -m[0], -m[1], -m[2], @@ -417,91 +410,91 @@ namespace glm // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] + s, m[1] + s, m[2] + s, m[3] + s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(T const & s, tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] + s, m[1] + s, m[2] + s, m[3] + s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2], m1[3] + m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] - s, m[1] - s, m[2] - s, m[3] - s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(T const & s, tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( s - m[0], s - m[1], s - m[2], s - m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2], m1[3] - m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const & s) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] * s, m[1] * s, m[2] * s, m[3] * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(T const & s, tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] * s, m[1] * s, m[2] * s, m[3] * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator* ( - tmat4x4<T, P> const & m, - typename tmat4x4<T, P>::row_type const & v + mat<4, 4, T, Q> const& m, + typename mat<4, 4, T, Q>::row_type const& v ) { /* @@ -520,24 +513,24 @@ namespace glm __m128 a2 = _mm_add_ps(a0, a1); - return typename tmat4x4<T, P>::col_type(a2); + return typename mat<4, 4, T, Q>::col_type(a2); */ - typename tmat4x4<T, P>::col_type const Mov0(v[0]); - typename tmat4x4<T, P>::col_type const Mov1(v[1]); - typename tmat4x4<T, P>::col_type const Mul0 = m[0] * Mov0; - typename tmat4x4<T, P>::col_type const Mul1 = m[1] * Mov1; - typename tmat4x4<T, P>::col_type const Add0 = Mul0 + Mul1; - typename tmat4x4<T, P>::col_type const Mov2(v[2]); - typename tmat4x4<T, P>::col_type const Mov3(v[3]); - typename tmat4x4<T, P>::col_type const Mul2 = m[2] * Mov2; - typename tmat4x4<T, P>::col_type const Mul3 = m[3] * Mov3; - typename tmat4x4<T, P>::col_type const Add1 = Mul2 + Mul3; - typename tmat4x4<T, P>::col_type const Add2 = Add0 + Add1; + typename mat<4, 4, T, Q>::col_type const Mov0(v[0]); + typename mat<4, 4, T, Q>::col_type const Mov1(v[1]); + typename mat<4, 4, T, Q>::col_type const Mul0 = m[0] * Mov0; + typename mat<4, 4, T, Q>::col_type const Mul1 = m[1] * Mov1; + typename mat<4, 4, T, Q>::col_type const Add0 = Mul0 + Mul1; + typename mat<4, 4, T, Q>::col_type const Mov2(v[2]); + typename mat<4, 4, T, Q>::col_type const Mov3(v[3]); + typename mat<4, 4, T, Q>::col_type const Mul2 = m[2] * Mov2; + typename mat<4, 4, T, Q>::col_type const Mul3 = m[3] * Mov3; + typename mat<4, 4, T, Q>::col_type const Add1 = Mul2 + Mul3; + typename mat<4, 4, T, Q>::col_type const Add2 = Add0 + Add1; return Add2; /* - return typename tmat4x4<T, P>::col_type( + return typename mat<4, 4, T, Q>::col_type( m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3], m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3], m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3], @@ -545,24 +538,24 @@ namespace glm */ } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator* + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator* ( - typename tmat4x4<T, P>::col_type const & v, - tmat4x4<T, P> const & m + typename mat<4, 4, T, Q>::col_type const& v, + mat<4, 4, T, Q> const& m ) { - return typename tmat4x4<T, P>::row_type( + return typename mat<4, 4, T, Q>::row_type( m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3], m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3], m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3], m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat2x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2) { - return tmat2x4<T, P>( + return mat<2, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], @@ -573,10 +566,10 @@ namespace glm m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat3x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2) { - return tmat3x4<T, P>( + return mat<3, 4, T, Q>( m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], @@ -591,20 +584,20 @@ namespace glm m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - typename tmat4x4<T, P>::col_type const SrcA0 = m1[0]; - typename tmat4x4<T, P>::col_type const SrcA1 = m1[1]; - typename tmat4x4<T, P>::col_type const SrcA2 = m1[2]; - typename tmat4x4<T, P>::col_type const SrcA3 = m1[3]; + typename mat<4, 4, T, Q>::col_type const SrcA0 = m1[0]; + typename mat<4, 4, T, Q>::col_type const SrcA1 = m1[1]; + typename mat<4, 4, T, Q>::col_type const SrcA2 = m1[2]; + typename mat<4, 4, T, Q>::col_type const SrcA3 = m1[3]; - typename tmat4x4<T, P>::col_type const SrcB0 = m2[0]; - typename tmat4x4<T, P>::col_type const SrcB1 = m2[1]; - typename tmat4x4<T, P>::col_type const SrcB2 = m2[2]; - typename tmat4x4<T, P>::col_type const SrcB3 = m2[3]; + typename mat<4, 4, T, Q>::col_type const SrcB0 = m2[0]; + typename mat<4, 4, T, Q>::col_type const SrcB1 = m2[1]; + typename mat<4, 4, T, Q>::col_type const SrcB2 = m2[2]; + typename mat<4, 4, T, Q>::col_type const SrcB3 = m2[3]; - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3]; Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3]; Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3]; @@ -612,55 +605,55 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const & m, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( m[0] / s, m[1] / s, m[2] / s, m[3] / s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(T const & s, tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( + return mat<4, 4, T, Q>( s / m[0], s / m[1], s / m[2], s / m[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator/(tmat4x4<T, P> const & m, typename tmat4x4<T, P>::row_type const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v) { return inverse(m) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator/(typename tmat4x4<T, P>::col_type const & v, tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m) { return v * inverse(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { - tmat4x4<T, P> m1_copy(m1); + mat<4, 4, T, Q> m1_copy(m1); return m1_copy /= m2; } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tmat4x4<T, P> const & m1, tmat4x4<T, P> const & m2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2) { return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); } diff --git a/external/include/glm/detail/type_vec.hpp b/external/include/glm/detail/type_vec.hpp index 7849db6..cf4f34c 100644 --- a/external/include/glm/detail/type_vec.hpp +++ b/external/include/glm/detail/type_vec.hpp @@ -3,13 +3,14 @@ #pragma once -#include "precision.hpp" +#include "qualifier.hpp" #include "type_int.hpp" +#include "compute_vector_relational.hpp" namespace glm{ namespace detail { - template <typename T, std::size_t size, bool aligned> + template<typename T, std::size_t size, bool aligned> struct storage { typedef struct type { @@ -18,7 +19,7 @@ namespace detail }; #define GLM_ALIGNED_STORAGE_TYPE_STRUCT(x) \ - template <typename T> \ + template<typename T> \ struct storage<T, x, true> { \ GLM_ALIGNED_STRUCT(x) type { \ uint8 data[x]; \ @@ -32,21 +33,21 @@ namespace detail GLM_ALIGNED_STORAGE_TYPE_STRUCT(16) GLM_ALIGNED_STORAGE_TYPE_STRUCT(32) GLM_ALIGNED_STORAGE_TYPE_STRUCT(64) - + # if GLM_ARCH & GLM_ARCH_SSE2_BIT - template <> + template<> struct storage<float, 16, true> { typedef glm_vec4 type; }; - template <> + template<> struct storage<int, 16, true> { typedef glm_ivec4 type; }; - template <> + template<> struct storage<unsigned int, 16, true> { typedef glm_uvec4 type; @@ -58,19 +59,19 @@ namespace detail unsigned __int8 data[16]; } glm_128; - template <> + template<> struct storage<float, 16, true> { typedef glm_128 type; }; - template <> + template<> struct storage<int, 16, true> { typedef glm_128 type; }; - template <> + template<> struct storage<unsigned int, 16, true> { typedef glm_128 type; @@ -79,7 +80,7 @@ namespace detail # endif # if (GLM_ARCH & GLM_ARCH_AVX_BIT) - template <> + template<> struct storage<double, 32, true> { typedef glm_dvec4 type; @@ -87,13 +88,13 @@ namespace detail # endif # if (GLM_ARCH & GLM_ARCH_AVX2_BIT) - template <> + template<> struct storage<int64, 32, true> { typedef glm_i64vec4 type; }; - template <> + template<> struct storage<uint64, 32, true> { typedef glm_u64vec4 type; @@ -101,336 +102,321 @@ namespace detail # endif }//namespace detail - template <typename T, precision P> struct tvec1; - template <typename T, precision P> struct tvec2; - template <typename T, precision P> struct tvec3; - template <typename T, precision P> struct tvec4; - - typedef tvec1<float, highp> highp_vec1_t; - typedef tvec1<float, mediump> mediump_vec1_t; - typedef tvec1<float, lowp> lowp_vec1_t; - typedef tvec1<double, highp> highp_dvec1_t; - typedef tvec1<double, mediump> mediump_dvec1_t; - typedef tvec1<double, lowp> lowp_dvec1_t; - typedef tvec1<int, highp> highp_ivec1_t; - typedef tvec1<int, mediump> mediump_ivec1_t; - typedef tvec1<int, lowp> lowp_ivec1_t; - typedef tvec1<uint, highp> highp_uvec1_t; - typedef tvec1<uint, mediump> mediump_uvec1_t; - typedef tvec1<uint, lowp> lowp_uvec1_t; - typedef tvec1<bool, highp> highp_bvec1_t; - typedef tvec1<bool, mediump> mediump_bvec1_t; - typedef tvec1<bool, lowp> lowp_bvec1_t; +#if GLM_HAS_TEMPLATE_ALIASES + template <typename T, qualifier Q = defaultp> using tvec2 = vec<2, T, Q>; + template <typename T, qualifier Q = defaultp> using tvec3 = vec<3, T, Q>; + template <typename T, qualifier Q = defaultp> using tvec4 = vec<4, T, Q>; +#endif//GLM_HAS_TEMPLATE_ALIASES /// @addtogroup core_precision /// @{ - /// 2 components vector of high single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of high single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<float, highp> highp_vec2; + typedef vec<2, float, highp> highp_vec2; - /// 2 components vector of medium single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of medium single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<float, mediump> mediump_vec2; + typedef vec<2, float, mediump> mediump_vec2; - /// 2 components vector of low single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of low single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<float, lowp> lowp_vec2; + typedef vec<2, float, lowp> lowp_vec2; - /// 2 components vector of high double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<double, highp> highp_dvec2; + typedef vec<2, double, highp> highp_dvec2; - /// 2 components vector of medium double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<double, mediump> mediump_dvec2; + typedef vec<2, double, mediump> mediump_dvec2; - /// 2 components vector of low double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<double, lowp> lowp_dvec2; + typedef vec<2, double, lowp> lowp_dvec2; - /// 2 components vector of high precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of high qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<int, highp> highp_ivec2; + typedef vec<2, int, highp> highp_ivec2; - /// 2 components vector of medium precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of medium qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<int, mediump> mediump_ivec2; + typedef vec<2, int, mediump> mediump_ivec2; - /// 2 components vector of low precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of low qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<int, lowp> lowp_ivec2; + typedef vec<2, int, lowp> lowp_ivec2; - /// 2 components vector of high precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of high qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<uint, highp> highp_uvec2; + typedef vec<2, uint, highp> highp_uvec2; - /// 2 components vector of medium precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of medium qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<uint, mediump> mediump_uvec2; + typedef vec<2, uint, mediump> mediump_uvec2; - /// 2 components vector of low precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of low qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<uint, lowp> lowp_uvec2; + typedef vec<2, uint, lowp> lowp_uvec2; - /// 2 components vector of high precision bool numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of high qualifier bool numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<bool, highp> highp_bvec2; + typedef vec<2, bool, highp> highp_bvec2; - /// 2 components vector of medium precision bool numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of medium qualifier bool numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<bool, mediump> mediump_bvec2; + typedef vec<2, bool, mediump> mediump_bvec2; - /// 2 components vector of low precision bool numbers. - /// There is no guarantee on the actual precision. + /// 2 components vector of low qualifier bool numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec2<bool, lowp> lowp_bvec2; + typedef vec<2, bool, lowp> lowp_bvec2; /// @} /// @addtogroup core_precision /// @{ - /// 3 components vector of high single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of high single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<float, highp> highp_vec3; + typedef vec<3, float, highp> highp_vec3; - /// 3 components vector of medium single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of medium single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<float, mediump> mediump_vec3; + typedef vec<3, float, mediump> mediump_vec3; - /// 3 components vector of low single-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of low single-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<float, lowp> lowp_vec3; + typedef vec<3, float, lowp> lowp_vec3; - /// 3 components vector of high double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of high double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<double, highp> highp_dvec3; + typedef vec<3, double, highp> highp_dvec3; - /// 3 components vector of medium double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of medium double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<double, mediump> mediump_dvec3; + typedef vec<3, double, mediump> mediump_dvec3; - /// 3 components vector of low double-precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of low double-qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<double, lowp> lowp_dvec3; + typedef vec<3, double, lowp> lowp_dvec3; - /// 3 components vector of high precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of high qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<int, highp> highp_ivec3; + typedef vec<3, int, highp> highp_ivec3; - /// 3 components vector of medium precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of medium qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<int, mediump> mediump_ivec3; + typedef vec<3, int, mediump> mediump_ivec3; - /// 3 components vector of low precision signed integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of low qualifier signed integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<int, lowp> lowp_ivec3; + typedef vec<3, int, lowp> lowp_ivec3; - /// 3 components vector of high precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of high qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<uint, highp> highp_uvec3; + typedef vec<3, uint, highp> highp_uvec3; - /// 3 components vector of medium precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of medium qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<uint, mediump> mediump_uvec3; + typedef vec<3, uint, mediump> mediump_uvec3; - /// 3 components vector of low precision unsigned integer numbers. - /// There is no guarantee on the actual precision. + /// 3 components vector of low qualifier unsigned integer numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<uint, lowp> lowp_uvec3; + typedef vec<3, uint, lowp> lowp_uvec3; - /// 3 components vector of high precision bool numbers. + /// 3 components vector of high qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<bool, highp> highp_bvec3; + typedef vec<3, bool, highp> highp_bvec3; - /// 3 components vector of medium precision bool numbers. + /// 3 components vector of medium qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<bool, mediump> mediump_bvec3; + typedef vec<3, bool, mediump> mediump_bvec3; - /// 3 components vector of low precision bool numbers. + /// 3 components vector of low qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec3<bool, lowp> lowp_bvec3; + typedef vec<3, bool, lowp> lowp_bvec3; /// @} /// @addtogroup core_precision /// @{ - /// 4 components vector of high single-precision floating-point numbers. + /// 4 components vector of high single-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<float, highp> highp_vec4; + typedef vec<4, float, highp> highp_vec4; - /// 4 components vector of medium single-precision floating-point numbers. + /// 4 components vector of medium single-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<float, mediump> mediump_vec4; + typedef vec<4, float, mediump> mediump_vec4; - /// 4 components vector of low single-precision floating-point numbers. + /// 4 components vector of low single-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<float, lowp> lowp_vec4; + typedef vec<4, float, lowp> lowp_vec4; - /// 4 components vector of high double-precision floating-point numbers. + /// 4 components vector of high double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<double, highp> highp_dvec4; + typedef vec<4, double, highp> highp_dvec4; - /// 4 components vector of medium double-precision floating-point numbers. + /// 4 components vector of medium double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<double, mediump> mediump_dvec4; + typedef vec<4, double, mediump> mediump_dvec4; - /// 4 components vector of low double-precision floating-point numbers. + /// 4 components vector of low double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<double, lowp> lowp_dvec4; + typedef vec<4, double, lowp> lowp_dvec4; - /// 4 components vector of high precision signed integer numbers. + /// 4 components vector of high qualifier signed integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<int, highp> highp_ivec4; + typedef vec<4, int, highp> highp_ivec4; - /// 4 components vector of medium precision signed integer numbers. + /// 4 components vector of medium qualifier signed integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<int, mediump> mediump_ivec4; + typedef vec<4, int, mediump> mediump_ivec4; - /// 4 components vector of low precision signed integer numbers. + /// 4 components vector of low qualifier signed integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<int, lowp> lowp_ivec4; + typedef vec<4, int, lowp> lowp_ivec4; - /// 4 components vector of high precision unsigned integer numbers. + /// 4 components vector of high qualifier unsigned integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<uint, highp> highp_uvec4; + typedef vec<4, uint, highp> highp_uvec4; - /// 4 components vector of medium precision unsigned integer numbers. + /// 4 components vector of medium qualifier unsigned integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<uint, mediump> mediump_uvec4; + typedef vec<4, uint, mediump> mediump_uvec4; - /// 4 components vector of low precision unsigned integer numbers. + /// 4 components vector of low qualifier unsigned integer numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<uint, lowp> lowp_uvec4; + typedef vec<4, uint, lowp> lowp_uvec4; - /// 4 components vector of high precision bool numbers. + /// 4 components vector of high qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<bool, highp> highp_bvec4; + typedef vec<4, bool, highp> highp_bvec4; - /// 4 components vector of medium precision bool numbers. + /// 4 components vector of medium qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<bool, mediump> mediump_bvec4; + typedef vec<4, bool, mediump> mediump_bvec4; - /// 4 components vector of low precision bool numbers. + /// 4 components vector of low qualifier bool numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tvec4<bool, lowp> lowp_bvec4; + typedef vec<4, bool, lowp> lowp_bvec4; /// @} @@ -475,17 +461,17 @@ namespace detail typedef mediump_dvec3 dvec3; typedef mediump_dvec4 dvec4; #else //defined(GLM_PRECISION_HIGHP_DOUBLE) - /// 2 components vector of double-precision floating-point numbers. + /// 2 components vector of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> typedef highp_dvec2 dvec2; - //! 3 components vector of double-precision floating-point numbers. + //! 3 components vector of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> typedef highp_dvec3 dvec3; - //! 4 components vector of double-precision floating-point numbers. + //! 4 components vector of double-qualifier floating-point numbers. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> typedef highp_dvec4 dvec4; diff --git a/external/include/glm/detail/type_vec1.hpp b/external/include/glm/detail/type_vec1.hpp index f5c7f01..e69de29 100644 --- a/external/include/glm/detail/type_vec1.hpp +++ b/external/include/glm/detail/type_vec1.hpp @@ -1,302 +0,0 @@ -/// @ref core -/// @file glm/detail/type_vec1.hpp - -#pragma once - -#include "../fwd.hpp" -#include "type_vec.hpp" -#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED -# if GLM_HAS_UNRESTRICTED_UNIONS -# include "_swizzle.hpp" -# else -# include "_swizzle_func.hpp" -# endif -#endif //GLM_SWIZZLE -#include <cstddef> - -namespace glm -{ - template <typename T, precision P = defaultp> - struct tvec1 - { - // -- Implementation detail -- - - typedef T value_type; - typedef tvec1<T, P> type; - typedef tvec1<bool, P> bool_type; - - // -- Data -- - -# if GLM_HAS_ONLY_XYZW - T x; - -# elif 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 - { - T x; - T r; - T s; -/* -# if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - _GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, x) - _GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, r) - _GLM_SWIZZLE1_2_MEMBERS(T, P, tvec2, s) - _GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, x) - _GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, r) - _GLM_SWIZZLE1_3_MEMBERS(T, P, tvec3, s) - _GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, x) - _GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, r) - _GLM_SWIZZLE1_4_MEMBERS(T, P, tvec4, s) -# endif//GLM_SWIZZLE*/ - }; - -# if GLM_COMPILER & GLM_COMPILER_CLANG -# pragma clang diagnostic pop -# endif -# if GLM_COMPILER & GLM_COMPILER_GCC -# pragma GCC diagnostic pop -# endif -# else - union {T x, r, s;}; -/* -# if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4) -# endif//GLM_SWIZZLE*/ -# endif - - // -- Component accesses -- - - /// Return the count of components of the vector - typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 1;} - - 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_CTOR tvec1() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec1(tvec1<T, P> const & v) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec1(tvec1<T, Q> const & v); - - // -- Explicit basic constructors -- - - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec1(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec1(T scalar); - - // -- Conversion vector constructors -- - - /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec2<U, Q> const & v); - /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec3<U, Q> const & v); - /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec4<U, Q> const & v); - - /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec1(tvec1<U, Q> const & v); - - // -- Swizzle constructors -- -/* -# if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) - template <int E0> - GLM_FUNC_DECL tvec1(detail::_swizzle<1, T, P, tvec1, E0, -1,-2,-3> const & that) - { - *this = that(); - } -# endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) -*/ - // -- Unary arithmetic operators -- - - GLM_FUNC_DECL tvec1<T, P> & operator=(tvec1<T, P> const & v) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator+=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator+=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator-=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator-=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator*=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator*=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator/=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator/=(tvec1<U, P> const & v); - - // -- Increment and decrement operators -- - - GLM_FUNC_DECL tvec1<T, P> & operator++(); - GLM_FUNC_DECL tvec1<T, P> & operator--(); - GLM_FUNC_DECL tvec1<T, P> operator++(int); - GLM_FUNC_DECL tvec1<T, P> operator--(int); - - // -- Unary bit operators -- - - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator%=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator%=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator&=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator&=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator|=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator|=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator^=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator^=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator<<=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator<<=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator>>=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec1<T, P> & operator>>=(tvec1<U, P> const & v); - }; - - // -- Unary operators -- - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const & v); - - // -- Binary operators -- - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator+(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator-(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator- (tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator*(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator/(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator%(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator&(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator|(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator^(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator<<(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const & v, T scalar); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator>>(T scalar, tvec1<T, P> const & v); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL tvec1<T, P> operator~(tvec1<T, P> const & v); - - // -- Boolean operators -- - - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tvec1<T, P> const & v1, tvec1<T, P> const & v2); - - template <precision P> - GLM_FUNC_DECL tvec1<bool, P> operator&&(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2); - - template <precision P> - GLM_FUNC_DECL tvec1<bool, P> operator||(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2); -}//namespace glm - -#ifndef GLM_EXTERNAL_TEMPLATE -#include "type_vec1.inl" -#endif//GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_vec1.inl b/external/include/glm/detail/type_vec1.inl index 72f9437..7f77f6c 100644 --- a/external/include/glm/detail/type_vec1.inl +++ b/external/include/glm/detail/type_vec1.inl @@ -5,76 +5,72 @@ namespace glm { // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1() -# ifndef GLM_FORCE_NO_CTOR_INIT +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec() +# ifdef GLM_FORCE_CTOR_INIT : x(0) # endif {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS +# endif//!GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, T, Q> const& v) : x(v.x) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<T, Q> const & v) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, T, P> const& v) : x(v.x) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(T scalar) : x(scalar) {} // -- Conversion vector constructors -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec1<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, U, P> const& v) : x(static_cast<T>(v.x)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec2<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<2, U, P> const& v) : x(static_cast<T>(v.x)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec3<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<3, U, P> const& v) : x(static_cast<T>(v.x)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec1<T, P>::tvec1(tvec4<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<4, U, P> const& v) : x(static_cast<T>(v.x)) {} // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T & tvec1<T, P>::operator[](typename tvec1<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&x)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T const & tvec1<T, P>::operator[](typename tvec1<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&x)[i]; @@ -83,81 +79,81 @@ namespace glm // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator=(tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v) { this->x = v.x; return *this; } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v) { this->x = static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator+=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar) { this->x += static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator+=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v) { this->x += static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator-=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar) { this->x -= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator-=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v) { this->x -= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator*=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar) { this->x *= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator*=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v) { this->x *= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator/=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar) { this->x /= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator/=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v) { this->x /= static_cast<T>(v.x); return *this; @@ -165,129 +161,129 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator++() { ++this->x; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator--() { --this->x; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> vec<1, T, Q>::operator++(int) { - tvec1<T, P> Result(*this); + vec<1, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> vec<1, T, Q>::operator--(int) { - tvec1<T, P> Result(*this); + vec<1, T, Q> Result(*this); --*this; return Result; } // -- Unary bit operators -- - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator%=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar) { this->x %= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator%=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v) { this->x %= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator&=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar) { this->x &= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator&=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v) { this->x &= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator|=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar) { this->x |= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator|=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v) { this->x |= U(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator^=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar) { this->x ^= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator^=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v) { this->x ^= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator<<=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar) { this->x <<= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator<<=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v) { this->x <<= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator>>=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar) { this->x >>= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec1<T, P> & tvec1<T, P>::operator>>=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v) { this->x >>= static_cast<T>(v.x); return *this; @@ -295,264 +291,264 @@ namespace glm // -- Unary constant operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v) { return v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( -v.x); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator+(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar + v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x + v2.x); } //operator- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator-(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar - v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x - v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator*(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar * v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x * v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator/(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar / v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x / v2.x); } // -- Binary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x % scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator%(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar % v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x % v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x & scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator&(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar & v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x & v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x | scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator|(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar | v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x | v2.x); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const & v, T scalar) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x ^ scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator^(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar ^ v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x ^ v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( - v.x << scalar); + return vec<1, T, Q>( + static_cast<T>(v.x << scalar)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar << v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x << v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar) { - return tvec1<T, P>( + return vec<1, T, Q>( v.x >> scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(T scalar, tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( scalar >> v.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec1<T, P>( + return vec<1, T, Q>( v1.x >> v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<T, P> operator~(tvec1<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, T, Q> operator~(vec<1, T, Q> const& v) { - return tvec1<T, P>( + return vec<1, T, Q>( ~v.x); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return (v1.x == v2.x); + return detail::compute_equal<T>::call(v1.x, v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tvec1<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2) { - return (v1.x != v2.x); + return !(v1 == v2); } - template <precision P> - GLM_FUNC_QUALIFIER tvec1<bool, P> operator&&(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) { - return tvec1<bool, P>(v1.x && v2.x); + return vec<1, bool, Q>(v1.x && v2.x); } - template <precision P> - GLM_FUNC_QUALIFIER tvec1<bool, P> operator||(tvec1<bool, P> const & v1, tvec1<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2) { - return tvec1<bool, P>(v1.x || v2.x); + return vec<1, bool, Q>(v1.x || v2.x); } }//namespace glm diff --git a/external/include/glm/detail/type_vec2.hpp b/external/include/glm/detail/type_vec2.hpp index a9af32e..b6ab685 100644 --- a/external/include/glm/detail/type_vec2.hpp +++ b/external/include/glm/detail/type_vec2.hpp @@ -15,14 +15,14 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tvec2 + template<typename T, qualifier Q> + struct vec<2, T, Q> { // -- Implementation detail -- typedef T value_type; - typedef tvec2<T, P> type; - typedef tvec2<bool, P> bool_type; + typedef vec type; + typedef vec<2, bool, Q> bool_type; // -- Data -- @@ -39,7 +39,7 @@ namespace glm # pragma clang diagnostic ignored "-Wgnu-anonymous-struct" # pragma clang diagnostic ignored "-Wnested-anon-types" # endif - + union { struct{ T x, y; }; @@ -47,19 +47,19 @@ namespace glm struct{ T s, t; }; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - _GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, x, y) - _GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, r, g) - _GLM_SWIZZLE2_2_MEMBERS(T, P, glm::tvec2, s, t) - _GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, x, y) - _GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, r, g) - _GLM_SWIZZLE2_3_MEMBERS(T, P, glm::tvec3, s, t) - _GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, x, y) - _GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, r, g) - _GLM_SWIZZLE2_4_MEMBERS(T, P, glm::tvec4, s, t) + GLM_SWIZZLE2_2_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_2_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_2_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_3_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_3_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_3_MEMBERS(T, Q, s, t) + GLM_SWIZZLE2_4_MEMBERS(T, Q, x, y) + GLM_SWIZZLE2_4_MEMBERS(T, Q, r, g) + GLM_SWIZZLE2_4_MEMBERS(T, Q, s, t) # endif//GLM_SWIZZLE }; - + # if GLM_COMPILER & GLM_COMPILER_CLANG # pragma clang diagnostic pop # endif @@ -71,7 +71,7 @@ namespace glm union {T y, g, t;}; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P, tvec2, tvec2, tvec3, tvec4) + GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P) # endif//GLM_SWIZZLE # endif @@ -79,49 +79,48 @@ namespace glm /// Return the count of components of the vector typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 2;} + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} - GLM_FUNC_DECL T & operator[](length_type i); - GLM_FUNC_DECL T const & operator[](length_type i) const; + 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_CTOR tvec2() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec2<T, P> const& v) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec2<T, Q> const& v); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, T, P> const& v); // -- Explicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec2(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec2(T scalar); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(T s1, T s2); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T x, T y); // -- Conversion constructors -- - /// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(A x, B y); - template <typename A, typename B> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec2(tvec1<A, P> const & v1, tvec1<B, P> const & v2); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename A, typename B> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A x, B y); + template<typename A, typename B> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, Q> const& x, vec<1, B, Q> const& y); // -- Conversion vector constructors -- /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec3<U, Q> const & v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec4<U, Q> const & v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec2(tvec2<U, Q> const & v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v); // -- Swizzle constructors -- # if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) - template <int E0, int E1> - GLM_FUNC_DECL tvec2(detail::_swizzle<2, T, P, glm::tvec2, E0, E1,-1,-2> const& that) + template<int E0, int E1> + GLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1,-1,-2> const& that) { *this = that(); } @@ -129,258 +128,258 @@ namespace glm // -- Unary arithmetic operators -- - GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<T, P> const & v) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator+=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator+=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator+=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator-=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator-=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator-=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator*=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator*=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator*=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator/=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator/=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P>& operator/=(tvec2<U, P> const & v); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec& operator=(vec const& v) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec& operator=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator+=(U scalar); + template<typename U> + GLM_FUNC_DECL vec& operator+=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator+=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator-=(U scalar); + template<typename U> + GLM_FUNC_DECL vec& operator-=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator-=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator*=(U scalar); + template<typename U> + GLM_FUNC_DECL vec& operator*=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator*=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator/=(U scalar); + template<typename U> + GLM_FUNC_DECL vec& operator/=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec& operator/=(vec<2, U, Q> const& v); // -- Increment and decrement operators -- - GLM_FUNC_DECL tvec2<T, P> & operator++(); - GLM_FUNC_DECL tvec2<T, P> & operator--(); - GLM_FUNC_DECL tvec2<T, P> operator++(int); - GLM_FUNC_DECL tvec2<T, P> operator--(int); + GLM_FUNC_DECL vec & operator++(); + GLM_FUNC_DECL vec & operator--(); + GLM_FUNC_DECL vec operator++(int); + GLM_FUNC_DECL vec operator--(int); // -- Unary bit operators -- - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator%=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator%=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator%=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator&=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator&=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator&=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator|=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator|=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator|=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator^=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator^=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator^=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator<<=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec2<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator>>=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec2<U, P> const & v); + template<typename U> + GLM_FUNC_DECL vec & operator%=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator%=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator&=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator&=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator|=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator|=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator^=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator^=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(vec<2, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(vec<2, U, Q> const& v); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator*(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator*(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator/(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator/(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator%(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator%(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator&(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator&(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator|(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator|(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator^(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator^(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator<<(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator<<(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator>>(T scalar, tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator>>(tvec1<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> operator~(tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> operator~(vec<2, T, Q> const& v); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tvec2<T, P> const & v1, tvec2<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec2<bool, P> operator&&(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec2<bool, P> operator||(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_vec2.inl b/external/include/glm/detail/type_vec2.inl index cf79da2..1273707 100644 --- a/external/include/glm/detail/type_vec2.inl +++ b/external/include/glm/detail/type_vec2.inl @@ -3,109 +3,92 @@ namespace glm { -# ifdef GLM_STATIC_CONST_MEMBERS - template <typename T, precision P> - const tvec2<T, P> tvec2<T, P>::ZERO(static_cast<T>(0), static_cast<T>(0)); - - template <typename T, precision P> - const tvec2<T, P> tvec2<T, P>::X(static_cast<T>(1), static_cast<T>(0)); - - template <typename T, precision P> - const tvec2<T, P> tvec2<T, P>::Y(static_cast<T>(0), static_cast<T>(1)); - - template <typename T, precision P> - const tvec2<T, P> tvec2<T, P>::XY(static_cast<T>(1), static_cast<T>(1)); -# endif // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2() -# ifndef GLM_FORCE_NO_CTOR_INIT +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec() +# ifdef GLM_FORCE_CTOR_INIT : x(0), y(0) # endif {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS +# endif//!GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, T, Q> const& v) : x(v.x), y(v.y) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<T, Q> const & v) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, T, P> const& v) : x(v.x), y(v.y) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(T scalar) : x(scalar), y(scalar) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(T s1, T s2) - : x(s1), y(s2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(T _x, T _y) + : x(_x), y(_y) {} // -- Conversion scalar constructors -- - template <typename T, precision P> - template <typename A, typename B> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(A a, B b) - : x(static_cast<T>(a)) - , y(static_cast<T>(b)) + template<typename T, qualifier Q> + template<typename A, typename B> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(A _x, B _y) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_y)) {} - template <typename T, precision P> - template <typename A, typename B> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec1<A, P> const & a, tvec1<B, P> const & b) - : x(static_cast<T>(a.x)) - , y(static_cast<T>(b.x)) + template<typename T, qualifier Q> + template<typename A, typename B> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, vec<1, B, Q> const& _y) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_y.x)) {} // -- Conversion vector constructors -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec2<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, U, P> const& v) : x(static_cast<T>(v.x)) , y(static_cast<T>(v.y)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec3<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<3, U, P> const& v) : x(static_cast<T>(v.x)) , y(static_cast<T>(v.y)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec2<T, P>::tvec2(tvec4<U, Q> const & v) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<4, U, P> const& v) : x(static_cast<T>(v.x)) , y(static_cast<T>(v.y)) {} // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T & tvec2<T, P>::operator[](typename tvec2<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T & vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&x)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T const & tvec2<T, P>::operator[](typename tvec2<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const& vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&x)[i]; @@ -114,8 +97,8 @@ namespace glm // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator=(tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, T, Q> const& v) { this->x = v.x; this->y = v.y; @@ -123,117 +106,117 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, U, Q> const& v) { this->x = static_cast<T>(v.x); this->y = static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(U scalar) { this->x += static_cast<T>(scalar); this->y += static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<1, U, Q> const& v) { this->x += static_cast<T>(v.x); this->y += static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator+=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<2, U, Q> const& v) { this->x += static_cast<T>(v.x); this->y += static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(U scalar) { this->x -= static_cast<T>(scalar); this->y -= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<1, U, Q> const& v) { this->x -= static_cast<T>(v.x); this->y -= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator-=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<2, U, Q> const& v) { this->x -= static_cast<T>(v.x); this->y -= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(U scalar) { this->x *= static_cast<T>(scalar); this->y *= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<1, U, Q> const& v) { this->x *= static_cast<T>(v.x); this->y *= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator*=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<2, U, Q> const& v) { this->x *= static_cast<T>(v.x); this->y *= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(U scalar) { this->x /= static_cast<T>(scalar); this->y /= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<1, U, Q> const& v) { this->x /= static_cast<T>(v.x); this->y /= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator/=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<2, U, Q> const& v) { this->x /= static_cast<T>(v.x); this->y /= static_cast<T>(v.y); @@ -242,196 +225,196 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator++() { ++this->x; ++this->y; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator--() { --this->x; --this->y; return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> vec<2, T, Q>::operator++(int) { - tvec2<T, P> Result(*this); + vec<2, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> vec<2, T, Q>::operator--(int) { - tvec2<T, P> Result(*this); + vec<2, T, Q> Result(*this); --*this; return Result; } // -- Unary bit operators -- - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(U scalar) { this->x %= static_cast<T>(scalar); this->y %= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<1, U, Q> const& v) { this->x %= static_cast<T>(v.x); this->y %= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator%=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<2, U, Q> const& v) { this->x %= static_cast<T>(v.x); this->y %= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(U scalar) { this->x &= static_cast<T>(scalar); this->y &= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<1, U, Q> const& v) { this->x &= static_cast<T>(v.x); this->y &= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator&=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<2, U, Q> const& v) { this->x &= static_cast<T>(v.x); this->y &= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(U scalar) { this->x |= static_cast<T>(scalar); this->y |= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<1, U, Q> const& v) { this->x |= static_cast<T>(v.x); this->y |= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator|=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<2, U, Q> const& v) { this->x |= static_cast<T>(v.x); this->y |= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(U scalar) { this->x ^= static_cast<T>(scalar); this->y ^= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<1, U, Q> const& v) { this->x ^= static_cast<T>(v.x); this->y ^= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator^=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<2, U, Q> const& v) { this->x ^= static_cast<T>(v.x); this->y ^= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(U scalar) { this->x <<= static_cast<T>(scalar); this->y <<= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<1, U, Q> const& v) { this->x <<= static_cast<T>(v.x); this->y <<= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator<<=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<2, U, Q> const& v) { this->x <<= static_cast<T>(v.x); this->y <<= static_cast<T>(v.y); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(U scalar) { this->x >>= static_cast<T>(scalar); this->y >>= static_cast<T>(scalar); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<1, U, Q> const& v) { this->x >>= static_cast<T>(v.x); this->y >>= static_cast<T>(v.x); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec2<T, P> & tvec2<T, P>::operator>>=(tvec2<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<2, U, Q> const& v) { this->x >>= static_cast<T>(v.x); this->y >>= static_cast<T>(v.y); @@ -440,455 +423,457 @@ namespace glm // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v) { return v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v) { - return tvec2<T, P>( - -v.x, + return vec<2, T, Q>( + -v.x, -v.y); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x + scalar, v.y + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x + v2.x, v1.y + v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar + v.x, scalar + v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x + v2.x, v1.x + v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x + v2.x, v1.y + v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x - scalar, v.y - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x - v2.x, v1.y - v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar - v.x, scalar - v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x - v2.x, v1.x - v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x - v2.x, v1.y - v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x * scalar, v.y * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x * v2.x, v1.y * v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator*(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar * v.x, scalar * v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x * v2.x, v1.x * v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x * v2.x, v1.y * v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x / scalar, v.y / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x / v2.x, v1.y / v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator/(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar / v.x, scalar / v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x / v2.x, v1.x / v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x / v2.x, v1.y / v2.y); } // -- Binary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x % scalar, v.y % scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x % v2.x, v1.y % v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator%(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar % v.x, scalar % v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x % v2.x, v1.x % v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x % v2.x, v1.y % v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x & scalar, v.y & scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x & v2.x, v1.y & v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator&(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar & v.x, scalar & v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x & v2.x, v1.x & v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x & v2.x, v1.y & v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x | scalar, v.y | scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x | v2.x, v1.y | v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator|(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar | v.x, scalar | v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x | v2.x, v1.x | v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x | v2.x, v1.y | v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x ^ scalar, v.y ^ scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x ^ v2.x, v1.y ^ v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator^(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar ^ v.x, scalar ^ v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x ^ v2.x, v1.x ^ v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x ^ v2.x, v1.y ^ v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x << scalar, v.y << scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x << v2.x, v1.y << v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar << v.x, scalar << v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x << v2.x, v1.x << v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x << v2.x, v1.y << v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar) { - return tvec2<T, P>( + return vec<2, T, Q>( v.x >> scalar, v.y >> scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x >> v2.x, v1.y >> v2.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(T scalar, tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( scalar >> v.x, scalar >> v.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec1<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x >> v2.x, v1.x >> v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return tvec2<T, P>( + return vec<2, T, Q>( v1.x >> v2.x, v1.y >> v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> operator~(tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> operator~(vec<2, T, Q> const& v) { - return tvec2<T, P>( + return vec<2, T, Q>( ~v.x, ~v.y); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return (v1.x == v2.x) && (v1.y == v2.y); + return + detail::compute_equal<T>::call(v1.x, v2.x) && + detail::compute_equal<T>::call(v1.y, v2.y); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tvec2<T, P> const & v1, tvec2<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2) { - return (v1.x != v2.x) || (v1.y != v2.y); + return !(v1 == v2); } - template <precision P> - GLM_FUNC_QUALIFIER tvec2<bool, P> operator&&(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) { - return tvec2<bool, P>(v1.x && v2.x, v1.y && v2.y); + return vec<2, bool, Q>(v1.x && v2.x, v1.y && v2.y); } - template <precision P> - GLM_FUNC_QUALIFIER tvec2<bool, P> operator||(tvec2<bool, P> const & v1, tvec2<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2) { - return tvec2<bool, P>(v1.x || v2.x, v1.y || v2.y); + return vec<2, bool, Q>(v1.x || v2.x, v1.y || v2.y); } }//namespace glm diff --git a/external/include/glm/detail/type_vec3.hpp b/external/include/glm/detail/type_vec3.hpp index f85f0a5..506e8a3 100644 --- a/external/include/glm/detail/type_vec3.hpp +++ b/external/include/glm/detail/type_vec3.hpp @@ -15,14 +15,14 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tvec3 + template<typename T, qualifier Q> + struct vec<3, T, Q> { // -- Implementation detail -- typedef T value_type; - typedef tvec3<T, P> type; - typedef tvec3<bool, P> bool_type; + typedef vec type; + typedef vec<3, bool, Q> bool_type; // -- Data -- @@ -47,18 +47,18 @@ namespace glm struct{ T s, t, p; }; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - _GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, x, y, z) - _GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, r, g, b) - _GLM_SWIZZLE3_2_MEMBERS(T, P, glm::tvec2, s, t, p) - _GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, x, y, z) - _GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, r, g, b) - _GLM_SWIZZLE3_3_MEMBERS(T, P, glm::tvec3, s, t, p) - _GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, x, y, z) - _GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, r, g, b) - _GLM_SWIZZLE3_4_MEMBERS(T, P, glm::tvec4, s, t, p) + GLM_SWIZZLE3_2_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_2_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_2_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_3_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_3_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_3_MEMBERS(T, Q, s, t, p) + GLM_SWIZZLE3_4_MEMBERS(T, Q, x, y, z) + GLM_SWIZZLE3_4_MEMBERS(T, Q, r, g, b) + GLM_SWIZZLE3_4_MEMBERS(T, Q, s, t, p) # endif//GLM_SWIZZLE }; - + # if GLM_COMPILER & GLM_COMPILER_CLANG # pragma clang diagnostic pop # endif @@ -71,7 +71,7 @@ namespace glm union { T z, b, p; }; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P, tvec3, tvec2, tvec3, tvec4) + GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) # endif//GLM_SWIZZLE # endif//GLM_LANG @@ -79,329 +79,328 @@ namespace glm /// Return the count of components of the vector typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 3;} + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 3;} GLM_FUNC_DECL T & operator[](length_type i); - GLM_FUNC_DECL T const & operator[](length_type i) const; + GLM_FUNC_DECL T const& operator[](length_type i) const; // -- Implicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec3<T, P> const & v) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec3<T, Q> const & v); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, T, P> const& v); // -- Explicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec3(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tvec3(T scalar); - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(T a, T b, T c); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T a, T b, T c); // -- Conversion scalar constructors -- - /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(A a, B b, C c); - template <typename A, typename B, typename C> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c); + /// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename X, typename Y, typename Z> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(X x, Y y, Z z); + template<typename X, typename Y, typename Z> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z); // -- Conversion vector constructors -- /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec2<A, Q> const & a, B b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, B _z); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec2<A, Q> const & a, tvec1<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(A a, tvec2<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<2, B, P> const& _yz); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec3(tvec1<A, Q> const & a, tvec2<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec3(tvec4<U, Q> const & v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec3(tvec3<U, Q> const & v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v); // -- Swizzle constructors -- # if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) - template <int E0, int E1, int E2> - GLM_FUNC_DECL tvec3(detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & that) + template<int E0, int E1, int E2> + GLM_FUNC_DECL vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& that) { *this = that(); } - template <int E0, int E1> - GLM_FUNC_DECL tvec3(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & scalar) + template<int E0, int E1> + GLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& scalar) { - *this = tvec3<T, P>(v(), scalar); + *this = vec(v(), scalar); } - template <int E0, int E1> - GLM_FUNC_DECL tvec3(T const & scalar, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v) + template<int E0, int E1> + GLM_FUNC_DECL vec(T const& scalar, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) { - *this = tvec3<T, P>(scalar, v()); + *this = vec(scalar, v()); } # endif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) // -- Unary arithmetic operators -- - GLM_FUNC_DECL tvec3<T, P> & operator=(tvec3<T, P> const & v) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator+=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator+=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator+=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator-=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator-=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator-=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator*=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator*=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator*=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator/=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator/=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator/=(tvec3<U, P> const & v); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec const& v) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator+=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator+=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator-=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator-=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator*=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator*=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator/=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator/=(vec<3, U, Q> const& v); // -- Increment and decrement operators -- - GLM_FUNC_DECL tvec3<T, P> & operator++(); - GLM_FUNC_DECL tvec3<T, P> & operator--(); - GLM_FUNC_DECL tvec3<T, P> operator++(int); - GLM_FUNC_DECL tvec3<T, P> operator--(int); + GLM_FUNC_DECL vec & operator++(); + GLM_FUNC_DECL vec & operator--(); + GLM_FUNC_DECL vec operator++(int); + GLM_FUNC_DECL vec operator--(int); // -- Unary bit operators -- - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator%=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator%=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator%=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator&=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator&=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator&=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator|=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator|=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator|=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator^=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator^=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator^=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator<<=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator<<=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator<<=(tvec3<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator>>=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator>>=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec3<T, P> & operator>>=(tvec3<U, P> const & v); + template<typename U> + GLM_FUNC_DECL vec & operator%=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator%=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator&=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator&=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator|=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator|=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator^=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator^=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(vec<3, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(vec<3, U, Q> const& v); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator/(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator/(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator/(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator%(T const & scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator%(T const& scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator%(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator%(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator&(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator&(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator&(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator|(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator|(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator|(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator^(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator^(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator^(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator<<(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator<<(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator<<(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator>>(T scalar, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator>>(tvec1<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator>>(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator~(tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator~(vec<3, T, Q> const& v); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tvec3<T, P> const & v1, tvec3<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec3<bool, P> operator&&(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec3<bool, P> operator||(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_vec3.inl b/external/include/glm/detail/type_vec3.inl index d84299d..15fd483 100644 --- a/external/include/glm/detail/type_vec3.inl +++ b/external/include/glm/detail/type_vec3.inl @@ -3,151 +3,121 @@ namespace glm { - -# ifdef GLM_STATIC_CONST_MEMBERS - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::ZERO(static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::X(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::Y(static_cast<T>(0), static_cast<T>(1), static_cast<T>(0)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::Z(static_cast<T>(0), static_cast<T>(0), static_cast<T>(1)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::XY(static_cast<T>(1), static_cast<T>(1), static_cast<T>(0)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::XZ(static_cast<T>(1), static_cast<T>(0), static_cast<T>(1)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::YZ(static_cast<T>(0), static_cast<T>(1), static_cast<T>(1)); - - template <typename T, precision P> - const tvec3<T, P> tvec3<T, P>::XYZ(static_cast<T>(1), static_cast<T>(1), static_cast<T>(1)); -# endif // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3() -# ifndef GLM_FORCE_NO_CTOR_INIT +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec() +# ifdef GLM_FORCE_CTOR_INIT : x(0), y(0), z(0) # endif {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS +# endif//!GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, T, Q> const& v) : x(v.x), y(v.y), z(v.z) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec3<T, Q> const & v) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, T, P> const& v) : x(v.x), y(v.y), z(v.z) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(T scalar) : x(scalar), y(scalar), z(scalar) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(T a, T b, T c) - : x(a), y(b), z(c) + template <typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(T _x, T _y, T _z) + : x(_x), y(_y), z(_z) {} // -- Conversion scalar constructors -- - template <typename T, precision P> - template <typename A, typename B, typename C> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(A a, B b, C c) : - x(static_cast<T>(a)), - y(static_cast<T>(b)), - z(static_cast<T>(c)) + template<typename T, qualifier Q> + template<typename X, typename Y, typename Z> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(X _x, Y _y, Z _z) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_y)) + , z(static_cast<T>(_z)) {} - template <typename T, precision P> - template <typename A, typename B, typename C> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c) : - x(static_cast<T>(a)), - y(static_cast<T>(b)), - z(static_cast<T>(c)) + template<typename T, qualifier Q> + template<typename X, typename Y, typename Z> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_y)) + , z(static_cast<T>(_z)) {} // -- Conversion vector constructors -- - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec2<A, Q> const & a, B b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(b)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z) + : x(static_cast<T>(_xy.x)) + , y(static_cast<T>(_xy.y)) + , z(static_cast<T>(_z)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec2<A, Q> const & a, tvec1<B, Q> const & b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(b.x)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z) + : x(static_cast<T>(_xy.x)) + , y(static_cast<T>(_xy.y)) + , z(static_cast<T>(_z.x)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(A a, tvec2<B, Q> const & b) : - x(static_cast<T>(a)), - y(static_cast<T>(b.x)), - z(static_cast<T>(b.y)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_yz.x)) + , z(static_cast<T>(_yz.y)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec1<A, Q> const & a, tvec2<B, Q> const & b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(b.x)), - z(static_cast<T>(b.y)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_yz.x)) + , z(static_cast<T>(_yz.y)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec3<U, Q> const & v) : - x(static_cast<T>(v.x)), - y(static_cast<T>(v.y)), - z(static_cast<T>(v.z)) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, U, P> const& v) + : x(static_cast<T>(v.x)) + , y(static_cast<T>(v.y)) + , z(static_cast<T>(v.z)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec3<T, P>::tvec3(tvec4<U, Q> const & v) : - x(static_cast<T>(v.x)), - y(static_cast<T>(v.y)), - z(static_cast<T>(v.z)) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast<T>(v.x)) + , y(static_cast<T>(v.y)) + , z(static_cast<T>(v.z)) {} // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T & tvec3<T, P>::operator[](typename tvec3<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&x)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T const & tvec3<T, P>::operator[](typename tvec3<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&x)[i]; @@ -156,8 +126,8 @@ namespace glm // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator=(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v) { this->x = v.x; this->y = v.y; @@ -166,9 +136,9 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v) { this->x = static_cast<T>(v.x); this->y = static_cast<T>(v.y); @@ -176,9 +146,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator+=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar) { this->x += static_cast<T>(scalar); this->y += static_cast<T>(scalar); @@ -186,9 +156,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator+=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v) { this->x += static_cast<T>(v.x); this->y += static_cast<T>(v.x); @@ -196,9 +166,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator+=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v) { this->x += static_cast<T>(v.x); this->y += static_cast<T>(v.y); @@ -206,9 +176,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator-=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar) { this->x -= static_cast<T>(scalar); this->y -= static_cast<T>(scalar); @@ -216,9 +186,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator-=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v) { this->x -= static_cast<T>(v.x); this->y -= static_cast<T>(v.x); @@ -226,9 +196,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator-=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v) { this->x -= static_cast<T>(v.x); this->y -= static_cast<T>(v.y); @@ -236,9 +206,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator*=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar) { this->x *= static_cast<T>(scalar); this->y *= static_cast<T>(scalar); @@ -246,9 +216,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator*=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v) { this->x *= static_cast<T>(v.x); this->y *= static_cast<T>(v.x); @@ -256,9 +226,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator*=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v) { this->x *= static_cast<T>(v.x); this->y *= static_cast<T>(v.y); @@ -266,9 +236,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator/=(U v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(U v) { this->x /= static_cast<T>(v); this->y /= static_cast<T>(v); @@ -276,9 +246,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator/=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v) { this->x /= static_cast<T>(v.x); this->y /= static_cast<T>(v.x); @@ -286,9 +256,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator/=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v) { this->x /= static_cast<T>(v.x); this->y /= static_cast<T>(v.y); @@ -298,8 +268,8 @@ namespace glm // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator++() { ++this->x; ++this->y; @@ -307,8 +277,8 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator--() { --this->x; --this->y; @@ -316,27 +286,27 @@ namespace glm return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> tvec3<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> vec<3, T, Q>::operator++(int) { - tvec3<T, P> Result(*this); + vec<3, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> tvec3<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> vec<3, T, Q>::operator--(int) { - tvec3<T, P> Result(*this); + vec<3, T, Q> Result(*this); --*this; return Result; } // -- Unary bit operators -- - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator%=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar) { this->x %= scalar; this->y %= scalar; @@ -344,9 +314,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator%=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v) { this->x %= v.x; this->y %= v.x; @@ -354,9 +324,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator%=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v) { this->x %= v.x; this->y %= v.y; @@ -364,9 +334,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator&=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar) { this->x &= scalar; this->y &= scalar; @@ -374,9 +344,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator&=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v) { this->x &= v.x; this->y &= v.x; @@ -384,9 +354,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator&=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v) { this->x &= v.x; this->y &= v.y; @@ -394,9 +364,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator|=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar) { this->x |= scalar; this->y |= scalar; @@ -404,9 +374,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator|=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v) { this->x |= v.x; this->y |= v.x; @@ -414,9 +384,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator|=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v) { this->x |= v.x; this->y |= v.y; @@ -424,9 +394,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator^=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar) { this->x ^= scalar; this->y ^= scalar; @@ -434,9 +404,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator^=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v) { this->x ^= v.x; this->y ^= v.x; @@ -444,9 +414,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator^=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v) { this->x ^= v.x; this->y ^= v.y; @@ -454,9 +424,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator<<=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar) { this->x <<= scalar; this->y <<= scalar; @@ -464,9 +434,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator<<=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v) { this->x <<= static_cast<T>(v.x); this->y <<= static_cast<T>(v.x); @@ -474,9 +444,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator<<=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v) { this->x <<= static_cast<T>(v.x); this->y <<= static_cast<T>(v.y); @@ -484,9 +454,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator>>=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar) { this->x >>= static_cast<T>(scalar); this->y >>= static_cast<T>(scalar); @@ -494,9 +464,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator>>=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v) { this->x >>= static_cast<T>(v.x); this->y >>= static_cast<T>(v.x); @@ -504,9 +474,9 @@ namespace glm return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec3<T, P> & tvec3<T, P>::operator>>=(tvec3<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v) { this->x >>= static_cast<T>(v.x); this->y >>= static_cast<T>(v.y); @@ -516,198 +486,198 @@ namespace glm // -- Unary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v) { return v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v) { - return tvec3<T, P>( - -v.x, - -v.y, + return vec<3, T, Q>( + -v.x, + -v.y, -v.z); } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x + scalar, v.y + scalar, v.z + scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x + scalar.x, v.y + scalar.x, v.z + scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar + v.x, scalar + v.y, scalar + v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x + v.x, scalar.x + v.y, scalar.x + v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x - scalar, v.y - scalar, v.z - scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x - scalar.x, v.y - scalar.x, v.z - scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar - v.x, scalar - v.y, scalar - v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x - v.x, scalar.x - v.y, scalar.x - v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x * scalar, v.y * scalar, v.z * scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x * scalar.x, v.y * scalar.x, v.z * scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar * v.x, scalar * v.y, scalar * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x * v.x, scalar.x * v.y, scalar.x * v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x * v2.x, v1.y * v2.y, v1.z * v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x / scalar, v.y / scalar, v.z / scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x / scalar.x, v.y / scalar.x, v.z / scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator/(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar / v.x, scalar / v.y, scalar / v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x / v.x, scalar.x / v.y, scalar.x / v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x / v2.x, v1.y / v2.y, v1.z / v2.z); @@ -715,280 +685,280 @@ namespace glm // -- Binary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x % scalar, v.y % scalar, v.z % scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x % scalar.x, v.y % scalar.x, v.z % scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator%(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar % v.x, scalar % v.y, scalar % v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x % v.x, scalar.x % v.y, scalar.x % v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x % v2.x, v1.y % v2.y, v1.z % v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x & scalar, v.y & scalar, v.z & scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x & scalar.x, v.y & scalar.x, v.z & scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator&(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar & v.x, scalar & v.y, scalar & v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x & v.x, scalar.x & v.y, scalar.x & v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x & v2.x, v1.y & v2.y, v1.z & v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x | scalar, v.y | scalar, v.z | scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x | scalar.x, v.y | scalar.x, v.z | scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator|(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar | v.x, scalar | v.y, scalar | v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x | v.x, scalar.x | v.y, scalar.x | v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x | v2.x, v1.y | v2.y, v1.z | v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x ^ scalar, v.y ^ scalar, v.z ^ scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x ^ scalar.x, v.y ^ scalar.x, v.z ^ scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator^(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar ^ v.x, scalar ^ v.y, scalar ^ v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x ^ v.x, scalar.x ^ v.y, scalar.x ^ v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x ^ v2.x, v1.y ^ v2.y, v1.z ^ v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x << scalar, v.y << scalar, v.z << scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x << scalar.x, v.y << scalar.x, v.z << scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator<<(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar << v.x, scalar << v.y, scalar << v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x << v.x, scalar.x << v.y, scalar.x << v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x << v2.x, v1.y << v2.y, v1.z << v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec3<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x >> scalar, v.y >> scalar, v.z >> scalar); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec3<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec3<T, P>( + return vec<3, T, Q>( v.x >> scalar.x, v.y >> scalar.x, v.z >> scalar.x); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator>>(T scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar >> v.x, scalar >> v.y, scalar >> v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec1<T, P> const & scalar, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( scalar.x >> v.x, scalar.x >> v.y, scalar.x >> v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return tvec3<T, P>( + return vec<3, T, Q>( v1.x >> v2.x, v1.y >> v2.y, v1.z >> v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator~(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator~(vec<3, T, Q> const& v) { - return tvec3<T, P>( + return vec<3, T, Q>( ~v.x, ~v.y, ~v.z); @@ -996,27 +966,30 @@ namespace glm // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z); + return + detail::compute_equal<T>::call(v1.x, v2.x) && + detail::compute_equal<T>::call(v1.y, v2.y) && + detail::compute_equal<T>::call(v1.z, v2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tvec3<T, P> const & v1, tvec3<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) { - return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z); + return !(v1 == v2); } - template <precision P> - GLM_FUNC_QUALIFIER tvec3<bool, P> operator&&(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) { - return tvec3<bool, P>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z); + return vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z); } - template <precision P> - GLM_FUNC_QUALIFIER tvec3<bool, P> operator||(tvec3<bool, P> const & v1, tvec3<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) { - return tvec3<bool, P>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z); + return vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z); } }//namespace glm diff --git a/external/include/glm/detail/type_vec4.hpp b/external/include/glm/detail/type_vec4.hpp index 5e89b74..43395ca 100644 --- a/external/include/glm/detail/type_vec4.hpp +++ b/external/include/glm/detail/type_vec4.hpp @@ -15,14 +15,14 @@ namespace glm { - template <typename T, precision P = defaultp> - struct tvec4 + template<typename T, qualifier Q> + struct vec<4, T, Q> { // -- Implementation detail -- typedef T value_type; - typedef tvec4<T, P> type; - typedef tvec4<bool, P> bool_type; + typedef vec<4, T, Q> type; + typedef vec<4, bool, Q> bool_type; // -- Data -- @@ -46,18 +46,18 @@ namespace glm struct { T r, g, b, a; }; struct { T s, t, p, q; }; - typename detail::storage<T, sizeof(T) * 4, detail::is_aligned<P>::value>::type data; + typename detail::storage<T, sizeof(T) * 4, detail::is_aligned<Q>::value>::type data; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - _GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, x, y, z, w) - _GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, r, g, b, a) - _GLM_SWIZZLE4_2_MEMBERS(T, P, glm::tvec2, s, t, p, q) - _GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, x, y, z, w) - _GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, r, g, b, a) - _GLM_SWIZZLE4_3_MEMBERS(T, P, glm::tvec3, s, t, p, q) - _GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, x, y, z, w) - _GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, r, g, b, a) - _GLM_SWIZZLE4_4_MEMBERS(T, P, glm::tvec4, s, t, p, q) + GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q) + GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w) + GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a) + GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q) # endif//GLM_SWIZZLE }; @@ -74,7 +74,7 @@ namespace glm union { T w, a, q; }; # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P, tvec4, tvec2, tvec3, tvec4) + GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) # endif//GLM_SWIZZLE # endif @@ -82,371 +82,370 @@ namespace glm /// Return the count of components of the vector typedef length_t length_type; - GLM_FUNC_DECL static length_type length(){return 4;} + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} GLM_FUNC_DECL T & operator[](length_type i); - GLM_FUNC_DECL T const & operator[](length_type i) const; + GLM_FUNC_DECL T const& operator[](length_type i) const; // -- Implicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(tvec4<T, P> const& v) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(tvec4<T, Q> const& v); + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec<4, T, Q> const& v) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec<4, T, P> const& v); // -- Explicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit tvec4(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit tvec4(T scalar); - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(T a, T b, T c, T d); + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit vec(T scalar); + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(T x, T y, T z, T w); // -- Conversion scalar constructors -- - /// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, typename D> - GLM_FUNC_DECL GLM_CONSTEXPR_SIMD tvec4(A a, B b, C c, D d); - template <typename A, typename B, typename C, typename D> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, P> const& a, tvec1<B, P> const& b, tvec1<C, P> const& c, tvec1<D, P> const& d); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename X, typename Y, typename Z, typename W> + GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(X _x, Y _y, Z _z, W _w); + template<typename X, typename Y, typename Z, typename W> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); // -- Conversion vector constructors -- /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, B b, C c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, B _z, C _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, tvec1<B, Q> const & b, tvec1<C, Q> const & c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, tvec2<B, Q> const & b, C c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<2, B, P> const& _yz, C _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec2<B, Q> const & b, tvec1<C, Q> const & c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, B b, tvec2<C, Q> const & c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, B _y, vec<2, C, P> const& _zw); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec1<B, Q> const & b, tvec2<C, Q> const & c); + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec3<A, Q> const & a, B b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, A, P> const& _xyz, B _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec3<A, Q> const & a, tvec1<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(A a, tvec3<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<3, B, P> const& _yzw); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec1<A, Q> const & a, tvec3<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename A, typename B, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR tvec4(tvec2<A, Q> const & a, tvec2<B, Q> const & b); + template<typename A, typename B, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw); /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT tvec4(tvec4<U, Q> const& v); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v); // -- Swizzle constructors -- # if GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) - template <int E0, int E1, int E2, int E3> - GLM_FUNC_DECL tvec4(detail::_swizzle<4, T, P, glm::tvec4, E0, E1, E2, E3> const & that) + template<int E0, int E1, int E2, int E3> + GLM_FUNC_DECL vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that) { *this = that(); } - template <int E0, int E1, int F0, int F1> - GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, detail::_swizzle<2, T, P, glm::tvec2, F0, F1, -1, -2> const & u) + template<int E0, int E1, int F0, int F1> + GLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u) { - *this = tvec4<T, P>(v(), u()); + *this = vec<4, T, Q>(v(), u()); } - template <int E0, int E1> - GLM_FUNC_DECL tvec4(T const & x, T const & y, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v) + template<int E0, int E1> + GLM_FUNC_DECL vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) { - *this = tvec4<T, P>(x, y, v()); + *this = vec<4, T, Q>(x, y, v()); } - template <int E0, int E1> - GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & w) + template<int E0, int E1> + GLM_FUNC_DECL vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w) { - *this = tvec4<T, P>(x, v(), w); + *this = vec<4, T, Q>(x, v(), w); } - template <int E0, int E1> - GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, glm::tvec2, E0, E1, -1, -2> const & v, T const & z, T const & w) + template<int E0, int E1> + GLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w) { - *this = tvec4<T, P>(v(), z, w); + *this = vec<4, T, Q>(v(), z, w); } - template <int E0, int E1, int E2> - GLM_FUNC_DECL tvec4(detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & v, T const & w) + template<int E0, int E1, int E2> + GLM_FUNC_DECL vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w) { - *this = tvec4<T, P>(v(), w); + *this = vec<4, T, Q>(v(), w); } - template <int E0, int E1, int E2> - GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<3, T, P, glm::tvec3, E0, E1, E2, -1> const & v) + template<int E0, int E1, int E2> + GLM_FUNC_DECL vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v) { - *this = tvec4<T, P>(x, v()); + *this = vec<4, T, Q>(x, v()); } # endif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED) // -- Unary arithmetic operators -- - GLM_FUNC_DECL tvec4<T, P> & operator=(tvec4<T, P> const & v) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator+=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator-=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator*=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec1<U, P> const& v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec4<U, P> const& v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator/=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec4<U, P> const & v); + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec<4, T, Q>& operator=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator+=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator+=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator+=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator-=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator-=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator-=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator*=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator*=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator*=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator/=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator/=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q>& operator/=(vec<4, U, Q> const& v); // -- Increment and decrement operators -- - GLM_FUNC_DECL tvec4<T, P> & operator++(); - GLM_FUNC_DECL tvec4<T, P> & operator--(); - GLM_FUNC_DECL tvec4<T, P> operator++(int); - GLM_FUNC_DECL tvec4<T, P> operator--(int); + GLM_FUNC_DECL vec<4, T, Q> & operator++(); + GLM_FUNC_DECL vec<4, T, Q> & operator--(); + GLM_FUNC_DECL vec<4, T, Q> operator++(int); + GLM_FUNC_DECL vec<4, T, Q> operator--(int); // -- Unary bit operators -- - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator%=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator&=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator|=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator^=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator<<=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec4<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator>>=(U scalar); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec1<U, P> const & v); - template <typename U> - GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec4<U, P> const & v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator%=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator%=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator%=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator&=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator&=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator&=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator|=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator|=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator|=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator^=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator^=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator^=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator<<=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator>>=(U scalar); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v); }; // -- Unary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(tvec1<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(tvec1<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec1<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec1<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator/(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator/(tvec1<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator%(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator%(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator&(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator&(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator|(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator|(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator^(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator^(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator<<(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator<<(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, T scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, tvec1<T, P> const & scalar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator>>(T scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator>>(tvec1<T, P> const & scalar, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator~(tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator~(vec<4, T, Q> const& v); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec4<bool, P> operator&&(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); - template <precision P> - GLM_FUNC_DECL tvec4<bool, P> operator||(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2); + template<qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); }//namespace glm #ifndef GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/detail/type_vec4.inl b/external/include/glm/detail/type_vec4.inl index b10a662..972cb4e 100644 --- a/external/include/glm/detail/type_vec4.inl +++ b/external/include/glm/detail/type_vec4.inl @@ -4,335 +4,335 @@ namespace glm{ namespace detail { - template <typename T> + template<typename T> struct is_int { enum test {value = 0}; }; - template <> + template<> struct is_int<uint32> { enum test {value = ~0}; }; - template <> + template<> struct is_int<int32> { enum test {value = ~0}; }; - template <> + template<> struct is_int<uint64> { enum test {value = ~0}; }; - template <> + template<> struct is_int<int64> { enum test {value = ~0}; }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_vec4_add { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); + return vec<4, T, Q>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_vec4_sub { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); + return vec<4, T, Q>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_vec4_mul { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); + return vec<4, T, Q>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_vec4_div { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); + return vec<4, T, Q>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_vec4_mod { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w); + return vec<4, T, Q>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_and { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w); + return vec<4, T, Q>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_or { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w); + return vec<4, T, Q>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_xor { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w); + return vec<4, T, Q>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_shift_left { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w); + return vec<4, T, Q>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_shift_right { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & a, tvec4<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - return tvec4<T, P>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w); + return vec<4, T, Q>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_equal { - GLM_FUNC_QUALIFIER static bool call(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + GLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z) && (v1.w == v2.w); + return + detail::compute_equal<T>::call(v1.x, v2.x) && + detail::compute_equal<T>::call(v1.y, v2.y) && + detail::compute_equal<T>::call(v1.z, v2.z) && + detail::compute_equal<T>::call(v1.w, v2.w); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_nequal { - GLM_FUNC_QUALIFIER static bool call(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + GLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z) || (v1.w != v2.w); + return !compute_vec4_equal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2); } }; - template <typename T, precision P, int IsInt, std::size_t Size, bool Aligned> + template<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned> struct compute_vec4_bitwise_not { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& v) { - return tvec4<T, P>(~v.x, ~v.y, ~v.z, ~v.w); + return vec<4, T, Q>(~v.x, ~v.y, ~v.z, ~v.w); } }; }//namespace detail // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4() -# ifndef GLM_FORCE_NO_CTOR_INIT +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec() +# ifdef GLM_FORCE_CTOR_INIT : x(0), y(0), z(0), w(0) # endif {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS +# endif//!GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(vec<4, T, Q> const& v) : x(v.x), y(v.y), z(v.z), w(v.w) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(tvec4<T, Q> const & v) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(vec<4, T, P> const& v) : x(v.x), y(v.y), z(v.z), w(v.w) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(T scalar) : x(scalar), y(scalar), z(scalar), w(scalar) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(T a, T b, T c, T d) - : x(a), y(b), z(c), w(d) + template <typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(T _x, T _y, T _z, T _w) + : x(_x), y(_y), z(_z), w(_w) {} // -- Conversion scalar constructors -- - template <typename T, precision P> - template <typename A, typename B, typename C, typename D> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<T, P>::tvec4(A a, B b, C c, D d) : - x(static_cast<T>(a)), - y(static_cast<T>(b)), - z(static_cast<T>(c)), - w(static_cast<T>(d)) + template<typename T, qualifier Q> + template<typename X, typename Y, typename Z, typename W> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(X _x, Y _y, Z _z, W _w) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_y)) + , z(static_cast<T>(_z)) + , w(static_cast<T>(_w)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, typename D> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c, tvec1<D, P> const & d) : - x(static_cast<T>(a.x)), - y(static_cast<T>(b.x)), - z(static_cast<T>(c.x)), - w(static_cast<T>(d.x)) + template<typename T, qualifier Q> + template<typename X, typename Y, typename Z, typename W> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_y.x)) + , z(static_cast<T>(_z.x)) + , w(static_cast<T>(_w.x)) {} // -- Conversion vector constructors -- - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, B b, C c) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(b)), - w(static_cast<T>(c)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, C _w) + : x(static_cast<T>(_xy.x)) + , y(static_cast<T>(_xy.y)) + , z(static_cast<T>(_z)) + , w(static_cast<T>(_w)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, tvec1<B, Q> const & b, tvec1<C, Q> const & c) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(b.x)), - w(static_cast<T>(c.x)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w) + : x(static_cast<T>(_xy.x)) + , y(static_cast<T>(_xy.y)) + , z(static_cast<T>(_z.x)) + , w(static_cast<T>(_w.x)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A s1, tvec2<B, Q> const & v, C s2) : - x(static_cast<T>(s1)), - y(static_cast<T>(v.x)), - z(static_cast<T>(v.y)), - w(static_cast<T>(s2)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, C _w) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_yz.x)) + , z(static_cast<T>(_yz.y)) + , w(static_cast<T>(_w)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec2<B, Q> const & b, tvec1<C, Q> const & c) : - x(static_cast<T>(a.x)), - y(static_cast<T>(b.x)), - z(static_cast<T>(b.y)), - w(static_cast<T>(c.x)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_yz.x)) + , z(static_cast<T>(_yz.y)) + , w(static_cast<T>(_w.x)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A s1, B s2, tvec2<C, Q> const & v) : - x(static_cast<T>(s1)), - y(static_cast<T>(s2)), - z(static_cast<T>(v.x)), - w(static_cast<T>(v.y)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, B _y, vec<2, C, P> const& _zw) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_y)) + , z(static_cast<T>(_zw.x)) + , w(static_cast<T>(_zw.y)) {} - template <typename T, precision P> - template <typename A, typename B, typename C, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec1<B, Q> const & b, tvec2<C, Q> const & c) : - x(static_cast<T>(a.x)), - y(static_cast<T>(b.x)), - z(static_cast<T>(c.x)), - w(static_cast<T>(c.y)) + template<typename T, qualifier Q> + template<typename A, typename B, typename C, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_y.x)) + , z(static_cast<T>(_zw.x)) + , w(static_cast<T>(_zw.y)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec3<A, Q> const & a, B b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(a.z)), - w(static_cast<T>(b)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, B _w) + : x(static_cast<T>(_xyz.x)) + , y(static_cast<T>(_xyz.y)) + , z(static_cast<T>(_xyz.z)) + , w(static_cast<T>(_w)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec3<A, Q> const & a, tvec1<B, Q> const & b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(a.z)), - w(static_cast<T>(b.x)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w) + : x(static_cast<T>(_xyz.x)) + , y(static_cast<T>(_xyz.y)) + , z(static_cast<T>(_xyz.z)) + , w(static_cast<T>(_w.x)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(A a, tvec3<B, Q> const & b) : - x(static_cast<T>(a)), - y(static_cast<T>(b.x)), - z(static_cast<T>(b.y)), - w(static_cast<T>(b.z)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, vec<3, B, P> const& _yzw) + : x(static_cast<T>(_x)) + , y(static_cast<T>(_yzw.x)) + , z(static_cast<T>(_yzw.y)) + , w(static_cast<T>(_yzw.z)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec1<A, Q> const & a, tvec3<B, Q> const & b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(b.x)), - z(static_cast<T>(b.y)), - w(static_cast<T>(b.z)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw) + : x(static_cast<T>(_x.x)) + , y(static_cast<T>(_yzw.x)) + , z(static_cast<T>(_yzw.y)) + , w(static_cast<T>(_yzw.z)) {} - template <typename T, precision P> - template <typename A, typename B, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec2<A, Q> const & a, tvec2<B, Q> const & b) : - x(static_cast<T>(a.x)), - y(static_cast<T>(a.y)), - z(static_cast<T>(b.x)), - w(static_cast<T>(b.y)) + template<typename T, qualifier Q> + template<typename A, typename B, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw) + : x(static_cast<T>(_xy.x)) + , y(static_cast<T>(_xy.y)) + , z(static_cast<T>(_zw.x)) + , w(static_cast<T>(_zw.y)) {} - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tvec4<T, P>::tvec4(tvec4<U, Q> const & v) : - x(static_cast<T>(v.x)), - y(static_cast<T>(v.y)), - z(static_cast<T>(v.z)), - w(static_cast<T>(v.w)) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<4, U, P> const& v) + : x(static_cast<T>(v.x)) + , y(static_cast<T>(v.y)) + , z(static_cast<T>(v.z)) + , w(static_cast<T>(v.w)) {} // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T & tvec4<T, P>::operator[](typename tvec4<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&x)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T const & tvec4<T, P>::operator[](typename tvec4<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&x)[i]; @@ -341,8 +341,8 @@ namespace detail // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, T, Q> const& v) { this->x = v.x; this->y = v.y; @@ -352,9 +352,9 @@ namespace detail } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CXX14 vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, U, Q> const& v) { this->x = static_cast<T>(v.x); this->y = static_cast<T>(v.y); @@ -363,94 +363,94 @@ namespace detail return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(U scalar) { - return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); + return (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator+=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_add<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(U scalar) { - return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); + return (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator-=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_sub<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(U scalar) { - return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); + return (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator*=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_mul<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(U scalar) { - return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v.x))); + return (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator/=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_div<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } // -- Increment and decrement operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator++() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator++() { ++this->x; ++this->y; @@ -459,8 +459,8 @@ namespace detail return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator--() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator--() { --this->x; --this->y; @@ -469,498 +469,498 @@ namespace detail return *this; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator++(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> vec<4, T, Q>::operator++(int) { - tvec4<T, P> Result(*this); + vec<4, T, Q> Result(*this); ++*this; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator--(int) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> vec<4, T, Q>::operator--(int) { - tvec4<T, P> Result(*this); + vec<4, T, Q> Result(*this); --*this; return Result; } // -- Unary bit operators -- - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(U scalar) { - return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(tvec1<U, P> const& v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator%=(tvec4<U, P> const& v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_mod<T, P, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(U scalar) { - return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator&=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_and<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(U scalar) { - return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator|=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_or<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(U scalar) { - return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator^=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_xor<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(U scalar) { - return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator<<=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_shift_left<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(U scalar) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(U scalar) { - return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(scalar))); + return (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(tvec1<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<1, U, Q> const& v) { - return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tvec4<T, P> & tvec4<T, P>::operator>>=(tvec4<U, P> const & v) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<4, U, Q> const& v) { - return (*this = detail::compute_vec4_shift_right<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(*this, tvec4<T, P>(v))); + return (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v))); } // -- Unary constant operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v) { return v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v) { - return tvec4<T, P>(0) -= v; + return vec<4, T, Q>(0) -= v; } // -- Binary arithmetic operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar) { - return tvec4<T, P>(v) += scalar; + return vec<4, T, Q>(v) += scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) += v2; + return vec<4, T, Q>(v1) += v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(v) += scalar; + return vec<4, T, Q>(v) += scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v2) += v1; + return vec<4, T, Q>(v2) += v1; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) += v2; + return vec<4, T, Q>(v1) += v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar) { - return tvec4<T, P>(v) -= scalar; + return vec<4, T, Q>(v) -= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) -= v2; + return vec<4, T, Q>(v1) -= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) -= v; + return vec<4, T, Q>(scalar) -= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) -= v2; + return vec<4, T, Q>(v1.x) -= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) -= v2; + return vec<4, T, Q>(v1) -= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar) { - return tvec4<T, P>(v) *= scalar; + return vec<4, T, Q>(v) *= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) *= v2; + return vec<4, T, Q>(v1) *= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(v) *= scalar; + return vec<4, T, Q>(v) *= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v2) *= v1; + return vec<4, T, Q>(v2) *= v1; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) *= v2; + return vec<4, T, Q>(v1) *= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar) { - return tvec4<T, P>(v) /= scalar; + return vec<4, T, Q>(v) /= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) /= v2; + return vec<4, T, Q>(v1) /= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator/(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) /= v; + return vec<4, T, Q>(scalar) /= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) /= v2; + return vec<4, T, Q>(v1.x) /= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) /= v2; + return vec<4, T, Q>(v1) /= v2; } // -- Binary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) %= scalar; + return vec<4, T, Q>(v) %= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) %= v2.x; + return vec<4, T, Q>(v1) %= v2.x; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator%(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) %= v; + return vec<4, T, Q>(scalar) %= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec1<T, P> const & scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar.x) %= v; + return vec<4, T, Q>(scalar.x) %= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) %= v2; + return vec<4, T, Q>(v1) %= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) &= scalar; + return vec<4, T, Q>(v) &= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v, tvec1<T, P> const & scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar) { - return tvec4<T, P>(v) &= scalar; + return vec<4, T, Q>(v) &= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator&(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) &= v; + return vec<4, T, Q>(scalar) &= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) &= v2; + return vec<4, T, Q>(v1.x) &= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) &= v2; + return vec<4, T, Q>(v1) &= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) |= scalar; + return vec<4, T, Q>(v) |= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) |= v2.x; + return vec<4, T, Q>(v1) |= v2.x; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator|(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) |= v; + return vec<4, T, Q>(scalar) |= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) |= v2; + return vec<4, T, Q>(v1.x) |= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) |= v2; + return vec<4, T, Q>(v1) |= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) ^= scalar; + return vec<4, T, Q>(v) ^= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) ^= v2.x; + return vec<4, T, Q>(v1) ^= v2.x; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator^(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) ^= v; + return vec<4, T, Q>(scalar) ^= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) ^= v2; + return vec<4, T, Q>(v1.x) ^= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) ^= v2; + return vec<4, T, Q>(v1) ^= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) <<= scalar; + return vec<4, T, Q>(v) <<= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) <<= v2.x; + return vec<4, T, Q>(v1) <<= v2.x; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) <<= v; + return vec<4, T, Q>(scalar) <<= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) <<= v2; + return vec<4, T, Q>(v1.x) <<= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) <<= v2; + return vec<4, T, Q>(v1) <<= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v, T scalar) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar) { - return tvec4<T, P>(v) >>= scalar; + return vec<4, T, Q>(v) >>= scalar; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec1<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2) { - return tvec4<T, P>(v1) >>= v2.x; + return vec<4, T, Q>(v1) >>= v2.x; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(T scalar, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v) { - return tvec4<T, P>(scalar) >>= v; + return vec<4, T, Q>(scalar) >>= v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec1<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1.x) >>= v2; + return vec<4, T, Q>(v1.x) >>= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return tvec4<T, P>(v1) >>= v2; + return vec<4, T, Q>(v1) >>= v2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator~(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator~(vec<4, T, Q> const& v) { - return detail::compute_vec4_bitwise_not<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v); + return detail::compute_vec4_bitwise_not<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return detail::compute_vec4_equal<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v1, v2); + return detail::compute_vec4_equal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2) { - return detail::compute_vec4_nequal<T, P, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<P>::value>::call(v1, v2); + return detail::compute_vec4_nequal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2); } - template <precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> operator&&(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) { - return tvec4<bool, P>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); + return vec<4, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w); } - template <precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> operator||(tvec4<bool, P> const & v1, tvec4<bool, P> const & v2) + template<qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2) { - return tvec4<bool, P>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); + return vec<4, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w); } }//namespace glm diff --git a/external/include/glm/detail/type_vec4_simd.inl b/external/include/glm/detail/type_vec4_simd.inl index 90652fd..adfb20c 100644 --- a/external/include/glm/detail/type_vec4_simd.inl +++ b/external/include/glm/detail/type_vec4_simd.inl @@ -7,14 +7,14 @@ namespace glm{ namespace detail { # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - template <precision P, int E0, int E1, int E2, int E3> - struct _swizzle_base1<4, float, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4> - { - GLM_FUNC_QUALIFIER tvec4<float, P> operator ()() const + template<qualifier Q, int E0, int E1, int E2, int E3> + struct _swizzle_base1<4, float, Q, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4> + { + GLM_FUNC_QUALIFIER vec<4, float, Q> operator ()() const { __m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer); - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; # if GLM_ARCH & GLM_ARCH_AVX_BIT Result.data = _mm_permute_ps(data, _MM_SHUFFLE(E3, E2, E1, E0)); # else @@ -24,457 +24,434 @@ namespace detail } }; - template <precision P, int E0, int E1, int E2, int E3> - struct _swizzle_base1<4, int32, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4> - { - GLM_FUNC_QUALIFIER tvec4<int32, P> operator ()() const + template<qualifier Q, int E0, int E1, int E2, int E3> + struct _swizzle_base1<4, int32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4> + { + GLM_FUNC_QUALIFIER vec<4, int32, Q> operator ()() const { __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); - tvec4<int32, P> Result(uninitialize); + vec<4, int32, Q> Result; Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); return Result; } }; - template <precision P, int E0, int E1, int E2, int E3> - struct _swizzle_base1<4, uint32, P, glm::tvec4, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4> - { - GLM_FUNC_QUALIFIER tvec4<uint32, P> operator ()() const + template<qualifier Q, int E0, int E1, int E2, int E3> + struct _swizzle_base1<4, uint32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4> + { + GLM_FUNC_QUALIFIER vec<4, uint32, Q> operator ()() const { __m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); - tvec4<uint32, P> Result(uninitialize); + vec<4, uint32, Q> Result; Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); return Result; } }; # endif// GLM_SWIZZLE == GLM_SWIZZLE_ENABLED - template <precision P> - struct compute_vec4_add<float, P, true> + template<qualifier Q> + struct compute_vec4_add<float, Q, true> { - static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_add_ps(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_vec4_add<double, P, true> + template<qualifier Q> + struct compute_vec4_add<double, Q, true> { - static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) { - tvec4<double, P> Result(uninitialize); + vec<4, double, Q> Result; Result.data = _mm256_add_pd(a.data, b.data); return Result; } }; # endif - template <precision P> - struct compute_vec4_sub<float, P, true> + template<qualifier Q> + struct compute_vec4_sub<float, Q, true> { - static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_sub_ps(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_vec4_sub<double, P, true> + template<qualifier Q> + struct compute_vec4_sub<double, Q, true> { - static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) { - tvec4<double, P> Result(uninitialize); + vec<4, double, Q> Result; Result.data = _mm256_sub_pd(a.data, b.data); return Result; } }; # endif - template <precision P> - struct compute_vec4_mul<float, P, true> + template<qualifier Q> + struct compute_vec4_mul<float, Q, true> { - static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_mul_ps(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_vec4_mul<double, P, true> + template<qualifier Q> + struct compute_vec4_mul<double, Q, true> { - static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) { - tvec4<double, P> Result(uninitialize); + vec<4, double, Q> Result; Result.data = _mm256_mul_pd(a.data, b.data); return Result; } }; # endif - template <precision P> - struct compute_vec4_div<float, P, true> + template<qualifier Q> + struct compute_vec4_div<float, Q, true> { - static tvec4<float, P> call(tvec4<float, P> const & a, tvec4<float, P> const & b) + static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_div_ps(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_vec4_div<double, P, true> + template<qualifier Q> + struct compute_vec4_div<double, Q, true> { - static tvec4<double, P> call(tvec4<double, P> const & a, tvec4<double, P> const & b) + static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) { - tvec4<double, P> Result(uninitialize); + vec<4, double, Q> Result; Result.data = _mm256_div_pd(a.data, b.data); return Result; } }; # endif - template <> + template<> struct compute_vec4_div<float, aligned_lowp, true> { - static tvec4<float, aligned_lowp> call(tvec4<float, aligned_lowp> const & a, tvec4<float, aligned_lowp> const & b) + static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& a, vec<4, float, aligned_lowp> const& b) { - tvec4<float, aligned_lowp> Result(uninitialize); + vec<4, float, aligned_lowp> Result; Result.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data)); return Result; } }; - template <typename T, precision P> - struct compute_vec4_and<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_and<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_and_si128(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_and<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_and<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_and_si256(a.data, b.data); return Result; } }; # endif - template <typename T, precision P> - struct compute_vec4_or<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_or<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_or_si128(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_or<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_or<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_or_si256(a.data, b.data); return Result; } }; # endif - template <typename T, precision P> - struct compute_vec4_xor<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_xor<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_xor_si128(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_xor<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_xor<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_xor_si256(a.data, b.data); return Result; } }; # endif - template <typename T, precision P> - struct compute_vec4_shift_left<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_shift_left<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_sll_epi32(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_shift_left<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_shift_left<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_sll_epi64(a.data, b.data); return Result; } }; # endif - template <typename T, precision P> - struct compute_vec4_shift_right<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_shift_right<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_srl_epi32(a.data, b.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_shift_right<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_shift_right<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const& a, tvec4<T, P> const& b) + static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_srl_epi64(a.data, b.data); return Result; } }; # endif - template <typename T, precision P> - struct compute_vec4_bitwise_not<T, P, true, 32, true> + template<typename T, qualifier Q> + struct compute_vec4_bitwise_not<T, Q, true, 32, true> { - static tvec4<T, P> call(tvec4<T, P> const & v) + static vec<4, T, Q> call(vec<4, T, Q> const& v) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm_xor_si128(v.data, _mm_set1_epi32(-1)); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <typename T, precision P> - struct compute_vec4_bitwise_not<T, P, true, 64, true> + template<typename T, qualifier Q> + struct compute_vec4_bitwise_not<T, Q, true, 64, true> { - static tvec4<T, P> call(tvec4<T, P> const & v) + static vec<4, T, Q> call(vec<4, T, Q> const& v) { - tvec4<T, P> Result(uninitialize); + vec<4, T, Q> Result; Result.data = _mm256_xor_si256(v.data, _mm_set1_epi32(-1)); return Result; } }; # endif - template <precision P> - struct compute_vec4_equal<float, P, false, 32, true> + template<qualifier Q> + struct compute_vec4_equal<float, Q, false, 32, true> { - static bool call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) { return _mm_movemask_ps(_mm_cmpeq_ps(v1.data, v2.data)) != 0; } }; - template <precision P> - struct compute_vec4_equal<int32, P, true, 32, true> + template<qualifier Q> + struct compute_vec4_equal<int32, Q, true, 32, true> { - static bool call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) + static bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) { return _mm_movemask_epi8(_mm_cmpeq_epi32(v1.data, v2.data)) != 0; } }; - template <precision P> - struct compute_vec4_nequal<float, P, false, 32, true> + template<qualifier Q> + struct compute_vec4_nequal<float, Q, false, 32, true> { - static bool call(tvec4<float, P> const & v1, tvec4<float, P> const & v2) + static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) { return _mm_movemask_ps(_mm_cmpneq_ps(v1.data, v2.data)) != 0; } }; - template <precision P> - struct compute_vec4_nequal<int32, P, true, 32, true> + template<qualifier Q> + struct compute_vec4_nequal<int32, Q, true, 32, true> { - static bool call(tvec4<int32, P> const & v1, tvec4<int32, P> const & v2) + static bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) { return _mm_movemask_epi8(_mm_cmpneq_epi32(v1.data, v2.data)) != 0; } }; }//namespace detail -# if !GLM_HAS_DEFAULTED_FUNCTIONS - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4() -# ifndef GLM_FORCE_NO_CTOR_INIT - : data(_mm_setzero_ps()) -# endif - {} - - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4() -# ifndef GLM_FORCE_NO_CTOR_INIT - : data(_mm_setzero_ps()) -# endif - {} - - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4() -# ifndef GLM_FORCE_NO_CTOR_INIT - : data(_mm_setzero_ps()) -# endif - {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS - - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(float s) : - data(_mm_set1_ps(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(float _s) : + data(_mm_set1_ps(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(float s) : - data(_mm_set1_ps(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(float _s) : + data(_mm_set1_ps(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(float s) : - data(_mm_set1_ps(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(float _s) : + data(_mm_set1_ps(_s)) {} # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_lowp>::tvec4(double s) : - data(_mm256_set1_pd(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_lowp>::vec(double _s) : + data(_mm256_set1_pd(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_mediump>::tvec4(double s) : - data(_mm256_set1_pd(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_mediump>::vec(double _s) : + data(_mm256_set1_pd(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<double, aligned_highp>::tvec4(double s) : - data(_mm256_set1_pd(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_highp>::vec(double _s) : + data(_mm256_set1_pd(_s)) {} # endif - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_lowp>::tvec4(int32 s) : - data(_mm_set1_epi32(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_lowp>::vec(int32 _s) : + data(_mm_set1_epi32(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_mediump>::tvec4(int32 s) : - data(_mm_set1_epi32(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_mediump>::vec(int32 _s) : + data(_mm_set1_epi32(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_highp>::tvec4(int32 s) : - data(_mm_set1_epi32(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_highp>::vec(int32 _s) : + data(_mm_set1_epi32(_s)) {} # if GLM_ARCH & GLM_ARCH_AVX2_BIT - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_lowp>::tvec4(int64 s) : - data(_mm256_set1_epi64x(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_lowp>::vec(int64 _s) : + data(_mm256_set1_epi64x(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_mediump>::tvec4(int64 s) : - data(_mm256_set1_epi64x(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_mediump>::vec(int64 _s) : + data(_mm256_set1_epi64x(_s)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int64, aligned_highp>::tvec4(int64 s) : - data(_mm256_set1_epi64x(s)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_highp>::vec(int64 _s) : + data(_mm256_set1_epi64x(_s)) {} # endif - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(float a, float b, float c, float d) : - data(_mm_set_ps(d, c, b, a)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(float a, float b, float c, float d) : - data(_mm_set_ps(d, c, b, a)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) {} - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(float a, float b, float c, float d) : - data(_mm_set_ps(d, c, b, a)) + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(float _x, float _y, float _z, float _w) : + data(_mm_set_ps(_w, _z, _y, _x)) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_lowp>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_set_epi32(d, c, b, a)) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_lowp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_mediump>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_set_epi32(d, c, b, a)) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_mediump>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<int32, aligned_highp>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_set_epi32(d, c, b, a)) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_highp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_set_epi32(_w, _z, _y, _x)) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_lowp>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x))) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_mediump>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x))) {} - template <> - template <> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD tvec4<float, aligned_highp>::tvec4(int32 a, int32 b, int32 c, int32 d) : - data(_mm_castsi128_ps(_mm_set_epi32(d, c, b, a))) + template<> + template<> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) : + data(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x))) {} }//namespace glm diff --git a/external/include/glm/exponential.hpp b/external/include/glm/exponential.hpp index f3a7842..8fac30e 100644 --- a/external/include/glm/exponential.hpp +++ b/external/include/glm/exponential.hpp @@ -1,6 +1,108 @@ /// @ref core /// @file glm/exponential.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> +/// +/// @defgroup core_func_exponential Exponential functions +/// @ingroup core +/// +/// Include <glm/exponential.hpp> to use these core features. +/// +/// These all operate component-wise. The description is per component. #pragma once -#include "detail/func_exponential.hpp" +#include "detail/type_vec1.hpp" +#include "detail/type_vec2.hpp" +#include "detail/type_vec3.hpp" +#include "detail/type_vec4.hpp" +#include <cmath> + +namespace glm +{ + /// @addtogroup core_func_exponential + /// @{ + + /// Returns 'base' raised to the power 'exponent'. + /// + /// @param base Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @param exponent Floating point value representing the 'exponent'. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml">GLSL pow man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> pow(vec<L, T, Q> const& base, vec<L, T, Q> const& exponent); + + /// Returns the natural exponentiation of x, i.e., e^x. + /// + /// @param v exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml">GLSL exp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> exp(vec<L, T, Q> const& v); + + /// Returns the natural logarithm of v, i.e., + /// returns the value y which satisfies the equation x = e^y. + /// Results are undefined if v <= 0. + /// + /// @param v log function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml">GLSL log man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> log(vec<L, T, Q> const& v); + + /// Returns 2 raised to the v power. + /// + /// @param v exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml">GLSL exp2 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> exp2(vec<L, T, Q> const& v); + + /// Returns the base 2 log of x, i.e., returns the value y, + /// which satisfies the equation x = 2 ^ y. + /// + /// @param v log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml">GLSL log2 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> log2(vec<L, T, Q> const& v); + + /// Returns the positive square root of v. + /// + /// @param v sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml">GLSL sqrt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> sqrt(vec<L, T, Q> const& v); + + /// Returns the reciprocal of the positive square root of v. + /// + /// @param v inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml">GLSL inversesqrt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> inversesqrt(vec<L, T, Q> const& v); + + /// @} +}//namespace glm + +#include "detail/func_exponential.inl" diff --git a/external/include/glm/ext.hpp b/external/include/glm/ext.hpp index 0c9f9f9..1f74f3c 100644 --- a/external/include/glm/ext.hpp +++ b/external/include/glm/ext.hpp @@ -1,29 +1,8 @@ /// @file glm/ext.hpp /// /// @ref core (Dependence) -/// -/// @defgroup gtc GTC Extensions (Stable) -/// -/// @brief Functions and types that the GLSL specification doesn't define, but useful to have for a C++ program. -/// -/// GTC extensions aim to be stable. -/// -/// Even if it's highly unrecommended, it's possible to include all the extensions at once by -/// including <glm/ext.hpp>. Otherwise, each extension needs to be included a specific file. -/// -/// @defgroup gtx GTX Extensions (Experimental) -/// -/// @brief Functions and types that the GLSL specification doesn't define, but -/// useful to have for a C++ program. -/// -/// Experimental extensions are useful functions and types, but the development of -/// their API and functionality is not necessarily stable. They can change -/// substantially between versions. Backwards compatibility is not much of an issue -/// for them. -/// -/// Even if it's highly unrecommended, it's possible to include all the extensions -/// at once by including <glm/ext.hpp>. Otherwise, each extension needs to be -/// included a specific file. + +#include "detail/setup.hpp" #pragma once @@ -31,14 +10,16 @@ #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED) # define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED -# pragma message("GLM: All extensions included (not recommanded)") +# pragma message("GLM: All extensions included (not recommended)") #endif//GLM_MESSAGES +#include "./ext/vec1.hpp" +#include "./ext/vector_relational.hpp" + #include "./gtc/bitfield.hpp" #include "./gtc/color_space.hpp" #include "./gtc/constants.hpp" #include "./gtc/epsilon.hpp" -#include "./gtc/functions.hpp" #include "./gtc/integer.hpp" #include "./gtc/matrix_access.hpp" #include "./gtc/matrix_integer.hpp" @@ -59,9 +40,11 @@ # include "./gtc/type_aligned.hpp" #endif +#ifdef GLM_ENABLE_EXPERIMENTAL #include "./gtx/associated_min_max.hpp" #include "./gtx/bit.hpp" #include "./gtx/closest_point.hpp" +#include "./gtx/color_encoding.hpp" #include "./gtx/color_space.hpp" #include "./gtx/color_space_YCoCg.hpp" #include "./gtx/compatibility.hpp" @@ -73,6 +56,7 @@ #include "./gtx/fast_exponential.hpp" #include "./gtx/fast_square_root.hpp" #include "./gtx/fast_trigonometry.hpp" +#include "./gtx/functions.hpp" #include "./gtx/gradient_paint.hpp" #include "./gtx/handed_coordinate_space.hpp" #include "./gtx/integer.hpp" @@ -103,6 +87,7 @@ #endif #include "./gtx/transform.hpp" #include "./gtx/transform2.hpp" +#include "./gtx/vec_swizzle.hpp" #include "./gtx/vector_angle.hpp" #include "./gtx/vector_query.hpp" #include "./gtx/wrap.hpp" @@ -114,3 +99,4 @@ #if GLM_HAS_RANGE_FOR # include "./gtx/range.hpp" #endif +#endif//GLM_ENABLE_EXPERIMENTAL diff --git a/external/include/glm/ext/vec1.hpp b/external/include/glm/ext/vec1.hpp new file mode 100644 index 0000000..887877e --- /dev/null +++ b/external/include/glm/ext/vec1.hpp @@ -0,0 +1,461 @@ +/// @ref ext_vec1 +/// @file glm/ext/vec1.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_vec1 GLM_EXT_vec1 +/// @ingroup ext +/// +/// Include <glm/ext/vec1.hpp> to use the features of this extension. +/// +/// Add vec1, ivec1, uvec1 and bvec1 types. + +#pragma once + +#include "../fwd.hpp" +#include "../detail/type_vec.hpp" +#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED +# if GLM_HAS_UNRESTRICTED_UNIONS +# include "../detail/_swizzle.hpp" +# else +# include "../detail/_swizzle_func.hpp" +# endif +#endif //GLM_SWIZZLE +#include <cstddef> + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vec1 extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vec1 + /// @{ + + template<typename T, qualifier Q> + struct vec<1, T, Q> + { + // -- Implementation detail -- + + typedef T value_type; + typedef vec type; + typedef vec<1, bool, Q> bool_type; + + // -- Data -- + +# if GLM_HAS_ONLY_XYZW + T x; + +# elif 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 + { + T x; + T r; + T s; +/* +# if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED + _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r) + _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r) + _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r) + _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s) +# endif//GLM_SWIZZLE*/ + }; + +# if GLM_COMPILER & GLM_COMPILER_CLANG +# pragma clang diagnostic pop +# endif +# if GLM_COMPILER & GLM_COMPILER_GCC +# pragma GCC diagnostic pop +# endif +# else + union {T x, r, s;}; +/* +# if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED + GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4) +# endif//GLM_SWIZZLE*/ +# endif + + // -- Component accesses -- + + /// Return the count of components of the vector + typedef length_t length_type; + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;} + + 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_CTOR vec() GLM_DEFAULT_CTOR; + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, T, P> const& v); + + // -- Explicit basic constructors -- + + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar); + + // -- Conversion vector constructors -- + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v); + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v); + + /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<1, U, P> const& v); + + // -- Swizzle constructors -- +/* +# if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) + template<int E0> + GLM_FUNC_DECL tvec(detail::_swizzle<1, T, Q, tvec1, E0, -1,-2,-3> const& that) + { + *this = that(); + } +# endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)) +*/ + // -- Unary arithmetic operators -- + + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec const& v) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator+=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator-=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator*=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator/=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v); + + // -- Increment and decrement operators -- + + GLM_FUNC_DECL vec & operator++(); + GLM_FUNC_DECL vec & operator--(); + GLM_FUNC_DECL vec operator++(int); + GLM_FUNC_DECL vec operator--(int); + + // -- Unary bit operators -- + + template<typename U> + GLM_FUNC_DECL vec & operator%=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator&=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator|=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator^=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(U scalar); + template<typename U> + GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v); + }; + + // -- Unary operators -- + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v); + + // -- Binary operators -- + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> operator~(vec<1, T, Q> const& v); + + // -- Boolean operators -- + + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2); + + template<qualifier Q> + GLM_FUNC_DECL vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); + + template<qualifier Q> + GLM_FUNC_DECL vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2); + + /// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, float, highp> highp_vec1; + + /// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, float, mediump> mediump_vec1; + + /// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, float, lowp> lowp_vec1; + + /// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, double, highp> highp_dvec1; + + /// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, double, mediump> mediump_dvec1; + + /// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + /// + /// @see ext_vec1 + typedef vec<1, double, lowp> lowp_dvec1; + + /// 1 component vector of signed integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, int, highp> highp_ivec1; + + /// 1 component vector of signed integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, int, mediump> mediump_ivec1; + + /// 1 component vector of signed integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, int, lowp> lowp_ivec1; + + /// 1 component vector of unsigned integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, uint, highp> highp_uvec1; + + /// 1 component vector of unsigned integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, uint, mediump> mediump_uvec1; + + /// 1 component vector of unsigned integer numbers. + /// + /// @see ext_vec1 + typedef vec<1, uint, lowp> lowp_uvec1; + + /// 1 component vector of bool values. + /// + /// @see ext_vec1 + typedef vec<1, bool, highp> highp_bvec1; + + /// 1 component vector of bool values. + /// + /// @see ext_vec1 + typedef vec<1, bool, mediump> mediump_bvec1; + + /// 1 component vector of bool values. + /// + /// @see ext_vec1 + typedef vec<1, bool, lowp> lowp_bvec1; + +#if GLM_HAS_TEMPLATE_ALIASES + template <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>; +#endif//GLM_HAS_TEMPLATE_ALIASES + + ////////////////////////// + // vec1 definition + +#if(defined(GLM_PRECISION_HIGHP_BOOL)) + typedef highp_bvec1 bvec1; +#elif(defined(GLM_PRECISION_MEDIUMP_BOOL)) + typedef mediump_bvec1 bvec1; +#elif(defined(GLM_PRECISION_LOWP_BOOL)) + typedef lowp_bvec1 bvec1; +#else + /// 1 component vector of boolean. + /// @see gtc_vec1 extension. + typedef highp_bvec1 bvec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_FLOAT)) + typedef highp_vec1 vec1; +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + typedef mediump_vec1 vec1; +#elif(defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_vec1 vec1; +#else + /// 1 component vector of floating-point numbers. + /// @see gtc_vec1 extension. + typedef highp_vec1 vec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_DOUBLE)) + typedef highp_dvec1 dvec1; +#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) + typedef mediump_dvec1 dvec1; +#elif(defined(GLM_PRECISION_LOWP_DOUBLE)) + typedef lowp_dvec1 dvec1; +#else + /// 1 component vector of floating-point numbers. + /// @see gtc_vec1 extension. + typedef highp_dvec1 dvec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_INT)) + typedef highp_ivec1 ivec1; +#elif(defined(GLM_PRECISION_MEDIUMP_INT)) + typedef mediump_ivec1 ivec1; +#elif(defined(GLM_PRECISION_LOWP_INT)) + typedef lowp_ivec1 ivec1; +#else + /// 1 component vector of signed integer numbers. + /// @see gtc_vec1 extension. + typedef highp_ivec1 ivec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_UINT)) + typedef highp_uvec1 uvec1; +#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) + typedef mediump_uvec1 uvec1; +#elif(defined(GLM_PRECISION_LOWP_UINT)) + typedef lowp_uvec1 uvec1; +#else + /// 1 component vector of unsigned integer numbers. + /// @see gtc_vec1 extension. + typedef highp_uvec1 uvec1; +#endif//GLM_PRECISION + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "../detail/type_vec1.inl" +#endif//GLM_EXTERNAL_TEMPLATE diff --git a/external/include/glm/ext/vec1.inl b/external/include/glm/ext/vec1.inl new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/external/include/glm/ext/vec1.inl diff --git a/external/include/glm/ext/vector_relational.hpp b/external/include/glm/ext/vector_relational.hpp new file mode 100644 index 0000000..e5cfa94 --- /dev/null +++ b/external/include/glm/ext/vector_relational.hpp @@ -0,0 +1,93 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.hpp +/// +/// @see core (dependence) +/// +/// @defgroup ext_vector_relational GLM_EXT_vector_relational +/// @ingroup ext +/// +/// Include <glm/ext/vector_relational.hpp> to use the features of this extension. +/// +/// Comparison functions for a user defined epsilon values. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_EXT_vector_relational extension included") +#endif + +namespace glm +{ + /// @addtogroup ext_vector_relational + /// @{ + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + /// + /// @see ext_vector_relational + template<typename genType> + GLM_FUNC_DECL bool equal(genType const& x, genType const& y, genType const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon); + + /// Returns the component-wise comparison of |x - y| < epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon); + + /// Returns the component-wise comparison of |x - y| >= epsilon. + /// True if this expression is not satisfied. + /// + /// @tparam genType Floating-point or integer scalar types + /// + /// @see ext_vector_relational + template<typename genType> + GLM_FUNC_DECL bool notEqual(genType const& x, genType const& y, genType const& epsilon); + + /// @} +}//namespace glm + +#include "vector_relational.inl" diff --git a/external/include/glm/ext/vector_relational.inl b/external/include/glm/ext/vector_relational.inl new file mode 100644 index 0000000..8532a02 --- /dev/null +++ b/external/include/glm/ext/vector_relational.inl @@ -0,0 +1,46 @@ +/// @ref ext_vector_relational +/// @file glm/ext/vector_relational.inl + +// Dependency: +#include "../vector_relational.hpp" +#include "../common.hpp" +#include "../detail/type_vec.hpp" + +namespace glm +{ + template<typename genType> + GLM_FUNC_QUALIFIER bool equal(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) < epsilon; + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon) + { + return lessThan(abs(x - y), vec<L, T, Q>(epsilon)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon) + { + return lessThan(abs(x - y), epsilon); + } + + template<typename genType> + GLM_FUNC_QUALIFIER bool notEqual(genType const& x, genType const& y, genType const& epsilon) + { + return abs(x - y) >= epsilon; + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon) + { + return greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon) + { + return greaterThanEqual(abs(x - y), epsilon); + } +}//namespace glm diff --git a/external/include/glm/fwd.hpp b/external/include/glm/fwd.hpp index f90c4d0..002fa5d 100644 --- a/external/include/glm/fwd.hpp +++ b/external/include/glm/fwd.hpp @@ -1,6 +1,8 @@ /// @ref core /// @file glm/fwd.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_int.hpp" @@ -12,19 +14,19 @@ // GLM_GTC_quaternion namespace glm { - template <typename T, precision P> struct tquat; + template<typename T, qualifier Q> struct tquat; - /// Quaternion of low single-precision floating-point numbers. + /// Quaternion of low single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<float, lowp> lowp_quat; - /// Quaternion of medium single-precision floating-point numbers. + /// Quaternion of medium single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<float, mediump> mediump_quat; - /// Quaternion of high single-precision floating-point numbers. + /// Quaternion of high single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<float, highp> highp_quat; @@ -36,46 +38,46 @@ namespace glm #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) typedef lowp_quat quat; #elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) - /// Quaternion of default single-precision floating-point numbers. + /// Quaternion of default single-qualifier floating-point numbers. typedef highp_quat quat; #endif - /// Quaternion of low single-precision floating-point numbers. + /// Quaternion of low single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef lowp_quat lowp_fquat; - /// Quaternion of medium single-precision floating-point numbers. + /// Quaternion of medium single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef mediump_quat mediump_fquat; - /// Quaternion of high single-precision floating-point numbers. + /// Quaternion of high single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef highp_quat highp_fquat; - /// Quaternion of default single-precision floating-point numbers. + /// Quaternion of default single-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef quat fquat; - /// Quaternion of low double-precision floating-point numbers. + /// Quaternion of low double-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<double, lowp> lowp_dquat; - - /// Quaternion of medium double-precision floating-point numbers. + + /// Quaternion of medium double-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<double, mediump> mediump_dquat; - - /// Quaternion of high double-precision floating-point numbers. + + /// Quaternion of high double-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef tquat<double, highp> highp_dquat; - + #if(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) typedef highp_dquat dquat; #elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) @@ -83,7 +85,7 @@ namespace glm #elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE)) typedef lowp_dquat dquat; #elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) - /// Quaternion of default double-precision floating-point numbers. + /// Quaternion of default double-qualifier floating-point numbers. /// /// @see gtc_quaternion typedef highp_dquat dquat; @@ -95,123 +97,123 @@ namespace glm // GLM_GTC_precision namespace glm { - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_int8; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_int16; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_int32; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_int64; - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_int8_t; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_int16_t; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_int32_t; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_int64_t; - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_i8; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_i16; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_i32; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_i64; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_int8; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_int16; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_int32; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_int64; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_int8_t; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_int16_t; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_int32_t; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_int64_t; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_i8; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_i16; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_i32; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_i64; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_int8; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_int16; - /// High precision 32 bit signed integer type. + /// High qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 highp_int32; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_int64; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_int8_t; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_int16_t; @@ -219,31 +221,31 @@ namespace glm /// @see gtc_type_precision typedef detail::int32 highp_int32_t; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_int64_t; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_i8; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_i16; - /// High precision 32 bit signed integer type. + /// High qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 highp_i32; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_i64; - + /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 int8; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 int16; @@ -266,7 +268,7 @@ namespace glm /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 int8_t; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 int16_t; @@ -283,7 +285,7 @@ namespace glm /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 i8; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 i16; @@ -295,59 +297,59 @@ namespace glm /// 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 i64; - - - - /// Low precision 8 bit signed integer scalar type. + + + + /// Low qualifier 8 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i8, lowp> lowp_i8vec1; - - /// Low precision 8 bit signed integer vector of 2 components type. + typedef vec<1, i8, lowp> lowp_i8vec1; + + /// Low qualifier 8 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i8, lowp> lowp_i8vec2; - - /// Low precision 8 bit signed integer vector of 3 components type. + typedef vec<2, i8, lowp> lowp_i8vec2; + + /// Low qualifier 8 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i8, lowp> lowp_i8vec3; - - /// Low precision 8 bit signed integer vector of 4 components type. + typedef vec<3, i8, lowp> lowp_i8vec3; + + /// Low qualifier 8 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i8, lowp> lowp_i8vec4; - + typedef vec<4, i8, lowp> lowp_i8vec4; + - /// Medium precision 8 bit signed integer scalar type. + /// Medium qualifier 8 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i8, mediump> mediump_i8vec1; - - /// Medium precision 8 bit signed integer vector of 2 components type. + typedef vec<1, i8, mediump> mediump_i8vec1; + + /// Medium qualifier 8 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i8, mediump> mediump_i8vec2; - - /// Medium precision 8 bit signed integer vector of 3 components type. + typedef vec<2, i8, mediump> mediump_i8vec2; + + /// Medium qualifier 8 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i8, mediump> mediump_i8vec3; - - /// Medium precision 8 bit signed integer vector of 4 components type. + typedef vec<3, i8, mediump> mediump_i8vec3; + + /// Medium qualifier 8 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i8, mediump> mediump_i8vec4; - - - /// High precision 8 bit signed integer scalar type. + typedef vec<4, i8, mediump> mediump_i8vec4; + + + /// High qualifier 8 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i8, highp> highp_i8vec1; - - /// High precision 8 bit signed integer vector of 2 components type. + typedef vec<1, i8, highp> highp_i8vec1; + + /// High qualifier 8 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i8, highp> highp_i8vec2; - - /// High precision 8 bit signed integer vector of 3 components type. + typedef vec<2, i8, highp> highp_i8vec2; + + /// High qualifier 8 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i8, highp> highp_i8vec3; - - /// High precision 8 bit signed integer vector of 4 components type. + typedef vec<3, i8, highp> highp_i8vec3; + + /// High qualifier 8 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i8, highp> highp_i8vec4; - + typedef vec<4, i8, highp> highp_i8vec4; + #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_i8vec1 i8vec1; typedef lowp_i8vec2 i8vec2; @@ -357,77 +359,77 @@ namespace glm typedef mediump_i8vec1 i8vec1; typedef mediump_i8vec2 i8vec2; typedef mediump_i8vec3 i8vec3; - typedef mediump_i8vec4 i8vec4; + typedef mediump_i8vec4 i8vec4; #else - /// Default precision 8 bit signed integer scalar type. + /// Default qualifier 8 bit signed integer scalar type. /// @see gtc_type_precision typedef highp_i8vec1 i8vec1; - - /// Default precision 8 bit signed integer vector of 2 components type. + + /// Default qualifier 8 bit signed integer vector of 2 components type. /// @see gtc_type_precision typedef highp_i8vec2 i8vec2; - - /// Default precision 8 bit signed integer vector of 3 components type. + + /// Default qualifier 8 bit signed integer vector of 3 components type. /// @see gtc_type_precision typedef highp_i8vec3 i8vec3; - - /// Default precision 8 bit signed integer vector of 4 components type. + + /// Default qualifier 8 bit signed integer vector of 4 components type. /// @see gtc_type_precision typedef highp_i8vec4 i8vec4; #endif - - - /// Low precision 16 bit signed integer scalar type. - /// @see gtc_type_precision - typedef tvec1<i16, lowp> lowp_i16vec1; - - /// Low precision 16 bit signed integer vector of 2 components type. - /// @see gtc_type_precision - typedef tvec2<i16, lowp> lowp_i16vec2; - - /// Low precision 16 bit signed integer vector of 3 components type. - /// @see gtc_type_precision - typedef tvec3<i16, lowp> lowp_i16vec3; - - /// Low precision 16 bit signed integer vector of 4 components type. - /// @see gtc_type_precision - typedef tvec4<i16, lowp> lowp_i16vec4; - - - /// Medium precision 16 bit signed integer scalar type. - /// @see gtc_type_precision - typedef tvec1<i16, mediump> mediump_i16vec1; - - /// Medium precision 16 bit signed integer vector of 2 components type. - /// @see gtc_type_precision - typedef tvec2<i16, mediump> mediump_i16vec2; - - /// Medium precision 16 bit signed integer vector of 3 components type. - /// @see gtc_type_precision - typedef tvec3<i16, mediump> mediump_i16vec3; - - /// Medium precision 16 bit signed integer vector of 4 components type. - /// @see gtc_type_precision - typedef tvec4<i16, mediump> mediump_i16vec4; - - - /// High precision 16 bit signed integer scalar type. - /// @see gtc_type_precision - typedef tvec1<i16, highp> highp_i16vec1; - - /// High precision 16 bit signed integer vector of 2 components type. - /// @see gtc_type_precision - typedef tvec2<i16, highp> highp_i16vec2; - - /// High precision 16 bit signed integer vector of 3 components type. - /// @see gtc_type_precision - typedef tvec3<i16, highp> highp_i16vec3; - - /// High precision 16 bit signed integer vector of 4 components type. - /// @see gtc_type_precision - typedef tvec4<i16, highp> highp_i16vec4; - - + + + /// Low qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, lowp> lowp_i16vec1; + + /// Low qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, lowp> lowp_i16vec2; + + /// Low qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, lowp> lowp_i16vec3; + + /// Low qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, lowp> lowp_i16vec4; + + + /// Medium qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, mediump> mediump_i16vec1; + + /// Medium qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, mediump> mediump_i16vec2; + + /// Medium qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, mediump> mediump_i16vec3; + + /// Medium qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, mediump> mediump_i16vec4; + + + /// High qualifier 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef vec<1, i16, highp> highp_i16vec1; + + /// High qualifier 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef vec<2, i16, highp> highp_i16vec2; + + /// High qualifier 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef vec<3, i16, highp> highp_i16vec3; + + /// High qualifier 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef vec<4, i16, highp> highp_i16vec4; + + #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_i16vec1 i16vec1; typedef lowp_i16vec2 i16vec2; @@ -439,74 +441,74 @@ namespace glm typedef mediump_i16vec3 i16vec3; typedef mediump_i16vec4 i16vec4; #else - /// Default precision 16 bit signed integer scalar type. + /// Default qualifier 16 bit signed integer scalar type. /// @see gtc_type_precision typedef highp_i16vec1 i16vec1; - - /// Default precision 16 bit signed integer vector of 2 components type. + + /// Default qualifier 16 bit signed integer vector of 2 components type. /// @see gtc_type_precision typedef highp_i16vec2 i16vec2; - - /// Default precision 16 bit signed integer vector of 3 components type. + + /// Default qualifier 16 bit signed integer vector of 3 components type. /// @see gtc_type_precision typedef highp_i16vec3 i16vec3; - - /// Default precision 16 bit signed integer vector of 4 components type. + + /// Default qualifier 16 bit signed integer vector of 4 components type. /// @see gtc_type_precision typedef highp_i16vec4 i16vec4; #endif - /// Low precision 32 bit signed integer scalar type. + /// Low qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, lowp> lowp_i32vec1; - - /// Low precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, lowp> lowp_i32vec1; + + /// Low qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, lowp> lowp_i32vec2; - - /// Low precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, lowp> lowp_i32vec2; + + /// Low qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, lowp> lowp_i32vec3; - - /// Low precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, lowp> lowp_i32vec3; + + /// Low qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, lowp> lowp_i32vec4; - - - /// Medium precision 32 bit signed integer scalar type. + typedef vec<4, i32, lowp> lowp_i32vec4; + + + /// Medium qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, mediump> mediump_i32vec1; - - /// Medium precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, mediump> mediump_i32vec1; + + /// Medium qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, mediump> mediump_i32vec2; - - /// Medium precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, mediump> mediump_i32vec2; + + /// Medium qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, mediump> mediump_i32vec3; - - /// Medium precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, mediump> mediump_i32vec3; + + /// Medium qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, mediump> mediump_i32vec4; - - - /// High precision 32 bit signed integer scalar type. + typedef vec<4, i32, mediump> mediump_i32vec4; + + + /// High qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, highp> highp_i32vec1; - - /// High precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, highp> highp_i32vec1; + + /// High qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, highp> highp_i32vec2; - - /// High precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, highp> highp_i32vec2; + + /// High qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, highp> highp_i32vec3; - - /// High precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, highp> highp_i32vec3; + + /// High qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, highp> highp_i32vec4; - + typedef vec<4, i32, highp> highp_i32vec4; + #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_i32vec1 i32vec1; typedef lowp_i32vec2 i32vec2; @@ -518,74 +520,74 @@ namespace glm typedef mediump_i32vec3 i32vec3; typedef mediump_i32vec4 i32vec4; #else - /// Default precision 32 bit signed integer scalar type. + /// Default qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision typedef highp_i32vec1 i32vec1; - - /// Default precision 32 bit signed integer vector of 2 components type. + + /// Default qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision typedef highp_i32vec2 i32vec2; - - /// Default precision 32 bit signed integer vector of 3 components type. + + /// Default qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision typedef highp_i32vec3 i32vec3; - - /// Default precision 32 bit signed integer vector of 4 components type. + + /// Default qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision typedef highp_i32vec4 i32vec4; #endif - /// Low precision 32 bit signed integer scalar type. + /// Low qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, lowp> lowp_i32vec1; - - /// Low precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, lowp> lowp_i32vec1; + + /// Low qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, lowp> lowp_i32vec2; - - /// Low precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, lowp> lowp_i32vec2; + + /// Low qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, lowp> lowp_i32vec3; - - /// Low precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, lowp> lowp_i32vec3; + + /// Low qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, lowp> lowp_i32vec4; - - - /// Medium precision 32 bit signed integer scalar type. + typedef vec<4, i32, lowp> lowp_i32vec4; + + + /// Medium qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, mediump> mediump_i32vec1; - - /// Medium precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, mediump> mediump_i32vec1; + + /// Medium qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, mediump> mediump_i32vec2; - - /// Medium precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, mediump> mediump_i32vec2; + + /// Medium qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, mediump> mediump_i32vec3; - - /// Medium precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, mediump> mediump_i32vec3; + + /// Medium qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, mediump> mediump_i32vec4; - - - /// High precision 32 bit signed integer scalar type. + typedef vec<4, i32, mediump> mediump_i32vec4; + + + /// High qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, highp> highp_i32vec1; - - /// High precision 32 bit signed integer vector of 2 components type. + typedef vec<1, i32, highp> highp_i32vec1; + + /// High qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, highp> highp_i32vec2; - - /// High precision 32 bit signed integer vector of 3 components type. + typedef vec<2, i32, highp> highp_i32vec2; + + /// High qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, highp> highp_i32vec3; - - /// High precision 32 bit signed integer vector of 4 components type. + typedef vec<3, i32, highp> highp_i32vec3; + + /// High qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, highp> highp_i32vec4; - + typedef vec<4, i32, highp> highp_i32vec4; + #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_i32vec1 i32vec1; typedef lowp_i32vec2 i32vec2; @@ -597,75 +599,75 @@ namespace glm typedef mediump_i32vec3 i32vec3; typedef mediump_i32vec4 i32vec4; #else - /// Default precision 32 bit signed integer scalar type. + /// Default qualifier 32 bit signed integer scalar type. /// @see gtc_type_precision typedef highp_i32vec1 i32vec1; - /// Default precision 32 bit signed integer vector of 2 components type. + /// Default qualifier 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision typedef highp_i32vec2 i32vec2; - - /// Default precision 32 bit signed integer vector of 3 components type. + + /// Default qualifier 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision typedef highp_i32vec3 i32vec3; - - /// Default precision 32 bit signed integer vector of 4 components type. + + /// Default qualifier 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision typedef highp_i32vec4 i32vec4; #endif - - /// Low precision 64 bit signed integer scalar type. + + /// Low qualifier 64 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i64, lowp> lowp_i64vec1; - - /// Low precision 64 bit signed integer vector of 2 components type. + typedef vec<1, i64, lowp> lowp_i64vec1; + + /// Low qualifier 64 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i64, lowp> lowp_i64vec2; - - /// Low precision 64 bit signed integer vector of 3 components type. + typedef vec<2, i64, lowp> lowp_i64vec2; + + /// Low qualifier 64 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i64, lowp> lowp_i64vec3; - - /// Low precision 64 bit signed integer vector of 4 components type. + typedef vec<3, i64, lowp> lowp_i64vec3; + + /// Low qualifier 64 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i64, lowp> lowp_i64vec4; - - - /// Medium precision 64 bit signed integer scalar type. + typedef vec<4, i64, lowp> lowp_i64vec4; + + + /// Medium qualifier 64 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i64, mediump> mediump_i64vec1; - - /// Medium precision 64 bit signed integer vector of 2 components type. + typedef vec<1, i64, mediump> mediump_i64vec1; + + /// Medium qualifier 64 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i64, mediump> mediump_i64vec2; - - /// Medium precision 64 bit signed integer vector of 3 components type. + typedef vec<2, i64, mediump> mediump_i64vec2; + + /// Medium qualifier 64 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i64, mediump> mediump_i64vec3; - - /// Medium precision 64 bit signed integer vector of 4 components type. + typedef vec<3, i64, mediump> mediump_i64vec3; + + /// Medium qualifier 64 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i64, mediump> mediump_i64vec4; - - - /// High precision 64 bit signed integer scalar type. + typedef vec<4, i64, mediump> mediump_i64vec4; + + + /// High qualifier 64 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i64, highp> highp_i64vec1; - - /// High precision 64 bit signed integer vector of 2 components type. + typedef vec<1, i64, highp> highp_i64vec1; + + /// High qualifier 64 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i64, highp> highp_i64vec2; - - /// High precision 64 bit signed integer vector of 3 components type. + typedef vec<2, i64, highp> highp_i64vec2; + + /// High qualifier 64 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i64, highp> highp_i64vec3; - - /// High precision 64 bit signed integer vector of 4 components type. + typedef vec<3, i64, highp> highp_i64vec3; + + /// High qualifier 64 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i64, highp> highp_i64vec4; - + typedef vec<4, i64, highp> highp_i64vec4; + #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_i64vec1 i64vec1; typedef lowp_i64vec2 i64vec2; @@ -677,195 +679,195 @@ namespace glm typedef mediump_i64vec3 i64vec3; typedef mediump_i64vec4 i64vec4; #else - /// Default precision 64 bit signed integer scalar type. + /// Default qualifier 64 bit signed integer scalar type. /// @see gtc_type_precision typedef highp_i64vec1 i64vec1; - /// Default precision 64 bit signed integer vector of 2 components type. + /// Default qualifier 64 bit signed integer vector of 2 components type. /// @see gtc_type_precision typedef highp_i64vec2 i64vec2; - - /// Default precision 64 bit signed integer vector of 3 components type. + + /// Default qualifier 64 bit signed integer vector of 3 components type. /// @see gtc_type_precision typedef highp_i64vec3 i64vec3; - - /// Default precision 64 bit signed integer vector of 4 components type. + + /// Default qualifier 64 bit signed integer vector of 4 components type. /// @see gtc_type_precision typedef highp_i64vec4 i64vec4; #endif - - + + ///////////////////////////// // Unsigned int vector types - - /// Low precision 8 bit unsigned integer type. + + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_uint8; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_uint16; - - /// Low precision 32 bit unsigned integer type. + + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_uint32; - - /// Low precision 64 bit unsigned integer type. + + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_uint64; - - - /// Low precision 8 bit unsigned integer type. + + + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_uint8_t; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_uint16_t; - - /// Low precision 32 bit unsigned integer type. + + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_uint32_t; - - /// Low precision 64 bit unsigned integer type. + + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_uint64_t; - - - /// Low precision 8 bit unsigned integer type. + + + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_u8; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_u16; - - /// Low precision 32 bit unsigned integer type. + + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_u32; - - /// Low precision 64 bit unsigned integer type. + + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_u64; - - - - /// Medium precision 8 bit unsigned integer type. + + + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_uint8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_uint16; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_uint32; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_uint64; - - /// Medium precision 8 bit unsigned integer type. + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_uint8_t; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_uint16_t; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_uint32_t; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_uint64_t; - - /// Medium precision 8 bit unsigned integer type. + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_u8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_u16; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_u32; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_u64; - - - - /// Medium precision 8 bit unsigned integer type. + + + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_uint8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_uint16; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_uint32; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_uint64; - - /// Medium precision 8 bit unsigned integer type. + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_uint8_t; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_uint16_t; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_uint32_t; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_uint64_t; - - /// Medium precision 8 bit unsigned integer type. + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_u8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_u16; - - /// Medium precision 32 bit unsigned integer type. + + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_u32; - - /// Medium precision 64 bit unsigned integer type. + + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_u64; - - - + + + /// 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 uint8; - + /// 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 uint16; - + /// 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 uint32; - + /// 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 uint64; - + #if GLM_HAS_EXTENDED_INTEGER_TYPE using std::uint8_t; using std::uint16_t; @@ -875,15 +877,15 @@ namespace glm /// 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 uint8_t; - + /// 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 uint16_t; - + /// 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 uint32_t; - + /// 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 uint64_t; @@ -907,55 +909,55 @@ namespace glm - /// Low precision 8 bit unsigned integer scalar type. + /// Low qualifier 8 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u8, lowp> lowp_u8vec1; - - /// Low precision 8 bit unsigned integer vector of 2 components type. + typedef vec<1, u8, lowp> lowp_u8vec1; + + /// Low qualifier 8 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u8, lowp> lowp_u8vec2; - - /// Low precision 8 bit unsigned integer vector of 3 components type. + typedef vec<2, u8, lowp> lowp_u8vec2; + + /// Low qualifier 8 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u8, lowp> lowp_u8vec3; - - /// Low precision 8 bit unsigned integer vector of 4 components type. + typedef vec<3, u8, lowp> lowp_u8vec3; + + /// Low qualifier 8 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u8, lowp> lowp_u8vec4; - + typedef vec<4, u8, lowp> lowp_u8vec4; + - /// Medium precision 8 bit unsigned integer scalar type. + /// Medium qualifier 8 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u8, mediump> mediump_u8vec1; + typedef vec<1, u8, mediump> mediump_u8vec1; - /// Medium precision 8 bit unsigned integer vector of 2 components type. + /// Medium qualifier 8 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u8, mediump> mediump_u8vec2; + typedef vec<2, u8, mediump> mediump_u8vec2; - /// Medium precision 8 bit unsigned integer vector of 3 components type. + /// Medium qualifier 8 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u8, mediump> mediump_u8vec3; + typedef vec<3, u8, mediump> mediump_u8vec3; - /// Medium precision 8 bit unsigned integer vector of 4 components type. + /// Medium qualifier 8 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u8, mediump> mediump_u8vec4; + typedef vec<4, u8, mediump> mediump_u8vec4; - /// High precision 8 bit unsigned integer scalar type. + /// High qualifier 8 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u8, highp> highp_u8vec1; + typedef vec<1, u8, highp> highp_u8vec1; - /// High precision 8 bit unsigned integer vector of 2 components type. + /// High qualifier 8 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u8, highp> highp_u8vec2; + typedef vec<2, u8, highp> highp_u8vec2; - /// High precision 8 bit unsigned integer vector of 3 components type. + /// High qualifier 8 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u8, highp> highp_u8vec3; + typedef vec<3, u8, highp> highp_u8vec3; - /// High precision 8 bit unsigned integer vector of 4 components type. + /// High qualifier 8 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u8, highp> highp_u8vec4; + typedef vec<4, u8, highp> highp_u8vec4; #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_u8vec1 u8vec1; @@ -966,75 +968,75 @@ namespace glm typedef mediump_u8vec1 u8vec1; typedef mediump_u8vec2 u8vec2; typedef mediump_u8vec3 u8vec3; - typedef mediump_u8vec4 u8vec4; + typedef mediump_u8vec4 u8vec4; #else - /// Default precision 8 bit unsigned integer scalar type. + /// Default qualifier 8 bit unsigned integer scalar type. /// @see gtc_type_precision typedef highp_u8vec1 u8vec1; - /// Default precision 8 bit unsigned integer vector of 2 components type. + /// Default qualifier 8 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision typedef highp_u8vec2 u8vec2; - /// Default precision 8 bit unsigned integer vector of 3 components type. + /// Default qualifier 8 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision typedef highp_u8vec3 u8vec3; - /// Default precision 8 bit unsigned integer vector of 4 components type. + /// Default qualifier 8 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision typedef highp_u8vec4 u8vec4; #endif - /// Low precision 16 bit unsigned integer scalar type. + /// Low qualifier 16 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u16, lowp> lowp_u16vec1; + typedef vec<1, u16, lowp> lowp_u16vec1; - /// Low precision 16 bit unsigned integer vector of 2 components type. + /// Low qualifier 16 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u16, lowp> lowp_u16vec2; + typedef vec<2, u16, lowp> lowp_u16vec2; - /// Low precision 16 bit unsigned integer vector of 3 components type. + /// Low qualifier 16 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u16, lowp> lowp_u16vec3; + typedef vec<3, u16, lowp> lowp_u16vec3; - /// Low precision 16 bit unsigned integer vector of 4 components type. + /// Low qualifier 16 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u16, lowp> lowp_u16vec4; + typedef vec<4, u16, lowp> lowp_u16vec4; - /// Medium precision 16 bit unsigned integer scalar type. + /// Medium qualifier 16 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u16, mediump> mediump_u16vec1; + typedef vec<1, u16, mediump> mediump_u16vec1; - /// Medium precision 16 bit unsigned integer vector of 2 components type. + /// Medium qualifier 16 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u16, mediump> mediump_u16vec2; + typedef vec<2, u16, mediump> mediump_u16vec2; - /// Medium precision 16 bit unsigned integer vector of 3 components type. + /// Medium qualifier 16 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u16, mediump> mediump_u16vec3; + typedef vec<3, u16, mediump> mediump_u16vec3; - /// Medium precision 16 bit unsigned integer vector of 4 components type. + /// Medium qualifier 16 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u16, mediump> mediump_u16vec4; + typedef vec<4, u16, mediump> mediump_u16vec4; - /// High precision 16 bit unsigned integer scalar type. + /// High qualifier 16 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u16, highp> highp_u16vec1; + typedef vec<1, u16, highp> highp_u16vec1; - /// High precision 16 bit unsigned integer vector of 2 components type. + /// High qualifier 16 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u16, highp> highp_u16vec2; + typedef vec<2, u16, highp> highp_u16vec2; - /// High precision 16 bit unsigned integer vector of 3 components type. + /// High qualifier 16 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u16, highp> highp_u16vec3; + typedef vec<3, u16, highp> highp_u16vec3; - /// High precision 16 bit unsigned integer vector of 4 components type. + /// High qualifier 16 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u16, highp> highp_u16vec4; + typedef vec<4, u16, highp> highp_u16vec4; #if(defined(GLM_PRECISION_LOWP_INT)) @@ -1048,73 +1050,73 @@ namespace glm typedef mediump_u16vec3 u16vec3; typedef mediump_u16vec4 u16vec4; #else - /// Default precision 16 bit unsigned integer scalar type. + /// Default qualifier 16 bit unsigned integer scalar type. /// @see gtc_type_precision typedef highp_u16vec1 u16vec1; - /// Default precision 16 bit unsigned integer vector of 2 components type. + /// Default qualifier 16 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision typedef highp_u16vec2 u16vec2; - /// Default precision 16 bit unsigned integer vector of 3 components type. + /// Default qualifier 16 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision typedef highp_u16vec3 u16vec3; - /// Default precision 16 bit unsigned integer vector of 4 components type. + /// Default qualifier 16 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision typedef highp_u16vec4 u16vec4; #endif - /// Low precision 32 bit unsigned integer scalar type. + /// Low qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, lowp> lowp_u32vec1; + typedef vec<1, u32, lowp> lowp_u32vec1; - /// Low precision 32 bit unsigned integer vector of 2 components type. + /// Low qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, lowp> lowp_u32vec2; + typedef vec<2, u32, lowp> lowp_u32vec2; - /// Low precision 32 bit unsigned integer vector of 3 components type. + /// Low qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, lowp> lowp_u32vec3; + typedef vec<3, u32, lowp> lowp_u32vec3; - /// Low precision 32 bit unsigned integer vector of 4 components type. + /// Low qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, lowp> lowp_u32vec4; + typedef vec<4, u32, lowp> lowp_u32vec4; - /// Medium precision 32 bit unsigned integer scalar type. + /// Medium qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, mediump> mediump_u32vec1; + typedef vec<1, u32, mediump> mediump_u32vec1; - /// Medium precision 32 bit unsigned integer vector of 2 components type. + /// Medium qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, mediump> mediump_u32vec2; + typedef vec<2, u32, mediump> mediump_u32vec2; - /// Medium precision 32 bit unsigned integer vector of 3 components type. + /// Medium qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, mediump> mediump_u32vec3; + typedef vec<3, u32, mediump> mediump_u32vec3; - /// Medium precision 32 bit unsigned integer vector of 4 components type. + /// Medium qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, mediump> mediump_u32vec4; + typedef vec<4, u32, mediump> mediump_u32vec4; - /// High precision 32 bit unsigned integer scalar type. + /// High qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, highp> highp_u32vec1; + typedef vec<1, u32, highp> highp_u32vec1; - /// High precision 32 bit unsigned integer vector of 2 components type. + /// High qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, highp> highp_u32vec2; + typedef vec<2, u32, highp> highp_u32vec2; - /// High precision 32 bit unsigned integer vector of 3 components type. + /// High qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, highp> highp_u32vec3; + typedef vec<3, u32, highp> highp_u32vec3; - /// High precision 32 bit unsigned integer vector of 4 components type. + /// High qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, highp> highp_u32vec4; + typedef vec<4, u32, highp> highp_u32vec4; #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_u32vec1 u32vec1; @@ -1127,73 +1129,73 @@ namespace glm typedef mediump_u32vec3 u32vec3; typedef mediump_u32vec4 u32vec4; #else - /// Default precision 32 bit unsigned integer scalar type. + /// Default qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision typedef highp_u32vec1 u32vec1; - /// Default precision 32 bit unsigned integer vector of 2 components type. + /// Default qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision typedef highp_u32vec2 u32vec2; - /// Default precision 32 bit unsigned integer vector of 3 components type. + /// Default qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision typedef highp_u32vec3 u32vec3; - /// Default precision 32 bit unsigned integer vector of 4 components type. + /// Default qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision typedef highp_u32vec4 u32vec4; #endif - /// Low precision 32 bit unsigned integer scalar type. + /// Low qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, lowp> lowp_u32vec1; + typedef vec<1, u32, lowp> lowp_u32vec1; - /// Low precision 32 bit unsigned integer vector of 2 components type. + /// Low qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, lowp> lowp_u32vec2; + typedef vec<2, u32, lowp> lowp_u32vec2; - /// Low precision 32 bit unsigned integer vector of 3 components type. + /// Low qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, lowp> lowp_u32vec3; + typedef vec<3, u32, lowp> lowp_u32vec3; - /// Low precision 32 bit unsigned integer vector of 4 components type. + /// Low qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, lowp> lowp_u32vec4; + typedef vec<4, u32, lowp> lowp_u32vec4; - /// Medium precision 32 bit unsigned integer scalar type. + /// Medium qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, mediump> mediump_u32vec1; + typedef vec<1, u32, mediump> mediump_u32vec1; - /// Medium precision 32 bit unsigned integer vector of 2 components type. + /// Medium qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, mediump> mediump_u32vec2; + typedef vec<2, u32, mediump> mediump_u32vec2; - /// Medium precision 32 bit unsigned integer vector of 3 components type. + /// Medium qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, mediump> mediump_u32vec3; + typedef vec<3, u32, mediump> mediump_u32vec3; - /// Medium precision 32 bit unsigned integer vector of 4 components type. + /// Medium qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, mediump> mediump_u32vec4; + typedef vec<4, u32, mediump> mediump_u32vec4; - /// High precision 32 bit unsigned integer scalar type. + /// High qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, highp> highp_u32vec1; + typedef vec<1, u32, highp> highp_u32vec1; - /// High precision 32 bit unsigned integer vector of 2 components type. + /// High qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, highp> highp_u32vec2; + typedef vec<2, u32, highp> highp_u32vec2; - /// High precision 32 bit unsigned integer vector of 3 components type. + /// High qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, highp> highp_u32vec3; + typedef vec<3, u32, highp> highp_u32vec3; - /// High precision 32 bit unsigned integer vector of 4 components type. + /// High qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, highp> highp_u32vec4; + typedef vec<4, u32, highp> highp_u32vec4; #if(defined(GLM_PRECISION_LOWP_INT)) typedef lowp_u32vec1 u32vec1; @@ -1206,74 +1208,74 @@ namespace glm typedef mediump_u32vec3 u32vec3; typedef mediump_u32vec4 u32vec4; #else - /// Default precision 32 bit unsigned integer scalar type. + /// Default qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision typedef highp_u32vec1 u32vec1; - /// Default precision 32 bit unsigned integer vector of 2 components type. + /// Default qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision typedef highp_u32vec2 u32vec2; - - /// Default precision 32 bit unsigned integer vector of 3 components type. + + /// Default qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision typedef highp_u32vec3 u32vec3; - - /// Default precision 32 bit unsigned integer vector of 4 components type. + + /// Default qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision typedef highp_u32vec4 u32vec4; #endif - - /// Low precision 64 bit unsigned integer scalar type. + + /// Low qualifier 64 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u64, lowp> lowp_u64vec1; + typedef vec<1, u64, lowp> lowp_u64vec1; - /// Low precision 64 bit unsigned integer vector of 2 components type. + /// Low qualifier 64 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u64, lowp> lowp_u64vec2; + typedef vec<2, u64, lowp> lowp_u64vec2; - /// Low precision 64 bit unsigned integer vector of 3 components type. + /// Low qualifier 64 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u64, lowp> lowp_u64vec3; + typedef vec<3, u64, lowp> lowp_u64vec3; - /// Low precision 64 bit unsigned integer vector of 4 components type. + /// Low qualifier 64 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u64, lowp> lowp_u64vec4; + typedef vec<4, u64, lowp> lowp_u64vec4; - /// Medium precision 64 bit unsigned integer scalar type. + /// Medium qualifier 64 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u64, mediump> mediump_u64vec1; + typedef vec<1, u64, mediump> mediump_u64vec1; - /// Medium precision 64 bit unsigned integer vector of 2 components type. + /// Medium qualifier 64 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u64, mediump> mediump_u64vec2; + typedef vec<2, u64, mediump> mediump_u64vec2; - /// Medium precision 64 bit unsigned integer vector of 3 components type. + /// Medium qualifier 64 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u64, mediump> mediump_u64vec3; + typedef vec<3, u64, mediump> mediump_u64vec3; - /// Medium precision 64 bit unsigned integer vector of 4 components type. + /// Medium qualifier 64 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u64, mediump> mediump_u64vec4; + typedef vec<4, u64, mediump> mediump_u64vec4; - /// High precision 64 bit unsigned integer scalar type. + /// High qualifier 64 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u64, highp> highp_u64vec1; + typedef vec<1, u64, highp> highp_u64vec1; - /// High precision 64 bit unsigned integer vector of 2 components type. + /// High qualifier 64 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u64, highp> highp_u64vec2; + typedef vec<2, u64, highp> highp_u64vec2; - /// High precision 64 bit unsigned integer vector of 3 components type. + /// High qualifier 64 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u64, highp> highp_u64vec3; + typedef vec<3, u64, highp> highp_u64vec3; - /// High precision 64 bit unsigned integer vector of 4 components type. + /// High qualifier 64 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u64, highp> highp_u64vec4; + typedef vec<4, u64, highp> highp_u64vec4; #if(defined(GLM_PRECISION_LOWP_UINT)) typedef lowp_u64vec1 u64vec1; @@ -1286,965 +1288,965 @@ namespace glm typedef mediump_u64vec3 u64vec3; typedef mediump_u64vec4 u64vec4; #else - /// Default precision 64 bit unsigned integer scalar type. + /// Default qualifier 64 bit unsigned integer scalar type. /// @see gtc_type_precision typedef highp_u64vec1 u64vec1; - /// Default precision 64 bit unsigned integer vector of 2 components type. + /// Default qualifier 64 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision typedef highp_u64vec2 u64vec2; - - /// Default precision 64 bit unsigned integer vector of 3 components type. + + /// Default qualifier 64 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision typedef highp_u64vec3 u64vec3; - - /// Default precision 64 bit unsigned integer vector of 4 components type. + + /// Default qualifier 64 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision typedef highp_u64vec4 u64vec4; #endif - - + + ////////////////////// // Float vector types - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32_t; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64_t; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 lowp_f32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef float64 lowp_f64; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32_t; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64_t; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 lowp_f32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef float64 lowp_f64; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 lowp_float32_t; - - /// Low 64 bit double-precision floating-point scalar. + + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 lowp_float64_t; - /// Low 32 bit single-precision floating-point scalar. + /// Low 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 lowp_f32; - /// Low 64 bit double-precision floating-point scalar. + /// Low 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef float64 lowp_f64; - /// Medium 32 bit single-precision floating-point scalar. + /// Medium 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 mediump_float32; - /// Medium 64 bit double-precision floating-point scalar. + /// Medium 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 mediump_float64; - /// Medium 32 bit single-precision floating-point scalar. + /// Medium 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 mediump_float32_t; - /// Medium 64 bit double-precision floating-point scalar. + /// Medium 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 mediump_float64_t; - /// Medium 32 bit single-precision floating-point scalar. + /// Medium 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 mediump_f32; - /// Medium 64 bit double-precision floating-point scalar. + /// Medium 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef float64 mediump_f64; - /// High 32 bit single-precision floating-point scalar. + /// High 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 highp_float32; - /// High 64 bit double-precision floating-point scalar. + /// High 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 highp_float64; - /// High 32 bit single-precision floating-point scalar. + /// High 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 highp_float32_t; - /// High 64 bit double-precision floating-point scalar. + /// High 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float64 highp_float64_t; - /// High 32 bit single-precision floating-point scalar. + /// High 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 highp_f32; - /// High 64 bit double-precision floating-point scalar. + /// High 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef float64 highp_f64; #if(defined(GLM_PRECISION_LOWP_FLOAT)) - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_float32 float32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_float64 float64; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_float32_t float32_t; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_float64_t float64_t; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_f32 f32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef lowp_f64 f64; #elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float32 float32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float64 float64; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float32 float32_t; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float64 float64_t; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float32 f32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef mediump_float64 f64; #else//(defined(GLM_PRECISION_HIGHP_FLOAT)) - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float32 float32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float64 float64; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float32_t float32_t; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float64_t float64_t; - /// Default 32 bit single-precision floating-point scalar. + /// Default 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float32_t f32; - /// Default 64 bit double-precision floating-point scalar. + /// Default 64 bit double-qualifier floating-point scalar. /// @see gtc_type_precision typedef highp_float64_t f64; #endif - /// Low single-precision floating-point vector of 1 component. + /// Low single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, lowp> lowp_vec1; + typedef vec<1, float, lowp> lowp_vec1; - /// Low single-precision floating-point vector of 2 components. + /// Low single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<float, lowp> lowp_vec2; + typedef vec<2, float, lowp> lowp_vec2; - /// Low single-precision floating-point vector of 3 components. + /// Low single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<float, lowp> lowp_vec3; + typedef vec<3, float, lowp> lowp_vec3; - /// Low single-precision floating-point vector of 4 components. + /// Low single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<float, lowp> lowp_vec4; + typedef vec<4, float, lowp> lowp_vec4; - /// Low single-precision floating-point vector of 1 component. + /// Low single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, lowp> lowp_fvec1; + typedef vec<1, float, lowp> lowp_fvec1; - /// Low single-precision floating-point vector of 2 components. + /// Low single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<float, lowp> lowp_fvec2; + typedef vec<2, float, lowp> lowp_fvec2; - /// Low single-precision floating-point vector of 3 components. + /// Low single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<float, lowp> lowp_fvec3; + typedef vec<3, float, lowp> lowp_fvec3; - /// Low single-precision floating-point vector of 4 components. + /// Low single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<float, lowp> lowp_fvec4; + typedef vec<4, float, lowp> lowp_fvec4; - /// Medium single-precision floating-point vector of 1 component. + /// Medium single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, mediump> mediump_vec1; + typedef vec<1, float, mediump> mediump_vec1; - /// Medium Single-precision floating-point vector of 2 components. + /// Medium Single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<float, mediump> mediump_vec2; + typedef vec<2, float, mediump> mediump_vec2; - /// Medium Single-precision floating-point vector of 3 components. + /// Medium Single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<float, mediump> mediump_vec3; + typedef vec<3, float, mediump> mediump_vec3; - /// Medium Single-precision floating-point vector of 4 components. + /// Medium Single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<float, mediump> mediump_vec4; + typedef vec<4, float, mediump> mediump_vec4; - /// Medium single-precision floating-point vector of 1 component. + /// Medium single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, mediump> mediump_fvec1; + typedef vec<1, float, mediump> mediump_fvec1; - /// Medium Single-precision floating-point vector of 2 components. + /// Medium Single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<float, mediump> mediump_fvec2; + typedef vec<2, float, mediump> mediump_fvec2; - /// Medium Single-precision floating-point vector of 3 components. + /// Medium Single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<float, mediump> mediump_fvec3; + typedef vec<3, float, mediump> mediump_fvec3; - /// Medium Single-precision floating-point vector of 4 components. + /// Medium Single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<float, mediump> mediump_fvec4; + typedef vec<4, float, mediump> mediump_fvec4; - /// High single-precision floating-point vector of 1 component. + /// High single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, highp> highp_vec1; + typedef vec<1, float, highp> highp_vec1; - /// High Single-precision floating-point vector of 2 components. + /// High Single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<float, highp> highp_vec2; + typedef vec<2, float, highp> highp_vec2; - /// High Single-precision floating-point vector of 3 components. + /// High Single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<float, highp> highp_vec3; + typedef vec<3, float, highp> highp_vec3; - /// High Single-precision floating-point vector of 4 components. + /// High Single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<float, highp> highp_vec4; + typedef vec<4, float, highp> highp_vec4; - /// High single-precision floating-point vector of 1 component. + /// High single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<float, highp> highp_fvec1; + typedef vec<1, float, highp> highp_fvec1; - /// High Single-precision floating-point vector of 2 components. + /// High Single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<float, highp> highp_fvec2; + typedef vec<2, float, highp> highp_fvec2; - /// High Single-precision floating-point vector of 3 components. + /// High Single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<float, highp> highp_fvec3; + typedef vec<3, float, highp> highp_fvec3; - /// High Single-precision floating-point vector of 4 components. + /// High Single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<float, highp> highp_fvec4; + typedef vec<4, float, highp> highp_fvec4; - /// Low single-precision floating-point vector of 1 component. + /// Low single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f32, lowp> lowp_f32vec1; + typedef vec<1, f32, lowp> lowp_f32vec1; - /// Low single-precision floating-point vector of 2 components. + /// Low single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<f32, lowp> lowp_f32vec2; + typedef vec<2, f32, lowp> lowp_f32vec2; - /// Low single-precision floating-point vector of 3 components. + /// Low single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<f32, lowp> lowp_f32vec3; + typedef vec<3, f32, lowp> lowp_f32vec3; - /// Low single-precision floating-point vector of 4 components. + /// Low single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<f32, lowp> lowp_f32vec4; + typedef vec<4, f32, lowp> lowp_f32vec4; - /// Medium single-precision floating-point vector of 1 component. + /// Medium single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f32, mediump> mediump_f32vec1; + typedef vec<1, f32, mediump> mediump_f32vec1; - /// Medium single-precision floating-point vector of 2 components. + /// Medium single-qualifier floating-point vector of 2 components. /// @see core_precision - typedef tvec2<f32, mediump> mediump_f32vec2; + typedef vec<2, f32, mediump> mediump_f32vec2; - /// Medium single-precision floating-point vector of 3 components. + /// Medium single-qualifier floating-point vector of 3 components. /// @see core_precision - typedef tvec3<f32, mediump> mediump_f32vec3; + typedef vec<3, f32, mediump> mediump_f32vec3; - /// Medium single-precision floating-point vector of 4 components. + /// Medium single-qualifier floating-point vector of 4 components. /// @see core_precision - typedef tvec4<f32, mediump> mediump_f32vec4; + typedef vec<4, f32, mediump> mediump_f32vec4; - /// High single-precision floating-point vector of 1 component. + /// High single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f32, highp> highp_f32vec1; + typedef vec<1, f32, highp> highp_f32vec1; - /// High single-precision floating-point vector of 2 components. + /// High single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<f32, highp> highp_f32vec2; + typedef vec<2, f32, highp> highp_f32vec2; - /// High single-precision floating-point vector of 3 components. + /// High single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<f32, highp> highp_f32vec3; + typedef vec<3, f32, highp> highp_f32vec3; - /// High single-precision floating-point vector of 4 components. + /// High single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<f32, highp> highp_f32vec4; + typedef vec<4, f32, highp> highp_f32vec4; - /// Low double-precision floating-point vector of 1 component. + /// Low double-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f64, lowp> lowp_f64vec1; + typedef vec<1, f64, lowp> lowp_f64vec1; - /// Low double-precision floating-point vector of 2 components. + /// Low double-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<f64, lowp> lowp_f64vec2; + typedef vec<2, f64, lowp> lowp_f64vec2; - /// Low double-precision floating-point vector of 3 components. + /// Low double-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<f64, lowp> lowp_f64vec3; + typedef vec<3, f64, lowp> lowp_f64vec3; - /// Low double-precision floating-point vector of 4 components. + /// Low double-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<f64, lowp> lowp_f64vec4; + typedef vec<4, f64, lowp> lowp_f64vec4; - /// Medium double-precision floating-point vector of 1 component. + /// Medium double-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f64, mediump> mediump_f64vec1; + typedef vec<1, f64, mediump> mediump_f64vec1; - /// Medium double-precision floating-point vector of 2 components. + /// Medium double-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<f64, mediump> mediump_f64vec2; + typedef vec<2, f64, mediump> mediump_f64vec2; - /// Medium double-precision floating-point vector of 3 components. + /// Medium double-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<f64, mediump> mediump_f64vec3; + typedef vec<3, f64, mediump> mediump_f64vec3; - /// Medium double-precision floating-point vector of 4 components. + /// Medium double-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<f64, mediump> mediump_f64vec4; + typedef vec<4, f64, mediump> mediump_f64vec4; - /// High double-precision floating-point vector of 1 component. + /// High double-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec1<f64, highp> highp_f64vec1; + typedef vec<1, f64, highp> highp_f64vec1; - /// High double-precision floating-point vector of 2 components. + /// High double-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec2<f64, highp> highp_f64vec2; + typedef vec<2, f64, highp> highp_f64vec2; - /// High double-precision floating-point vector of 3 components. + /// High double-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec3<f64, highp> highp_f64vec3; + typedef vec<3, f64, highp> highp_f64vec3; - /// High double-precision floating-point vector of 4 components. + /// High double-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec4<f64, highp> highp_f64vec4; + typedef vec<4, f64, highp> highp_f64vec4; ////////////////////// // Float matrix types - /// Low single-precision floating-point 1x1 matrix. + /// Low single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef lowp_f32 lowp_fmat1x1; - /// Low single-precision floating-point 2x2 matrix. + /// Low single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, lowp> lowp_fmat2x2; + typedef mat<2, 2, f32, lowp> lowp_fmat2x2; - /// Low single-precision floating-point 2x3 matrix. + /// Low single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, lowp> lowp_fmat2x3; + typedef mat<2, 3, f32, lowp> lowp_fmat2x3; - /// Low single-precision floating-point 2x4 matrix. + /// Low single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, lowp> lowp_fmat2x4; + typedef mat<2, 4, f32, lowp> lowp_fmat2x4; - /// Low single-precision floating-point 3x2 matrix. + /// Low single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, lowp> lowp_fmat3x2; + typedef mat<3, 2, f32, lowp> lowp_fmat3x2; - /// Low single-precision floating-point 3x3 matrix. + /// Low single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, lowp> lowp_fmat3x3; + typedef mat<3, 3, f32, lowp> lowp_fmat3x3; - /// Low single-precision floating-point 3x4 matrix. + /// Low single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, lowp> lowp_fmat3x4; + typedef mat<3, 4, f32, lowp> lowp_fmat3x4; - /// Low single-precision floating-point 4x2 matrix. + /// Low single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, lowp> lowp_fmat4x2; + typedef mat<4, 2, f32, lowp> lowp_fmat4x2; - /// Low single-precision floating-point 4x3 matrix. + /// Low single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, lowp> lowp_fmat4x3; + typedef mat<4, 3, f32, lowp> lowp_fmat4x3; - /// Low single-precision floating-point 4x4 matrix. + /// Low single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, lowp> lowp_fmat4x4; + typedef mat<4, 4, f32, lowp> lowp_fmat4x4; - /// Low single-precision floating-point 1x1 matrix. + /// Low single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef lowp_fmat1x1 lowp_fmat1; - /// Low single-precision floating-point 2x2 matrix. + /// Low single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef lowp_fmat2x2 lowp_fmat2; - /// Low single-precision floating-point 3x3 matrix. + /// Low single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef lowp_fmat3x3 lowp_fmat3; - /// Low single-precision floating-point 4x4 matrix. + /// Low single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef lowp_fmat4x4 lowp_fmat4; - /// Medium single-precision floating-point 1x1 matrix. + /// Medium single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef mediump_f32 mediump_fmat1x1; - /// Medium single-precision floating-point 2x2 matrix. + /// Medium single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, mediump> mediump_fmat2x2; + typedef mat<2, 2, f32, mediump> mediump_fmat2x2; - /// Medium single-precision floating-point 2x3 matrix. + /// Medium single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, mediump> mediump_fmat2x3; + typedef mat<2, 3, f32, mediump> mediump_fmat2x3; - /// Medium single-precision floating-point 2x4 matrix. + /// Medium single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, mediump> mediump_fmat2x4; + typedef mat<2, 4, f32, mediump> mediump_fmat2x4; - /// Medium single-precision floating-point 3x2 matrix. + /// Medium single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, mediump> mediump_fmat3x2; + typedef mat<3, 2, f32, mediump> mediump_fmat3x2; - /// Medium single-precision floating-point 3x3 matrix. + /// Medium single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, mediump> mediump_fmat3x3; + typedef mat<3, 3, f32, mediump> mediump_fmat3x3; - /// Medium single-precision floating-point 3x4 matrix. + /// Medium single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, mediump> mediump_fmat3x4; + typedef mat<3, 4, f32, mediump> mediump_fmat3x4; - /// Medium single-precision floating-point 4x2 matrix. + /// Medium single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, mediump> mediump_fmat4x2; + typedef mat<4, 2, f32, mediump> mediump_fmat4x2; - /// Medium single-precision floating-point 4x3 matrix. + /// Medium single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, mediump> mediump_fmat4x3; + typedef mat<4, 3, f32, mediump> mediump_fmat4x3; - /// Medium single-precision floating-point 4x4 matrix. + /// Medium single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, mediump> mediump_fmat4x4; + typedef mat<4, 4, f32, mediump> mediump_fmat4x4; - /// Medium single-precision floating-point 1x1 matrix. + /// Medium single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef mediump_fmat1x1 mediump_fmat1; - /// Medium single-precision floating-point 2x2 matrix. + /// Medium single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef mediump_fmat2x2 mediump_fmat2; - /// Medium single-precision floating-point 3x3 matrix. + /// Medium single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef mediump_fmat3x3 mediump_fmat3; - /// Medium single-precision floating-point 4x4 matrix. + /// Medium single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef mediump_fmat4x4 mediump_fmat4; - /// High single-precision floating-point 1x1 matrix. + /// High single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef highp_f32 highp_fmat1x1; - /// High single-precision floating-point 2x2 matrix. + /// High single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, highp> highp_fmat2x2; + typedef mat<2, 2, f32, highp> highp_fmat2x2; - /// High single-precision floating-point 2x3 matrix. + /// High single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, highp> highp_fmat2x3; + typedef mat<2, 3, f32, highp> highp_fmat2x3; - /// High single-precision floating-point 2x4 matrix. + /// High single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, highp> highp_fmat2x4; + typedef mat<2, 4, f32, highp> highp_fmat2x4; - /// High single-precision floating-point 3x2 matrix. + /// High single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, highp> highp_fmat3x2; + typedef mat<3, 2, f32, highp> highp_fmat3x2; - /// High single-precision floating-point 3x3 matrix. + /// High single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, highp> highp_fmat3x3; + typedef mat<3, 3, f32, highp> highp_fmat3x3; - /// High single-precision floating-point 3x4 matrix. + /// High single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, highp> highp_fmat3x4; + typedef mat<3, 4, f32, highp> highp_fmat3x4; - /// High single-precision floating-point 4x2 matrix. + /// High single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, highp> highp_fmat4x2; + typedef mat<4, 2, f32, highp> highp_fmat4x2; - /// High single-precision floating-point 4x3 matrix. + /// High single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, highp> highp_fmat4x3; + typedef mat<4, 3, f32, highp> highp_fmat4x3; - /// High single-precision floating-point 4x4 matrix. + /// High single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, highp> highp_fmat4x4; + typedef mat<4, 4, f32, highp> highp_fmat4x4; - /// High single-precision floating-point 1x1 matrix. + /// High single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef highp_fmat1x1 highp_fmat1; - /// High single-precision floating-point 2x2 matrix. + /// High single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_fmat2x2 highp_fmat2; - /// High single-precision floating-point 3x3 matrix. + /// High single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_fmat3x3 highp_fmat3; - - /// High single-precision floating-point 4x4 matrix. + + /// High single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_fmat4x4 highp_fmat4; - /// Low single-precision floating-point 1x1 matrix. + /// Low single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f32 lowp_f32mat1x1; - /// Low single-precision floating-point 2x2 matrix. + /// Low single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, lowp> lowp_f32mat2x2; + typedef mat<2, 2, f32, lowp> lowp_f32mat2x2; - /// Low single-precision floating-point 2x3 matrix. + /// Low single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, lowp> lowp_f32mat2x3; + typedef mat<2, 3, f32, lowp> lowp_f32mat2x3; - /// Low single-precision floating-point 2x4 matrix. + /// Low single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, lowp> lowp_f32mat2x4; + typedef mat<2, 4, f32, lowp> lowp_f32mat2x4; - /// Low single-precision floating-point 3x2 matrix. + /// Low single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, lowp> lowp_f32mat3x2; + typedef mat<3, 2, f32, lowp> lowp_f32mat3x2; - /// Low single-precision floating-point 3x3 matrix. + /// Low single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, lowp> lowp_f32mat3x3; + typedef mat<3, 3, f32, lowp> lowp_f32mat3x3; - /// Low single-precision floating-point 3x4 matrix. + /// Low single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, lowp> lowp_f32mat3x4; + typedef mat<3, 4, f32, lowp> lowp_f32mat3x4; - /// Low single-precision floating-point 4x2 matrix. + /// Low single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, lowp> lowp_f32mat4x2; + typedef mat<4, 2, f32, lowp> lowp_f32mat4x2; - /// Low single-precision floating-point 4x3 matrix. + /// Low single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, lowp> lowp_f32mat4x3; + typedef mat<4, 3, f32, lowp> lowp_f32mat4x3; - /// Low single-precision floating-point 4x4 matrix. + /// Low single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, lowp> lowp_f32mat4x4; + typedef mat<4, 4, f32, lowp> lowp_f32mat4x4; - /// Low single-precision floating-point 1x1 matrix. + /// Low single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f32, lowp> lowp_f32mat1; - /// Low single-precision floating-point 2x2 matrix. + /// Low single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef lowp_f32mat2x2 lowp_f32mat2; - /// Low single-precision floating-point 3x3 matrix. + /// Low single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef lowp_f32mat3x3 lowp_f32mat3; - /// Low single-precision floating-point 4x4 matrix. + /// Low single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef lowp_f32mat4x4 lowp_f32mat4; - /// High single-precision floating-point 1x1 matrix. + /// High single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f32 mediump_f32mat1x1; - /// Low single-precision floating-point 2x2 matrix. + /// Low single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, mediump> mediump_f32mat2x2; + typedef mat<2, 2, f32, mediump> mediump_f32mat2x2; - /// Medium single-precision floating-point 2x3 matrix. + /// Medium single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, mediump> mediump_f32mat2x3; + typedef mat<2, 3, f32, mediump> mediump_f32mat2x3; - /// Medium single-precision floating-point 2x4 matrix. + /// Medium single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, mediump> mediump_f32mat2x4; + typedef mat<2, 4, f32, mediump> mediump_f32mat2x4; - /// Medium single-precision floating-point 3x2 matrix. + /// Medium single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, mediump> mediump_f32mat3x2; + typedef mat<3, 2, f32, mediump> mediump_f32mat3x2; - /// Medium single-precision floating-point 3x3 matrix. + /// Medium single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, mediump> mediump_f32mat3x3; + typedef mat<3, 3, f32, mediump> mediump_f32mat3x3; - /// Medium single-precision floating-point 3x4 matrix. + /// Medium single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, mediump> mediump_f32mat3x4; + typedef mat<3, 4, f32, mediump> mediump_f32mat3x4; - /// Medium single-precision floating-point 4x2 matrix. + /// Medium single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, mediump> mediump_f32mat4x2; + typedef mat<4, 2, f32, mediump> mediump_f32mat4x2; - /// Medium single-precision floating-point 4x3 matrix. + /// Medium single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, mediump> mediump_f32mat4x3; + typedef mat<4, 3, f32, mediump> mediump_f32mat4x3; - /// Medium single-precision floating-point 4x4 matrix. + /// Medium single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, mediump> mediump_f32mat4x4; + typedef mat<4, 4, f32, mediump> mediump_f32mat4x4; - /// Medium single-precision floating-point 1x1 matrix. + /// Medium single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f32, mediump> f32mat1; - /// Medium single-precision floating-point 2x2 matrix. + /// Medium single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef mediump_f32mat2x2 mediump_f32mat2; - /// Medium single-precision floating-point 3x3 matrix. + /// Medium single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef mediump_f32mat3x3 mediump_f32mat3; - /// Medium single-precision floating-point 4x4 matrix. + /// Medium single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef mediump_f32mat4x4 mediump_f32mat4; - /// High single-precision floating-point 1x1 matrix. + /// High single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f32 highp_f32mat1x1; - /// High single-precision floating-point 2x2 matrix. + /// High single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, highp> highp_f32mat2x2; + typedef mat<2, 2, f32, highp> highp_f32mat2x2; - /// High single-precision floating-point 2x3 matrix. + /// High single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, highp> highp_f32mat2x3; + typedef mat<2, 3, f32, highp> highp_f32mat2x3; - /// High single-precision floating-point 2x4 matrix. + /// High single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, highp> highp_f32mat2x4; + typedef mat<2, 4, f32, highp> highp_f32mat2x4; - /// High single-precision floating-point 3x2 matrix. + /// High single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, highp> highp_f32mat3x2; + typedef mat<3, 2, f32, highp> highp_f32mat3x2; - /// High single-precision floating-point 3x3 matrix. + /// High single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, highp> highp_f32mat3x3; + typedef mat<3, 3, f32, highp> highp_f32mat3x3; - /// High single-precision floating-point 3x4 matrix. + /// High single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, highp> highp_f32mat3x4; + typedef mat<3, 4, f32, highp> highp_f32mat3x4; - /// High single-precision floating-point 4x2 matrix. + /// High single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, highp> highp_f32mat4x2; + typedef mat<4, 2, f32, highp> highp_f32mat4x2; - /// High single-precision floating-point 4x3 matrix. + /// High single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, highp> highp_f32mat4x3; + typedef mat<4, 3, f32, highp> highp_f32mat4x3; - /// High single-precision floating-point 4x4 matrix. + /// High single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, highp> highp_f32mat4x4; + typedef mat<4, 4, f32, highp> highp_f32mat4x4; - /// High single-precision floating-point 1x1 matrix. + /// High single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f32, highp> f32mat1; - /// High single-precision floating-point 2x2 matrix. + /// High single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_f32mat2x2 highp_f32mat2; - /// High single-precision floating-point 3x3 matrix. + /// High single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_f32mat3x3 highp_f32mat3; - /// High single-precision floating-point 4x4 matrix. + /// High single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_f32mat4x4 highp_f32mat4; - /// Low double-precision floating-point 1x1 matrix. + /// Low double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f64 lowp_f64mat1x1; - /// Low double-precision floating-point 2x2 matrix. + /// Low double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f64, lowp> lowp_f64mat2x2; + typedef mat<2, 2, f64, lowp> lowp_f64mat2x2; - /// Low double-precision floating-point 2x3 matrix. + /// Low double-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f64, lowp> lowp_f64mat2x3; + typedef mat<2, 3, f64, lowp> lowp_f64mat2x3; - /// Low double-precision floating-point 2x4 matrix. + /// Low double-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f64, lowp> lowp_f64mat2x4; + typedef mat<2, 4, f64, lowp> lowp_f64mat2x4; - /// Low double-precision floating-point 3x2 matrix. + /// Low double-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f64, lowp> lowp_f64mat3x2; + typedef mat<3, 2, f64, lowp> lowp_f64mat3x2; - /// Low double-precision floating-point 3x3 matrix. + /// Low double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f64, lowp> lowp_f64mat3x3; + typedef mat<3, 3, f64, lowp> lowp_f64mat3x3; - /// Low double-precision floating-point 3x4 matrix. + /// Low double-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f64, lowp> lowp_f64mat3x4; + typedef mat<3, 4, f64, lowp> lowp_f64mat3x4; - /// Low double-precision floating-point 4x2 matrix. + /// Low double-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f64, lowp> lowp_f64mat4x2; + typedef mat<4, 2, f64, lowp> lowp_f64mat4x2; - /// Low double-precision floating-point 4x3 matrix. + /// Low double-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f64, lowp> lowp_f64mat4x3; - - /// Low double-precision floating-point 4x4 matrix. + typedef mat<4, 3, f64, lowp> lowp_f64mat4x3; + + /// Low double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f64, lowp> lowp_f64mat4x4; + typedef mat<4, 4, f64, lowp> lowp_f64mat4x4; - /// Low double-precision floating-point 1x1 matrix. + /// Low double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef lowp_f64mat1x1 lowp_f64mat1; - /// Low double-precision floating-point 2x2 matrix. + /// Low double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef lowp_f64mat2x2 lowp_f64mat2; - /// Low double-precision floating-point 3x3 matrix. + /// Low double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef lowp_f64mat3x3 lowp_f64mat3; - /// Low double-precision floating-point 4x4 matrix. + /// Low double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef lowp_f64mat4x4 lowp_f64mat4; - /// Medium double-precision floating-point 1x1 matrix. + /// Medium double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f64 Highp_f64mat1x1; - /// Medium double-precision floating-point 2x2 matrix. + /// Medium double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f64, mediump> mediump_f64mat2x2; + typedef mat<2, 2, f64, mediump> mediump_f64mat2x2; - /// Medium double-precision floating-point 2x3 matrix. + /// Medium double-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f64, mediump> mediump_f64mat2x3; + typedef mat<2, 3, f64, mediump> mediump_f64mat2x3; - /// Medium double-precision floating-point 2x4 matrix. + /// Medium double-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f64, mediump> mediump_f64mat2x4; + typedef mat<2, 4, f64, mediump> mediump_f64mat2x4; - /// Medium double-precision floating-point 3x2 matrix. + /// Medium double-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f64, mediump> mediump_f64mat3x2; + typedef mat<3, 2, f64, mediump> mediump_f64mat3x2; - /// Medium double-precision floating-point 3x3 matrix. + /// Medium double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f64, mediump> mediump_f64mat3x3; + typedef mat<3, 3, f64, mediump> mediump_f64mat3x3; - /// Medium double-precision floating-point 3x4 matrix. + /// Medium double-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f64, mediump> mediump_f64mat3x4; + typedef mat<3, 4, f64, mediump> mediump_f64mat3x4; - /// Medium double-precision floating-point 4x2 matrix. + /// Medium double-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f64, mediump> mediump_f64mat4x2; + typedef mat<4, 2, f64, mediump> mediump_f64mat4x2; - /// Medium double-precision floating-point 4x3 matrix. + /// Medium double-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f64, mediump> mediump_f64mat4x3; + typedef mat<4, 3, f64, mediump> mediump_f64mat4x3; - /// Medium double-precision floating-point 4x4 matrix. + /// Medium double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f64, mediump> mediump_f64mat4x4; + typedef mat<4, 4, f64, mediump> mediump_f64mat4x4; - /// Medium double-precision floating-point 1x1 matrix. + /// Medium double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef mediump_f64mat1x1 mediump_f64mat1; - /// Medium double-precision floating-point 2x2 matrix. + /// Medium double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef mediump_f64mat2x2 mediump_f64mat2; - /// Medium double-precision floating-point 3x3 matrix. + /// Medium double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef mediump_f64mat3x3 mediump_f64mat3; - /// Medium double-precision floating-point 4x4 matrix. + /// Medium double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef mediump_f64mat4x4 mediump_f64mat4; - /// High double-precision floating-point 1x1 matrix. + /// High double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f64 highp_f64mat1x1; - /// High double-precision floating-point 2x2 matrix. + /// High double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f64, highp> highp_f64mat2x2; + typedef mat<2, 2, f64, highp> highp_f64mat2x2; - /// High double-precision floating-point 2x3 matrix. + /// High double-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f64, highp> highp_f64mat2x3; + typedef mat<2, 3, f64, highp> highp_f64mat2x3; - /// High double-precision floating-point 2x4 matrix. + /// High double-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f64, highp> highp_f64mat2x4; + typedef mat<2, 4, f64, highp> highp_f64mat2x4; - /// High double-precision floating-point 3x2 matrix. + /// High double-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f64, highp> highp_f64mat3x2; + typedef mat<3, 2, f64, highp> highp_f64mat3x2; - /// High double-precision floating-point 3x3 matrix. + /// High double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f64, highp> highp_f64mat3x3; + typedef mat<3, 3, f64, highp> highp_f64mat3x3; - /// High double-precision floating-point 3x4 matrix. + /// High double-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f64, highp> highp_f64mat3x4; + typedef mat<3, 4, f64, highp> highp_f64mat3x4; - /// High double-precision floating-point 4x2 matrix. + /// High double-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f64, highp> highp_f64mat4x2; + typedef mat<4, 2, f64, highp> highp_f64mat4x2; - /// High double-precision floating-point 4x3 matrix. + /// High double-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f64, highp> highp_f64mat4x3; + typedef mat<4, 3, f64, highp> highp_f64mat4x3; - /// High double-precision floating-point 4x4 matrix. + /// High double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f64, highp> highp_f64mat4x4; + typedef mat<4, 4, f64, highp> highp_f64mat4x4; - /// High double-precision floating-point 1x1 matrix. + /// High double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef highp_f64mat1x1 highp_f64mat1; - /// High double-precision floating-point 2x2 matrix. + /// High double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_f64mat2x2 highp_f64mat2; - /// High double-precision floating-point 3x3 matrix. + /// High double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_f64mat3x3 highp_f64mat3; - /// High double-precision floating-point 4x4 matrix. + /// High double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_f64mat4x4 highp_f64mat4; ////////////////////////// // Quaternion types - /// Low single-precision floating-point quaternion. + /// Low single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f32, lowp> lowp_f32quat; - /// Low double-precision floating-point quaternion. + /// Low double-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f64, lowp> lowp_f64quat; - /// Medium single-precision floating-point quaternion. + /// Medium single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f32, mediump> mediump_f32quat; - /// Medium double-precision floating-point quaternion. + /// Medium double-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f64, mediump> mediump_f64quat; - /// High single-precision floating-point quaternion. + /// High single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f32, highp> highp_f32quat; - /// High double-precision floating-point quaternion. + /// High double-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f64, highp> highp_f64quat; @@ -2322,141 +2324,141 @@ namespace glm typedef mediump_f32mat4x4 f32mat4x4; typedef mediump_f32quat f32quat; #else//if(defined(GLM_PRECISION_HIGHP_FLOAT)) - /// Default single-precision floating-point vector of 1 components. + /// Default single-qualifier floating-point vector of 1 components. /// @see gtc_type_precision typedef highp_f32vec1 fvec1; - /// Default single-precision floating-point vector of 2 components. + /// Default single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision typedef highp_f32vec2 fvec2; - /// Default single-precision floating-point vector of 3 components. + /// Default single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision typedef highp_f32vec3 fvec3; - /// Default single-precision floating-point vector of 4 components. + /// Default single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision typedef highp_f32vec4 fvec4; - /// Default single-precision floating-point 2x2 matrix. + /// Default single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_f32mat2x2 fmat2x2; - /// Default single-precision floating-point 2x3 matrix. + /// Default single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision typedef highp_f32mat2x3 fmat2x3; - /// Default single-precision floating-point 2x4 matrix. + /// Default single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision typedef highp_f32mat2x4 fmat2x4; - /// Default single-precision floating-point 3x2 matrix. + /// Default single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision typedef highp_f32mat3x2 fmat3x2; - /// Default single-precision floating-point 3x3 matrix. + /// Default single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_f32mat3x3 fmat3x3; - /// Default single-precision floating-point 3x4 matrix. + /// Default single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision typedef highp_f32mat3x4 fmat3x4; - /// Default single-precision floating-point 4x2 matrix. + /// Default single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision typedef highp_f32mat4x2 fmat4x2; - /// Default single-precision floating-point 4x3 matrix. + /// Default single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision typedef highp_f32mat4x3 fmat4x3; - /// Default single-precision floating-point 4x4 matrix. + /// Default single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_f32mat4x4 fmat4x4; - - /// Default single-precision floating-point 2x2 matrix. + + /// Default single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef fmat2x2 fmat2; - /// Default single-precision floating-point 3x3 matrix. + /// Default single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef fmat3x3 fmat3; - /// Default single-precision floating-point 4x4 matrix. + /// Default single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef fmat4x4 fmat4; - /// Default single-precision floating-point quaternion. + /// Default single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef highp_fquat fquat; - - /// Default single-precision floating-point vector of 1 components. + + /// Default single-qualifier floating-point vector of 1 components. /// @see gtc_type_precision typedef highp_f32vec1 f32vec1; - /// Default single-precision floating-point vector of 2 components. + /// Default single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision typedef highp_f32vec2 f32vec2; - /// Default single-precision floating-point vector of 3 components. + /// Default single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision typedef highp_f32vec3 f32vec3; - /// Default single-precision floating-point vector of 4 components. + /// Default single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision typedef highp_f32vec4 f32vec4; - /// Default single-precision floating-point 2x2 matrix. + /// Default single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_f32mat2x2 f32mat2x2; - /// Default single-precision floating-point 2x3 matrix. + /// Default single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision typedef highp_f32mat2x3 f32mat2x3; - /// Default single-precision floating-point 2x4 matrix. + /// Default single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision typedef highp_f32mat2x4 f32mat2x4; - /// Default single-precision floating-point 3x2 matrix. + /// Default single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision typedef highp_f32mat3x2 f32mat3x2; - /// Default single-precision floating-point 3x3 matrix. + /// Default single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_f32mat3x3 f32mat3x3; - /// Default single-precision floating-point 3x4 matrix. + /// Default single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision typedef highp_f32mat3x4 f32mat3x4; - /// Default single-precision floating-point 4x2 matrix. + /// Default single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision typedef highp_f32mat4x2 f32mat4x2; - /// Default single-precision floating-point 4x3 matrix. + /// Default single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision typedef highp_f32mat4x3 f32mat4x3; - /// Default single-precision floating-point 4x4 matrix. + /// Default single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_f32mat4x4 f32mat4x4; - /// Default single-precision floating-point 2x2 matrix. + /// Default single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef f32mat2x2 f32mat2; - /// Default single-precision floating-point 3x3 matrix. + /// Default single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef f32mat3x3 f32mat3; - /// Default single-precision floating-point 4x4 matrix. + /// Default single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef f32mat4x4 f32mat4; - /// Default single-precision floating-point quaternion. + /// Default single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef highp_f32quat f32quat; #endif @@ -2498,71 +2500,71 @@ namespace glm typedef mediump_f64mat4x4 f64mat4x4; typedef mediump_f64quat f64quat; #else - /// Default double-precision floating-point vector of 1 components. + /// Default double-qualifier floating-point vector of 1 components. /// @see gtc_type_precision typedef highp_f64vec1 f64vec1; - /// Default double-precision floating-point vector of 2 components. + /// Default double-qualifier floating-point vector of 2 components. /// @see gtc_type_precision typedef highp_f64vec2 f64vec2; - /// Default double-precision floating-point vector of 3 components. + /// Default double-qualifier floating-point vector of 3 components. /// @see gtc_type_precision typedef highp_f64vec3 f64vec3; - /// Default double-precision floating-point vector of 4 components. + /// Default double-qualifier floating-point vector of 4 components. /// @see gtc_type_precision typedef highp_f64vec4 f64vec4; - /// Default double-precision floating-point 2x2 matrix. + /// Default double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef highp_f64mat2x2 f64mat2x2; - /// Default double-precision floating-point 2x3 matrix. + /// Default double-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision typedef highp_f64mat2x3 f64mat2x3; - /// Default double-precision floating-point 2x4 matrix. + /// Default double-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision typedef highp_f64mat2x4 f64mat2x4; - /// Default double-precision floating-point 3x2 matrix. + /// Default double-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision typedef highp_f64mat3x2 f64mat3x2; - /// Default double-precision floating-point 3x3 matrix. + /// Default double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef highp_f64mat3x3 f64mat3x3; - /// Default double-precision floating-point 3x4 matrix. + /// Default double-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision typedef highp_f64mat3x4 f64mat3x4; - /// Default double-precision floating-point 4x2 matrix. + /// Default double-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision typedef highp_f64mat4x2 f64mat4x2; - /// Default double-precision floating-point 4x3 matrix. + /// Default double-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision typedef highp_f64mat4x3 f64mat4x3; - /// Default double-precision floating-point 4x4 matrix. + /// Default double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef highp_f64mat4x4 f64mat4x4; - /// Default double-precision floating-point 2x2 matrix. + /// Default double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision typedef f64mat2x2 f64mat2; - /// Default double-precision floating-point 3x3 matrix. + /// Default double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision typedef f64mat3x3 f64mat3; - /// Default double-precision floating-point 4x4 matrix. + /// Default double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision typedef f64mat4x4 f64mat4; - /// Default double-precision floating-point quaternion. + /// Default double-qualifier floating-point quaternion. /// @see gtc_type_precision typedef highp_f64quat f64quat; #endif diff --git a/external/include/glm/geometric.hpp b/external/include/glm/geometric.hpp index eea45b1..e038083 100644 --- a/external/include/glm/geometric.hpp +++ b/external/include/glm/geometric.hpp @@ -1,6 +1,116 @@ /// @ref core /// @file glm/geometric.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> +/// +/// @defgroup core_func_geometric Geometric functions +/// @ingroup core +/// +/// Include <glm/geometric.hpp> to use these core features. +/// +/// These operate on vectors as vectors, not component-wise. #pragma once -#include "detail/func_geometric.hpp" +#include "detail/type_vec3.hpp" + +namespace glm +{ + /// @addtogroup core_func_geometric + /// @{ + + /// Returns the length of x, i.e., sqrt(x * x). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml">GLSL length man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T length(vec<L, T, Q> const& x); + + /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml">GLSL distance man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T distance(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1); + + /// Returns the dot product of x and y, i.e., result = x * y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml">GLSL dot man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml">GLSL cross man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + + /// Returns a vector in the same direction as x but with length of 1. + /// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml">GLSL normalize man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> normalize(vec<L, T, Q> const& x); + + /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml">GLSL faceforward man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> faceforward( + vec<L, T, Q> const& N, + vec<L, T, Q> const& I, + vec<L, T, Q> const& Nref); + + /// For the incident vector I and surface orientation N, + /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml">GLSL reflect man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> reflect( + vec<L, T, Q> const& I, + vec<L, T, Q> const& N); + + /// For the incident vector I and surface normal N, + /// and the ratio of indices of refraction eta, + /// return the refraction vector. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> refract( + vec<L, T, Q> const& I, + vec<L, T, Q> const& N, + T eta); + + /// @} +}//namespace glm + +#include "detail/func_geometric.inl" diff --git a/external/include/glm/glm.hpp b/external/include/glm/glm.hpp index 021a360..cfd0ce2 100644 --- a/external/include/glm/glm.hpp +++ b/external/include/glm/glm.hpp @@ -1,20 +1,20 @@ /// @ref core /// @file glm/glm.hpp /// -/// @defgroup core GLM Core +/// @defgroup core Core features /// -/// @brief The core of GLM, which implements exactly and only the GLSL specification to the degree possible. +/// @brief Features that implement in C++ the GLSL specification as closely as possible. /// /// The GLM core consists of @ref core_types "C++ types that mirror GLSL types" and -/// C++ functions that mirror the GLSL functions. It also includes -/// @ref core_precision "a set of precision-based types" that can be used in the appropriate +/// C++ functions that mirror the GLSL functions. It also includes +/// @ref core_precision "a set of qualifier-based types" that can be used in the appropriate /// functions. The C++ types are all based on a basic set of @ref core_template "template types". /// /// The best documentation for GLM Core is the current GLSL specification, /// <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf">version 4.2 /// (pdf file)</a>. /// -/// GLM core functionnalities require <glm/glm.hpp> to be included to be used. +/// GLM core functionalities require <glm/glm.hpp> to be included to be used. /// /// @defgroup core_types Types /// @@ -27,30 +27,68 @@ /// /// @defgroup core_precision Precision types /// -/// @brief Non-GLSL types that are used to define precision-based types. +/// @brief Non-GLSL types that are used to define qualifier-based types. /// -/// The GLSL language allows the user to define the precision of a particular variable. -/// In OpenGL's GLSL, these precision qualifiers have no effect; they are there for compatibility -/// with OpenGL ES's precision qualifiers, where they @em do have an effect. +/// The GLSL language allows the user to define the qualifier of a particular variable. +/// In OpenGL's GLSL, these qualifier qualifiers have no effect; they are there for compatibility +/// with OpenGL ES's qualifier qualifiers, where they @em do have an effect. /// -/// C++ has no language equivalent to precision qualifiers. So GLM provides the next-best thing: -/// a number of typedefs of the @ref core_template that use a particular precision. +/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: +/// a number of typedefs of the @ref core_template that use a particular qualifier. /// -/// None of these types make any guarantees about the actual precision used. +/// None of these types make any guarantees about the actual qualifier used. /// /// @ingroup core /// /// @defgroup core_template Template types /// -/// @brief The generic template types used as the basis for the core types. +/// @brief The generic template types used as the basis for the core types. /// /// These types are all templates used to define the actual @ref core_types. -/// These templetes are implementation details of GLM types and should not be used explicitly. +/// These templates are implementation details of GLM types and should not be used explicitly. /// /// @ingroup core +/// +/// @defgroup ext Stable extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// EXT extensions are fully tested and documented. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including <glm/ext.hpp>. Otherwise, each extension needs to be included a specific file. +/// +/// @defgroup gtc Recommended extensions +/// +/// @brief Additional features not specified by GLSL specification. +/// +/// GTC extensions aim to be stable with tests and documentation. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including <glm/ext.hpp>. Otherwise, each extension needs to be included a specific file. +/// +/// @defgroup gtx Experimental extensions +/// +/// @brief Experimental features not specified by GLSL specification. +/// +/// Experimental extensions are useful functions and types, but the development of +/// their API and functionality is not necessarily stable. They can change +/// substantially between versions. Backwards compatibility is not much of an issue +/// for them. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions +/// at once by including <glm/ext.hpp>. Otherwise, each extension needs to be +/// included a specific file. +/// +/// @mainpage OpenGL Mathematics (GLM) +/// - Website: <a href="https://glm.g-truc.net">glm.g-truc.net</a> +/// - <a href="modules.html">GLM API documentation</a> +/// - <a href="https://github.com/g-truc/glm/blob/master/manual.md">GLM Manual</a> #include "detail/_fixes.hpp" +#include "detail/setup.hpp" + #pragma once #include <cmath> diff --git a/external/include/glm/gtc/bitfield.hpp b/external/include/glm/gtc/bitfield.hpp index 38a38b6..9dcec53 100644 --- a/external/include/glm/gtc/bitfield.hpp +++ b/external/include/glm/gtc/bitfield.hpp @@ -6,16 +6,17 @@ /// /// @defgroup gtc_bitfield GLM_GTC_bitfield /// @ingroup gtc -/// -/// @brief Allow to perform bit operations on integer values -/// -/// <glm/gtc/bitfield.hpp> need to be included to use these functionalities. +/// +/// Include <glm/gtc/bitfield.hpp> to use the features of this extension. +/// +/// Allow to perform bit operations on integer values + +#include "../detail/setup.hpp" #pragma once // Dependencies -#include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #include "../detail/type_int.hpp" #include "../detail/_vectorize.hpp" #include <limits> @@ -32,172 +33,192 @@ namespace glm /// Build a mask of 'count' bits /// /// @see gtc_bitfield - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType mask(genIUType Bits); - + /// Build a mask of 'count' bits /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_bitfield - template <typename T, precision P, template <typename, precision> class vecIUType> - GLM_FUNC_DECL vecIUType<T, P> mask(vecIUType<T, P> const & v); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> mask(vec<L, T, Q> const& v); /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. /// /// @see gtc_bitfield - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType bitfieldRotateRight(genIUType In, int Shift); /// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_bitfield - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldRotateRight(vecType<T, P> const & In, int Shift); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldRotateRight(vec<L, T, Q> const& In, int Shift); /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. /// /// @see gtc_bitfield - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType bitfieldRotateLeft(genIUType In, int Shift); /// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_bitfield - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldRotateLeft(vecType<T, P> const & In, int Shift); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldRotateLeft(vec<L, T, Q> const& In, int Shift); /// Set to 1 a range of bits. /// /// @see gtc_bitfield - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount); /// Set to 1 a range of bits. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_bitfield - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldFillOne(vecType<T, P> const & Value, int FirstBit, int BitCount); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldFillOne(vec<L, T, Q> const& Value, int FirstBit, int BitCount); /// Set to 0 a range of bits. /// /// @see gtc_bitfield - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount); /// Set to 0 a range of bits. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Signed and unsigned integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_bitfield - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> bitfieldFillZero(vecType<T, P> const & Value, int FirstBit, int BitCount); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldFillZero(vec<L, T, Q> const& Value, int FirstBit, int BitCount); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y); /// Interleaves the bits of x and y. /// The first bit is the first bit of x followed by the first bit of y. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y); /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z); /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z); /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z); - /// Interleaves the bits of x, y and z. + /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z); - /// Interleaves the bits of x, y and z. + /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z); - /// Interleaves the bits of x, y and z. + /// Interleaves the bits of x, y and z. /// The first bit is the first bit of x followed by the first bit of y and the first bit of z. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z); - /// Interleaves the bits of x, y, z and w. + /// Interleaves the bits of x, y, z and w. /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w); - /// Interleaves the bits of x, y, z and w. + /// Interleaves the bits of x, y, z and w. /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w); - /// Interleaves the bits of x, y, z and w. + /// Interleaves the bits of x, y, z and w. /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w); - /// Interleaves the bits of x, y, z and w. + /// Interleaves the bits of x, y, z and w. /// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w. /// The other bits are interleaved following the previous sequence. - /// + /// /// @see gtc_bitfield GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w); diff --git a/external/include/glm/gtc/bitfield.inl b/external/include/glm/gtc/bitfield.inl index 490cfb3..9735740 100644 --- a/external/include/glm/gtc/bitfield.inl +++ b/external/include/glm/gtc/bitfield.inl @@ -6,165 +6,165 @@ namespace glm{ namespace detail { - template <typename PARAM, typename RET> + template<typename PARAM, typename RET> GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y); - template <typename PARAM, typename RET> + template<typename PARAM, typename RET> GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z); - template <typename PARAM, typename RET> + template<typename PARAM, typename RET> GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w); - template <> + template<> GLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y) { glm::uint16 REG1(x); glm::uint16 REG2(y); - REG1 = ((REG1 << 4) | REG1) & glm::uint16(0x0F0F); - REG2 = ((REG2 << 4) | REG2) & glm::uint16(0x0F0F); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint16>(0x0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint16>(0x0F0F); - REG1 = ((REG1 << 2) | REG1) & glm::uint16(0x3333); - REG2 = ((REG2 << 2) | REG2) & glm::uint16(0x3333); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint16>(0x3333); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint16>(0x3333); - REG1 = ((REG1 << 1) | REG1) & glm::uint16(0x5555); - REG2 = ((REG2 << 1) | REG2) & glm::uint16(0x5555); + REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint16>(0x5555); + REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint16>(0x5555); - return REG1 | (REG2 << 1); + return REG1 | static_cast<glm::uint16>(REG2 << 1); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x, glm::uint16 y) { glm::uint32 REG1(x); glm::uint32 REG2(y); - REG1 = ((REG1 << 8) | REG1) & glm::uint32(0x00FF00FF); - REG2 = ((REG2 << 8) | REG2) & glm::uint32(0x00FF00FF); + REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint32>(0x00FF00FF); + REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint32>(0x00FF00FF); - REG1 = ((REG1 << 4) | REG1) & glm::uint32(0x0F0F0F0F); - REG2 = ((REG2 << 4) | REG2) & glm::uint32(0x0F0F0F0F); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint32>(0x0F0F0F0F); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint32>(0x0F0F0F0F); - REG1 = ((REG1 << 2) | REG1) & glm::uint32(0x33333333); - REG2 = ((REG2 << 2) | REG2) & glm::uint32(0x33333333); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint32>(0x33333333); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint32>(0x33333333); - REG1 = ((REG1 << 1) | REG1) & glm::uint32(0x55555555); - REG2 = ((REG2 << 1) | REG2) & glm::uint32(0x55555555); + REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint32>(0x55555555); + REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint32>(0x55555555); return REG1 | (REG2 << 1); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y) { glm::uint64 REG1(x); glm::uint64 REG2(y); - REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFFull); - REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFFull); + REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull); + REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull); - REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FFull); - REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FFull); + REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull); + REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull); - REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0Full); - REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0Full); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full); - REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333ull); - REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333ull); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x3333333333333333ull); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x3333333333333333ull); - REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555ull); - REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555ull); + REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint64>(0x5555555555555555ull); + REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint64>(0x5555555555555555ull); return REG1 | (REG2 << 1); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z) { glm::uint32 REG1(x); glm::uint32 REG2(y); glm::uint32 REG3(z); - REG1 = ((REG1 << 16) | REG1) & glm::uint32(0x00FF0000FF0000FF); - REG2 = ((REG2 << 16) | REG2) & glm::uint32(0x00FF0000FF0000FF); - REG3 = ((REG3 << 16) | REG3) & glm::uint32(0x00FF0000FF0000FF); + REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint32>(0xFF0000FFu); + REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint32>(0xFF0000FFu); + REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint32>(0xFF0000FFu); - REG1 = ((REG1 << 8) | REG1) & glm::uint32(0xF00F00F00F00F00F); - REG2 = ((REG2 << 8) | REG2) & glm::uint32(0xF00F00F00F00F00F); - REG3 = ((REG3 << 8) | REG3) & glm::uint32(0xF00F00F00F00F00F); + REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint32>(0x0F00F00Fu); + REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint32>(0x0F00F00Fu); + REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint32>(0x0F00F00Fu); - REG1 = ((REG1 << 4) | REG1) & glm::uint32(0x30C30C30C30C30C3); - REG2 = ((REG2 << 4) | REG2) & glm::uint32(0x30C30C30C30C30C3); - REG3 = ((REG3 << 4) | REG3) & glm::uint32(0x30C30C30C30C30C3); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint32>(0xC30C30C3u); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint32>(0xC30C30C3u); + REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint32>(0xC30C30C3u); - REG1 = ((REG1 << 2) | REG1) & glm::uint32(0x9249249249249249); - REG2 = ((REG2 << 2) | REG2) & glm::uint32(0x9249249249249249); - REG3 = ((REG3 << 2) | REG3) & glm::uint32(0x9249249249249249); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint32>(0x49249249u); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint32>(0x49249249u); + REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint32>(0x49249249u); return REG1 | (REG2 << 1) | (REG3 << 2); } - - template <> + + template<> GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z) { glm::uint64 REG1(x); glm::uint64 REG2(y); glm::uint64 REG3(z); - REG1 = ((REG1 << 32) | REG1) & glm::uint64(0xFFFF00000000FFFFull); - REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFFull); - REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFFull); + REG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); - REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FFull); - REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FFull); - REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FFull); + REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); - REG1 = ((REG1 << 8) | REG1) & glm::uint64(0xF00F00F00F00F00Full); - REG2 = ((REG2 << 8) | REG2) & glm::uint64(0xF00F00F00F00F00Full); - REG3 = ((REG3 << 8) | REG3) & glm::uint64(0xF00F00F00F00F00Full); + REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); - REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x30C30C30C30C30C3ull); - REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x30C30C30C30C30C3ull); - REG3 = ((REG3 << 4) | REG3) & glm::uint64(0x30C30C30C30C30C3ull); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); - REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x9249249249249249ull); - REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x9249249249249249ull); - REG3 = ((REG3 << 2) | REG3) & glm::uint64(0x9249249249249249ull); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull); return REG1 | (REG2 << 1) | (REG3 << 2); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y, glm::uint32 z) { glm::uint64 REG1(x); glm::uint64 REG2(y); glm::uint64 REG3(z); - REG1 = ((REG1 << 32) | REG1) & glm::uint64(0xFFFF00000000FFFFull); - REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFFull); - REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFFull); + REG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); + REG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); + REG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull); - REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FFull); - REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FFull); - REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FFull); + REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); + REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); + REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull); - REG1 = ((REG1 << 8) | REG1) & glm::uint64(0xF00F00F00F00F00Full); - REG2 = ((REG2 << 8) | REG2) & glm::uint64(0xF00F00F00F00F00Full); - REG3 = ((REG3 << 8) | REG3) & glm::uint64(0xF00F00F00F00F00Full); + REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); + REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); + REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full); - REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x30C30C30C30C30C3ull); - REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x30C30C30C30C30C3ull); - REG3 = ((REG3 << 4) | REG3) & glm::uint64(0x30C30C30C30C30C3ull); + REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); + REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); + REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull); - REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x9249249249249249ull); - REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x9249249249249249ull); - REG3 = ((REG3 << 2) | REG3) & glm::uint64(0x9249249249249249ull); + REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull); + REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull); + REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull); return REG1 | (REG2 << 1) | (REG3 << 2); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w) { glm::uint32 REG1(x); @@ -172,25 +172,25 @@ namespace detail glm::uint32 REG3(z); glm::uint32 REG4(w); - REG1 = ((REG1 << 12) | REG1) & glm::uint32(0x000F000F000F000F); - REG2 = ((REG2 << 12) | REG2) & glm::uint32(0x000F000F000F000F); - REG3 = ((REG3 << 12) | REG3) & glm::uint32(0x000F000F000F000F); - REG4 = ((REG4 << 12) | REG4) & glm::uint32(0x000F000F000F000F); + REG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint32>(0x000F000Fu); + REG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint32>(0x000F000Fu); + REG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint32>(0x000F000Fu); + REG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint32>(0x000F000Fu); - REG1 = ((REG1 << 6) | REG1) & glm::uint32(0x0303030303030303); - REG2 = ((REG2 << 6) | REG2) & glm::uint32(0x0303030303030303); - REG3 = ((REG3 << 6) | REG3) & glm::uint32(0x0303030303030303); - REG4 = ((REG4 << 6) | REG4) & glm::uint32(0x0303030303030303); + REG1 = ((REG1 << 6) | REG1) & static_cast<glm::uint32>(0x03030303u); + REG2 = ((REG2 << 6) | REG2) & static_cast<glm::uint32>(0x03030303u); + REG3 = ((REG3 << 6) | REG3) & static_cast<glm::uint32>(0x03030303u); + REG4 = ((REG4 << 6) | REG4) & static_cast<glm::uint32>(0x03030303u); - REG1 = ((REG1 << 3) | REG1) & glm::uint32(0x1111111111111111); - REG2 = ((REG2 << 3) | REG2) & glm::uint32(0x1111111111111111); - REG3 = ((REG3 << 3) | REG3) & glm::uint32(0x1111111111111111); - REG4 = ((REG4 << 3) | REG4) & glm::uint32(0x1111111111111111); + REG1 = ((REG1 << 3) | REG1) & static_cast<glm::uint32>(0x11111111u); + REG2 = ((REG2 << 3) | REG2) & static_cast<glm::uint32>(0x11111111u); + REG3 = ((REG3 << 3) | REG3) & static_cast<glm::uint32>(0x11111111u); + REG4 = ((REG4 << 3) | REG4) & static_cast<glm::uint32>(0x11111111u); return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); } - template <> + template<> GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z, glm::uint16 w) { glm::uint64 REG1(x); @@ -198,31 +198,31 @@ namespace detail glm::uint64 REG3(z); glm::uint64 REG4(w); - REG1 = ((REG1 << 24) | REG1) & glm::uint64(0x000000FF000000FFull); - REG2 = ((REG2 << 24) | REG2) & glm::uint64(0x000000FF000000FFull); - REG3 = ((REG3 << 24) | REG3) & glm::uint64(0x000000FF000000FFull); - REG4 = ((REG4 << 24) | REG4) & glm::uint64(0x000000FF000000FFull); + REG1 = ((REG1 << 24) | REG1) & static_cast<glm::uint64>(0x000000FF000000FFull); + REG2 = ((REG2 << 24) | REG2) & static_cast<glm::uint64>(0x000000FF000000FFull); + REG3 = ((REG3 << 24) | REG3) & static_cast<glm::uint64>(0x000000FF000000FFull); + REG4 = ((REG4 << 24) | REG4) & static_cast<glm::uint64>(0x000000FF000000FFull); - REG1 = ((REG1 << 12) | REG1) & glm::uint64(0x000F000F000F000Full); - REG2 = ((REG2 << 12) | REG2) & glm::uint64(0x000F000F000F000Full); - REG3 = ((REG3 << 12) | REG3) & glm::uint64(0x000F000F000F000Full); - REG4 = ((REG4 << 12) | REG4) & glm::uint64(0x000F000F000F000Full); + REG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint64>(0x000F000F000F000Full); + REG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint64>(0x000F000F000F000Full); + REG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint64>(0x000F000F000F000Full); + REG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint64>(0x000F000F000F000Full); - REG1 = ((REG1 << 6) | REG1) & glm::uint64(0x0303030303030303ull); - REG2 = ((REG2 << 6) | REG2) & glm::uint64(0x0303030303030303ull); - REG3 = ((REG3 << 6) | REG3) & glm::uint64(0x0303030303030303ull); - REG4 = ((REG4 << 6) | REG4) & glm::uint64(0x0303030303030303ull); + REG1 = ((REG1 << 6) | REG1) & static_cast<glm::uint64>(0x0303030303030303ull); + REG2 = ((REG2 << 6) | REG2) & static_cast<glm::uint64>(0x0303030303030303ull); + REG3 = ((REG3 << 6) | REG3) & static_cast<glm::uint64>(0x0303030303030303ull); + REG4 = ((REG4 << 6) | REG4) & static_cast<glm::uint64>(0x0303030303030303ull); - REG1 = ((REG1 << 3) | REG1) & glm::uint64(0x1111111111111111ull); - REG2 = ((REG2 << 3) | REG2) & glm::uint64(0x1111111111111111ull); - REG3 = ((REG3 << 3) | REG3) & glm::uint64(0x1111111111111111ull); - REG4 = ((REG4 << 3) | REG4) & glm::uint64(0x1111111111111111ull); + REG1 = ((REG1 << 3) | REG1) & static_cast<glm::uint64>(0x1111111111111111ull); + REG2 = ((REG2 << 3) | REG2) & static_cast<glm::uint64>(0x1111111111111111ull); + REG3 = ((REG3 << 3) | REG3) & static_cast<glm::uint64>(0x1111111111111111ull); + REG4 = ((REG4 << 3) | REG4) & static_cast<glm::uint64>(0x1111111111111111ull); return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3); } }//namespace detail - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType mask(genIUType Bits) { GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'mask' accepts only integer values"); @@ -230,15 +230,15 @@ namespace detail return Bits >= sizeof(genIUType) * 8 ? ~static_cast<genIUType>(0) : (static_cast<genIUType>(1) << Bits) - static_cast<genIUType>(1); } - template <typename T, precision P, template <typename, precision> class vecIUType> - GLM_FUNC_QUALIFIER vecIUType<T, P> mask(vecIUType<T, P> const& v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mask(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'mask' accepts only integer values"); - return detail::functor1<T, T, P, vecIUType>::call(mask, v); + return detail::functor1<L, T, T, Q>::call(mask, v); } - template <typename genIType> + template<typename genIType> GLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift) { GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateRight' accepts only integer values"); @@ -247,8 +247,8 @@ namespace detail return (In << static_cast<genIType>(Shift)) | (In >> static_cast<genIType>(BitSize - Shift)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldRotateRight(vecType<T, P> const & In, int Shift) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateRight(vec<L, T, Q> const& In, int Shift) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateRight' accepts only integer values"); @@ -256,7 +256,7 @@ namespace detail return (In << static_cast<T>(Shift)) | (In >> static_cast<T>(BitSize - Shift)); } - template <typename genIType> + template<typename genIType> GLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift) { GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateLeft' accepts only integer values"); @@ -265,8 +265,8 @@ namespace detail return (In >> static_cast<genIType>(Shift)) | (In << static_cast<genIType>(BitSize - Shift)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldRotateLeft(vecType<T, P> const& In, int Shift) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateLeft(vec<L, T, Q> const& In, int Shift) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateLeft' accepts only integer values"); @@ -274,26 +274,26 @@ namespace detail return (In >> static_cast<T>(Shift)) | (In << static_cast<T>(BitSize - Shift)); } - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount) { return Value | static_cast<genIUType>(mask(BitCount) << FirstBit); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldFillOne(vecType<T, P> const& Value, int FirstBit, int BitCount) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillOne(vec<L, T, Q> const& Value, int FirstBit, int BitCount) { return Value | static_cast<T>(mask(BitCount) << FirstBit); } - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount) { return Value & static_cast<genIUType>(~(mask(BitCount) << FirstBit)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> bitfieldFillZero(vecType<T, P> const& Value, int FirstBit, int BitCount) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillZero(vec<L, T, Q> const& Value, int FirstBit, int BitCount) { return Value & static_cast<T>(~(mask(BitCount) << FirstBit)); } diff --git a/external/include/glm/gtc/color_encoding.inl b/external/include/glm/gtc/color_encoding.inl deleted file mode 100644 index 68570cb..0000000 --- a/external/include/glm/gtc/color_encoding.inl +++ /dev/null @@ -1,65 +0,0 @@ -/// @ref gtc_color_encoding -/// @file glm/gtc/color_encoding.inl - -namespace glm -{ - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertLinearSRGBToD65XYZ(tvec3<T, P> const& ColorLinearSRGB) - { - tvec3<T, P> const M(0.490f, 0.17697f, 0.2f); - tvec3<T, P> const N(0.31f, 0.8124f, 0.01063f); - tvec3<T, P> const O(0.490f, 0.01f, 0.99f); - - return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast<T>(5.650675255693055f); - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertD65XYZToLinearSRGB(tvec3<T, P> const& ColorD65XYZ) - { - tvec3<T, P> const M(0.41847f, -0.091169f, 0.0009209f); - tvec3<T, P> const N(-0.15866f, 0.25243f, 0.015708f); - tvec3<T, P> const O(0.0009209f, -0.0025498f, 0.1786f); - - return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertLinearSRGBToD50XYZ(tvec3<T, P> const& ColorLinearSRGB) - { - tvec3<T, P> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f); - tvec3<T, P> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f); - tvec3<T, P> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f); - - return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB; - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertD50XYZToLinearSRGB(tvec3<T, P> const& ColorD50XYZ) - { - tvec3<T, P> const M(); - tvec3<T, P> const N(); - tvec3<T, P> const O(); - - return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertD65XYZToD50XYZ(tvec3<T, P> const& ColorD65XYZ) - { - tvec3<T, P> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f); - tvec3<T, P> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f); - tvec3<T, P> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f); - - return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> convertD50XYZToD65XYZ(tvec3<T, P> const& ColorD50XYZ) - { - tvec3<T, P> const M(); - tvec3<T, P> const N(); - tvec3<T, P> const O(); - - return M * ColorD50XYZ + N * ColorD50XYZ + O * ColorD50XYZ; - } -}//namespace glm diff --git a/external/include/glm/gtc/color_space.hpp b/external/include/glm/gtc/color_space.hpp index 08ece8f..56cbc8f 100644 --- a/external/include/glm/gtc/color_space.hpp +++ b/external/include/glm/gtc/color_space.hpp @@ -7,15 +7,15 @@ /// @defgroup gtc_color_space GLM_GTC_color_space /// @ingroup gtc /// -/// @brief Allow to perform bit operations on integer values +/// Include <glm/gtc/color_space.hpp> to use the features of this extension. /// -/// <glm/gtc/color.hpp> need to be included to use these functionalities. +/// Allow to perform bit operations on integer values #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #include "../exponential.hpp" #include "../vec3.hpp" #include "../vec4.hpp" @@ -31,24 +31,24 @@ namespace glm /// @{ /// Convert a linear color to sRGB color using a standard gamma correction. - /// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> convertLinearToSRGB(vecType<T, P> const & ColorLinear); + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear); /// Convert a linear color to sRGB color using a custom gamma correction. - /// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> convertLinearToSRGB(vecType<T, P> const & ColorLinear, T Gamma); + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear, T Gamma); /// Convert a sRGB color to linear color using a standard gamma correction. - /// IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> convertSRGBToLinear(vecType<T, P> const & ColorSRGB); + /// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB); /// Convert a sRGB color to linear color using a custom gamma correction. - // IEC 61966-2-1:1999 specification https://www.w3.org/Graphics/Color/srgb - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> convertSRGBToLinear(vecType<T, P> const & ColorSRGB, T Gamma); + // IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB, T Gamma); /// @} } //namespace glm diff --git a/external/include/glm/gtc/color_space.inl b/external/include/glm/gtc/color_space.inl index c9a44ef..53241ac 100644 --- a/external/include/glm/gtc/color_space.inl +++ b/external/include/glm/gtc/color_space.inl @@ -4,72 +4,82 @@ namespace glm{ namespace detail { - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct compute_rgbToSrgb { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& ColorRGB, T GammaCorrection) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& ColorRGB, T GammaCorrection) { - vecType<T, P> const ClampedColor(clamp(ColorRGB, static_cast<T>(0), static_cast<T>(1))); + vec<L, T, Q> const ClampedColor(clamp(ColorRGB, static_cast<T>(0), static_cast<T>(1))); return mix( - pow(ClampedColor, vecType<T, P>(GammaCorrection)) * static_cast<T>(1.055) - static_cast<T>(0.055), + pow(ClampedColor, vec<L, T, Q>(GammaCorrection)) * static_cast<T>(1.055) - static_cast<T>(0.055), ClampedColor * static_cast<T>(12.92), - lessThan(ClampedColor, vecType<T, P>(static_cast<T>(0.0031308)))); + lessThan(ClampedColor, vec<L, T, Q>(static_cast<T>(0.0031308)))); } }; - template <typename T, precision P> - struct compute_rgbToSrgb<T, P, tvec4> + template<typename T, qualifier Q> + struct compute_rgbToSrgb<4, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const& ColorRGB, T GammaCorrection) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorRGB, T GammaCorrection) { - return tvec4<T, P>(compute_rgbToSrgb<T, P, tvec3>::call(tvec3<T, P>(ColorRGB), GammaCorrection), ColorRGB.w); + return vec<4, T, Q>(compute_rgbToSrgb<3, T, Q>::call(vec<3, T, Q>(ColorRGB), GammaCorrection), ColorRGB.w); } }; - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct compute_srgbToRgb { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& ColorSRGB, T Gamma) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& ColorSRGB, T Gamma) { return mix( - pow((ColorSRGB + static_cast<T>(0.055)) * static_cast<T>(0.94786729857819905213270142180095), vecType<T, P>(Gamma)), + pow((ColorSRGB + static_cast<T>(0.055)) * static_cast<T>(0.94786729857819905213270142180095), vec<L, T, Q>(Gamma)), ColorSRGB * static_cast<T>(0.07739938080495356037151702786378), - lessThanEqual(ColorSRGB, vecType<T, P>(static_cast<T>(0.04045)))); + lessThanEqual(ColorSRGB, vec<L, T, Q>(static_cast<T>(0.04045)))); } }; - template <typename T, precision P> - struct compute_srgbToRgb<T, P, tvec4> + template<typename T, qualifier Q> + struct compute_srgbToRgb<4, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<T, P> call(tvec4<T, P> const& ColorSRGB, T Gamma) + GLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorSRGB, T Gamma) { - return tvec4<T, P>(compute_srgbToRgb<T, P, tvec3>::call(tvec3<T, P>(ColorSRGB), Gamma), ColorSRGB.w); + return vec<4, T, Q>(compute_srgbToRgb<3, T, Q>::call(vec<3, T, Q>(ColorSRGB), Gamma), ColorSRGB.w); } }; }//namespace detail - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> convertLinearToSRGB(vecType<T, P> const& ColorLinear) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear) { - return detail::compute_rgbToSrgb<T, P, vecType>::call(ColorLinear, static_cast<T>(0.41666)); + return detail::compute_rgbToSrgb<L, T, Q>::call(ColorLinear, static_cast<T>(0.41666)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> convertLinearToSRGB(vecType<T, P> const& ColorLinear, T Gamma) + // Based on Ian Taylor http://chilliant.blogspot.fr/2012/08/srgb-approximations-for-hlsl.html + template<> + GLM_FUNC_QUALIFIER vec<3, float, lowp> convertLinearToSRGB(vec<3, float, lowp> const& ColorLinear) { - return detail::compute_rgbToSrgb<T, P, vecType>::call(ColorLinear, static_cast<T>(1) / Gamma); + vec<3, float, lowp> S1 = sqrt(ColorLinear); + vec<3, float, lowp> S2 = sqrt(S1); + vec<3, float, lowp> S3 = sqrt(S2); + return 0.662002687f * S1 + 0.684122060f * S2 - 0.323583601f * S3 - 0.0225411470f * ColorLinear; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> convertSRGBToLinear(vecType<T, P> const& ColorSRGB) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear, T Gamma) { - return detail::compute_srgbToRgb<T, P, vecType>::call(ColorSRGB, static_cast<T>(2.4)); + return detail::compute_rgbToSrgb<L, T, Q>::call(ColorLinear, static_cast<T>(1) / Gamma); } - - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> convertSRGBToLinear(vecType<T, P> const& ColorSRGB, T Gamma) + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB) + { + return detail::compute_srgbToRgb<L, T, Q>::call(ColorSRGB, static_cast<T>(2.4)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB, T Gamma) { - return detail::compute_srgbToRgb<T, P, vecType>::call(ColorSRGB, Gamma); + return detail::compute_srgbToRgb<L, T, Q>::call(ColorSRGB, Gamma); } }//namespace glm diff --git a/external/include/glm/gtc/constants.hpp b/external/include/glm/gtc/constants.hpp index d3358c7..f55f619 100644 --- a/external/include/glm/gtc/constants.hpp +++ b/external/include/glm/gtc/constants.hpp @@ -2,14 +2,13 @@ /// @file glm/gtc/constants.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// /// @defgroup gtc_constants GLM_GTC_constants /// @ingroup gtc -/// -/// @brief Provide a list of constants and precomputed useful values. -/// -/// <glm/gtc/constants.hpp> need to be included to use these features. +/// +/// Include <glm/gtc/constants.hpp> to use the features of this extension. +/// +/// Provide a list of constants and precomputed useful values. #pragma once @@ -27,147 +26,147 @@ namespace glm /// Return the epsilon constant for floating point types. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon(); /// Return 0. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType zero(); /// Return 1. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType one(); /// Return the pi constant. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType pi(); /// Return pi * 2. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi(); /// Return square root of pi. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi(); /// Return pi / 2. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi(); /// Return pi / 2 * 3. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi(); /// Return pi / 4. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi(); /// Return 1 / pi. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi(); /// Return 1 / (pi * 2). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi(); /// Return 2 / pi. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi(); /// Return 4 / pi. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi(); /// Return 2 / sqrt(pi). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi(); /// Return 1 / sqrt(2). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two(); /// Return sqrt(pi / 2). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi(); /// Return sqrt(2 * pi). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi(); /// Return sqrt(ln(4)). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four(); /// Return e constant. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType e(); /// Return Euler's constant. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType euler(); /// Return sqrt(2). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_two(); /// Return sqrt(3). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_three(); /// Return sqrt(5). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType root_five(); /// Return ln(2). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two(); /// Return ln(10). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten(); /// Return ln(ln(2)). /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two(); /// Return 1 / 3. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType third(); /// Return 2 / 3. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds(); /// Return the golden ratio constant. /// @see gtc_constants - template <typename genType> + template<typename genType> GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio(); /// @} diff --git a/external/include/glm/gtc/constants.inl b/external/include/glm/gtc/constants.inl index cb451d0..b1d277c 100644 --- a/external/include/glm/gtc/constants.inl +++ b/external/include/glm/gtc/constants.inl @@ -5,175 +5,175 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon() { return std::numeric_limits<genType>::epsilon(); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero() { return genType(0); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one() { return genType(1); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi() { return genType(3.14159265358979323846264338327950288); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi() { return genType(6.28318530717958647692528676655900576); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi() { return genType(1.772453850905516027); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi() { return genType(1.57079632679489661923132169163975144); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi() { - return genType(4.71238898038468985769396507491925432); + return genType(4.71238898038468985769396507491925432); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi() { return genType(0.785398163397448309615660845819875721); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi() { return genType(0.318309886183790671537767526745028724); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi() { return genType(0.159154943091895335768883763372514362); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi() { return genType(0.636619772367581343075535053490057448); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi() { return genType(1.273239544735162686151070106980114898); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi() { return genType(1.12837916709551257389615890312154517); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two() { return genType(0.707106781186547524400844362104849039); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi() { return genType(1.253314137315500251); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi() { return genType(2.506628274631000502); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four() { return genType(1.17741002251547469); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e() { return genType(2.71828182845904523536); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler() { return genType(0.577215664901532860606); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two() { return genType(1.41421356237309504880168872420969808); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three() { return genType(1.73205080756887729352744634150587236); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five() { return genType(2.23606797749978969640917366873127623); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two() { return genType(0.693147180559945309417232121458176568); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten() { return genType(2.30258509299404568401799145468436421); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ln_two() { return genType(-0.3665129205816643); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third() { return genType(0.3333333333333333333333333333333333333333); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds() { return genType(0.666666666666666666666666666666666666667); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio() { return genType(1.61803398874989484820458683436563811); diff --git a/external/include/glm/gtc/epsilon.hpp b/external/include/glm/gtc/epsilon.hpp index 289f5b7..dce03ef 100644 --- a/external/include/glm/gtc/epsilon.hpp +++ b/external/include/glm/gtc/epsilon.hpp @@ -1,22 +1,21 @@ /// @ref gtc_epsilon /// @file glm/gtc/epsilon.hpp -/// +/// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtc_quaternion (dependence) /// /// @defgroup gtc_epsilon GLM_GTC_epsilon /// @ingroup gtc -/// -/// @brief Comparison functions for a user defined epsilon values. -/// -/// <glm/gtc/epsilon.hpp> need to be included to use these functionalities. +/// +/// Include <glm/gtc/epsilon.hpp> to use the features of this extension. +/// +/// Comparison functions for a user defined epsilon values. #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTC_epsilon extension included") @@ -31,41 +30,29 @@ namespace glm /// True if this expression is satisfied. /// /// @see gtc_epsilon - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> epsilonEqual( - vecType<T, P> const & x, - vecType<T, P> const & y, - T const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon); /// Returns the component-wise comparison of |x - y| < epsilon. /// True if this expression is satisfied. /// /// @see gtc_epsilon - template <typename genType> - GLM_FUNC_DECL bool epsilonEqual( - genType const & x, - genType const & y, - genType const & epsilon); + template<typename genType> + GLM_FUNC_DECL bool epsilonEqual(genType const& x, genType const& y, genType const& epsilon); /// Returns the component-wise comparison of |x - y| < epsilon. /// True if this expression is not satisfied. /// /// @see gtc_epsilon - template <typename genType> - GLM_FUNC_DECL typename genType::boolType epsilonNotEqual( - genType const & x, - genType const & y, - typename genType::value_type const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon); /// Returns the component-wise comparison of |x - y| >= epsilon. /// True if this expression is not satisfied. /// /// @see gtc_epsilon - template <typename genType> - GLM_FUNC_DECL bool epsilonNotEqual( - genType const & x, - genType const & y, - genType const & epsilon); + template<typename genType> + GLM_FUNC_DECL bool epsilonNotEqual(genType const& x, genType const& y, genType const& epsilon); /// @} }//namespace glm diff --git a/external/include/glm/gtc/epsilon.inl b/external/include/glm/gtc/epsilon.inl index b5577d9..2478cab 100644 --- a/external/include/glm/gtc/epsilon.inl +++ b/external/include/glm/gtc/epsilon.inl @@ -5,121 +5,79 @@ #include "quaternion.hpp" #include "../vector_relational.hpp" #include "../common.hpp" -#include "../vec2.hpp" -#include "../vec3.hpp" -#include "../vec4.hpp" +#include "../detail/type_vec.hpp" namespace glm { - template <> + template<> GLM_FUNC_QUALIFIER bool epsilonEqual ( - float const & x, - float const & y, - float const & epsilon + float const& x, + float const& y, + float const& epsilon ) { return abs(x - y) < epsilon; } - template <> + template<> GLM_FUNC_QUALIFIER bool epsilonEqual ( - double const & x, - double const & y, - double const & epsilon + double const& x, + double const& y, + double const& epsilon ) { return abs(x - y) < epsilon; } - template <> - GLM_FUNC_QUALIFIER bool epsilonNotEqual - ( - float const & x, - float const & y, - float const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon) { - return abs(x - y) >= epsilon; + return lessThan(abs(x - y), vec<L, T, Q>(epsilon)); } - template <> - GLM_FUNC_QUALIFIER bool epsilonNotEqual - ( - double const & x, - double const & y, - double const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon) { - return abs(x - y) >= epsilon; + return lessThan(abs(x - y), vec<L, T, Q>(epsilon)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual - ( - vecType<T, P> const & x, - vecType<T, P> const & y, - T const & epsilon - ) + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(float const& x, float const& y, float const& epsilon) { - return lessThan(abs(x - y), vecType<T, P>(epsilon)); + return abs(x - y) >= epsilon; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual - ( - vecType<T, P> const & x, - vecType<T, P> const & y, - vecType<T, P> const & epsilon - ) + template<> + GLM_FUNC_QUALIFIER bool epsilonNotEqual(double const& x, double const& y, double const& epsilon) { - return lessThan(abs(x - y), vecType<T, P>(epsilon)); + return abs(x - y) >= epsilon; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual - ( - vecType<T, P> const & x, - vecType<T, P> const & y, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon) { - return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon)); + return greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual - ( - vecType<T, P> const & x, - vecType<T, P> const & y, - vecType<T, P> const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon) { - return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon)); + return greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> epsilonEqual - ( - tquat<T, P> const & x, - tquat<T, P> const & y, - T const & epsilon - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonEqual(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& epsilon) { - tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); - return lessThan(abs(v), tvec4<T, P>(epsilon)); + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return lessThan(abs(v), vec<4, T, Q>(epsilon)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> epsilonNotEqual - ( - tquat<T, P> const & x, - tquat<T, P> const & y, - T const & epsilon - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonNotEqual(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& epsilon) { - tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); - return greaterThanEqual(abs(v), tvec4<T, P>(epsilon)); + vec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w); + return greaterThanEqual(abs(v), vec<4, T, Q>(epsilon)); } }//namespace glm diff --git a/external/include/glm/gtc/functions.hpp b/external/include/glm/gtc/functions.hpp deleted file mode 100644 index ab1590b..0000000 --- a/external/include/glm/gtc/functions.hpp +++ /dev/null @@ -1,53 +0,0 @@ -/// @ref gtc_functions -/// @file glm/gtc/functions.hpp -/// -/// @see core (dependence) -/// @see gtc_half_float (dependence) -/// @see gtc_quaternion (dependence) -/// -/// @defgroup gtc_functions GLM_GTC_functions -/// @ingroup gtc -/// -/// @brief List of useful common functions. -/// -/// <glm/gtc/functions.hpp> need to be included to use these functionalities. - -#pragma once - -// Dependencies -#include "../detail/setup.hpp" -#include "../detail/precision.hpp" -#include "../detail/type_vec2.hpp" - -#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) -# pragma message("GLM: GLM_GTC_functions extension included") -#endif - -namespace glm -{ - /// @addtogroup gtc_functions - /// @{ - - /// 1D gauss function - /// - /// @see gtc_epsilon - template <typename T> - GLM_FUNC_DECL T gauss( - T x, - T ExpectedValue, - T StandardDeviation); - - /// 2D gauss function - /// - /// @see gtc_epsilon - template <typename T, precision P> - GLM_FUNC_DECL T gauss( - tvec2<T, P> const& Coord, - tvec2<T, P> const& ExpectedValue, - tvec2<T, P> const& StandardDeviation); - - /// @} -}//namespace glm - -#include "functions.inl" - diff --git a/external/include/glm/gtc/integer.hpp b/external/include/glm/gtc/integer.hpp index 69ffb1d..1d28c32 100644 --- a/external/include/glm/gtc/integer.hpp +++ b/external/include/glm/gtc/integer.hpp @@ -7,18 +7,18 @@ /// @defgroup gtc_integer GLM_GTC_integer /// @ingroup gtc /// -/// @brief Allow to perform bit operations on integer values +/// Include <glm/gtc/integer.hpp> to use the features of this extension. /// -/// <glm/gtc/integer.hpp> need to be included to use these functionalities. +/// @brief Allow to perform bit operations on integer values #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" -#include "../detail/func_common.hpp" -#include "../detail/func_integer.hpp" -#include "../detail/func_exponential.hpp" +#include "../detail/qualifier.hpp" +#include "../common.hpp" +#include "../integer.hpp" +#include "../exponential.hpp" #include <limits> #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) @@ -32,69 +32,32 @@ namespace glm /// Returns the log2 of x for integer values. Can be reliably using to compute mipmap count from the texture size. /// @see gtc_integer - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType log2(genIUType x); - /// Modulus. Returns x % y - /// for each component in x using the floating point value y. - /// - /// @tparam genIUType Integer-point scalar or vector types. - /// - /// @see gtc_integer - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genIUType> - GLM_FUNC_DECL genIUType mod(genIUType x, genIUType y); - - /// Modulus. Returns x % y - /// for each component in x using the floating point value y. - /// - /// @tparam T Integer scalar types. - /// @tparam vecType vector types. - /// - /// @see gtc_integer - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, T y); - - /// Modulus. Returns x % y - /// for each component in x using the floating point value y. - /// - /// @tparam T Integer scalar types. - /// @tparam vecType vector types. - /// - /// @see gtc_integer - /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> - /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> mod(vecType<T, P> const & x, vecType<T, P> const & y); - /// Returns a value equal to the nearest integer to x. /// The fraction 0.5 will round in a direction chosen by the /// implementation, presumably the direction that is fastest. - /// + /// /// @param x The values of the argument must be greater or equal to zero. /// @tparam T floating point scalar types. - /// @tparam vecType vector types. - /// + /// /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> /// @see gtc_integer - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<int, P> iround(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, int, Q> iround(vec<L, T, Q> const& x); /// Returns a value equal to the nearest integer to x. /// The fraction 0.5 will round in a direction chosen by the /// implementation, presumably the direction that is fastest. - /// + /// /// @param x The values of the argument must be greater or equal to zero. /// @tparam T floating point scalar types. - /// @tparam vecType vector types. - /// + /// /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> /// @see gtc_integer - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<uint, P> uround(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, uint, Q> uround(vec<L, T, Q> const& x); /// @} } //namespace glm diff --git a/external/include/glm/gtc/integer.inl b/external/include/glm/gtc/integer.inl index 7ce2918..9d4b618 100644 --- a/external/include/glm/gtc/integer.inl +++ b/external/include/glm/gtc/integer.inl @@ -4,36 +4,34 @@ namespace glm{ namespace detail { - template <typename T, precision P, template <typename, precision> class vecType, bool Aligned> - struct compute_log2<T, P, vecType, false, Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> + struct compute_log2<L, T, Q, false, Aligned> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & vec) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v) { //Equivalent to return findMSB(vec); but save one function call in ASM with VC //return findMSB(vec); - return vecType<T, P>(detail::compute_findMSB_vec<T, P, vecType, sizeof(T) * 8>::call(vec)); + return vec<L, T, Q>(detail::compute_findMSB_vec<L, T, Q, sizeof(T) * 8>::call(v)); } }; # if GLM_HAS_BITSCAN_WINDOWS - template <precision P, bool Aligned> - struct compute_log2<int, P, tvec4, false, Aligned> + template<qualifier Q, bool Aligned> + struct compute_log2<4, int, Q, false, Aligned> { - GLM_FUNC_QUALIFIER static tvec4<int, P> call(tvec4<int, P> const & vec) + GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v) { - tvec4<int, P> Result(glm::uninitialize); - - _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.x), vec.x); - _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.y), vec.y); - _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.z), vec.z); - _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.w), vec.w); - + vec<4, int, Q> Result; + _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.x), v.x); + _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.y), v.y); + _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.z), v.z); + _BitScanReverse(reinterpret_cast<unsigned long*>(&Result.w), v.w); return Result; } }; # endif//GLM_HAS_BITSCAN_WINDOWS }//namespace detail - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER int iround(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'iround' only accept floating-point inputs"); @@ -42,16 +40,16 @@ namespace detail return static_cast<int>(x + static_cast<genType>(0.5)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<int, P> iround(vecType<T, P> const& x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, int, Q> iround(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'iround' only accept floating-point inputs"); - assert(all(lessThanEqual(vecType<T, P>(0), x))); + assert(all(lessThanEqual(vec<L, T, Q>(0), x))); - return vecType<int, P>(x + static_cast<T>(0.5)); + return vec<L, int, Q>(x + static_cast<T>(0.5)); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER uint uround(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'uround' only accept floating-point inputs"); @@ -60,12 +58,12 @@ namespace detail return static_cast<uint>(x + static_cast<genType>(0.5)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uint, P> uround(vecType<T, P> const& x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint, Q> uround(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'uround' only accept floating-point inputs"); - assert(all(lessThanEqual(vecType<T, P>(0), x))); + assert(all(lessThanEqual(vec<L, T, Q>(0), x))); - return vecType<uint, P>(x + static_cast<T>(0.5)); + return vec<L, uint, Q>(x + static_cast<T>(0.5)); } }//namespace glm diff --git a/external/include/glm/gtc/matrix_access.hpp b/external/include/glm/gtc/matrix_access.hpp index e4156ef..3a67cff 100644 --- a/external/include/glm/gtc/matrix_access.hpp +++ b/external/include/glm/gtc/matrix_access.hpp @@ -5,9 +5,10 @@ /// /// @defgroup gtc_matrix_access GLM_GTC_matrix_access /// @ingroup gtc -/// +/// +/// Include <glm/gtc/matrix_access.hpp> to use the features of this extension. +/// /// Defines functions to access rows or columns of a matrix easily. -/// <glm/gtc/matrix_access.hpp> need to be included to use these functionalities. #pragma once @@ -25,33 +26,33 @@ namespace glm /// Get a specific row of a matrix. /// @see gtc_matrix_access - template <typename genType> + template<typename genType> GLM_FUNC_DECL typename genType::row_type row( - genType const & m, + genType const& m, length_t index); /// Set a specific row to a matrix. /// @see gtc_matrix_access - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType row( - genType const & m, + genType const& m, length_t index, - typename genType::row_type const & x); + typename genType::row_type const& x); /// Get a specific column of a matrix. /// @see gtc_matrix_access - template <typename genType> + template<typename genType> GLM_FUNC_DECL typename genType::col_type column( - genType const & m, + genType const& m, length_t index); /// Set a specific column to a matrix. /// @see gtc_matrix_access - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType column( - genType const & m, + genType const& m, length_t index, - typename genType::col_type const & x); + typename genType::col_type const& x); /// @} }//namespace glm diff --git a/external/include/glm/gtc/matrix_access.inl b/external/include/glm/gtc/matrix_access.inl index 831b940..176136a 100644 --- a/external/include/glm/gtc/matrix_access.inl +++ b/external/include/glm/gtc/matrix_access.inl @@ -3,12 +3,12 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType row ( - genType const & m, + genType const& m, length_t index, - typename genType::row_type const & x + typename genType::row_type const& x ) { assert(index >= 0 && index < m[0].length()); @@ -19,27 +19,27 @@ namespace glm return Result; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER typename genType::row_type row ( - genType const & m, + genType const& m, length_t index ) { assert(index >= 0 && index < m[0].length()); - typename genType::row_type Result; + typename genType::row_type Result(0); for(length_t i = 0; i < m.length(); ++i) Result[i] = m[i][index]; return Result; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType column ( - genType const & m, + genType const& m, length_t index, - typename genType::col_type const & x + typename genType::col_type const& x ) { assert(index >= 0 && index < m.length()); @@ -49,10 +49,10 @@ namespace glm return Result; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER typename genType::col_type column ( - genType const & m, + genType const& m, length_t index ) { diff --git a/external/include/glm/gtc/matrix_integer.hpp b/external/include/glm/gtc/matrix_integer.hpp index fdc816d..59aec12 100644 --- a/external/include/glm/gtc/matrix_integer.hpp +++ b/external/include/glm/gtc/matrix_integer.hpp @@ -6,8 +6,9 @@ /// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer /// @ingroup gtc /// +/// Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. +/// /// Defines a number of matrices with integer types. -/// <glm/gtc/matrix_integer.hpp> need to be included to use these functionalities. #pragma once @@ -31,302 +32,302 @@ namespace glm /// @addtogroup gtc_matrix_integer /// @{ - /// High-precision signed integer 2x2 matrix. + /// High-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, highp> highp_imat2; + typedef mat<2, 2, int, highp> highp_imat2; - /// High-precision signed integer 3x3 matrix. + /// High-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, highp> highp_imat3; + typedef mat<3, 3, int, highp> highp_imat3; - /// High-precision signed integer 4x4 matrix. + /// High-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, highp> highp_imat4; + typedef mat<4, 4, int, highp> highp_imat4; - /// High-precision signed integer 2x2 matrix. + /// High-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, highp> highp_imat2x2; + typedef mat<2, 2, int, highp> highp_imat2x2; - /// High-precision signed integer 2x3 matrix. + /// High-qualifier signed integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<int, highp> highp_imat2x3; + typedef mat<2, 3, int, highp> highp_imat2x3; - /// High-precision signed integer 2x4 matrix. + /// High-qualifier signed integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<int, highp> highp_imat2x4; + typedef mat<2, 4, int, highp> highp_imat2x4; - /// High-precision signed integer 3x2 matrix. + /// High-qualifier signed integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<int, highp> highp_imat3x2; + typedef mat<3, 2, int, highp> highp_imat3x2; - /// High-precision signed integer 3x3 matrix. + /// High-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, highp> highp_imat3x3; + typedef mat<3, 3, int, highp> highp_imat3x3; - /// High-precision signed integer 3x4 matrix. + /// High-qualifier signed integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<int, highp> highp_imat3x4; + typedef mat<3, 4, int, highp> highp_imat3x4; - /// High-precision signed integer 4x2 matrix. + /// High-qualifier signed integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<int, highp> highp_imat4x2; + typedef mat<4, 2, int, highp> highp_imat4x2; - /// High-precision signed integer 4x3 matrix. + /// High-qualifier signed integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<int, highp> highp_imat4x3; + typedef mat<4, 3, int, highp> highp_imat4x3; - /// High-precision signed integer 4x4 matrix. + /// High-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, highp> highp_imat4x4; + typedef mat<4, 4, int, highp> highp_imat4x4; - /// Medium-precision signed integer 2x2 matrix. + /// Medium-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, mediump> mediump_imat2; + typedef mat<2, 2, int, mediump> mediump_imat2; - /// Medium-precision signed integer 3x3 matrix. + /// Medium-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, mediump> mediump_imat3; + typedef mat<3, 3, int, mediump> mediump_imat3; - /// Medium-precision signed integer 4x4 matrix. + /// Medium-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, mediump> mediump_imat4; + typedef mat<4, 4, int, mediump> mediump_imat4; - /// Medium-precision signed integer 2x2 matrix. + /// Medium-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, mediump> mediump_imat2x2; + typedef mat<2, 2, int, mediump> mediump_imat2x2; - /// Medium-precision signed integer 2x3 matrix. + /// Medium-qualifier signed integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<int, mediump> mediump_imat2x3; + typedef mat<2, 3, int, mediump> mediump_imat2x3; - /// Medium-precision signed integer 2x4 matrix. + /// Medium-qualifier signed integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<int, mediump> mediump_imat2x4; + typedef mat<2, 4, int, mediump> mediump_imat2x4; - /// Medium-precision signed integer 3x2 matrix. + /// Medium-qualifier signed integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<int, mediump> mediump_imat3x2; + typedef mat<3, 2, int, mediump> mediump_imat3x2; - /// Medium-precision signed integer 3x3 matrix. + /// Medium-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, mediump> mediump_imat3x3; + typedef mat<3, 3, int, mediump> mediump_imat3x3; - /// Medium-precision signed integer 3x4 matrix. + /// Medium-qualifier signed integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<int, mediump> mediump_imat3x4; + typedef mat<3, 4, int, mediump> mediump_imat3x4; - /// Medium-precision signed integer 4x2 matrix. + /// Medium-qualifier signed integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<int, mediump> mediump_imat4x2; + typedef mat<4, 2, int, mediump> mediump_imat4x2; - /// Medium-precision signed integer 4x3 matrix. + /// Medium-qualifier signed integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<int, mediump> mediump_imat4x3; + typedef mat<4, 3, int, mediump> mediump_imat4x3; - /// Medium-precision signed integer 4x4 matrix. + /// Medium-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, mediump> mediump_imat4x4; + typedef mat<4, 4, int, mediump> mediump_imat4x4; - /// Low-precision signed integer 2x2 matrix. + /// Low-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, lowp> lowp_imat2; - - /// Low-precision signed integer 3x3 matrix. + typedef mat<2, 2, int, lowp> lowp_imat2; + + /// Low-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, lowp> lowp_imat3; + typedef mat<3, 3, int, lowp> lowp_imat3; - /// Low-precision signed integer 4x4 matrix. + /// Low-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, lowp> lowp_imat4; + typedef mat<4, 4, int, lowp> lowp_imat4; - /// Low-precision signed integer 2x2 matrix. + /// Low-qualifier signed integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<int, lowp> lowp_imat2x2; + typedef mat<2, 2, int, lowp> lowp_imat2x2; - /// Low-precision signed integer 2x3 matrix. + /// Low-qualifier signed integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<int, lowp> lowp_imat2x3; + typedef mat<2, 3, int, lowp> lowp_imat2x3; - /// Low-precision signed integer 2x4 matrix. + /// Low-qualifier signed integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<int, lowp> lowp_imat2x4; + typedef mat<2, 4, int, lowp> lowp_imat2x4; - /// Low-precision signed integer 3x2 matrix. + /// Low-qualifier signed integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<int, lowp> lowp_imat3x2; + typedef mat<3, 2, int, lowp> lowp_imat3x2; - /// Low-precision signed integer 3x3 matrix. + /// Low-qualifier signed integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<int, lowp> lowp_imat3x3; + typedef mat<3, 3, int, lowp> lowp_imat3x3; - /// Low-precision signed integer 3x4 matrix. + /// Low-qualifier signed integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<int, lowp> lowp_imat3x4; + typedef mat<3, 4, int, lowp> lowp_imat3x4; - /// Low-precision signed integer 4x2 matrix. + /// Low-qualifier signed integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<int, lowp> lowp_imat4x2; + typedef mat<4, 2, int, lowp> lowp_imat4x2; - /// Low-precision signed integer 4x3 matrix. + /// Low-qualifier signed integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<int, lowp> lowp_imat4x3; + typedef mat<4, 3, int, lowp> lowp_imat4x3; - /// Low-precision signed integer 4x4 matrix. + /// Low-qualifier signed integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<int, lowp> lowp_imat4x4; + typedef mat<4, 4, int, lowp> lowp_imat4x4; - /// High-precision unsigned integer 2x2 matrix. + /// High-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, highp> highp_umat2; + typedef mat<2, 2, uint, highp> highp_umat2; - /// High-precision unsigned integer 3x3 matrix. + /// High-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, highp> highp_umat3; + typedef mat<3, 3, uint, highp> highp_umat3; - /// High-precision unsigned integer 4x4 matrix. + /// High-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, highp> highp_umat4; + typedef mat<4, 4, uint, highp> highp_umat4; - /// High-precision unsigned integer 2x2 matrix. + /// High-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, highp> highp_umat2x2; + typedef mat<2, 2, uint, highp> highp_umat2x2; - /// High-precision unsigned integer 2x3 matrix. + /// High-qualifier unsigned integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<uint, highp> highp_umat2x3; + typedef mat<2, 3, uint, highp> highp_umat2x3; - /// High-precision unsigned integer 2x4 matrix. + /// High-qualifier unsigned integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<uint, highp> highp_umat2x4; + typedef mat<2, 4, uint, highp> highp_umat2x4; - /// High-precision unsigned integer 3x2 matrix. + /// High-qualifier unsigned integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<uint, highp> highp_umat3x2; + typedef mat<3, 2, uint, highp> highp_umat3x2; - /// High-precision unsigned integer 3x3 matrix. + /// High-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, highp> highp_umat3x3; + typedef mat<3, 3, uint, highp> highp_umat3x3; - /// High-precision unsigned integer 3x4 matrix. + /// High-qualifier unsigned integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<uint, highp> highp_umat3x4; + typedef mat<3, 4, uint, highp> highp_umat3x4; - /// High-precision unsigned integer 4x2 matrix. + /// High-qualifier unsigned integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<uint, highp> highp_umat4x2; + typedef mat<4, 2, uint, highp> highp_umat4x2; - /// High-precision unsigned integer 4x3 matrix. + /// High-qualifier unsigned integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<uint, highp> highp_umat4x3; + typedef mat<4, 3, uint, highp> highp_umat4x3; - /// High-precision unsigned integer 4x4 matrix. + /// High-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, highp> highp_umat4x4; + typedef mat<4, 4, uint, highp> highp_umat4x4; - /// Medium-precision unsigned integer 2x2 matrix. + /// Medium-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, mediump> mediump_umat2; + typedef mat<2, 2, uint, mediump> mediump_umat2; - /// Medium-precision unsigned integer 3x3 matrix. + /// Medium-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, mediump> mediump_umat3; + typedef mat<3, 3, uint, mediump> mediump_umat3; - /// Medium-precision unsigned integer 4x4 matrix. + /// Medium-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, mediump> mediump_umat4; + typedef mat<4, 4, uint, mediump> mediump_umat4; - /// Medium-precision unsigned integer 2x2 matrix. + /// Medium-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, mediump> mediump_umat2x2; + typedef mat<2, 2, uint, mediump> mediump_umat2x2; - /// Medium-precision unsigned integer 2x3 matrix. + /// Medium-qualifier unsigned integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<uint, mediump> mediump_umat2x3; + typedef mat<2, 3, uint, mediump> mediump_umat2x3; - /// Medium-precision unsigned integer 2x4 matrix. + /// Medium-qualifier unsigned integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<uint, mediump> mediump_umat2x4; + typedef mat<2, 4, uint, mediump> mediump_umat2x4; - /// Medium-precision unsigned integer 3x2 matrix. + /// Medium-qualifier unsigned integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<uint, mediump> mediump_umat3x2; + typedef mat<3, 2, uint, mediump> mediump_umat3x2; - /// Medium-precision unsigned integer 3x3 matrix. + /// Medium-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, mediump> mediump_umat3x3; + typedef mat<3, 3, uint, mediump> mediump_umat3x3; - /// Medium-precision unsigned integer 3x4 matrix. + /// Medium-qualifier unsigned integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<uint, mediump> mediump_umat3x4; + typedef mat<3, 4, uint, mediump> mediump_umat3x4; - /// Medium-precision unsigned integer 4x2 matrix. + /// Medium-qualifier unsigned integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<uint, mediump> mediump_umat4x2; + typedef mat<4, 2, uint, mediump> mediump_umat4x2; - /// Medium-precision unsigned integer 4x3 matrix. + /// Medium-qualifier unsigned integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<uint, mediump> mediump_umat4x3; + typedef mat<4, 3, uint, mediump> mediump_umat4x3; - /// Medium-precision unsigned integer 4x4 matrix. + /// Medium-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, mediump> mediump_umat4x4; + typedef mat<4, 4, uint, mediump> mediump_umat4x4; - /// Low-precision unsigned integer 2x2 matrix. + /// Low-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, lowp> lowp_umat2; - - /// Low-precision unsigned integer 3x3 matrix. + typedef mat<2, 2, uint, lowp> lowp_umat2; + + /// Low-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, lowp> lowp_umat3; + typedef mat<3, 3, uint, lowp> lowp_umat3; - /// Low-precision unsigned integer 4x4 matrix. + /// Low-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, lowp> lowp_umat4; + typedef mat<4, 4, uint, lowp> lowp_umat4; - /// Low-precision unsigned integer 2x2 matrix. + /// Low-qualifier unsigned integer 2x2 matrix. /// @see gtc_matrix_integer - typedef tmat2x2<uint, lowp> lowp_umat2x2; + typedef mat<2, 2, uint, lowp> lowp_umat2x2; - /// Low-precision unsigned integer 2x3 matrix. + /// Low-qualifier unsigned integer 2x3 matrix. /// @see gtc_matrix_integer - typedef tmat2x3<uint, lowp> lowp_umat2x3; + typedef mat<2, 3, uint, lowp> lowp_umat2x3; - /// Low-precision unsigned integer 2x4 matrix. + /// Low-qualifier unsigned integer 2x4 matrix. /// @see gtc_matrix_integer - typedef tmat2x4<uint, lowp> lowp_umat2x4; + typedef mat<2, 4, uint, lowp> lowp_umat2x4; - /// Low-precision unsigned integer 3x2 matrix. + /// Low-qualifier unsigned integer 3x2 matrix. /// @see gtc_matrix_integer - typedef tmat3x2<uint, lowp> lowp_umat3x2; + typedef mat<3, 2, uint, lowp> lowp_umat3x2; - /// Low-precision unsigned integer 3x3 matrix. + /// Low-qualifier unsigned integer 3x3 matrix. /// @see gtc_matrix_integer - typedef tmat3x3<uint, lowp> lowp_umat3x3; + typedef mat<3, 3, uint, lowp> lowp_umat3x3; - /// Low-precision unsigned integer 3x4 matrix. + /// Low-qualifier unsigned integer 3x4 matrix. /// @see gtc_matrix_integer - typedef tmat3x4<uint, lowp> lowp_umat3x4; + typedef mat<3, 4, uint, lowp> lowp_umat3x4; - /// Low-precision unsigned integer 4x2 matrix. + /// Low-qualifier unsigned integer 4x2 matrix. /// @see gtc_matrix_integer - typedef tmat4x2<uint, lowp> lowp_umat4x2; + typedef mat<4, 2, uint, lowp> lowp_umat4x2; - /// Low-precision unsigned integer 4x3 matrix. + /// Low-qualifier unsigned integer 4x3 matrix. /// @see gtc_matrix_integer - typedef tmat4x3<uint, lowp> lowp_umat4x3; + typedef mat<4, 3, uint, lowp> lowp_umat4x3; - /// Low-precision unsigned integer 4x4 matrix. + /// Low-qualifier unsigned integer 4x4 matrix. /// @see gtc_matrix_integer - typedef tmat4x4<uint, lowp> lowp_umat4x4; + typedef mat<4, 4, uint, lowp> lowp_umat4x4; #if(defined(GLM_PRECISION_HIGHP_INT)) typedef highp_imat2 imat2; @@ -432,7 +433,7 @@ namespace glm typedef lowp_umat4x3 umat4x3; typedef lowp_umat4x4 umat4x4; #else //if(defined(GLM_PRECISION_MEDIUMP_UINT)) - + /// Unsigned integer 2x2 matrix. /// @see gtc_matrix_integer typedef mediump_umat2 umat2; diff --git a/external/include/glm/gtc/matrix_inverse.hpp b/external/include/glm/gtc/matrix_inverse.hpp index 589381d..97e8d89 100644 --- a/external/include/glm/gtc/matrix_inverse.hpp +++ b/external/include/glm/gtc/matrix_inverse.hpp @@ -6,8 +6,9 @@ /// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse /// @ingroup gtc /// +/// Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. +/// /// Defines additional matrix inverting functions. -/// <glm/gtc/matrix_inverse.hpp> need to be included to use these functionalities. #pragma once @@ -28,20 +29,20 @@ namespace glm /// @{ /// Fast matrix inverse for affine matrix. - /// + /// /// @param m Input matrix to invert. - /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-precision floating point value is highly innacurate. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. /// @see gtc_matrix_inverse - template <typename genType> - GLM_FUNC_DECL genType affineInverse(genType const & m); + template<typename genType> + GLM_FUNC_DECL genType affineInverse(genType const& m); /// Compute the inverse transpose of a matrix. - /// + /// /// @param m Input matrix to invert transpose. - /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-precision floating point value is highly innacurate. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. /// @see gtc_matrix_inverse - template <typename genType> - GLM_FUNC_DECL genType inverseTranspose(genType const & m); + template<typename genType> + GLM_FUNC_DECL genType inverseTranspose(genType const& m); /// @} }//namespace glm diff --git a/external/include/glm/gtc/matrix_inverse.inl b/external/include/glm/gtc/matrix_inverse.inl index 36c9bf7..592e690 100644 --- a/external/include/glm/gtc/matrix_inverse.inl +++ b/external/include/glm/gtc/matrix_inverse.inl @@ -3,35 +3,35 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> affineInverse(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> affineInverse(mat<3, 3, T, Q> const& m) { - tmat2x2<T, P> const Inv(inverse(tmat2x2<T, P>(m))); + mat<2, 2, T, Q> const Inv(inverse(mat<2, 2, T, Q>(m))); - return tmat3x3<T, P>( - tvec3<T, P>(Inv[0], static_cast<T>(0)), - tvec3<T, P>(Inv[1], static_cast<T>(0)), - tvec3<T, P>(-Inv * tvec2<T, P>(m[2]), static_cast<T>(1))); + return mat<3, 3, T, Q>( + vec<3, T, Q>(Inv[0], static_cast<T>(0)), + vec<3, T, Q>(Inv[1], static_cast<T>(0)), + vec<3, T, Q>(-Inv * vec<2, T, Q>(m[2]), static_cast<T>(1))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> affineInverse(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> affineInverse(mat<4, 4, T, Q> const& m) { - tmat3x3<T, P> const Inv(inverse(tmat3x3<T, P>(m))); + mat<3, 3, T, Q> const Inv(inverse(mat<3, 3, T, Q>(m))); - return tmat4x4<T, P>( - tvec4<T, P>(Inv[0], static_cast<T>(0)), - tvec4<T, P>(Inv[1], static_cast<T>(0)), - tvec4<T, P>(Inv[2], static_cast<T>(0)), - tvec4<T, P>(-Inv * tvec3<T, P>(m[3]), static_cast<T>(1))); + return mat<4, 4, T, Q>( + vec<4, T, Q>(Inv[0], static_cast<T>(0)), + vec<4, T, Q>(Inv[1], static_cast<T>(0)), + vec<4, T, Q>(Inv[2], static_cast<T>(0)), + vec<4, T, Q>(-Inv * vec<3, T, Q>(m[3]), static_cast<T>(1))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> inverseTranspose(tmat2x2<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> inverseTranspose(mat<2, 2, T, Q> const& m) { T Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; - tmat2x2<T, P> Inverse( + mat<2, 2, T, Q> Inverse( + m[1][1] / Determinant, - m[0][1] / Determinant, - m[1][0] / Determinant, @@ -40,15 +40,15 @@ namespace glm return Inverse; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> inverseTranspose(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> inverseTranspose(mat<3, 3, T, Q> const& m) { T Determinant = + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); - tmat3x3<T, P> Inverse(uninitialize); + mat<3, 3, T, Q> Inverse; Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); @@ -63,8 +63,8 @@ namespace glm return Inverse; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> inverseTranspose(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> inverseTranspose(mat<4, 4, T, Q> const& m) { T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; @@ -86,7 +86,7 @@ namespace glm T SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; T SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; - tmat4x4<T, P> Inverse(uninitialize); + mat<4, 4, T, Q> Inverse; Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02); Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04); Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05); diff --git a/external/include/glm/gtc/matrix_transform.hpp b/external/include/glm/gtc/matrix_transform.hpp index c97b89a..a9d5cd0 100644 --- a/external/include/glm/gtc/matrix_transform.hpp +++ b/external/include/glm/gtc/matrix_transform.hpp @@ -4,19 +4,19 @@ /// @see core (dependence) /// @see gtx_transform /// @see gtx_transform2 -/// +/// /// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform /// @ingroup gtc /// -/// @brief Defines functions that generate common transformation matrices. +/// Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. +/// +/// Defines functions that generate common transformation matrices. /// /// The matrices generated by this extension use standard OpenGL fixed-function /// conventions. For example, the lookAt function generates a transform from world -/// space into the specific eye space that the projective matrix functions +/// space into the specific eye space that the projective matrix functions /// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility /// specifications defines the particular layout of this eye space. -/// -/// <glm/gtc/matrix_transform.hpp> need to be included to use these functionalities. #pragma once @@ -37,10 +37,10 @@ namespace glm /// @{ /// Builds a translation 4 * 4 matrix created from a vector of 3 components. - /// + /// /// @param m Input matrix multiplied by this translation matrix. /// @param v Coordinates of a translation vector. - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @code /// #include <glm/glm.hpp> /// #include <glm/gtc/matrix_transform.hpp> @@ -52,412 +52,674 @@ namespace glm /// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f /// @endcode /// @see gtc_matrix_transform - /// @see - translate(tmat4x4<T, P> const & m, T x, T y, T z) - /// @see - translate(tvec3<T, P> const & v) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> translate( - tmat4x4<T, P> const & m, - tvec3<T, P> const & v); - - /// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. - /// + /// @see - translate(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - translate(vec<3, T, Q> const& v) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml">glTranslate man page</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); + + /// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. + /// /// @param m Input matrix multiplied by this rotation matrix. /// @param angle Rotation angle expressed in radians. /// @param axis Rotation axis, recommended to be normalized. /// @tparam T Value type used to build the matrix. Supported: half, float or double. /// @see gtc_matrix_transform - /// @see - rotate(tmat4x4<T, P> const & m, T angle, T x, T y, T z) - /// @see - rotate(T angle, tvec3<T, P> const & v) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> rotate( - tmat4x4<T, P> const & m, - T angle, - tvec3<T, P> const & axis); - - /// Builds a scale 4 * 4 matrix created from 3 scalars. - /// + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml">glRotate man page</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& axis); + + /// Builds a scale 4 * 4 matrix created from 3 scalars. + /// /// @param m Input matrix multiplied by this scale matrix. /// @param v Ratio of scaling for each axis. - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - /// @see - scale(tmat4x4<T, P> const & m, T x, T y, T z) - /// @see - scale(tvec3<T, P> const & v) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> scale( - tmat4x4<T, P> const & m, - tvec3<T, P> const & v); - - /// Creates a matrix for an orthographic parallel viewing volume, using the default handedness. - /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param zNear - /// @param zFar - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top) - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> ortho( - T left, - T right, - T bottom, - T top, - T zNear, - T zFar); - - /// Creates a matrix for an orthographic parallel viewing volume, using left-handedness. - /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param zNear - /// @param zFar - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top) - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> orthoLH( - T left, - T right, - T bottom, - T top, - T zNear, - T zFar); - - /// Creates a matrix for an orthographic parallel viewing volume, using right-handedness. - /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param zNear - /// @param zFar - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top) - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> orthoRH( - T left, - T right, - T bottom, - T top, - T zNear, - T zFar); + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - scale(mat<4, 4, T, Q> const& m, T x, T y, T z) + /// @see - scale(vec<3, T, Q> const& v) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glScale.xml">glScale man page</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v); /// Creates a matrix for projecting two-dimensional coordinates onto the screen. /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top, T const & zNear, T const & zFar) - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> ortho( - T left, - T right, - T bottom, - T top); - - /// Creates a frustum matrix with default handedness. - /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param near - /// @param far - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> frustum( - T left, - T right, - T bottom, - T top, - T near, - T far); + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top, T const& zNear, T const& zFar) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluOrtho2D.xml">gluOrtho2D man page</a> + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_ZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_NO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoZO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoNO( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH( + T left, T right, T bottom, T top, T zNear, T zFar); + + /// Creates a matrix for an orthographic parallel viewing volume, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml">glOrtho man page</a> + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> ortho( + T left, T right, T bottom, T top, T zNear, T zFar); /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param near - /// @param far - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> frustumLH( - T left, - T right, - T bottom, - T top, - T near, - T far); + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_NO( + T left, T right, T bottom, T top, T near, T far); /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) /// - /// @param left - /// @param right - /// @param bottom - /// @param top - /// @param near - /// @param far - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> frustumRH( - T left, - T right, - T bottom, - T top, - T near, - T far); - - /// Creates a matrix for a symetric perspective-view frustum based on the default handedness. - /// - /// @param fovy Specifies the field of view angle in the y direction. Expressed in radians. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_ZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_NO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumZO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumNO( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a left handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a right handed frustum matrix. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH( + T left, T right, T bottom, T top, T near, T far); + + /// Creates a frustum matrix with default handedness, using the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml">glFrustum man page</a> + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> frustum( + T left, T right, T bottom, T top, T near, T far); + + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspective( - T fovy, - T aspect, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_ZO( + T fovy, T aspect, T near, T far); /// Creates a matrix for a right handed, symetric perspective-view frustum. - /// + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspectiveRH( - T fovy, - T aspect, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_NO( + T fovy, T aspect, T near, T far); /// Creates a matrix for a left handed, symetric perspective-view frustum. - /// + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspectiveLH( - T fovy, - T aspect, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_ZO( + T fovy, T aspect, T near, T far); - /// Builds a perspective projection matrix based on a field of view and the default handedness. - /// + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_NO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveZO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveNO( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a right handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a left handed, symetric perspective-view frustum. + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH( + T fovy, T aspect, T near, T far); + + /// Creates a matrix for a symetric perspective-view frustum based on the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param fovy Specifies the field of view angle in the y direction. Expressed in radians. + /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml">gluPerspective man page</a> + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspective( + T fovy, T aspect, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using right-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// /// @param fov Expressed in radians. - /// @param width - /// @param height + /// @param width Width of the viewport + /// @param height Height of the viewport /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspectiveFov( - T fov, - T width, - T height, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_ZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_NO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovZO( + T fov, T width, T height, T near, T far); + + /// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovNO( + T fov, T width, T height, T near, T far); /// Builds a right handed perspective projection matrix based on a field of view. - /// + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// /// @param fov Expressed in radians. - /// @param width - /// @param height + /// @param width Width of the viewport + /// @param height Height of the viewport /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspectiveFovRH( - T fov, - T width, - T height, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH( + T fov, T width, T height, T near, T far); /// Builds a left handed perspective projection matrix based on a field of view. - /// + /// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// /// @param fov Expressed in radians. - /// @param width - /// @param height + /// @param width Width of the viewport + /// @param height Height of the viewport /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> perspectiveFovLH( - T fov, - T width, - T height, - T near, - T far); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH( + T fov, T width, T height, T near, T far); - /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness. + /// Builds a perspective projection matrix based on a field of view and the default handedness and default near and far clip planes definition. + /// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param fov Expressed in radians. + /// @param width Width of the viewport + /// @param height Height of the viewport + /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). + /// @param far Specifies the distance from the viewer to the far clipping plane (always positive). + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// @see gtc_matrix_transform + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFov( + T fov, T width, T height, T near, T far); + + /// Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite. /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> infinitePerspective( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveLH( T fovy, T aspect, T near); - /// Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite. + /// Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite. /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> infinitePerspectiveLH( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveRH( T fovy, T aspect, T near); - /// Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite. + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness. /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> infinitePerspectiveRH( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspective( T fovy, T aspect, T near); /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. - /// + /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> tweakedInfinitePerspective( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( T fovy, T aspect, T near); /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. - /// + /// /// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. /// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). /// @param near Specifies the distance from the viewer to the near clipping plane (always positive). - /// @param ep - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @param ep Epsilon + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. /// @see gtc_matrix_transform - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> tweakedInfinitePerspective( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective( T fovy, T aspect, T near, T ep); /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. - /// + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml">gluProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> projectZO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param obj Specify the object coordinates. + /// @param model Specifies the current modelview matrix + /// @param proj Specifies the current projection matrix + /// @param viewport Specifies the current viewport + /// @return Return the computed window coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml">gluProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> projectNO( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// /// @param obj Specify the object coordinates. /// @param model Specifies the current modelview matrix /// @param proj Specifies the current projection matrix /// @param viewport Specifies the current viewport /// @return Return the computed window coordinates. - /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. /// @tparam U Currently supported: Floating-point types and integer types. /// @see gtc_matrix_transform - template <typename T, typename U, precision P> - GLM_FUNC_DECL tvec3<T, P> project( - tvec3<T, P> const & obj, - tmat4x4<T, P> const & model, - tmat4x4<T, P> const & proj, - tvec4<U, P> const & viewport); + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml">gluProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> project( + vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition) /// /// @param win Specify the window coordinates to be mapped. /// @param model Specifies the modelview matrix /// @param proj Specifies the projection matrix /// @param viewport Specifies the viewport /// @return Returns the computed object coordinates. - /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. /// @tparam U Currently supported: Floating-point types and integer types. /// @see gtc_matrix_transform - template <typename T, typename U, precision P> - GLM_FUNC_DECL tvec3<T, P> unProject( - tvec3<T, P> const & win, - tmat4x4<T, P> const & model, - tmat4x4<T, P> const & proj, - tvec4<U, P> const & viewport); + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml">gluUnProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> unProjectZO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition) + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml">gluUnProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> unProjectNO( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using default near and far clip planes definition. + /// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE. + /// + /// @param win Specify the window coordinates to be mapped. + /// @param model Specifies the modelview matrix + /// @param proj Specifies the projection matrix + /// @param viewport Specifies the viewport + /// @return Returns the computed object coordinates. + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml">gluUnProject man page</a> + template<typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> unProject( + vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport); /// Define a picking region /// - /// @param center - /// @param delta - /// @param viewport - /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @param center Specify the center of a picking region in window coordinates. + /// @param delta Specify the width and height, respectively, of the picking region in window coordinates. + /// @param viewport Rendering viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommended), float or double. /// @tparam U Currently supported: Floating-point types and integer types. /// @see gtc_matrix_transform - template <typename T, precision P, typename U> - GLM_FUNC_DECL tmat4x4<T, P> pickMatrix( - tvec2<T, P> const & center, - tvec2<T, P> const & delta, - tvec4<U, P> const & viewport); + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPickMatrix.xml">gluPickMatrix man page</a> + template<typename T, qualifier Q, typename U> + GLM_FUNC_DECL mat<4, 4, T, Q> pickMatrix( + vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport); - /// Build a look at view matrix based on the default handedness. + /// Build a right handed look at view matrix. /// /// @param eye Position of the camera /// @param center Position where the camera is looking at /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) /// @see gtc_matrix_transform - /// @see - frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> lookAt( - tvec3<T, P> const & eye, - tvec3<T, P> const & center, - tvec3<T, P> const & up); + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtRH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); - /// Build a right handed look at view matrix. + /// Build a left handed look at view matrix. /// /// @param eye Position of the camera /// @param center Position where the camera is looking at /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) /// @see gtc_matrix_transform - /// @see - frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> lookAtRH( - tvec3<T, P> const & eye, - tvec3<T, P> const & center, - tvec3<T, P> const & up); + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> lookAtLH( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); - /// Build a left handed look at view matrix. + /// Build a look at view matrix based on the default handedness. /// /// @param eye Position of the camera /// @param center Position where the camera is looking at /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) /// @see gtc_matrix_transform - /// @see - frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> lookAtLH( - tvec3<T, P> const & eye, - tvec3<T, P> const & center, - tvec3<T, P> const & up); + /// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) + /// @see <a href="https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml">gluLookAt man page</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> lookAt( + vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up); /// @} }//namespace glm diff --git a/external/include/glm/gtc/matrix_transform.inl b/external/include/glm/gtc/matrix_transform.inl index b9ff418..12623d7 100644 --- a/external/include/glm/gtc/matrix_transform.inl +++ b/external/include/glm/gtc/matrix_transform.inl @@ -7,25 +7,25 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(tmat4x4<T, P> const & m, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) { - tmat4x4<T, P> Result(m); + mat<4, 4, T, Q> Result(m); Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; return Result; } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate(tmat4x4<T, P> const & m, T angle, tvec3<T, P> const & v) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) { T const a = angle; T const c = cos(a); T const s = sin(a); - tvec3<T, P> axis(normalize(v)); - tvec3<T, P> temp((T(1) - c) * axis); + vec<3, T, Q> axis(normalize(v)); + vec<3, T, Q> temp((T(1) - c) * axis); - tmat4x4<T, P> Rotate(uninitialize); + mat<4, 4, T, Q> Rotate; Rotate[0][0] = c + temp[0] * axis[0]; Rotate[0][1] = temp[0] * axis[1] + s * axis[2]; Rotate[0][2] = temp[0] * axis[2] - s * axis[1]; @@ -38,23 +38,23 @@ namespace glm Rotate[2][1] = temp[2] * axis[1] - s * axis[0]; Rotate[2][2] = c + temp[2] * axis[2]; - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; Result[3] = m[3]; return Result; } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate_slow(tmat4x4<T, P> const & m, T angle, tvec3<T, P> const & v) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate_slow(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v) { T const a = angle; T const c = cos(a); T const s = sin(a); - tmat4x4<T, P> Result; + mat<4, 4, T, Q> Result; - tvec3<T, P> axis = normalize(v); + vec<3, T, Q> axis = normalize(v); Result[0][0] = c + (static_cast<T>(1) - c) * axis.x * axis.x; Result[0][1] = (static_cast<T>(1) - c) * axis.x * axis.y + s * axis.z; @@ -71,14 +71,14 @@ namespace glm Result[2][2] = c + (static_cast<T>(1) - c) * axis.z * axis.z; Result[2][3] = static_cast<T>(0); - Result[3] = tvec4<T, P>(0, 0, 0, 1); + Result[3] = vec<4, T, Q>(0, 0, 0, 1); return m * Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> scale(tmat4x4<T, P> const & m, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) { - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0] = m[0] * v[0]; Result[1] = m[1] * v[1]; Result[2] = m[2] * v[2]; @@ -86,296 +86,497 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> scale_slow(tmat4x4<T, P> const & m, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale_slow(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v) { - tmat4x4<T, P> Result(T(1)); + mat<4, 4, T, Q> Result(T(1)); Result[0][0] = v.x; Result[1][1] = v.y; Result[2][2] = v.z; return m * Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> ortho - ( - T left, T right, - T bottom, T top, - T zNear, T zFar - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top) { -# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return orthoLH(left, right, bottom, top, zNear, zFar); -# else - return orthoRH(left, right, bottom, top, zNear, zFar); -# endif + mat<4, 4, T, defaultp> Result(static_cast<T>(1)); + Result[0][0] = static_cast<T>(2) / (right - left); + Result[1][1] = static_cast<T>(2) / (top - bottom); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> orthoLH - ( - T left, T right, - T bottom, T top, - T zNear, T zFar - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) { - tmat4x4<T, defaultp> Result(1); + mat<4, 4, T, defaultp> Result(1); Result[0][0] = static_cast<T>(2) / (right - left); Result[1][1] = static_cast<T>(2) / (top - bottom); + Result[2][2] = static_cast<T>(1) / (zFar - zNear); Result[3][0] = - (right + left) / (right - left); Result[3][1] = - (top + bottom) / (top - bottom); - -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = static_cast<T>(1) / (zFar - zNear); - Result[3][2] = - zNear / (zFar - zNear); -# else - Result[2][2] = static_cast<T>(2) / (zFar - zNear); - Result[3][2] = - (zFar + zNear) / (zFar - zNear); -# endif - + Result[3][2] = - zNear / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> orthoRH - ( - T left, T right, - T bottom, T top, - T zNear, T zFar - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_NO(T left, T right, T bottom, T top, T zNear, T zFar) { - tmat4x4<T, defaultp> Result(1); + mat<4, 4, T, defaultp> Result(1); Result[0][0] = static_cast<T>(2) / (right - left); Result[1][1] = static_cast<T>(2) / (top - bottom); + Result[2][2] = static_cast<T>(2) / (zFar - zNear); Result[3][0] = - (right + left) / (right - left); Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = - static_cast<T>(1) / (zFar - zNear); - Result[3][2] = - zNear / (zFar - zNear); -# else - Result[2][2] = - static_cast<T>(2) / (zFar - zNear); - Result[3][2] = - (zFar + zNear) / (zFar - zNear); -# endif - + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_ZO(T left, T right, T bottom, T top, T zNear, T zFar) + { + mat<4, 4, T, defaultp> Result(1); + Result[0][0] = static_cast<T>(2) / (right - left); + Result[1][1] = static_cast<T>(2) / (top - bottom); + Result[2][2] = - static_cast<T>(1) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - zNear / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> ortho - ( - T left, T right, - T bottom, T top - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_NO(T left, T right, T bottom, T top, T zNear, T zFar) { - tmat4x4<T, defaultp> Result(static_cast<T>(1)); + mat<4, 4, T, defaultp> Result(1); Result[0][0] = static_cast<T>(2) / (right - left); Result[1][1] = static_cast<T>(2) / (top - bottom); - Result[2][2] = - static_cast<T>(1); + Result[2][2] = - static_cast<T>(2) / (zFar - zNear); Result[3][0] = - (right + left) / (right - left); Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> frustum - ( - T left, T right, - T bottom, T top, - T nearVal, T farVal - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoZO(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoNO(T left, T right, T bottom, T top, T zNear, T zFar) { # if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return frustumLH(left, right, bottom, top, nearVal, farVal); + return orthoLH_NO(left, right, bottom, top, zNear, zFar); # else - return frustumRH(left, right, bottom, top, nearVal, farVal); + return orthoRH_NO(left, right, bottom, top, zNear, zFar); # endif } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> frustumLH - ( - T left, T right, - T bottom, T top, - T nearVal, T farVal - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH(T left, T right, T bottom, T top, T zNear, T zFar) { - tmat4x4<T, defaultp> Result(0); +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# else + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return orthoLH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return orthoLH_NO(left, right, bottom, top, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return orthoRH_ZO(left, right, bottom, top, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return orthoRH_NO(left, right, bottom, top, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); Result[0][0] = (static_cast<T>(2) * nearVal) / (right - left); Result[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom); Result[2][0] = (right + left) / (right - left); Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (farVal - nearVal); Result[2][3] = static_cast<T>(1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = farVal / (farVal - nearVal); - Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); -# else - Result[2][2] = (farVal + nearVal) / (farVal - nearVal); - Result[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal); -# endif + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast<T>(2) * nearVal) / (right - left); + Result[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = (farVal + nearVal) / (farVal - nearVal); + Result[2][3] = static_cast<T>(1); + Result[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { + mat<4, 4, T, defaultp> Result(0); + Result[0][0] = (static_cast<T>(2) * nearVal) / (right - left); + Result[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = farVal / (nearVal - farVal); + Result[2][3] = static_cast<T>(-1); + Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> frustumRH - ( - T left, T right, - T bottom, T top, - T nearVal, T farVal - ) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_NO(T left, T right, T bottom, T top, T nearVal, T farVal) { - tmat4x4<T, defaultp> Result(0); + mat<4, 4, T, defaultp> Result(0); Result[0][0] = (static_cast<T>(2) * nearVal) / (right - left); Result[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom); Result[2][0] = (right + left) / (right - left); Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = - (farVal + nearVal) / (farVal - nearVal); Result[2][3] = static_cast<T>(-1); + Result[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = farVal / (nearVal - farVal); - Result[3][2] = -(farVal * nearVal) / (farVal - nearVal); + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumZO(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); # else - Result[2][2] = - (farVal + nearVal) / (farVal - nearVal); - Result[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal); + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); # endif - - return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumNO(T left, T right, T bottom, T top, T nearVal, T farVal) { # if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return perspectiveLH(fovy, aspect, zNear, zFar); + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); # else - return perspectiveRH(fovy, aspect, zNear, zFar); + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); # endif } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# else + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustum(T left, T right, T bottom, T top, T nearVal, T farVal) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return frustumLH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return frustumLH_NO(left, right, bottom, top, nearVal, farVal); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return frustumRH_ZO(left, right, bottom, top, nearVal, farVal); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return frustumRH_NO(left, right, bottom, top, nearVal, farVal); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_ZO(T fovy, T aspect, T zNear, T zFar) { assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); T const tanHalfFovy = tan(fovy / static_cast<T>(2)); - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy); Result[1][1] = static_cast<T>(1) / (tanHalfFovy); + Result[2][2] = zFar / (zNear - zFar); Result[2][3] = - static_cast<T>(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = zFar / (zNear - zFar); - Result[3][2] = -(zFar * zNear) / (zFar - zNear); -# else - Result[2][2] = - (zFar + zNear) / (zFar - zNear); - Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); -# endif + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); + + T const tanHalfFovy = tan(fovy / static_cast<T>(2)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); + Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast<T>(1) / (tanHalfFovy); + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast<T>(1); + Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); return Result; } - - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar) + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_ZO(T fovy, T aspect, T zNear, T zFar) { assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); T const tanHalfFovy = tan(fovy / static_cast<T>(2)); - - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy); Result[1][1] = static_cast<T>(1) / (tanHalfFovy); + Result[2][2] = zFar / (zFar - zNear); Result[2][3] = static_cast<T>(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = zFar / (zFar - zNear); - Result[3][2] = -(zFar * zNear) / (zFar - zNear); -# else - Result[2][2] = (zFar + zNear) / (zFar - zNear); - Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); -# endif + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_NO(T fovy, T aspect, T zNear, T zFar) + { + assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); + + T const tanHalfFovy = tan(fovy / static_cast<T>(2)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); + Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy); + Result[1][1] = static_cast<T>(1) / (tanHalfFovy); + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast<T>(1); + Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveZO(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveNO(T fovy, T aspect, T zNear, T zFar) { # if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return perspectiveFovLH(fov, width, height, zNear, zFar); + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); # else - return perspectiveFovRH(fov, width, height, zNear, zFar); + return perspectiveLH_NO(fovy, aspect, zNear, zFar); # endif } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# else + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveLH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return perspectiveLH_NO(fovy, aspect, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveRH_ZO(fovy, aspect, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return perspectiveRH_NO(fovy, aspect, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_ZO(T fov, T width, T height, T zNear, T zFar) { assert(width > static_cast<T>(0)); assert(height > static_cast<T>(0)); assert(fov > static_cast<T>(0)); - + T const rad = fov; T const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad); T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = w; Result[1][1] = h; + Result[2][2] = zFar / (zNear - zFar); Result[2][3] = - static_cast<T>(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = zFar / (zNear - zFar); - Result[3][2] = -(zFar * zNear) / (zFar - zNear); -# else - Result[2][2] = - (zFar + zNear) / (zFar - zNear); - Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); -# endif + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast<T>(0)); + assert(height > static_cast<T>(0)); + assert(fov > static_cast<T>(0)); + + T const rad = fov; + T const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - static_cast<T>(1); + Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_ZO(T fov, T width, T height, T zNear, T zFar) { assert(width > static_cast<T>(0)); assert(height > static_cast<T>(0)); assert(fov > static_cast<T>(0)); - + T const rad = fov; T const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad); T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = w; Result[1][1] = h; + Result[2][2] = zFar / (zFar - zNear); Result[2][3] = static_cast<T>(1); + Result[3][2] = -(zFar * zNear) / (zFar - zNear); + return Result; + } -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - Result[2][2] = zFar / (zFar - zNear); - Result[3][2] = -(zFar * zNear) / (zFar - zNear); -# else - Result[2][2] = (zFar + zNear) / (zFar - zNear); - Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); -# endif + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_NO(T fov, T width, T height, T zNear, T zFar) + { + assert(width > static_cast<T>(0)); + assert(height > static_cast<T>(0)); + assert(fov > static_cast<T>(0)); + + T const rad = fov; + T const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad); + T const w = h * height / width; ///todo max(width , Height) / min(width , Height)? + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = (zFar + zNear) / (zFar - zNear); + Result[2][3] = static_cast<T>(1); + Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspective(T fovy, T aspect, T zNear) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovZO(T fov, T width, T height, T zNear, T zFar) { # if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return infinitePerspectiveLH(fovy, aspect, zNear); + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); # else - return infinitePerspectiveRH(fovy, aspect, zNear); + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovNO(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# else + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); # endif } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveFovLH_ZO(fov, width, height, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return perspectiveFovLH_NO(fov, width, height, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return perspectiveFovRH_ZO(fov, width, height, zNear, zFar); +# elif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE + return perspectiveFovRH_NO(fov, width, height, zNear, zFar); +# endif + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear) { T const range = tan(fovy / static_cast<T>(2)) * zNear; T const left = -range * aspect; @@ -383,7 +584,7 @@ namespace glm T const bottom = -range; T const top = range; - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); Result[2][2] = - static_cast<T>(1); @@ -392,8 +593,8 @@ namespace glm return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear) { T const range = tan(fovy / static_cast<T>(2)) * zNear; T const left = -range * aspect; @@ -401,7 +602,7 @@ namespace glm T const bottom = -range; T const top = range; - tmat4x4<T, defaultp> Result(T(0)); + mat<4, 4, T, defaultp> Result(T(0)); Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); Result[2][2] = static_cast<T>(1); @@ -410,17 +611,27 @@ namespace glm return Result; } + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspective(T fovy, T aspect, T zNear) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return infinitePerspectiveLH(fovy, aspect, zNear); +# else + return infinitePerspectiveRH(fovy, aspect, zNear); +# endif + } + // Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep) { - T const range = tan(fovy / static_cast<T>(2)) * zNear; + T const range = tan(fovy / static_cast<T>(2)) * zNear; T const left = -range * aspect; T const right = range * aspect; T const bottom = -range; T const top = range; - tmat4x4<T, defaultp> Result(static_cast<T>(0)); + mat<4, 4, T, defaultp> Result(static_cast<T>(0)); Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); Result[2][2] = ep - static_cast<T>(1); @@ -429,107 +640,124 @@ namespace glm return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear) { return tweakedInfinitePerspective(fovy, aspect, zNear, epsilon<T>()); } - template <typename T, typename U, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> project - ( - tvec3<T, P> const & obj, - tmat4x4<T, P> const & model, - tmat4x4<T, P> const & proj, - tvec4<U, P> const & viewport - ) + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> projectZO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) { - tvec4<T, P> tmp = tvec4<T, P>(obj, static_cast<T>(1)); + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1)); tmp = model * tmp; tmp = proj * tmp; tmp /= tmp.w; -# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - tmp.x = tmp.x * static_cast<T>(0.5) + static_cast<T>(0.5); - tmp.y = tmp.y * static_cast<T>(0.5) + static_cast<T>(0.5); -# else - tmp = tmp * static_cast<T>(0.5) + static_cast<T>(0.5); -# endif + tmp.x = tmp.x * static_cast<T>(0.5) + static_cast<T>(0.5); + tmp.y = tmp.y * static_cast<T>(0.5) + static_cast<T>(0.5); + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); - return tvec3<T, P>(tmp); + return vec<3, T, Q>(tmp); } - template <typename T, typename U, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> unProject - ( - tvec3<T, P> const & win, - tmat4x4<T, P> const & model, - tmat4x4<T, P> const & proj, - tvec4<U, P> const & viewport - ) + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> projectNO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) { - tmat4x4<T, P> Inverse = inverse(proj * model); + vec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1)); + tmp = model * tmp; + tmp = proj * tmp; - tvec4<T, P> tmp = tvec4<T, P>(win, T(1)); - tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); - tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp /= tmp.w; + tmp = tmp * static_cast<T>(0.5) + static_cast<T>(0.5); + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return vec<3, T, Q>(tmp); + } + + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> project(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { # if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE - tmp.x = tmp.x * static_cast<T>(2) - static_cast<T>(1); - tmp.y = tmp.y * static_cast<T>(2) - static_cast<T>(1); + return projectZO(obj, model, proj, viewport); # else - tmp = tmp * static_cast<T>(2) - static_cast<T>(1); + return projectNO(obj, model, proj, viewport); # endif + } + + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectZO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp.x = tmp.x * static_cast<T>(2) - static_cast<T>(1); + tmp.y = tmp.y * static_cast<T>(2) - static_cast<T>(1); + + vec<4, T, Q> obj = Inverse * tmp; + obj /= obj.w; + + return vec<3, T, Q>(obj); + } + + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> unProjectNO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { + mat<4, 4, T, Q> Inverse = inverse(proj * model); + + vec<4, T, Q> tmp = vec<4, T, Q>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp = tmp * static_cast<T>(2) - static_cast<T>(1); - tvec4<T, P> obj = Inverse * tmp; + vec<4, T, Q> obj = Inverse * tmp; obj /= obj.w; - return tvec3<T, P>(obj); + return vec<3, T, Q>(obj); + } + + template<typename T, typename U, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> unProject(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport) + { +# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE + return unProjectZO(win, model, proj, viewport); +# else + return unProjectNO(win, model, proj, viewport); +# endif } - template <typename T, precision P, typename U> - GLM_FUNC_QUALIFIER tmat4x4<T, P> pickMatrix(tvec2<T, P> const & center, tvec2<T, P> const & delta, tvec4<U, P> const & viewport) + template<typename T, qualifier Q, typename U> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> pickMatrix(vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport) { assert(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0)); - tmat4x4<T, P> Result(static_cast<T>(1)); + mat<4, 4, T, Q> Result(static_cast<T>(1)); if(!(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0))) return Result; // Error - tvec3<T, P> Temp( + vec<3, T, Q> Temp( (static_cast<T>(viewport[2]) - static_cast<T>(2) * (center.x - static_cast<T>(viewport[0]))) / delta.x, (static_cast<T>(viewport[3]) - static_cast<T>(2) * (center.y - static_cast<T>(viewport[1]))) / delta.y, static_cast<T>(0)); // Translate and scale the picked region to the entire window Result = translate(Result, Temp); - return scale(Result, tvec3<T, P>(static_cast<T>(viewport[2]) / delta.x, static_cast<T>(viewport[3]) / delta.y, static_cast<T>(1))); + return scale(Result, vec<3, T, Q>(static_cast<T>(viewport[2]) / delta.x, static_cast<T>(viewport[3]) / delta.y, static_cast<T>(1))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAt(tvec3<T, P> const & eye, tvec3<T, P> const & center, tvec3<T, P> const & up) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) { -# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED - return lookAtLH(eye, center, up); -# else - return lookAtRH(eye, center, up); -# endif - } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAtRH - ( - tvec3<T, P> const & eye, - tvec3<T, P> const & center, - tvec3<T, P> const & up - ) - { - tvec3<T, P> const f(normalize(center - eye)); - tvec3<T, P> const s(normalize(cross(f, up))); - tvec3<T, P> const u(cross(s, f)); + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(f, up))); + vec<3, T, Q> const u(cross(s, f)); - tmat4x4<T, P> Result(1); + mat<4, 4, T, Q> Result(1); Result[0][0] = s.x; Result[1][0] = s.y; Result[2][0] = s.z; @@ -545,19 +773,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAtLH - ( - tvec3<T, P> const & eye, - tvec3<T, P> const & center, - tvec3<T, P> const & up - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) { - tvec3<T, P> const f(normalize(center - eye)); - tvec3<T, P> const s(normalize(cross(up, f))); - tvec3<T, P> const u(cross(f, s)); + vec<3, T, Q> const f(normalize(center - eye)); + vec<3, T, Q> const s(normalize(cross(up, f))); + vec<3, T, Q> const u(cross(f, s)); - tmat4x4<T, P> Result(1); + mat<4, 4, T, Q> Result(1); Result[0][0] = s.x; Result[1][0] = s.y; Result[2][0] = s.z; @@ -572,4 +795,14 @@ namespace glm Result[3][2] = -dot(f, eye); return Result; } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAt(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return lookAtLH(eye, center, up); +# else + return lookAtRH(eye, center, up); +# endif + } }//namespace glm diff --git a/external/include/glm/gtc/noise.hpp b/external/include/glm/gtc/noise.hpp index aec4f18..7b1ca40 100644 --- a/external/include/glm/gtc/noise.hpp +++ b/external/include/glm/gtc/noise.hpp @@ -6,18 +6,19 @@ /// @defgroup gtc_noise GLM_GTC_noise /// @ingroup gtc /// -/// Defines 2D, 3D and 4D procedural noise functions -/// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": -/// https://github.com/ashima/webgl-noise -/// Following Stefan Gustavson's paper "Simplex noise demystified": +/// Include <glm/gtc/noise.hpp> to use the features of this extension. +/// +/// Defines 2D, 3D and 4D procedural noise functions +/// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +/// https://github.com/ashima/webgl-noise +/// Following Stefan Gustavson's paper "Simplex noise demystified": /// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf -/// <glm/gtc/noise.hpp> need to be included to use these functionalities. #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #include "../detail/_noise.hpp" #include "../geometric.hpp" #include "../common.hpp" @@ -37,22 +38,22 @@ namespace glm /// Classic perlin noise. /// @see gtc_noise - template <typename T, precision P, template<typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> GLM_FUNC_DECL T perlin( - vecType<T, P> const & p); - + vec<L, T, Q> const& p); + /// Periodic perlin noise. /// @see gtc_noise - template <typename T, precision P, template<typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> GLM_FUNC_DECL T perlin( - vecType<T, P> const & p, - vecType<T, P> const & rep); + vec<L, T, Q> const& p, + vec<L, T, Q> const& rep); /// Simplex noise. /// @see gtc_noise - template <typename T, precision P, template<typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> GLM_FUNC_DECL T simplex( - vecType<T, P> const & p); + vec<L, T, Q> const& p); /// @} }//namespace glm diff --git a/external/include/glm/gtc/noise.inl b/external/include/glm/gtc/noise.inl index 4f2731c..00a80ab 100644 --- a/external/include/glm/gtc/noise.inl +++ b/external/include/glm/gtc/noise.inl @@ -1,643 +1,643 @@ /// @ref gtc_noise /// @file glm/gtc/noise.inl /// -// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": -// https://github.com/ashima/webgl-noise -// Following Stefan Gustavson's paper "Simplex noise demystified": +// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +// https://github.com/ashima/webgl-noise +// Following Stefan Gustavson's paper "Simplex noise demystified": // http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf namespace glm{ namespace gtc { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> grad4(T const & j, tvec4<T, P> const & ip) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> grad4(T const& j, vec<4, T, Q> const& ip) { - tvec3<T, P> pXYZ = floor(fract(tvec3<T, P>(j) * tvec3<T, P>(ip)) * T(7)) * ip[2] - T(1); - T pW = static_cast<T>(1.5) - dot(abs(pXYZ), tvec3<T, P>(1)); - tvec4<T, P> s = tvec4<T, P>(lessThan(tvec4<T, P>(pXYZ, pW), tvec4<T, P>(0.0))); - pXYZ = pXYZ + (tvec3<T, P>(s) * T(2) - T(1)) * s.w; - return tvec4<T, P>(pXYZ, pW); + vec<3, T, Q> pXYZ = floor(fract(vec<3, T, Q>(j) * vec<3, T, Q>(ip)) * T(7)) * ip[2] - T(1); + T pW = static_cast<T>(1.5) - dot(abs(pXYZ), vec<3, T, Q>(1)); + vec<4, T, Q> s = vec<4, T, Q>(lessThan(vec<4, T, Q>(pXYZ, pW), vec<4, T, Q>(0.0))); + pXYZ = pXYZ + (vec<3, T, Q>(s) * T(2) - T(1)) * s.w; + return vec<4, T, Q>(pXYZ, pW); } }//namespace gtc // Classic Perlin noise - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec2<T, P> const & Position) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position) { - tvec4<T, P> Pi = glm::floor(tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) + tvec4<T, P>(0.0, 0.0, 1.0, 1.0); - tvec4<T, P> Pf = glm::fract(tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) - tvec4<T, P>(0.0, 0.0, 1.0, 1.0); - Pi = mod(Pi, tvec4<T, P>(289)); // To avoid truncation effects in permutation - tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z); - tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w); - tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z); - tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w); - - tvec4<T, P> i = detail::permute(detail::permute(ix) + iy); - - tvec4<T, P> gx = static_cast<T>(2) * glm::fract(i / T(41)) - T(1); - tvec4<T, P> gy = glm::abs(gx) - T(0.5); - tvec4<T, P> tx = glm::floor(gx + T(0.5)); + vec<4, T, Q> Pi = glm::floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast<T>(2) * glm::fract(i / T(41)) - T(1); + vec<4, T, Q> gy = glm::abs(gx) - T(0.5); + vec<4, T, Q> tx = glm::floor(gx + T(0.5)); gx = gx - tx; - tvec2<T, P> g00(gx.x, gy.x); - tvec2<T, P> g10(gx.y, gy.y); - tvec2<T, P> g01(gx.z, gy.z); - tvec2<T, P> g11(gx.w, gy.w); + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); - tvec4<T, P> norm = detail::taylorInvSqrt(tvec4<T, P>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); g00 *= norm.x; g01 *= norm.y; g10 *= norm.z; g11 *= norm.w; - T n00 = dot(g00, tvec2<T, P>(fx.x, fy.x)); - T n10 = dot(g10, tvec2<T, P>(fx.y, fy.y)); - T n01 = dot(g01, tvec2<T, P>(fx.z, fy.z)); - T n11 = dot(g11, tvec2<T, P>(fx.w, fy.w)); + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); - tvec2<T, P> fade_xy = detail::fade(tvec2<T, P>(Pf.x, Pf.y)); - tvec2<T, P> n_x = mix(tvec2<T, P>(n00, n01), tvec2<T, P>(n10, n11), fade_xy.x); + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); T n_xy = mix(n_x.x, n_x.y, fade_xy.y); return T(2.3) * n_xy; } // Classic Perlin noise - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec3<T, P> const & Position) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position) { - tvec3<T, P> Pi0 = floor(Position); // Integer part for indexing - tvec3<T, P> Pi1 = Pi0 + T(1); // Integer part + 1 + vec<3, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 Pi0 = detail::mod289(Pi0); Pi1 = detail::mod289(Pi1); - tvec3<T, P> Pf0 = fract(Position); // Fractional part for interpolation - tvec3<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0 - tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - tvec4<T, P> iy = tvec4<T, P>(tvec2<T, P>(Pi0.y), tvec2<T, P>(Pi1.y)); - tvec4<T, P> iz0(Pi0.z); - tvec4<T, P> iz1(Pi1.z); - - tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy); - tvec4<T, P> ixy0 = detail::permute(ixy + iz0); - tvec4<T, P> ixy1 = detail::permute(ixy + iz1); - - tvec4<T, P> gx0 = ixy0 * T(1.0 / 7.0); - tvec4<T, P> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(vec<2, T, Q>(Pi0.y), vec<2, T, Q>(Pi1.y)); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0); + vec<4, T, Q> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5); gx0 = fract(gx0); - tvec4<T, P> gz0 = tvec4<T, P>(0.5) - abs(gx0) - abs(gy0); - tvec4<T, P> sz0 = step(gz0, tvec4<T, P>(0.0)); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); - tvec4<T, P> gx1 = ixy1 * T(1.0 / 7.0); - tvec4<T, P> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5); + vec<4, T, Q> gx1 = ixy1 * T(1.0 / 7.0); + vec<4, T, Q> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5); gx1 = fract(gx1); - tvec4<T, P> gz1 = tvec4<T, P>(0.5) - abs(gx1) - abs(gy1); - tvec4<T, P> sz1 = step(gz1, tvec4<T, P>(0.0)); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); - tvec3<T, P> g000(gx0.x, gy0.x, gz0.x); - tvec3<T, P> g100(gx0.y, gy0.y, gz0.y); - tvec3<T, P> g010(gx0.z, gy0.z, gz0.z); - tvec3<T, P> g110(gx0.w, gy0.w, gz0.w); - tvec3<T, P> g001(gx1.x, gy1.x, gz1.x); - tvec3<T, P> g101(gx1.y, gy1.y, gz1.y); - tvec3<T, P> g011(gx1.z, gy1.z, gz1.z); - tvec3<T, P> g111(gx1.w, gy1.w, gz1.w); + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); - tvec4<T, P> norm0 = detail::taylorInvSqrt(tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); g000 *= norm0.x; g010 *= norm0.y; g100 *= norm0.z; g110 *= norm0.w; - tvec4<T, P> norm1 = detail::taylorInvSqrt(tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); g001 *= norm1.x; g011 *= norm1.y; g101 *= norm1.z; g111 *= norm1.w; T n000 = dot(g000, Pf0); - T n100 = dot(g100, tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z)); - T n010 = dot(g010, tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z)); - T n110 = dot(g110, tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z)); - T n001 = dot(g001, tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z)); - T n101 = dot(g101, tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z)); - T n011 = dot(g011, tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z)); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); T n111 = dot(g111, Pf1); - tvec3<T, P> fade_xyz = detail::fade(Pf0); - tvec4<T, P> n_z = mix(tvec4<T, P>(n000, n100, n010, n110), tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z); - tvec2<T, P> n_yz = mix(tvec2<T, P>(n_z.x, n_z.y), tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y); - T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); return T(2.2) * n_xyz; } /* // Classic Perlin noise - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec3<T, P> const & P) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& P) { - tvec3<T, P> Pi0 = floor(P); // Integer part for indexing - tvec3<T, P> Pi1 = Pi0 + T(1); // Integer part + 1 + vec<3, T, Q> Pi0 = floor(P); // Integer part for indexing + vec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 Pi0 = mod(Pi0, T(289)); Pi1 = mod(Pi1, T(289)); - tvec3<T, P> Pf0 = fract(P); // Fractional part for interpolation - tvec3<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0 - tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); - tvec4<T, P> iz0(Pi0.z); - tvec4<T, P> iz1(Pi1.z); - - tvec4<T, P> ixy = permute(permute(ix) + iy); - tvec4<T, P> ixy0 = permute(ixy + iz0); - tvec4<T, P> ixy1 = permute(ixy + iz1); - - tvec4<T, P> gx0 = ixy0 / T(7); - tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + vec<3, T, Q> Pf0 = fract(P); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = permute(permute(ix) + iy); + vec<4, T, Q> ixy0 = permute(ixy + iz0); + vec<4, T, Q> ixy1 = permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); gx0 = fract(gx0); - tvec4<T, P> gz0 = tvec4<T, P>(0.5) - abs(gx0) - abs(gy0); - tvec4<T, P> sz0 = step(gz0, tvec4<T, P>(0.0)); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0)); gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); - tvec4<T, P> gx1 = ixy1 / T(7); - tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); gx1 = fract(gx1); - tvec4<T, P> gz1 = tvec4<T, P>(0.5) - abs(gx1) - abs(gy1); - tvec4<T, P> sz1 = step(gz1, tvec4<T, P>(0.0)); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0)); gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); - tvec3<T, P> g000(gx0.x, gy0.x, gz0.x); - tvec3<T, P> g100(gx0.y, gy0.y, gz0.y); - tvec3<T, P> g010(gx0.z, gy0.z, gz0.z); - tvec3<T, P> g110(gx0.w, gy0.w, gz0.w); - tvec3<T, P> g001(gx1.x, gy1.x, gz1.x); - tvec3<T, P> g101(gx1.y, gy1.y, gz1.y); - tvec3<T, P> g011(gx1.z, gy1.z, gz1.z); - tvec3<T, P> g111(gx1.w, gy1.w, gz1.w); + vec<3, T, Q> g000(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111(gx1.w, gy1.w, gz1.w); - tvec4<T, P> norm0 = taylorInvSqrt(tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + vec<4, T, Q> norm0 = taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); g000 *= norm0.x; g010 *= norm0.y; g100 *= norm0.z; g110 *= norm0.w; - tvec4<T, P> norm1 = taylorInvSqrt(tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + vec<4, T, Q> norm1 = taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); g001 *= norm1.x; g011 *= norm1.y; g101 *= norm1.z; g111 *= norm1.w; T n000 = dot(g000, Pf0); - T n100 = dot(g100, tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z)); - T n010 = dot(g010, tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z)); - T n110 = dot(g110, tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z)); - T n001 = dot(g001, tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z)); - T n101 = dot(g101, tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z)); - T n011 = dot(g011, tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z)); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); T n111 = dot(g111, Pf1); - tvec3<T, P> fade_xyz = fade(Pf0); - tvec4<T, P> n_z = mix(tvec4<T, P>(n000, n100, n010, n110), tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z); - tvec2<T, P> n_yz = mix( - tvec2<T, P>(n_z.x, n_z.y), - tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y); - T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + vec<3, T, Q> fade_xyz = fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix( + vec<2, T, Q>(n_z.x, n_z.y), + vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); return T(2.2) * n_xyz; } */ // Classic Perlin noise - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec4<T, P> const & Position) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position) { - tvec4<T, P> Pi0 = floor(Position); // Integer part for indexing - tvec4<T, P> Pi1 = Pi0 + T(1); // Integer part + 1 - Pi0 = mod(Pi0, tvec4<T, P>(289)); - Pi1 = mod(Pi1, tvec4<T, P>(289)); - tvec4<T, P> Pf0 = fract(Position); // Fractional part for interpolation - tvec4<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0 - tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); - tvec4<T, P> iz0(Pi0.z); - tvec4<T, P> iz1(Pi1.z); - tvec4<T, P> iw0(Pi0.w); - tvec4<T, P> iw1(Pi1.w); - - tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy); - tvec4<T, P> ixy0 = detail::permute(ixy + iz0); - tvec4<T, P> ixy1 = detail::permute(ixy + iz1); - tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0); - tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1); - tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0); - tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1); - - tvec4<T, P> gx00 = ixy00 / T(7); - tvec4<T, P> gy00 = floor(gx00) / T(7); - tvec4<T, P> gz00 = floor(gy00) / T(6); + vec<4, T, Q> Pi0 = floor(Position); // Integer part for indexing + vec<4, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, vec<4, T, Q>(289)); + Pi1 = mod(Pi1, vec<4, T, Q>(289)); + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); gx00 = fract(gx00) - T(0.5); gy00 = fract(gy00) - T(0.5); gz00 = fract(gz00) - T(0.5); - tvec4<T, P> gw00 = tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); - tvec4<T, P> sw00 = step(gw00, tvec4<T, P>(0.0)); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0.0)); gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); - tvec4<T, P> gx01 = ixy01 / T(7); - tvec4<T, P> gy01 = floor(gx01) / T(7); - tvec4<T, P> gz01 = floor(gy01) / T(6); + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); gx01 = fract(gx01) - T(0.5); gy01 = fract(gy01) - T(0.5); gz01 = fract(gz01) - T(0.5); - tvec4<T, P> gw01 = tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); - tvec4<T, P> sw01 = step(gw01, tvec4<T, P>(0.0)); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); - tvec4<T, P> gx10 = ixy10 / T(7); - tvec4<T, P> gy10 = floor(gx10) / T(7); - tvec4<T, P> gz10 = floor(gy10) / T(6); + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); gx10 = fract(gx10) - T(0.5); gy10 = fract(gy10) - T(0.5); gz10 = fract(gz10) - T(0.5); - tvec4<T, P> gw10 = tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); - tvec4<T, P> sw10 = step(gw10, tvec4<T, P>(0)); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0)); gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); - tvec4<T, P> gx11 = ixy11 / T(7); - tvec4<T, P> gy11 = floor(gx11) / T(7); - tvec4<T, P> gz11 = floor(gy11) / T(6); + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); gx11 = fract(gx11) - T(0.5); gy11 = fract(gy11) - T(0.5); gz11 = fract(gz11) - T(0.5); - tvec4<T, P> gw11 = tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); - tvec4<T, P> sw11 = step(gw11, tvec4<T, P>(0.0)); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(0.0)); gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); - tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x); - tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y); - tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z); - tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w); - tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x); - tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y); - tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z); - tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w); - tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x); - tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y); - tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z); - tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w); - tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x); - tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y); - tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z); - tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w); - - tvec4<T, P> norm00 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); g0000 *= norm00.x; g0100 *= norm00.y; g1000 *= norm00.z; g1100 *= norm00.w; - tvec4<T, P> norm01 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); g0001 *= norm01.x; g0101 *= norm01.y; g1001 *= norm01.z; g1101 *= norm01.w; - tvec4<T, P> norm10 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); g0010 *= norm10.x; g0110 *= norm10.y; g1010 *= norm10.z; g1110 *= norm10.w; - tvec4<T, P> norm11 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); g0011 *= norm11.x; g0111 *= norm11.y; g1011 *= norm11.z; g1111 *= norm11.w; T n0000 = dot(g0000, Pf0); - T n1000 = dot(g1000, tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); - T n0100 = dot(g0100, tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); - T n1100 = dot(g1100, tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); - T n0010 = dot(g0010, tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); - T n1010 = dot(g1010, tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); - T n0110 = dot(g0110, tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); - T n1110 = dot(g1110, tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); - T n0001 = dot(g0001, tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); - T n1001 = dot(g1001, tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); - T n0101 = dot(g0101, tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); - T n1101 = dot(g1101, tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); - T n0011 = dot(g0011, tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); - T n1011 = dot(g1011, tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); - T n0111 = dot(g0111, tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); T n1111 = dot(g1111, Pf1); - tvec4<T, P> fade_xyzw = detail::fade(Pf0); - tvec4<T, P> n_0w = mix(tvec4<T, P>(n0000, n1000, n0100, n1100), tvec4<T, P>(n0001, n1001, n0101, n1101), fade_xyzw.w); - tvec4<T, P> n_1w = mix(tvec4<T, P>(n0010, n1010, n0110, n1110), tvec4<T, P>(n0011, n1011, n0111, n1111), fade_xyzw.w); - tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z); - tvec2<T, P> n_yzw = mix(tvec2<T, P>(n_zw.x, n_zw.y), tvec2<T, P>(n_zw.z, n_zw.w), fade_xyzw.y); + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); return T(2.2) * n_xyzw; } // Classic Perlin noise, periodic variant - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec2<T, P> const & Position, tvec2<T, P> const & rep) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position, vec<2, T, Q> const& rep) { - tvec4<T, P> Pi = floor(tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) + tvec4<T, P>(0.0, 0.0, 1.0, 1.0); - tvec4<T, P> Pf = fract(tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) - tvec4<T, P>(0.0, 0.0, 1.0, 1.0); - Pi = mod(Pi, tvec4<T, P>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period - Pi = mod(Pi, tvec4<T, P>(289)); // To avoid truncation effects in permutation - tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z); - tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w); - tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z); - tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w); - - tvec4<T, P> i = detail::permute(detail::permute(ix) + iy); - - tvec4<T, P> gx = static_cast<T>(2) * fract(i / T(41)) - T(1); - tvec4<T, P> gy = abs(gx) - T(0.5); - tvec4<T, P> tx = floor(gx + T(0.5)); + vec<4, T, Q> Pi = floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + vec<4, T, Q> Pf = fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, vec<4, T, Q>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period + Pi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation + vec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z); + vec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w); + vec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z); + vec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + vec<4, T, Q> i = detail::permute(detail::permute(ix) + iy); + + vec<4, T, Q> gx = static_cast<T>(2) * fract(i / T(41)) - T(1); + vec<4, T, Q> gy = abs(gx) - T(0.5); + vec<4, T, Q> tx = floor(gx + T(0.5)); gx = gx - tx; - tvec2<T, P> g00(gx.x, gy.x); - tvec2<T, P> g10(gx.y, gy.y); - tvec2<T, P> g01(gx.z, gy.z); - tvec2<T, P> g11(gx.w, gy.w); + vec<2, T, Q> g00(gx.x, gy.x); + vec<2, T, Q> g10(gx.y, gy.y); + vec<2, T, Q> g01(gx.z, gy.z); + vec<2, T, Q> g11(gx.w, gy.w); - tvec4<T, P> norm = detail::taylorInvSqrt(tvec4<T, P>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); g00 *= norm.x; g01 *= norm.y; g10 *= norm.z; g11 *= norm.w; - T n00 = dot(g00, tvec2<T, P>(fx.x, fy.x)); - T n10 = dot(g10, tvec2<T, P>(fx.y, fy.y)); - T n01 = dot(g01, tvec2<T, P>(fx.z, fy.z)); - T n11 = dot(g11, tvec2<T, P>(fx.w, fy.w)); + T n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x)); + T n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y)); + T n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z)); + T n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w)); - tvec2<T, P> fade_xy = detail::fade(tvec2<T, P>(Pf.x, Pf.y)); - tvec2<T, P> n_x = mix(tvec2<T, P>(n00, n01), tvec2<T, P>(n10, n11), fade_xy.x); + vec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y)); + vec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x); T n_xy = mix(n_x.x, n_x.y, fade_xy.y); return T(2.3) * n_xy; } // Classic Perlin noise, periodic variant - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec3<T, P> const & Position, tvec3<T, P> const & rep) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position, vec<3, T, Q> const& rep) { - tvec3<T, P> Pi0 = mod(floor(Position), rep); // Integer part, modulo period - tvec3<T, P> Pi1 = mod(Pi0 + tvec3<T, P>(T(1)), rep); // Integer part + 1, mod period - Pi0 = mod(Pi0, tvec3<T, P>(289)); - Pi1 = mod(Pi1, tvec3<T, P>(289)); - tvec3<T, P> Pf0 = fract(Position); // Fractional part for interpolation - tvec3<T, P> Pf1 = Pf0 - tvec3<T, P>(T(1)); // Fractional part - 1.0 - tvec4<T, P> ix = tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - tvec4<T, P> iy = tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); - tvec4<T, P> iz0(Pi0.z); - tvec4<T, P> iz1(Pi1.z); - - tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy); - tvec4<T, P> ixy0 = detail::permute(ixy + iz0); - tvec4<T, P> ixy1 = detail::permute(ixy + iz1); - - tvec4<T, P> gx0 = ixy0 / T(7); - tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + vec<3, T, Q> Pi0 = mod(floor(Position), rep); // Integer part, modulo period + vec<3, T, Q> Pi1 = mod(Pi0 + vec<3, T, Q>(T(1)), rep); // Integer part + 1, mod period + Pi0 = mod(Pi0, vec<3, T, Q>(289)); + Pi1 = mod(Pi1, vec<3, T, Q>(289)); + vec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<3, T, Q> Pf1 = Pf0 - vec<3, T, Q>(T(1)); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + + vec<4, T, Q> gx0 = ixy0 / T(7); + vec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5); gx0 = fract(gx0); - tvec4<T, P> gz0 = tvec4<T, P>(0.5) - abs(gx0) - abs(gy0); - tvec4<T, P> sz0 = step(gz0, tvec4<T, P>(0)); + vec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0); + vec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0)); gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); - tvec4<T, P> gx1 = ixy1 / T(7); - tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + vec<4, T, Q> gx1 = ixy1 / T(7); + vec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5); gx1 = fract(gx1); - tvec4<T, P> gz1 = tvec4<T, P>(0.5) - abs(gx1) - abs(gy1); - tvec4<T, P> sz1 = step(gz1, tvec4<T, P>(T(0))); + vec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1); + vec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(T(0))); gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); - tvec3<T, P> g000 = tvec3<T, P>(gx0.x, gy0.x, gz0.x); - tvec3<T, P> g100 = tvec3<T, P>(gx0.y, gy0.y, gz0.y); - tvec3<T, P> g010 = tvec3<T, P>(gx0.z, gy0.z, gz0.z); - tvec3<T, P> g110 = tvec3<T, P>(gx0.w, gy0.w, gz0.w); - tvec3<T, P> g001 = tvec3<T, P>(gx1.x, gy1.x, gz1.x); - tvec3<T, P> g101 = tvec3<T, P>(gx1.y, gy1.y, gz1.y); - tvec3<T, P> g011 = tvec3<T, P>(gx1.z, gy1.z, gz1.z); - tvec3<T, P> g111 = tvec3<T, P>(gx1.w, gy1.w, gz1.w); + vec<3, T, Q> g000 = vec<3, T, Q>(gx0.x, gy0.x, gz0.x); + vec<3, T, Q> g100 = vec<3, T, Q>(gx0.y, gy0.y, gz0.y); + vec<3, T, Q> g010 = vec<3, T, Q>(gx0.z, gy0.z, gz0.z); + vec<3, T, Q> g110 = vec<3, T, Q>(gx0.w, gy0.w, gz0.w); + vec<3, T, Q> g001 = vec<3, T, Q>(gx1.x, gy1.x, gz1.x); + vec<3, T, Q> g101 = vec<3, T, Q>(gx1.y, gy1.y, gz1.y); + vec<3, T, Q> g011 = vec<3, T, Q>(gx1.z, gy1.z, gz1.z); + vec<3, T, Q> g111 = vec<3, T, Q>(gx1.w, gy1.w, gz1.w); - tvec4<T, P> norm0 = detail::taylorInvSqrt(tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + vec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); g000 *= norm0.x; g010 *= norm0.y; g100 *= norm0.z; g110 *= norm0.w; - tvec4<T, P> norm1 = detail::taylorInvSqrt(tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + vec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); g001 *= norm1.x; g011 *= norm1.y; g101 *= norm1.z; g111 *= norm1.w; T n000 = dot(g000, Pf0); - T n100 = dot(g100, tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z)); - T n010 = dot(g010, tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z)); - T n110 = dot(g110, tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z)); - T n001 = dot(g001, tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z)); - T n101 = dot(g101, tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z)); - T n011 = dot(g011, tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z)); + T n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z)); T n111 = dot(g111, Pf1); - tvec3<T, P> fade_xyz = detail::fade(Pf0); - tvec4<T, P> n_z = mix(tvec4<T, P>(n000, n100, n010, n110), tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z); - tvec2<T, P> n_yz = mix(tvec2<T, P>(n_z.x, n_z.y), tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y); + vec<3, T, Q> fade_xyz = detail::fade(Pf0); + vec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z); + vec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y); T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); return T(2.2) * n_xyz; } // Classic Perlin noise, periodic version - template <typename T, precision P> - GLM_FUNC_QUALIFIER T perlin(tvec4<T, P> const & Position, tvec4<T, P> const & rep) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position, vec<4, T, Q> const& rep) { - tvec4<T, P> Pi0 = mod(floor(Position), rep); // Integer part modulo rep - tvec4<T, P> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep - tvec4<T, P> Pf0 = fract(Position); // Fractional part for interpolation - tvec4<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0 - tvec4<T, P> ix = tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - tvec4<T, P> iy = tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); - tvec4<T, P> iz0(Pi0.z); - tvec4<T, P> iz1(Pi1.z); - tvec4<T, P> iw0(Pi0.w); - tvec4<T, P> iw1(Pi1.w); - - tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy); - tvec4<T, P> ixy0 = detail::permute(ixy + iz0); - tvec4<T, P> ixy1 = detail::permute(ixy + iz1); - tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0); - tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1); - tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0); - tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1); - - tvec4<T, P> gx00 = ixy00 / T(7); - tvec4<T, P> gy00 = floor(gx00) / T(7); - tvec4<T, P> gz00 = floor(gy00) / T(6); + vec<4, T, Q> Pi0 = mod(floor(Position), rep); // Integer part modulo rep + vec<4, T, Q> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep + vec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation + vec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + vec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + vec<4, T, Q> iz0(Pi0.z); + vec<4, T, Q> iz1(Pi1.z); + vec<4, T, Q> iw0(Pi0.w); + vec<4, T, Q> iw1(Pi1.w); + + vec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy); + vec<4, T, Q> ixy0 = detail::permute(ixy + iz0); + vec<4, T, Q> ixy1 = detail::permute(ixy + iz1); + vec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0); + vec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1); + vec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0); + vec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1); + + vec<4, T, Q> gx00 = ixy00 / T(7); + vec<4, T, Q> gy00 = floor(gx00) / T(7); + vec<4, T, Q> gz00 = floor(gy00) / T(6); gx00 = fract(gx00) - T(0.5); gy00 = fract(gy00) - T(0.5); gz00 = fract(gz00) - T(0.5); - tvec4<T, P> gw00 = tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); - tvec4<T, P> sw00 = step(gw00, tvec4<T, P>(0)); + vec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + vec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0)); gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); - tvec4<T, P> gx01 = ixy01 / T(7); - tvec4<T, P> gy01 = floor(gx01) / T(7); - tvec4<T, P> gz01 = floor(gy01) / T(6); + vec<4, T, Q> gx01 = ixy01 / T(7); + vec<4, T, Q> gy01 = floor(gx01) / T(7); + vec<4, T, Q> gz01 = floor(gy01) / T(6); gx01 = fract(gx01) - T(0.5); gy01 = fract(gy01) - T(0.5); gz01 = fract(gz01) - T(0.5); - tvec4<T, P> gw01 = tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); - tvec4<T, P> sw01 = step(gw01, tvec4<T, P>(0.0)); + vec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + vec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0)); gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); - tvec4<T, P> gx10 = ixy10 / T(7); - tvec4<T, P> gy10 = floor(gx10) / T(7); - tvec4<T, P> gz10 = floor(gy10) / T(6); + vec<4, T, Q> gx10 = ixy10 / T(7); + vec<4, T, Q> gy10 = floor(gx10) / T(7); + vec<4, T, Q> gz10 = floor(gy10) / T(6); gx10 = fract(gx10) - T(0.5); gy10 = fract(gy10) - T(0.5); gz10 = fract(gz10) - T(0.5); - tvec4<T, P> gw10 = tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); - tvec4<T, P> sw10 = step(gw10, tvec4<T, P>(0.0)); + vec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + vec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0.0)); gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); - tvec4<T, P> gx11 = ixy11 / T(7); - tvec4<T, P> gy11 = floor(gx11) / T(7); - tvec4<T, P> gz11 = floor(gy11) / T(6); + vec<4, T, Q> gx11 = ixy11 / T(7); + vec<4, T, Q> gy11 = floor(gx11) / T(7); + vec<4, T, Q> gz11 = floor(gy11) / T(6); gx11 = fract(gx11) - T(0.5); gy11 = fract(gy11) - T(0.5); gz11 = fract(gz11) - T(0.5); - tvec4<T, P> gw11 = tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); - tvec4<T, P> sw11 = step(gw11, tvec4<T, P>(T(0))); + vec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + vec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(T(0))); gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); - tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x); - tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y); - tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z); - tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w); - tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x); - tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y); - tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z); - tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w); - tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x); - tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y); - tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z); - tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w); - tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x); - tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y); - tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z); - tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w); - - tvec4<T, P> norm00 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + vec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + vec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + vec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + vec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + vec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + vec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + vec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + vec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + vec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + vec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + vec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + vec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + vec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + vec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + vec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + vec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + vec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); g0000 *= norm00.x; g0100 *= norm00.y; g1000 *= norm00.z; g1100 *= norm00.w; - tvec4<T, P> norm01 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + vec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); g0001 *= norm01.x; g0101 *= norm01.y; g1001 *= norm01.z; g1101 *= norm01.w; - tvec4<T, P> norm10 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + vec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); g0010 *= norm10.x; g0110 *= norm10.y; g1010 *= norm10.z; g1110 *= norm10.w; - tvec4<T, P> norm11 = detail::taylorInvSqrt(tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + vec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); g0011 *= norm11.x; g0111 *= norm11.y; g1011 *= norm11.z; g1111 *= norm11.w; T n0000 = dot(g0000, Pf0); - T n1000 = dot(g1000, tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); - T n0100 = dot(g0100, tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); - T n1100 = dot(g1100, tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); - T n0010 = dot(g0010, tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); - T n1010 = dot(g1010, tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); - T n0110 = dot(g0110, tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); - T n1110 = dot(g1110, tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); - T n0001 = dot(g0001, tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); - T n1001 = dot(g1001, tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); - T n0101 = dot(g0101, tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); - T n1101 = dot(g1101, tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); - T n0011 = dot(g0011, tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); - T n1011 = dot(g1011, tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); - T n0111 = dot(g0111, tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); T n1111 = dot(g1111, Pf1); - tvec4<T, P> fade_xyzw = detail::fade(Pf0); - tvec4<T, P> n_0w = mix(tvec4<T, P>(n0000, n1000, n0100, n1100), tvec4<T, P>(n0001, n1001, n0101, n1101), fade_xyzw.w); - tvec4<T, P> n_1w = mix(tvec4<T, P>(n0010, n1010, n0110, n1110), tvec4<T, P>(n0011, n1011, n0111, n1111), fade_xyzw.w); - tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z); - tvec2<T, P> n_yzw = mix(tvec2<T, P>(n_zw.x, n_zw.y), tvec2<T, P>(n_zw.z, n_zw.w), fade_xyzw.y); + vec<4, T, Q> fade_xyzw = detail::fade(Pf0); + vec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w); + vec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w); + vec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + vec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y); T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); return T(2.2) * n_xyzw; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T simplex(glm::tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T simplex(glm::vec<2, T, Q> const& v) { - tvec4<T, P> const C = tvec4<T, P>( + vec<4, T, Q> const C = vec<4, T, Q>( T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) T(-0.577350269189626), // -1.0 + 2.0 * C.x T( 0.024390243902439)); // 1.0 / 41.0 // First corner - tvec2<T, P> i = floor(v + dot(v, tvec2<T, P>(C[1]))); - tvec2<T, P> x0 = v - i + dot(i, tvec2<T, P>(C[0])); + vec<2, T, Q> i = floor(v + dot(v, vec<2, T, Q>(C[1]))); + vec<2, T, Q> x0 = v - i + dot(i, vec<2, T, Q>(C[0])); // Other corners //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 //i1.y = 1.0 - i1.x; - tvec2<T, P> i1 = (x0.x > x0.y) ? tvec2<T, P>(1, 0) : tvec2<T, P>(0, 1); + vec<2, T, Q> i1 = (x0.x > x0.y) ? vec<2, T, Q>(1, 0) : vec<2, T, Q>(0, 1); // x0 = x0 - 0.0 + 0.0 * C.xx ; // x1 = x0 - i1 + 1.0 * C.xx ; // x2 = x0 - 1.0 + 2.0 * C.xx ; - tvec4<T, P> x12 = tvec4<T, P>(x0.x, x0.y, x0.x, x0.y) + tvec4<T, P>(C.x, C.x, C.z, C.z); - x12 = tvec4<T, P>(tvec2<T, P>(x12) - i1, x12.z, x12.w); + vec<4, T, Q> x12 = vec<4, T, Q>(x0.x, x0.y, x0.x, x0.y) + vec<4, T, Q>(C.x, C.x, C.z, C.z); + x12 = vec<4, T, Q>(vec<2, T, Q>(x12) - i1, x12.z, x12.w); // Permutations - i = mod(i, tvec2<T, P>(289)); // Avoid truncation effects in permutation - tvec3<T, P> p = detail::permute( - detail::permute(i.y + tvec3<T, P>(T(0), i1.y, T(1))) - + i.x + tvec3<T, P>(T(0), i1.x, T(1))); + i = mod(i, vec<2, T, Q>(289)); // Avoid truncation effects in permutation + vec<3, T, Q> p = detail::permute( + detail::permute(i.y + vec<3, T, Q>(T(0), i1.y, T(1))) + + i.x + vec<3, T, Q>(T(0), i1.x, T(1))); - tvec3<T, P> m = max(tvec3<T, P>(0.5) - tvec3<T, P>( + vec<3, T, Q> m = max(vec<3, T, Q>(0.5) - vec<3, T, Q>( dot(x0, x0), - dot(tvec2<T, P>(x12.x, x12.y), tvec2<T, P>(x12.x, x12.y)), - dot(tvec2<T, P>(x12.z, x12.w), tvec2<T, P>(x12.z, x12.w))), tvec3<T, P>(0)); + dot(vec<2, T, Q>(x12.x, x12.y), vec<2, T, Q>(x12.x, x12.y)), + dot(vec<2, T, Q>(x12.z, x12.w), vec<2, T, Q>(x12.z, x12.w))), vec<3, T, Q>(0)); m = m * m ; m = m * m ; // Gradients: 41 points uniformly over a line, mapped onto a diamond. // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) - tvec3<T, P> x = static_cast<T>(2) * fract(p * C.w) - T(1); - tvec3<T, P> h = abs(x) - T(0.5); - tvec3<T, P> ox = floor(x + T(0.5)); - tvec3<T, P> a0 = x - ox; + vec<3, T, Q> x = static_cast<T>(2) * fract(p * C.w) - T(1); + vec<3, T, Q> h = abs(x) - T(0.5); + vec<3, T, Q> ox = floor(x + T(0.5)); + vec<3, T, Q> a0 = x - ox; // Normalise gradients implicitly by scaling m // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); m *= static_cast<T>(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); // Compute final noise value at P - tvec3<T, P> g; + vec<3, T, Q> g; g.x = a0.x * x0.x + h.x * x0.y; //g.yz = a0.yz * x12.xz + h.yz * x12.yw; g.y = a0.y * x12.x + h.y * x12.y; @@ -645,85 +645,85 @@ namespace gtc return T(130) * dot(m, g); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T simplex(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T simplex(vec<3, T, Q> const& v) { - tvec2<T, P> const C(1.0 / 6.0, 1.0 / 3.0); - tvec4<T, P> const D(0.0, 0.5, 1.0, 2.0); + vec<2, T, Q> const C(1.0 / 6.0, 1.0 / 3.0); + vec<4, T, Q> const D(0.0, 0.5, 1.0, 2.0); // First corner - tvec3<T, P> i(floor(v + dot(v, tvec3<T, P>(C.y)))); - tvec3<T, P> x0(v - i + dot(i, tvec3<T, P>(C.x))); + vec<3, T, Q> i(floor(v + dot(v, vec<3, T, Q>(C.y)))); + vec<3, T, Q> x0(v - i + dot(i, vec<3, T, Q>(C.x))); // Other corners - tvec3<T, P> g(step(tvec3<T, P>(x0.y, x0.z, x0.x), x0)); - tvec3<T, P> l(T(1) - g); - tvec3<T, P> i1(min(g, tvec3<T, P>(l.z, l.x, l.y))); - tvec3<T, P> i2(max(g, tvec3<T, P>(l.z, l.x, l.y))); + vec<3, T, Q> g(step(vec<3, T, Q>(x0.y, x0.z, x0.x), x0)); + vec<3, T, Q> l(T(1) - g); + vec<3, T, Q> i1(min(g, vec<3, T, Q>(l.z, l.x, l.y))); + vec<3, T, Q> i2(max(g, vec<3, T, Q>(l.z, l.x, l.y))); // x0 = x0 - 0.0 + 0.0 * C.xxx; // x1 = x0 - i1 + 1.0 * C.xxx; // x2 = x0 - i2 + 2.0 * C.xxx; // x3 = x0 - 1.0 + 3.0 * C.xxx; - tvec3<T, P> x1(x0 - i1 + C.x); - tvec3<T, P> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y - tvec3<T, P> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y + vec<3, T, Q> x1(x0 - i1 + C.x); + vec<3, T, Q> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y + vec<3, T, Q> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y // Permutations i = detail::mod289(i); - tvec4<T, P> p(detail::permute(detail::permute(detail::permute( - i.z + tvec4<T, P>(T(0), i1.z, i2.z, T(1))) + - i.y + tvec4<T, P>(T(0), i1.y, i2.y, T(1))) + - i.x + tvec4<T, P>(T(0), i1.x, i2.x, T(1)))); + vec<4, T, Q> p(detail::permute(detail::permute(detail::permute( + i.z + vec<4, T, Q>(T(0), i1.z, i2.z, T(1))) + + i.y + vec<4, T, Q>(T(0), i1.y, i2.y, T(1))) + + i.x + vec<4, T, Q>(T(0), i1.x, i2.x, T(1)))); // Gradients: 7x7 points over a square, mapped onto an octahedron. // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) T n_ = static_cast<T>(0.142857142857); // 1.0/7.0 - tvec3<T, P> ns(n_ * tvec3<T, P>(D.w, D.y, D.z) - tvec3<T, P>(D.x, D.z, D.x)); + vec<3, T, Q> ns(n_ * vec<3, T, Q>(D.w, D.y, D.z) - vec<3, T, Q>(D.x, D.z, D.x)); - tvec4<T, P> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) + vec<4, T, Q> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) - tvec4<T, P> x_(floor(j * ns.z)); - tvec4<T, P> y_(floor(j - T(7) * x_)); // mod(j,N) + vec<4, T, Q> x_(floor(j * ns.z)); + vec<4, T, Q> y_(floor(j - T(7) * x_)); // mod(j,N) - tvec4<T, P> x(x_ * ns.x + ns.y); - tvec4<T, P> y(y_ * ns.x + ns.y); - tvec4<T, P> h(T(1) - abs(x) - abs(y)); + vec<4, T, Q> x(x_ * ns.x + ns.y); + vec<4, T, Q> y(y_ * ns.x + ns.y); + vec<4, T, Q> h(T(1) - abs(x) - abs(y)); - tvec4<T, P> b0(x.x, x.y, y.x, y.y); - tvec4<T, P> b1(x.z, x.w, y.z, y.w); + vec<4, T, Q> b0(x.x, x.y, y.x, y.y); + vec<4, T, Q> b1(x.z, x.w, y.z, y.w); // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; - tvec4<T, P> s0(floor(b0) * T(2) + T(1)); - tvec4<T, P> s1(floor(b1) * T(2) + T(1)); - tvec4<T, P> sh(-step(h, tvec4<T, P>(0.0))); + vec<4, T, Q> s0(floor(b0) * T(2) + T(1)); + vec<4, T, Q> s1(floor(b1) * T(2) + T(1)); + vec<4, T, Q> sh(-step(h, vec<4, T, Q>(0.0))); - tvec4<T, P> a0 = tvec4<T, P>(b0.x, b0.z, b0.y, b0.w) + tvec4<T, P>(s0.x, s0.z, s0.y, s0.w) * tvec4<T, P>(sh.x, sh.x, sh.y, sh.y); - tvec4<T, P> a1 = tvec4<T, P>(b1.x, b1.z, b1.y, b1.w) + tvec4<T, P>(s1.x, s1.z, s1.y, s1.w) * tvec4<T, P>(sh.z, sh.z, sh.w, sh.w); + vec<4, T, Q> a0 = vec<4, T, Q>(b0.x, b0.z, b0.y, b0.w) + vec<4, T, Q>(s0.x, s0.z, s0.y, s0.w) * vec<4, T, Q>(sh.x, sh.x, sh.y, sh.y); + vec<4, T, Q> a1 = vec<4, T, Q>(b1.x, b1.z, b1.y, b1.w) + vec<4, T, Q>(s1.x, s1.z, s1.y, s1.w) * vec<4, T, Q>(sh.z, sh.z, sh.w, sh.w); - tvec3<T, P> p0(a0.x, a0.y, h.x); - tvec3<T, P> p1(a0.z, a0.w, h.y); - tvec3<T, P> p2(a1.x, a1.y, h.z); - tvec3<T, P> p3(a1.z, a1.w, h.w); + vec<3, T, Q> p0(a0.x, a0.y, h.x); + vec<3, T, Q> p1(a0.z, a0.w, h.y); + vec<3, T, Q> p2(a1.x, a1.y, h.z); + vec<3, T, Q> p3(a1.z, a1.w, h.w); // Normalise gradients - tvec4<T, P> norm = detail::taylorInvSqrt(tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; // Mix final noise value - tvec4<T, P> m = max(T(0.6) - tvec4<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), tvec4<T, P>(0)); + vec<4, T, Q> m = max(T(0.6) - vec<4, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec<4, T, Q>(0)); m = m * m; - return T(42) * dot(m * m, tvec4<T, P>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + return T(42) * dot(m * m, vec<4, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T simplex(tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T simplex(vec<4, T, Q> const& v) { - tvec4<T, P> const C( + vec<4, T, Q> const C( 0.138196601125011, // (5 - sqrt(5))/20 G4 0.276393202250021, // 2 * G4 0.414589803375032, // 3 * G4 @@ -733,63 +733,63 @@ namespace gtc T const F4 = static_cast<T>(0.309016994374947451); // First corner - tvec4<T, P> i = floor(v + dot(v, vec4(F4))); - tvec4<T, P> x0 = v - i + dot(i, vec4(C.x)); + vec<4, T, Q> i = floor(v + dot(v, vec4(F4))); + vec<4, T, Q> x0 = v - i + dot(i, vec4(C.x)); // Other corners // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) - tvec4<T, P> i0; - tvec3<T, P> isX = step(tvec3<T, P>(x0.y, x0.z, x0.w), tvec3<T, P>(x0.x)); - tvec3<T, P> isYZ = step(tvec3<T, P>(x0.z, x0.w, x0.w), tvec3<T, P>(x0.y, x0.y, x0.z)); + vec<4, T, Q> i0; + vec<3, T, Q> isX = step(vec<3, T, Q>(x0.y, x0.z, x0.w), vec<3, T, Q>(x0.x)); + vec<3, T, Q> isYZ = step(vec<3, T, Q>(x0.z, x0.w, x0.w), vec<3, T, Q>(x0.y, x0.y, x0.z)); // i0.x = dot(isX, vec3(1.0)); //i0.x = isX.x + isX.y + isX.z; //i0.yzw = static_cast<T>(1) - isX; - i0 = tvec4<T, P>(isX.x + isX.y + isX.z, T(1) - isX); + i0 = vec<4, T, Q>(isX.x + isX.y + isX.z, T(1) - isX); // i0.y += dot(isYZ.xy, vec2(1.0)); i0.y += isYZ.x + isYZ.y; - //i0.zw += 1.0 - tvec2<T, P>(isYZ.x, isYZ.y); + //i0.zw += 1.0 - vec<2, T, Q>(isYZ.x, isYZ.y); i0.z += static_cast<T>(1) - isYZ.x; i0.w += static_cast<T>(1) - isYZ.y; i0.z += isYZ.z; i0.w += static_cast<T>(1) - isYZ.z; // i0 now contains the unique values 0,1,2,3 in each channel - tvec4<T, P> i3 = clamp(i0, T(0), T(1)); - tvec4<T, P> i2 = clamp(i0 - T(1), T(0), T(1)); - tvec4<T, P> i1 = clamp(i0 - T(2), T(0), T(1)); + vec<4, T, Q> i3 = clamp(i0, T(0), T(1)); + vec<4, T, Q> i2 = clamp(i0 - T(1), T(0), T(1)); + vec<4, T, Q> i1 = clamp(i0 - T(2), T(0), T(1)); // x0 = x0 - 0.0 + 0.0 * C.xxxx // x1 = x0 - i1 + 0.0 * C.xxxx // x2 = x0 - i2 + 0.0 * C.xxxx // x3 = x0 - i3 + 0.0 * C.xxxx // x4 = x0 - 1.0 + 4.0 * C.xxxx - tvec4<T, P> x1 = x0 - i1 + C.x; - tvec4<T, P> x2 = x0 - i2 + C.y; - tvec4<T, P> x3 = x0 - i3 + C.z; - tvec4<T, P> x4 = x0 + C.w; + vec<4, T, Q> x1 = x0 - i1 + C.x; + vec<4, T, Q> x2 = x0 - i2 + C.y; + vec<4, T, Q> x3 = x0 - i3 + C.z; + vec<4, T, Q> x4 = x0 + C.w; // Permutations - i = mod(i, tvec4<T, P>(289)); + i = mod(i, vec<4, T, Q>(289)); T j0 = detail::permute(detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x); - tvec4<T, P> j1 = detail::permute(detail::permute(detail::permute(detail::permute( - i.w + tvec4<T, P>(i1.w, i2.w, i3.w, T(1))) + - i.z + tvec4<T, P>(i1.z, i2.z, i3.z, T(1))) + - i.y + tvec4<T, P>(i1.y, i2.y, i3.y, T(1))) + - i.x + tvec4<T, P>(i1.x, i2.x, i3.x, T(1))); + vec<4, T, Q> j1 = detail::permute(detail::permute(detail::permute(detail::permute( + i.w + vec<4, T, Q>(i1.w, i2.w, i3.w, T(1))) + + i.z + vec<4, T, Q>(i1.z, i2.z, i3.z, T(1))) + + i.y + vec<4, T, Q>(i1.y, i2.y, i3.y, T(1))) + + i.x + vec<4, T, Q>(i1.x, i2.x, i3.x, T(1))); // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope // 7*7*6 = 294, which is close to the ring size 17*17 = 289. - tvec4<T, P> ip = tvec4<T, P>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); + vec<4, T, Q> ip = vec<4, T, Q>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); - tvec4<T, P> p0 = gtc::grad4(j0, ip); - tvec4<T, P> p1 = gtc::grad4(j1.x, ip); - tvec4<T, P> p2 = gtc::grad4(j1.y, ip); - tvec4<T, P> p3 = gtc::grad4(j1.z, ip); - tvec4<T, P> p4 = gtc::grad4(j1.w, ip); + vec<4, T, Q> p0 = gtc::grad4(j0, ip); + vec<4, T, Q> p1 = gtc::grad4(j1.x, ip); + vec<4, T, Q> p2 = gtc::grad4(j1.y, ip); + vec<4, T, Q> p3 = gtc::grad4(j1.z, ip); + vec<4, T, Q> p4 = gtc::grad4(j1.w, ip); // Normalise gradients - tvec4<T, P> norm = detail::taylorInvSqrt(tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + vec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; @@ -797,12 +797,12 @@ namespace gtc p4 *= detail::taylorInvSqrt(dot(p4, p4)); // Mix contributions from the five corners - tvec3<T, P> m0 = max(T(0.6) - tvec3<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), tvec3<T, P>(0)); - tvec2<T, P> m1 = max(T(0.6) - tvec2<T, P>(dot(x3, x3), dot(x4, x4) ), tvec2<T, P>(0)); + vec<3, T, Q> m0 = max(T(0.6) - vec<3, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), vec<3, T, Q>(0)); + vec<2, T, Q> m1 = max(T(0.6) - vec<2, T, Q>(dot(x3, x3), dot(x4, x4) ), vec<2, T, Q>(0)); m0 = m0 * m0; m1 = m1 * m1; - return T(49) * - (dot(m0 * m0, tvec3<T, P>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + - dot(m1 * m1, tvec2<T, P>(dot(p3, x3), dot(p4, x4)))); + return T(49) * + (dot(m0 * m0, vec<3, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + + dot(m1 * m1, vec<2, T, Q>(dot(p3, x3), dot(p4, x4)))); } }//namespace glm diff --git a/external/include/glm/gtc/packing.hpp b/external/include/glm/gtc/packing.hpp index 1389d95..96070c2 100644 --- a/external/include/glm/gtc/packing.hpp +++ b/external/include/glm/gtc/packing.hpp @@ -6,10 +6,10 @@ /// @defgroup gtc_packing GLM_GTC_packing /// @ingroup gtc /// -/// @brief This extension provides a set of function to convert vertors to packed -/// formats. +/// Include <glm/gtc/packing.hpp> to use the features of this extension. /// -/// <glm/gtc/packing.hpp> need to be included to use these features. +/// This extension provides a set of function to convert vertors to packed +/// formats. #pragma once @@ -32,17 +32,17 @@ namespace glm /// packUnorm1x8: round(clamp(c, 0, +1) * 255.0) /// /// @see gtc_packing - /// @see uint16 packUnorm2x8(vec2 const & v) - /// @see uint32 packUnorm4x8(vec4 const & v) + /// @see uint16 packUnorm2x8(vec2 const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL uint8 packUnorm1x8(float v); /// Convert a single 8-bit integer to a normalized floating-point value. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackUnorm4x8: f / 255.0 - /// + /// /// @see gtc_packing /// @see vec2 unpackUnorm2x8(uint16 p) /// @see vec4 unpackUnorm4x8(uint32 p) @@ -60,28 +60,28 @@ namespace glm /// the last component will be written to the most significant bits. /// /// @see gtc_packing - /// @see uint8 packUnorm1x8(float const & v) - /// @see uint32 packUnorm4x8(vec4 const & v) + /// @see uint8 packUnorm1x8(float const& v) + /// @see uint32 packUnorm4x8(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const & v); + GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const& v); - /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackUnorm4x8: f / 255.0 - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing /// @see float unpackUnorm1x8(uint8 v) /// @see vec4 unpackUnorm4x8(uint32 p) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p); - + /// First, converts the normalized floating-point value v into 8-bit integer value. /// Then, the results are packed into the returned 8-bit unsigned integer. /// @@ -89,25 +89,25 @@ namespace glm /// packSnorm1x8: round(clamp(s, -1, +1) * 127.0) /// /// @see gtc_packing - /// @see uint16 packSnorm2x8(vec2 const & v) - /// @see uint32 packSnorm4x8(vec4 const & v) + /// @see uint16 packSnorm2x8(vec2 const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL uint8 packSnorm1x8(float s); - /// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. + /// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm1x8: clamp(f / 127.0, -1, +1) - /// + /// /// @see gtc_packing /// @see vec2 unpackSnorm2x8(uint16 p) /// @see vec4 unpackSnorm4x8(uint32 p) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL float unpackSnorm1x8(uint8 p); - + /// First, converts each component of the normalized floating-point value v into 8-bit integer values. /// Then, the results are packed into the returned 16-bit unsigned integer. /// @@ -118,28 +118,28 @@ namespace glm /// the last component will be written to the most significant bits. /// /// @see gtc_packing - /// @see uint8 packSnorm1x8(float const & v) - /// @see uint32 packSnorm4x8(vec4 const & v) + /// @see uint8 packSnorm1x8(float const& v) + /// @see uint32 packSnorm4x8(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const & v); + GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const& v); - /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. + /// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm2x8: clamp(f / 127.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing /// @see float unpackSnorm1x8(uint8 p) /// @see vec4 unpackSnorm4x8(uint32 p) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p); - + /// First, converts the normalized floating-point value v into a 16-bit integer value. /// Then, the results are packed into the returned 16-bit unsigned integer. /// @@ -147,18 +147,18 @@ namespace glm /// packUnorm1x16: round(clamp(c, 0, +1) * 65535.0) /// /// @see gtc_packing - /// @see uint16 packSnorm1x16(float const & v) - /// @see uint64 packSnorm4x16(vec4 const & v) + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL uint16 packUnorm1x16(float v); - /// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. + /// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. /// Then, the value is converted to a normalized floating-point value to generate the returned scalar. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackUnorm1x16: f / 65535.0 - /// + /// unpackUnorm1x16: f / 65535.0 + /// /// @see gtc_packing /// @see vec2 unpackUnorm2x16(uint32 p) /// @see vec4 unpackUnorm4x16(uint64 p) @@ -176,21 +176,21 @@ namespace glm /// the last component will be written to the most significant bits. /// /// @see gtc_packing - /// @see uint16 packUnorm1x16(float const & v) - /// @see uint32 packUnorm2x16(vec2 const & v) + /// @see uint16 packUnorm1x16(float const& v) + /// @see uint32 packUnorm2x16(vec2 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const & v); + GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const& v); - /// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackUnormx4x16: f / 65535.0 - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// unpackUnormx4x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing /// @see float unpackUnorm1x16(uint16 p) /// @see vec2 unpackUnorm2x16(uint32 p) @@ -205,18 +205,18 @@ namespace glm /// packSnorm1x8: round(clamp(s, -1, +1) * 32767.0) /// /// @see gtc_packing - /// @see uint32 packSnorm2x16(vec2 const & v) - /// @see uint64 packSnorm4x16(vec4 const & v) + /// @see uint32 packSnorm2x16(vec2 const& v) + /// @see uint64 packSnorm4x16(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL uint16 packSnorm1x16(float v); - /// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. + /// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned scalar. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm1x16: clamp(f / 32767.0, -1, +1) - /// + /// /// @see gtc_packing /// @see vec2 unpackSnorm2x16(uint32 p) /// @see vec4 unpackSnorm4x16(uint64 p) @@ -234,122 +234,122 @@ namespace glm /// the last component will be written to the most significant bits. /// /// @see gtc_packing - /// @see uint16 packSnorm1x16(float const & v) - /// @see uint32 packSnorm2x16(vec2 const & v) + /// @see uint16 packSnorm1x16(float const& v) + /// @see uint32 packSnorm2x16(vec2 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const & v); + GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const& v); - /// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. + /// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm4x16: clamp(f / 32767.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing /// @see float unpackSnorm1x16(uint16 p) /// @see vec2 unpackSnorm2x16(uint32 p) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm4x8 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p); - + /// Returns an unsigned integer obtained by converting the components of a floating-point scalar /// to the 16-bit floating-point representation found in the OpenGL Specification, /// and then packing this 16-bit value into a 16-bit unsigned integer. /// /// @see gtc_packing - /// @see uint32 packHalf2x16(vec2 const & v) - /// @see uint64 packHalf4x16(vec4 const & v) + /// @see uint32 packHalf2x16(vec2 const& v) + /// @see uint64 packHalf4x16(vec4 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL uint16 packHalf1x16(float v); - + /// Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, /// interpreted as a 16-bit floating-point number according to the OpenGL Specification, /// and converting it to 32-bit floating-point values. /// /// @see gtc_packing - /// @see vec2 unpackHalf2x16(uint32 const & v) - /// @see vec4 unpackHalf4x16(uint64 const & v) + /// @see vec2 unpackHalf2x16(uint32 const& v) + /// @see vec4 unpackHalf4x16(uint64 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL float unpackHalf1x16(uint16 v); - /// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector - /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, /// and then packing these four 16-bit values into a 64-bit unsigned integer. - /// The first vector component specifies the 16 least-significant bits of the result; + /// The first vector component specifies the 16 least-significant bits of the result; /// the forth component specifies the 16 most-significant bits. - /// + /// /// @see gtc_packing - /// @see uint16 packHalf1x16(float const & v) - /// @see uint32 packHalf2x16(vec2 const & v) + /// @see uint16 packHalf1x16(float const& v) + /// @see uint32 packHalf2x16(vec2 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - GLM_FUNC_DECL uint64 packHalf4x16(vec4 const & v); - + GLM_FUNC_DECL uint64 packHalf4x16(vec4 const& v); + /// Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, - /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, /// and converting them to 32-bit floating-point values. - /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// The first component of the vector is obtained from the 16 least-significant bits of v; /// the forth component is obtained from the 16 most-significant bits of v. - /// + /// /// @see gtc_packing - /// @see float unpackHalf1x16(uint16 const & v) - /// @see vec2 unpackHalf2x16(uint32 const & v) + /// @see float unpackHalf1x16(uint16 const& v) + /// @see vec2 unpackHalf2x16(uint32 const& v) /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p); - /// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector - /// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, + /// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector + /// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, /// and then packing these four values into a 32-bit unsigned integer. - /// The first vector component specifies the 10 least-significant bits of the result; + /// The first vector component specifies the 10 least-significant bits of the result; /// the forth component specifies the 2 most-significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packI3x10_1x2(uvec4 const & v) - /// @see uint32 packSnorm3x10_1x2(vec4 const & v) - /// @see uint32 packUnorm3x10_1x2(vec4 const & v) - /// @see ivec4 unpackI3x10_1x2(uint32 const & p) - GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const & v); + /// @see uint32 packI3x10_1x2(uvec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackI3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const& v); - /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packU3x10_1x2(uvec4 const & v) - /// @see vec4 unpackSnorm3x10_1x2(uint32 const & p); - /// @see uvec4 unpackI3x10_1x2(uint32 const & p); + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p); - /// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector - /// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, + /// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector + /// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, /// and then packing these four values into a 32-bit unsigned integer. - /// The first vector component specifies the 10 least-significant bits of the result; + /// The first vector component specifies the 10 least-significant bits of the result; /// the forth component specifies the 2 most-significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packI3x10_1x2(ivec4 const & v) - /// @see uint32 packSnorm3x10_1x2(vec4 const & v) - /// @see uint32 packUnorm3x10_1x2(vec4 const & v) - /// @see ivec4 unpackU3x10_1x2(uint32 const & p) - GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const & v); + /// @see uint32 packI3x10_1x2(ivec4 const& v) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see ivec4 unpackU3x10_1x2(uint32 const& p) + GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const& v); - /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packU3x10_1x2(uvec4 const & v) - /// @see vec4 unpackSnorm3x10_1x2(uint32 const & p); - /// @see uvec4 unpackI3x10_1x2(uint32 const & p); + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p); + /// @see uvec4 unpackI3x10_1x2(uint32 const& p); GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p); /// First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values. @@ -360,31 +360,31 @@ namespace glm /// packSnorm3x10_1x2(xyz): round(clamp(c, -1, +1) * 511.0) /// packSnorm3x10_1x2(w): round(clamp(c, -1, +1) * 1.0) /// - /// The first vector component specifies the 10 least-significant bits of the result; + /// The first vector component specifies the 10 least-significant bits of the result; /// the forth component specifies the 2 most-significant bits. /// /// @see gtc_packing - /// @see vec4 unpackSnorm3x10_1x2(uint32 const & p) - /// @see uint32 packUnorm3x10_1x2(vec4 const & v) - /// @see uint32 packU3x10_1x2(uvec4 const & v) - /// @see uint32 packI3x10_1x2(ivec4 const & v) - GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const & v); + /// @see vec4 unpackSnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const& v); - /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1) /// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packSnorm3x10_1x2(vec4 const & v) - /// @see vec4 unpackUnorm3x10_1x2(uint32 const & p)) - /// @see uvec4 unpackI3x10_1x2(uint32 const & p) - /// @see uvec4 unpackU3x10_1x2(uint32 const & p) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p); /// First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values. @@ -395,52 +395,52 @@ namespace glm /// packUnorm3x10_1x2(xyz): round(clamp(c, 0, +1) * 1023.0) /// packUnorm3x10_1x2(w): round(clamp(c, 0, +1) * 3.0) /// - /// The first vector component specifies the 10 least-significant bits of the result; + /// The first vector component specifies the 10 least-significant bits of the result; /// the forth component specifies the 2 most-significant bits. /// /// @see gtc_packing - /// @see vec4 unpackUnorm3x10_1x2(uint32 const & p) - /// @see uint32 packUnorm3x10_1x2(vec4 const & v) - /// @see uint32 packU3x10_1x2(uvec4 const & v) - /// @see uint32 packI3x10_1x2(ivec4 const & v) - GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const & v); + /// @see vec4 unpackUnorm3x10_1x2(uint32 const& p) + /// @see uint32 packUnorm3x10_1x2(vec4 const& v) + /// @see uint32 packU3x10_1x2(uvec4 const& v) + /// @see uint32 packI3x10_1x2(ivec4 const& v) + GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const& v); - /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. + /// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector. - /// + /// /// The conversion for unpacked fixed-point value f to floating point is done as follows: /// unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1) /// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packSnorm3x10_1x2(vec4 const & v) - /// @see vec4 unpackInorm3x10_1x2(uint32 const & p)) - /// @see uvec4 unpackI3x10_1x2(uint32 const & p) - /// @see uvec4 unpackU3x10_1x2(uint32 const & p) + /// @see uint32 packSnorm3x10_1x2(vec4 const& v) + /// @see vec4 unpackInorm3x10_1x2(uint32 const& p)) + /// @see uvec4 unpackI3x10_1x2(uint32 const& p) + /// @see uvec4 unpackU3x10_1x2(uint32 const& p) GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p); /// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. /// Then, the results are packed into the returned 32-bit unsigned integer. /// - /// The first vector component specifies the 11 least-significant bits of the result; + /// The first vector component specifies the 11 least-significant bits of the result; /// the last component specifies the 10 most-significant bits. /// /// @see gtc_packing - /// @see vec3 unpackF2x11_1x10(uint32 const & p) - GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const & v); + /// @see vec3 unpackF2x11_1x10(uint32 const& p) + GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const& v); - /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// /// @see gtc_packing - /// @see uint32 packF2x11_1x10(vec3 const & v) + /// @see uint32 packF2x11_1x10(vec3 const& v) GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p); @@ -448,131 +448,280 @@ namespace glm /// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. /// Then, the results are packed into the returned 32-bit unsigned integer. /// - /// The first vector component specifies the 11 least-significant bits of the result; + /// The first vector component specifies the 11 least-significant bits of the result; /// the last component specifies the 10 most-significant bits. /// + /// packF3x9_E1x5 allows encoding into RGBE / RGB9E5 format + /// /// @see gtc_packing - /// @see vec3 unpackF3x9_E1x5(uint32 const & p) - GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const & v); + /// @see vec3 unpackF3x9_E1x5(uint32 const& p) + GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const& v); - /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . + /// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . /// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector. - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; /// the last component will be extracted from the most significant bits. - /// + /// + /// unpackF3x9_E1x5 allows decoding RGBE / RGB9E5 data + /// /// @see gtc_packing - /// @see uint32 packF3x9_E1x5(vec3 const & v) + /// @see uint32 packF3x9_E1x5(vec3 const& v) GLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p); /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector /// to the 16-bit floating-point representation found in the OpenGL Specification. - /// The first vector component specifies the 16 least-significant bits of the result; + /// The first vector component specifies the 16 least-significant bits of the result; + /// the forth component specifies the 16 most-significant bits. + /// + /// @see gtc_packing + /// @see vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& p) + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb); + + /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the forth component is obtained from the 16 most-significant bits of v. + /// + /// @see gtc_packing + /// @see vec<4, T, Q> packRGBM(vec<3, float, Q> const& v) + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm); + + /// Returns an unsigned integer vector obtained by converting the components of a floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification. + /// The first vector component specifies the 16 least-significant bits of the result; /// the forth component specifies the 16 most-significant bits. - /// + /// /// @see gtc_packing - /// @see vecType<float, P> unpackHalf(vecType<uint16, P> const & p) + /// @see vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& p) /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<uint16, P> packHalf(vecType<float, P> const & v); + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v); /// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. /// The first component of the vector is obtained from the 16 least-significant bits of v; /// the forth component is obtained from the 16 most-significant bits of v. - /// + /// /// @see gtc_packing - /// @see vecType<uint16, P> packHalf(vecType<float, P> const & v) + /// @see vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v) /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<float, P> unpackHalf(vecType<uint16, P> const & p); + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& p); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing - /// @see vecType<floatType, P> unpackUnorm(vecType<intType, P> const & p); - template <typename uintType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<uintType, P> packUnorm(vecType<floatType, P> const & v); + /// @see vec<L, floatType, Q> unpackUnorm(vec<L, intType, Q> const& p); + template<typename uintType, length_t L, typename floatType, qualifier Q> + GLM_FUNC_DECL vec<L, uintType, Q> packUnorm(vec<L, floatType, Q> const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see vecType<intType, P> packUnorm(vecType<floatType, P> const & v) - template <typename uintType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<floatType, P> unpackUnorm(vecType<uintType, P> const & v); + /// @see vec<L, intType, Q> packUnorm(vec<L, floatType, Q> const& v) + template<typename floatType, length_t L, typename uintType, qualifier Q> + GLM_FUNC_DECL vec<L, floatType, Q> unpackUnorm(vec<L, uintType, Q> const& v); /// Convert each component of the normalized floating-point vector into signed integer values. /// /// @see gtc_packing - /// @see vecType<floatType, P> unpackSnorm(vecType<intType, P> const & p); - template <typename intType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<intType, P> packSnorm(vecType<floatType, P> const & v); + /// @see vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& p); + template<typename intType, length_t L, typename floatType, qualifier Q> + GLM_FUNC_DECL vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v); - /// Convert each signed integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see vecType<intType, P> packSnorm(vecType<floatType, P> const & v) - template <typename intType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<floatType, P> unpackSnorm(vecType<intType, P> const & v); + /// @see vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v) + template<typename floatType, length_t L, typename intType, qualifier Q> + GLM_FUNC_DECL vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& v); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing /// @see vec2 unpackUnorm2x4(uint8 p) - GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const & v); + GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see uint8 packUnorm2x4(vec2 const & v) + /// @see uint8 packUnorm2x4(vec2 const& v) GLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing /// @see vec4 unpackUnorm4x4(uint16 p) - GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const & v); + GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see uint16 packUnorm4x4(vec4 const & v) + /// @see uint16 packUnorm4x4(vec4 const& v) GLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing /// @see vec3 unpackUnorm1x5_1x6_1x5(uint16 p) - GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const & v); + GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see uint16 packUnorm1x5_1x6_1x5(vec3 const & v) + /// @see uint16 packUnorm1x5_1x6_1x5(vec3 const& v) GLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing /// @see vec4 unpackUnorm3x5_1x1(uint16 p) - GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const & v); + GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see uint16 packUnorm3x5_1x1(vec4 const & v) + /// @see uint16 packUnorm3x5_1x1(vec4 const& v) GLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p); /// Convert each component of the normalized floating-point vector into unsigned integer values. /// /// @see gtc_packing /// @see vec3 unpackUnorm2x3_1x2(uint8 p) - GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const & v); + GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const& v); - /// Convert each unsigned integer components of a vector to normalized floating-point values. - /// + /// Convert a packed integer to a normalized floating-point vector. + /// /// @see gtc_packing - /// @see uint8 packUnorm2x3_1x2(vec3 const & v) + /// @see uint8 packUnorm2x3_1x2(vec3 const& v) GLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p); + + + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see i8vec2 unpackInt2x8(int16 p) + GLM_FUNC_DECL int16 packInt2x8(i8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int16 packInt2x8(i8vec2 const& v) + GLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec2 unpackInt2x8(uint16 p) + GLM_FUNC_DECL uint16 packUint2x8(u8vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint16 packInt2x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see i8vec4 unpackInt4x8(int32 p) + GLM_FUNC_DECL int32 packInt4x8(i8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int32 packInt2x8(i8vec4 const& v) + GLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u8vec4 unpackUint4x8(uint32 p) + GLM_FUNC_DECL uint32 packUint4x8(u8vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint32 packUint4x8(u8vec2 const& v) + GLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see i16vec2 unpackInt2x16(int p) + GLM_FUNC_DECL int packInt2x16(i16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i16vec2 const& v) + GLM_FUNC_DECL i16vec2 unpackInt2x16(int p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see i16vec4 unpackInt4x16(int64 p) + GLM_FUNC_DECL int64 packInt4x16(i16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int64 packInt4x16(i16vec4 const& v) + GLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec2 unpackUint2x16(uint p) + GLM_FUNC_DECL uint packUint2x16(u16vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint packUint2x16(u16vec2 const& v) + GLM_FUNC_DECL u16vec2 unpackUint2x16(uint p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u16vec4 unpackUint4x16(uint64 p) + GLM_FUNC_DECL uint64 packUint4x16(u16vec4 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see uint64 packUint4x16(u16vec4 const& v) + GLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see i32vec2 unpackInt2x32(int p) + GLM_FUNC_DECL int64 packInt2x32(i32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packInt2x16(i32vec2 const& v) + GLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p); + + /// Convert each component from an integer vector into a packed unsigned integer. + /// + /// @see gtc_packing + /// @see u32vec2 unpackUint2x32(int p) + GLM_FUNC_DECL uint64 packUint2x32(u32vec2 const& v); + + /// Convert a packed integer into an integer vector. + /// + /// @see gtc_packing + /// @see int packUint2x16(u32vec2 const& v) + GLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p); + + /// @} }// namespace glm diff --git a/external/include/glm/gtc/packing.inl b/external/include/glm/gtc/packing.inl index 618fb9e..c12c140 100644 --- a/external/include/glm/gtc/packing.inl +++ b/external/include/glm/gtc/packing.inl @@ -2,6 +2,7 @@ /// @file glm/gtc/packing.inl #include "../common.hpp" +#include "../vector_relational.hpp" #include "../vec2.hpp" #include "../vec3.hpp" #include "../vec4.hpp" @@ -270,83 +271,83 @@ namespace detail uint32 pack; }; - template <precision P, template <typename, precision> class vecType> + template<length_t L, qualifier Q> struct compute_half {}; - template <precision P> - struct compute_half<P, tvec1> + template<qualifier Q> + struct compute_half<1, Q> { - GLM_FUNC_QUALIFIER static tvec1<uint16, P> pack(tvec1<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<1, uint16, Q> pack(vec<1, float, Q> const& v) { int16 const Unpack(detail::toFloat16(v.x)); - u16vec1 Packed(uninitialize); + u16vec1 Packed; memcpy(&Packed, &Unpack, sizeof(Packed)); return Packed; } - GLM_FUNC_QUALIFIER static tvec1<float, P> unpack(tvec1<uint16, P> const & v) + GLM_FUNC_QUALIFIER static vec<1, float, Q> unpack(vec<1, uint16, Q> const& v) { - i16vec1 Unpack(uninitialize); + i16vec1 Unpack; memcpy(&Unpack, &v, sizeof(Unpack)); - return tvec1<float, P>(detail::toFloat32(v.x)); + return vec<1, float, Q>(detail::toFloat32(v.x)); } }; - template <precision P> - struct compute_half<P, tvec2> + template<qualifier Q> + struct compute_half<2, Q> { - GLM_FUNC_QUALIFIER static tvec2<uint16, P> pack(tvec2<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<2, uint16, Q> pack(vec<2, float, Q> const& v) { - tvec2<int16, P> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y)); - u16vec2 Packed(uninitialize); + vec<2, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y)); + u16vec2 Packed; memcpy(&Packed, &Unpack, sizeof(Packed)); return Packed; } - GLM_FUNC_QUALIFIER static tvec2<float, P> unpack(tvec2<uint16, P> const & v) + GLM_FUNC_QUALIFIER static vec<2, float, Q> unpack(vec<2, uint16, Q> const& v) { - i16vec2 Unpack(uninitialize); + i16vec2 Unpack; memcpy(&Unpack, &v, sizeof(Unpack)); - return tvec2<float, P>(detail::toFloat32(v.x), detail::toFloat32(v.y)); + return vec<2, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y)); } }; - template <precision P> - struct compute_half<P, tvec3> + template<qualifier Q> + struct compute_half<3, Q> { - GLM_FUNC_QUALIFIER static tvec3<uint16, P> pack(tvec3<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<3, uint16, Q> pack(vec<3, float, Q> const& v) { - tvec3<int16, P> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z)); - u16vec3 Packed(uninitialize); + vec<3, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z)); + u16vec3 Packed; memcpy(&Packed, &Unpack, sizeof(Packed)); return Packed; } - GLM_FUNC_QUALIFIER static tvec3<float, P> unpack(tvec3<uint16, P> const & v) + GLM_FUNC_QUALIFIER static vec<3, float, Q> unpack(vec<3, uint16, Q> const& v) { - i16vec3 Unpack(uninitialize); + i16vec3 Unpack; memcpy(&Unpack, &v, sizeof(Unpack)); - return tvec3<float, P>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z)); + return vec<3, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z)); } }; - template <precision P> - struct compute_half<P, tvec4> + template<qualifier Q> + struct compute_half<4, Q> { - GLM_FUNC_QUALIFIER static tvec4<uint16, P> pack(tvec4<float, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, uint16, Q> pack(vec<4, float, Q> const& v) { - tvec4<int16, P> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w)); - u16vec4 Packed(uninitialize); + vec<4, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w)); + u16vec4 Packed; memcpy(&Packed, &Unpack, sizeof(Packed)); return Packed; } - GLM_FUNC_QUALIFIER static tvec4<float, P> unpack(tvec4<uint16, P> const & v) + GLM_FUNC_QUALIFIER static vec<4, float, Q> unpack(vec<4, uint16, Q> const& v) { - i16vec4 Unpack(uninitialize); + i16vec4 Unpack; memcpy(&Unpack, &v, sizeof(Unpack)); - return tvec4<float, P>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w)); + return vec<4, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w)); } }; }//namespace detail @@ -355,14 +356,14 @@ namespace detail { return static_cast<uint8>(round(clamp(v, 0.0f, 1.0f) * 255.0f)); } - + GLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 p) { float const Unpack(p); return Unpack * static_cast<float>(0.0039215686274509803921568627451); // 1 / 255 } - - GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const & v) + + GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v) { u8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); @@ -370,10 +371,10 @@ namespace detail memcpy(&Unpack, &Topack, sizeof(Unpack)); return Unpack; } - + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 p) { - u8vec2 Unpack(uninitialize); + u8vec2 Unpack; memcpy(&Unpack, &p, sizeof(Unpack)); return vec2(Unpack) * float(0.0039215686274509803921568627451); // 1 / 255 } @@ -385,7 +386,7 @@ namespace detail memcpy(&Packed, &Topack, sizeof(Packed)); return Packed; } - + GLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 p) { int8 Unpack = 0; @@ -394,18 +395,18 @@ namespace detail static_cast<float>(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f -1.0f, 1.0f); } - - GLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const & v) + + GLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v) { i8vec2 const Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f)); uint16 Packed = 0; memcpy(&Packed, &Topack, sizeof(Packed)); return Packed; } - + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 p) { - i8vec2 Unpack(uninitialize); + i8vec2 Unpack; memcpy(&Unpack, &p, sizeof(Unpack)); return clamp( vec2(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f @@ -423,7 +424,7 @@ namespace detail return Unpack * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 } - GLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const & v) + GLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v) { u16vec4 const Topack(round(clamp(v , 0.0f, 1.0f) * 65535.0f)); uint64 Packed = 0; @@ -433,7 +434,7 @@ namespace detail GLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 p) { - u16vec4 Unpack(uninitialize); + u16vec4 Unpack; memcpy(&Unpack, &p, sizeof(Unpack)); return vec4(Unpack) * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0 } @@ -451,11 +452,11 @@ namespace detail int16 Unpack = 0; memcpy(&Unpack, &p, sizeof(Unpack)); return clamp( - static_cast<float>(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, + static_cast<float>(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, -1.0f, 1.0f); } - GLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const & v) + GLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v) { i16vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f)); uint64 Packed = 0; @@ -465,7 +466,7 @@ namespace detail GLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 p) { - i16vec4 Unpack(uninitialize); + i16vec4 Unpack; memcpy(&Unpack, &p, sizeof(Unpack)); return clamp( vec4(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, @@ -487,7 +488,7 @@ namespace detail return detail::toFloat32(Unpack); } - GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const & v) + GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v) { i16vec4 const Unpack( detail::toFloat16(v.x), @@ -501,7 +502,7 @@ namespace detail GLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 v) { - i16vec4 Unpack(uninitialize); + i16vec4 Unpack; memcpy(&Unpack, &v, sizeof(Unpack)); return vec4( detail::toFloat32(Unpack.x), @@ -510,14 +511,14 @@ namespace detail detail::toFloat32(Unpack.w)); } - GLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const & v) + GLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v) { detail::i10i10i10i2 Result; Result.data.x = v.x; Result.data.y = v.y; Result.data.z = v.z; Result.data.w = v.w; - return Result.pack; + return Result.pack; } GLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 v) @@ -531,14 +532,14 @@ namespace detail Unpack.data.w); } - GLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const & v) + GLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v) { detail::u10u10u10u2 Result; Result.data.x = v.x; Result.data.y = v.y; Result.data.z = v.z; Result.data.w = v.w; - return Result.pack; + return Result.pack; } GLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 v) @@ -552,13 +553,15 @@ namespace detail Unpack.data.w); } - GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const & v) + GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v) { + ivec4 const Pack(round(clamp(v,-1.0f, 1.0f) * vec4(511.f, 511.f, 511.f, 1.f))); + detail::i10i10i10i2 Result; - Result.data.x = int(round(clamp(v.x,-1.0f, 1.0f) * 511.f)); - Result.data.y = int(round(clamp(v.y,-1.0f, 1.0f) * 511.f)); - Result.data.z = int(round(clamp(v.z,-1.0f, 1.0f) * 511.f)); - Result.data.w = int(round(clamp(v.w,-1.0f, 1.0f) * 1.f)); + Result.data.x = Pack.x; + Result.data.y = Pack.y; + Result.data.z = Pack.z; + Result.data.w = Pack.w; return Result.pack; } @@ -566,15 +569,13 @@ namespace detail { detail::i10i10i10i2 Unpack; Unpack.pack = v; - vec4 Result; - Result.x = clamp(float(Unpack.data.x) / 511.f, -1.0f, 1.0f); - Result.y = clamp(float(Unpack.data.y) / 511.f, -1.0f, 1.0f); - Result.z = clamp(float(Unpack.data.z) / 511.f, -1.0f, 1.0f); - Result.w = clamp(float(Unpack.data.w) / 1.f, -1.0f, 1.0f); - return Result; + + vec4 const Result(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w); + + return clamp(Result * vec4(1.f / 511.f, 1.f / 511.f, 1.f / 511.f, 1.f), -1.0f, 1.0f); } - GLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const & v) + GLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v) { uvec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(1023.f, 1023.f, 1023.f, 3.f))); @@ -595,7 +596,7 @@ namespace detail return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactors; } - GLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const & v) + GLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v) { return ((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) << 0) | @@ -611,15 +612,15 @@ namespace detail detail::packed10bitToFloat(v >> 22)); } - GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const & v) + GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const& v) { float const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f); vec3 const Color = clamp(v, 0.0f, SharedExpMax); float const MaxColor = max(Color.x, max(Color.y, Color.z)); float const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f; - float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 16.f - 9.f)) + 0.5f); - float const ExpShared = MaxShared == pow(2.0f, 9.0f) ? ExpSharedP + 1.0f : ExpSharedP; + float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 15.f - 9.f)) + 0.5f); + float const ExpShared = detail::compute_equal<float>::call(MaxShared, pow(2.0f, 9.0f)) ? ExpSharedP + 1.0f : ExpSharedP; uvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f)); @@ -639,55 +640,71 @@ namespace detail return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uint16, P> packHalf(vecType<float, P> const & v) + // Based on Brian Karis http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb) { - return detail::compute_half<P, vecType>::pack(v); + vec<3, T, Q> const Color(rgb * static_cast<T>(1.0 / 6.0)); + T Alpha = clamp(max(max(Color.x, Color.y), max(Color.z, static_cast<T>(1e-6))), static_cast<T>(0), static_cast<T>(1)); + Alpha = ceil(Alpha * static_cast<T>(255.0)) / static_cast<T>(255.0); + return vec<4, T, Q>(Color / Alpha, Alpha); } - template <precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<float, P> unpackHalf(vecType<uint16, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm) { - return detail::compute_half<P, vecType>::unpack(v); + return vec<3, T, Q>(rgbm.x, rgbm.y, rgbm.z) * rgbm.w * static_cast<T>(6); } - template <typename uintType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uintType, P> packUnorm(vecType<floatType, P> const & v) + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v) + { + return detail::compute_half<L, Q>::pack(v); + } + + template<length_t L, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& v) + { + return detail::compute_half<L, Q>::unpack(v); + } + + template<typename uintType, length_t L, typename floatType, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uintType, Q> packUnorm(vec<L, floatType, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, "uintType must be an integer type"); GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type"); - return vecType<uintType, P>(round(clamp(v, static_cast<floatType>(0), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<uintType>::max()))); + return vec<L, uintType, Q>(round(clamp(v, static_cast<floatType>(0), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<uintType>::max()))); } - template <typename uintType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<floatType, P> unpackUnorm(vecType<uintType, P> const & v) + template<typename floatType, length_t L, typename uintType, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, floatType, Q> unpackUnorm(vec<L, uintType, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, "uintType must be an integer type"); GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type"); - return vecType<float, P>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<uintType>::max())); + return vec<L, float, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<uintType>::max())); } - template <typename intType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<intType, P> packSnorm(vecType<floatType, P> const & v) + template<typename intType, length_t L, typename floatType, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, "uintType must be an integer type"); GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type"); - return vecType<intType, P>(round(clamp(v , static_cast<floatType>(-1), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<intType>::max()))); + return vec<L, intType, Q>(round(clamp(v , static_cast<floatType>(-1), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<intType>::max()))); } - template <typename intType, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<floatType, P> unpackSnorm(vecType<intType, P> const & v) + template<typename floatType, length_t L, typename intType, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, "uintType must be an integer type"); GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type"); - return clamp(vecType<floatType, P>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<intType>::max())), static_cast<floatType>(-1), static_cast<floatType>(1)); + return clamp(vec<L, floatType, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<intType>::max())), static_cast<floatType>(-1), static_cast<floatType>(1)); } - GLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const & v) + GLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const& v) { u32vec2 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); detail::u4u4 Result; @@ -704,7 +721,7 @@ namespace detail return vec2(Unpack.data.x, Unpack.data.y) * ScaleFactor; } - GLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const & v) + GLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const& v) { u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f)); detail::u4u4u4u4 Result; @@ -723,7 +740,7 @@ namespace detail return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; } - GLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const & v) + GLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const& v) { u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(31.f, 63.f, 31.f))); detail::u5u6u5 Result; @@ -741,7 +758,7 @@ namespace detail return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; } - GLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const & v) + GLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const& v) { u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(31.f, 31.f, 31.f, 1.f))); detail::u5u5u5u1 Result; @@ -760,7 +777,7 @@ namespace detail return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor; } - GLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const & v) + GLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const& v) { u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(7.f, 7.f, 3.f))); detail::u3u3u2 Result; @@ -777,5 +794,145 @@ namespace detail Unpack.pack = v; return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor; } + + GLM_FUNC_QUALIFIER int16 packInt2x8(i8vec2 const& v) + { + int16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec2 unpackInt2x8(int16 p) + { + i8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint16 packUint2x8(u8vec2 const& v) + { + uint16 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec2 unpackUint2x8(uint16 p) + { + u8vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int32 packInt4x8(i8vec4 const& v) + { + int32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i8vec4 unpackInt4x8(int32 p) + { + i8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint32 packUint4x8(u8vec4 const& v) + { + uint32 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u8vec4 unpackUint4x8(uint32 p) + { + u8vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int packInt2x16(i16vec2 const& v) + { + int Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec2 unpackInt2x16(int p) + { + i16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt4x16(i16vec4 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i16vec4 unpackInt4x16(int64 p) + { + i16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint packUint2x16(u16vec2 const& v) + { + uint Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec2 unpackUint2x16(uint p) + { + u16vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint4x16(u16vec4 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u16vec4 unpackUint4x16(uint64 p) + { + u16vec4 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER int64 packInt2x32(i32vec2 const& v) + { + int64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER i32vec2 unpackInt2x32(int64 p) + { + i32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } + + GLM_FUNC_QUALIFIER uint64 packUint2x32(u32vec2 const& v) + { + uint64 Pack = 0; + memcpy(&Pack, &v, sizeof(Pack)); + return Pack; + } + + GLM_FUNC_QUALIFIER u32vec2 unpackUint2x32(uint64 p) + { + u32vec2 Unpack; + memcpy(&Unpack, &p, sizeof(Unpack)); + return Unpack; + } }//namespace glm diff --git a/external/include/glm/gtc/quaternion.hpp b/external/include/glm/gtc/quaternion.hpp index 8af1c8b..25f741c 100644 --- a/external/include/glm/gtc/quaternion.hpp +++ b/external/include/glm/gtc/quaternion.hpp @@ -2,15 +2,14 @@ /// @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. +/// Include <glm/gtc/quaternion.hpp> to use the features of this extension. /// -/// <glm/gtc/quaternion.hpp> need to be included to use these functionalities. +/// Defines a templated quaternion type and several quaternion operations. #pragma once @@ -30,12 +29,12 @@ namespace glm /// @addtogroup gtc_quaternion /// @{ - template <typename T, precision P = defaultp> + template<typename T, qualifier Q = defaultp> struct tquat { // -- Implementation detail -- - typedef tquat<T, P> type; + typedef tquat<T, Q> type; typedef T value_type; // -- Data -- @@ -50,13 +49,13 @@ namespace glm # 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<T, sizeof(T) * 4, detail::is_aligned<P>::value>::type data; + typename detail::storage<T, sizeof(T) * 4, detail::is_aligned<Q>::value>::type data; }; - + # if GLM_COMPILER & GLM_COMPILER_CLANG # pragma clang diagnostic pop # endif @@ -71,33 +70,32 @@ namespace glm 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 static GLM_CONSTEXPR length_type length(){return 4;} GLM_FUNC_DECL T & operator[](length_type i); - GLM_FUNC_DECL T const & operator[](length_type i) const; + 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<T, P> const & q) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat<T, Q> const & q); + GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat<T, Q> const& q) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat<T, P> const& q); // -- Explicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tquat(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR tquat(T const & s, tvec3<T, P> const & v); - GLM_FUNC_DECL GLM_CONSTEXPR tquat(T const & w, T const & x, T const & y, T const & z); + GLM_FUNC_DECL GLM_CONSTEXPR tquat(T s, vec<3, T, Q> const& v); + GLM_FUNC_DECL GLM_CONSTEXPR tquat(T w, T x, T y, T z); // -- Conversion constructors -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tquat(tquat<U, Q> const & q); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tquat(tquat<U, P> const& q); /// Explicit conversion operators # if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS - GLM_FUNC_DECL explicit operator tmat3x3<T, P>(); - GLM_FUNC_DECL explicit operator tmat4x4<T, P>(); + GLM_FUNC_DECL explicit operator mat<3, 3, T, Q>(); + GLM_FUNC_DECL explicit operator mat<4, 4, T, Q>(); # endif /// Create a quaternion from two normalized axis @@ -106,290 +104,332 @@ namespace glm /// @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<T, P> const & u, tvec3<T, P> const & v); + GLM_FUNC_DECL tquat(vec<3, T, Q> const& u, vec<3, T, Q> const& v); /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. - GLM_FUNC_DECL GLM_EXPLICIT tquat(tvec3<T, P> const & eulerAngles); - GLM_FUNC_DECL GLM_EXPLICIT tquat(tmat3x3<T, P> const & m); - GLM_FUNC_DECL GLM_EXPLICIT tquat(tmat4x4<T, P> const & m); + GLM_FUNC_DECL GLM_EXPLICIT tquat(vec<3, T, Q> const& eulerAngles); + GLM_FUNC_DECL GLM_EXPLICIT tquat(mat<3, 3, T, Q> const& q); + GLM_FUNC_DECL GLM_EXPLICIT tquat(mat<4, 4, T, Q> const& q); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tquat<T, P> & operator=(tquat<T, P> const & m) GLM_DEFAULT; - - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator=(tquat<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator+=(tquat<U, P> const & q); - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator-=(tquat<U, P> const & q); - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator*=(tquat<U, P> const & q); - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tquat<T, P> & operator/=(U s); + GLM_FUNC_DECL tquat<T, Q> & operator=(tquat<T, Q> const& q) GLM_DEFAULT; + + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator=(tquat<U, Q> const& q); + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator+=(tquat<U, Q> const& q); + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator-=(tquat<U, Q> const& q); + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator*=(tquat<U, Q> const& q); + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL tquat<T, Q> & operator/=(U s); }; // -- Unary bit operators -- - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator+(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator+(tquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator-(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator-(tquat<T, Q> const& q); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator+(tquat<T, P> const & q, tquat<T, P> const & p); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator+(tquat<T, Q> const& q, tquat<T, Q> const& p); - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator*(tquat<T, P> const & q, tquat<T, P> const & p); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator-(tquat<T, Q> const& q, tquat<T, Q> const& p); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tquat<T, P> const & q, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator*(tquat<T, Q> const& q, tquat<T, Q> const& p); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(tquat<T, Q> const& q, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tquat<T, P> const & q, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(tquat<T, Q> const& q, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator*(tquat<T, P> const & q, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator*(T const & s, tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator*(tquat<T, Q> const& q, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> operator/(tquat<T, P> const & q, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator*(T const& s, tquat<T, Q> const& q); + + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> operator/(tquat<T, Q> const& q, T const& s); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tquat<T, P> const & q1, tquat<T, P> const & q2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(tquat<T, Q> const& q1, tquat<T, Q> const& q2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tquat<T, P> const & q1, tquat<T, P> const & q2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(tquat<T, Q> const& q1, tquat<T, Q> const& q2); /// Returns the length of the quaternion. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL T length(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL T length(tquat<T, Q> const& q); /// Returns the normalized quaternion. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> normalize(tquat<T, P> const & q); - + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> normalize(tquat<T, Q> const& q); + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P, template <typename, precision> class quatType> - GLM_FUNC_DECL T dot(quatType<T, P> const & x, quatType<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL T dot(tquat<T, Q> const& x, tquat<T, Q> 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. + /// @tparam T Floating-point scalar types. + /// + /// @see - slerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a) /// @see gtc_quaternion - /// @see - slerp(tquat<T, P> const & x, tquat<T, P> const & y, T const & a) - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> mix(tquat<T, P> const & x, tquat<T, P> const & y, T a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> 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. + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> lerp(tquat<T, P> const & x, tquat<T, P> const & y, T a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> lerp(tquat<T, Q> const& x, tquat<T, Q> 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. + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> slerp(tquat<T, P> const & x, tquat<T, P> const & y, T a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> slerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a); /// Returns the q conjugate. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> conjugate(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> conjugate(tquat<T, Q> const& q); /// Returns the q inverse. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> inverse(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> inverse(tquat<T, Q> 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 - /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> rotate(tquat<T, P> const & q, T const & angle, tvec3<T, P> const & axis); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> rotate(tquat<T, Q> const& q, T const& angle, vec<3, T, Q> 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. - /// + /// The result is expressed in radians. + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> eulerAngles(tquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> eulerAngles(tquat<T, Q> const& x); /// Returns roll value of euler angles expressed in radians. /// - /// @see gtx_quaternion - template <typename T, precision P> - GLM_FUNC_DECL T roll(tquat<T, P> const & x); + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL T roll(tquat<T, Q> const& x); /// Returns pitch value of euler angles expressed in radians. /// - /// @see gtx_quaternion - template <typename T, precision P> - GLM_FUNC_DECL T pitch(tquat<T, P> const & x); + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL T pitch(tquat<T, Q> const& x); /// Returns yaw value of euler angles expressed in radians. /// - /// @see gtx_quaternion - template <typename T, precision P> - GLM_FUNC_DECL T yaw(tquat<T, P> const & x); + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL T yaw(tquat<T, Q> const& x); /// Converts a quaternion to a 3 * 3 matrix. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> mat3_cast(tquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> mat3_cast(tquat<T, Q> const& x); /// Converts a quaternion to a 4 * 4 matrix. - /// + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> mat4_cast(tquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> mat4_cast(tquat<T, Q> const& x); - /// Converts a 3 * 3 matrix to a quaternion. - /// + /// Converts a pure rotation 3 * 3 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> quat_cast(tmat3x3<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quat_cast(mat<3, 3, T, Q> const& x); - /// Converts a 4 * 4 matrix to a quaternion. - /// + /// Converts a pure rotation 4 * 4 matrix to a quaternion. + /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> quat_cast(tmat4x4<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quat_cast(mat<4, 4, T, Q> const& x); /// Returns the quaternion rotation angle. /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL T angle(tquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL T angle(tquat<T, Q> const& x); /// Returns the q rotation axis. /// + /// @tparam T Floating-point scalar types. + /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> axis(tquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> axis(tquat<T, Q> 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. + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> angleAxis(T const & angle, tvec3<T, P> const & axis); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& axis); /// Returns the component-wise comparison result of x < y. - /// - /// @tparam quatType Floating-point quaternion types. + /// + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> lessThan(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> lessThan(tquat<T, Q> const& x, tquat<T, Q> const& y); /// Returns the component-wise comparison of result x <= y. /// - /// @tparam quatType Floating-point quaternion types. + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> lessThanEqual(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y); /// Returns the component-wise comparison of result x > y. /// - /// @tparam quatType Floating-point quaternion types. + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> greaterThan(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> greaterThan(tquat<T, Q> const& x, tquat<T, Q> const& y); /// Returns the component-wise comparison of result x >= y. /// - /// @tparam quatType Floating-point quaternion types. + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> greaterThanEqual(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y); /// Returns the component-wise comparison of result x == y. /// - /// @tparam quatType Floating-point quaternion types. + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> equal(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> equal(tquat<T, Q> const& x, tquat<T, Q> const& y); /// Returns the component-wise comparison of result x != y. - /// - /// @tparam quatType Floating-point quaternion types. + /// + /// @tparam T Floating-point scalar types. /// /// @see gtc_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> notEqual(tquat<T, P> const & x, tquat<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> notEqual(tquat<T, Q> const& x, tquat<T, Q> 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 <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> isnan(tquat<T, P> const & x); + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> isnan(tquat<T, Q> 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 <typename T, precision P> - GLM_FUNC_DECL tvec4<bool, P> isinf(tquat<T, P> const & x); + /// + /// @tparam T Floating-point scalar types. + /// + /// @see gtc_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, bool, Q> isinf(tquat<T, Q> const& x); /// @} } //namespace glm diff --git a/external/include/glm/gtc/quaternion.inl b/external/include/glm/gtc/quaternion.inl index c9b2af7..df4a5f7 100644 --- a/external/include/glm/gtc/quaternion.inl +++ b/external/include/glm/gtc/quaternion.inl @@ -4,78 +4,80 @@ #include "../trigonometric.hpp" #include "../geometric.hpp" #include "../exponential.hpp" +#include "../detail/compute_vector_relational.hpp" +#include "epsilon.hpp" #include <limits> namespace glm{ namespace detail { - template <typename T, precision P, bool Aligned> - struct compute_dot<tquat, T, P, Aligned> + template<typename T, qualifier Q, bool Aligned> + struct compute_dot<tquat<T, Q>, T, Aligned> { - static GLM_FUNC_QUALIFIER T call(tquat<T, P> const& x, tquat<T, P> const& y) + static GLM_FUNC_QUALIFIER T call(tquat<T, Q> const& a, tquat<T, Q> const& b) { - tvec4<T, P> tmp(x.x * y.x, x.y * y.y, x.z * y.z, x.w * y.w); + vec<4, T, Q> tmp(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); return (tmp.x + tmp.y) + (tmp.z + tmp.w); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_quat_add { - static tquat<T, P> call(tquat<T, P> const& q, tquat<T, P> const& p) + static tquat<T, Q> call(tquat<T, Q> const& q, tquat<T, Q> const& p) { - return tquat<T, P>(q.w + p.w, q.x + p.x, q.y + p.y, q.z + p.z); + return tquat<T, Q>(q.w + p.w, q.x + p.x, q.y + p.y, q.z + p.z); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_quat_sub { - static tquat<T, P> call(tquat<T, P> const& q, tquat<T, P> const& p) + static tquat<T, Q> call(tquat<T, Q> const& q, tquat<T, Q> const& p) { - return tquat<T, P>(q.w - p.w, q.x - p.x, q.y - p.y, q.z - p.z); + return tquat<T, Q>(q.w - p.w, q.x - p.x, q.y - p.y, q.z - p.z); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_quat_mul_scalar { - static tquat<T, P> call(tquat<T, P> const& q, T s) + static tquat<T, Q> call(tquat<T, Q> const& q, T s) { - return tquat<T, P>(q.w * s, q.x * s, q.y * s, q.z * s); + return tquat<T, Q>(q.w * s, q.x * s, q.y * s, q.z * s); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_quat_div_scalar { - static tquat<T, P> call(tquat<T, P> const& q, T s) + static tquat<T, Q> call(tquat<T, Q> const& q, T s) { - return tquat<T, P>(q.w / s, q.x / s, q.y / s, q.z / s); + return tquat<T, Q>(q.w / s, q.x / s, q.y / s, q.z / s); } }; - template <typename T, precision P, bool Aligned> + template<typename T, qualifier Q, bool Aligned> struct compute_quat_mul_vec4 { - static tvec4<T, P> call(tquat<T, P> const & q, tvec4<T, P> const & v) + static vec<4, T, Q> call(tquat<T, Q> const& q, vec<4, T, Q> const& v) { - return tvec4<T, P>(q * tvec3<T, P>(v), v.w); + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); } }; }//namespace detail // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T & tquat<T, P>::operator[](typename tquat<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T & tquat<T, Q>::operator[](typename tquat<T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&x)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T const & tquat<T, P>::operator[](typename tquat<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const& tquat<T, Q>::operator[](typename tquat<T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&x)[i]; @@ -83,129 +85,139 @@ namespace detail // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat() -# ifndef GLM_FORCE_NO_CTOR_INIT - : x(0), y(0), z(0), w(1) +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat() +# ifdef GLM_FORCE_CTOR_INIT + : x(0), y(0), z(0), w(1) # endif {} # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<T, Q> const& q) : x(q.x), y(q.y), z(q.z), w(q.w) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat(tquat<T, Q> const & q) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<T, P> const& q) : x(q.x), y(q.y), z(q.z), w(q.w) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tquat<T, P>::tquat(ctor) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat(T const & s, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(T s, vec<3, T, Q> const& v) : x(v.x), y(v.y), z(v.z), w(s) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat(T const & w, T const & x, T const & y, T const & z) - : x(x), y(y), z(z), w(w) + template <typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(T _w, T _x, T _y, T _z) + : x(_x), y(_y), z(_z), w(_w) {} // -- Conversion constructors -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, P>::tquat(tquat<U, Q> const & q) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<U, P> const& q) : x(static_cast<T>(q.x)) , y(static_cast<T>(q.y)) , z(static_cast<T>(q.z)) , w(static_cast<T>(q.w)) {} - //template <typename valType> + //template<typename valType> //GLM_FUNC_QUALIFIER tquat<valType>::tquat //( - // valType const & pitch, - // valType const & yaw, - // valType const & roll + // valType const& pitch, + // valType const& yaw, + // valType const& roll //) //{ - // tvec3<valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5)); - // tvec3<valType> c = glm::cos(eulerAngle * valType(0.5)); - // tvec3<valType> s = glm::sin(eulerAngle * valType(0.5)); - // + // vec<3, valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5)); + // vec<3, valType> c = glm::cos(eulerAngle * valType(0.5)); + // vec<3, valType> s = glm::sin(eulerAngle * valType(0.5)); + // // this->w = c.x * c.y * c.z + s.x * s.y * s.z; // this->x = s.x * c.y * c.z - c.x * s.y * s.z; // this->y = c.x * s.y * c.z + s.x * c.y * s.z; // this->z = c.x * c.y * s.z - s.x * s.y * c.z; //} - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::tquat(tvec3<T, P> const & u, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::tquat(vec<3, T, Q> const& u, vec<3, T, Q> const& v) { - tvec3<T, P> const LocalW(cross(u, v)); - T Dot = detail::compute_dot<tvec3, T, P, detail::is_aligned<P>::value>::call(u, v); - tquat<T, P> q(T(1) + Dot, LocalW.x, LocalW.y, LocalW.z); + T norm_u_norm_v = sqrt(dot(u, u) * dot(v, v)); + T real_part = norm_u_norm_v + dot(u, v); + vec<3, T, Q> t; + + if(real_part < static_cast<T>(1.e-6f) * norm_u_norm_v) + { + // If u and v are exactly opposite, rotate 180 degrees + // around an arbitrary orthogonal axis. Axis normalisation + // can happen later, when we normalise the quaternion. + real_part = static_cast<T>(0); + t = abs(u.x) > abs(u.z) ? vec<3, T, Q>(-u.y, u.x, static_cast<T>(0)) : vec<3, T, Q>(static_cast<T>(0), -u.z, u.y); + } + else + { + // Otherwise, build quaternion the standard way. + t = cross(u, v); + } - *this = normalize(q); + *this = normalize(tquat<T, Q>(real_part, t.x, t.y, t.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::tquat(tvec3<T, P> const & eulerAngle) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::tquat(vec<3, T, Q> const& eulerAngle) { - tvec3<T, P> c = glm::cos(eulerAngle * T(0.5)); - tvec3<T, P> s = glm::sin(eulerAngle * T(0.5)); - + vec<3, T, Q> c = glm::cos(eulerAngle * T(0.5)); + vec<3, T, Q> s = glm::sin(eulerAngle * T(0.5)); + this->w = c.x * c.y * c.z + s.x * s.y * s.z; this->x = s.x * c.y * c.z - c.x * s.y * s.z; this->y = c.x * s.y * c.z + s.x * c.y * s.z; this->z = c.x * c.y * s.z - s.x * s.y * c.z; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::tquat(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::tquat(mat<3, 3, T, Q> const& m) { *this = quat_cast(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::tquat(tmat4x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::tquat(mat<4, 4, T, Q> const& m) { *this = quat_cast(m); } # if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::operator tmat3x3<T, P>() + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::operator mat<3, 3, T, Q>() { return mat3_cast(*this); } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P>::operator tmat4x4<T, P>() + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q>::operator mat<4, 4, T, Q>() { return mat4_cast(*this); } # endif//GLM_HAS_EXPLICIT_CONVERSION_OPERATORS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> conjugate(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> conjugate(tquat<T, Q> const& q) { - return tquat<T, P>(q.w, -q.x, -q.y, -q.z); + return tquat<T, Q>(q.w, -q.x, -q.y, -q.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> inverse(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> inverse(tquat<T, Q> const& q) { return conjugate(q) / dot(q, q); } @@ -213,8 +225,8 @@ namespace detail // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator=(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator=(tquat<T, Q> const& q) { this->w = q.w; this->x = q.x; @@ -224,9 +236,9 @@ namespace detail } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator=(tquat<U, P> const & q) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator=(tquat<U, Q> const& q) { this->w = static_cast<T>(q.w); this->x = static_cast<T>(q.x); @@ -235,26 +247,26 @@ namespace detail return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator+=(tquat<U, P> const& q) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator+=(tquat<U, Q> const& q) { - return (*this = detail::compute_quat_add<T, P, detail::is_aligned<P>::value>::call(*this, tquat<T, P>(q))); + return (*this = detail::compute_quat_add<T, Q, detail::is_aligned<Q>::value>::call(*this, tquat<T, Q>(q))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator-=(tquat<U, P> const& q) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator-=(tquat<U, Q> const& q) { - return (*this = detail::compute_quat_sub<T, P, detail::is_aligned<P>::value>::call(*this, tquat<T, P>(q))); + return (*this = detail::compute_quat_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, tquat<T, Q>(q))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator*=(tquat<U, P> const & r) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator*=(tquat<U, Q> const& r) { - tquat<T, P> const p(*this); - tquat<T, P> const q(r); + tquat<T, Q> const p(*this); + tquat<T, Q> const q(r); this->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z; this->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y; @@ -263,132 +275,145 @@ namespace detail return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator*=(U s) { - return (*this = detail::compute_quat_mul_scalar<T, P, detail::is_aligned<P>::value>::call(*this, static_cast<U>(s))); + return (*this = detail::compute_quat_mul_scalar<T, Q, detail::is_aligned<Q>::value>::call(*this, static_cast<U>(s))); } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tquat<T, P> & tquat<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator/=(U s) { - return (*this = detail::compute_quat_div_scalar<T, P, detail::is_aligned<P>::value>::call(*this, static_cast<U>(s))); + return (*this = detail::compute_quat_div_scalar<T, Q, detail::is_aligned<Q>::value>::call(*this, static_cast<U>(s))); } // -- Unary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator+(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator+(tquat<T, Q> const& q) { return q; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator-(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator-(tquat<T, Q> const& q) { - return tquat<T, P>(-q.w, -q.x, -q.y, -q.z); + return tquat<T, Q>(-q.w, -q.x, -q.y, -q.z); } // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator+(tquat<T, P> const & q, tquat<T, P> const & p) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator+(tquat<T, Q> const& q, tquat<T, Q> const& p) { - return tquat<T, P>(q) += p; + return tquat<T, Q>(q) += p; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator*(tquat<T, P> const & q, tquat<T, P> const & p) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator-(tquat<T, Q> const& q, tquat<T, Q> const& p) { - return tquat<T, P>(q) *= p; + return tquat<T, Q>(q) -= p; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tquat<T, P> const & q, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator*(tquat<T, Q> const& q, tquat<T, Q> const& p) { - tvec3<T, P> const QuatVector(q.x, q.y, q.z); - tvec3<T, P> const uv(glm::cross(QuatVector, v)); - tvec3<T, P> const uuv(glm::cross(QuatVector, uv)); + return tquat<T, Q>(q) *= p; + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tquat<T, Q> const& q, vec<3, T, Q> const& v) + { + vec<3, T, Q> const QuatVector(q.x, q.y, q.z); + vec<3, T, Q> const uv(glm::cross(QuatVector, v)); + vec<3, T, Q> const uuv(glm::cross(QuatVector, uv)); return v + ((uv * q.w) + uuv) * static_cast<T>(2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v, tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tquat<T, Q> const& q) { return glm::inverse(q) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tquat<T, P> const& q, tvec4<T, P> const& v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tquat<T, Q> const& q, vec<4, T, Q> const& v) { - return detail::compute_quat_mul_vec4<T, P, detail::is_aligned<P>::value>::call(q, v); + return detail::compute_quat_mul_vec4<T, Q, detail::is_aligned<Q>::value>::call(q, v); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v, tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tquat<T, Q> const& q) { return glm::inverse(q) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator*(tquat<T, P> const & q, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator*(tquat<T, Q> const& q, T const& s) { - return tquat<T, P>( + return tquat<T, Q>( q.w * s, q.x * s, q.y * s, q.z * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator*(T const & s, tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator*(T const& s, tquat<T, Q> const& q) { return q * s; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> operator/(tquat<T, P> const & q, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> operator/(tquat<T, Q> const& q, T const& s) { - return tquat<T, P>( + return tquat<T, Q>( q.w / s, q.x / s, q.y / s, q.z / s); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tquat<T, P> const & q1, tquat<T, P> const & q2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(tquat<T, Q> const& q1, tquat<T, Q> const& q2) { - return (q1.x == q2.x) && (q1.y == q2.y) && (q1.z == q2.z) && (q1.w == q2.w); + return all(epsilonEqual(q1, q2, epsilon<T>())); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tquat<T, P> const & q1, tquat<T, P> const & q2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(tquat<T, Q> const& q1, tquat<T, Q> const& q2) { - return (q1.x != q2.x) || (q1.y != q2.y) || (q1.z != q2.z) || (q1.w != q2.w); + return any(epsilonNotEqual(q1, q2, epsilon<T>())); } // -- Operations -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER T length(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T dot(tquat<T, Q> const& x, tquat<T, Q> const& y) + { + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs"); + return detail::compute_dot<tquat<T, Q>, T, detail::is_aligned<Q>::value>::call(x, y); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T length(tquat<T, Q> const& q) { return glm::sqrt(dot(q, q)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> normalize(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> normalize(tquat<T, Q> const& q) { T len = length(q); if(len <= T(0)) // Problem - return tquat<T, P>(1, 0, 0, 0); + return tquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)); T oneOverLen = T(1) / len; - return tquat<T, P>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen); + return tquat<T, Q>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> cross(tquat<T, P> const & q1, tquat<T, P> const & q2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> cross(tquat<T, Q> const& q1, tquat<T, Q> const& q2) { - return tquat<T, P>( + return tquat<T, Q>( q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z, q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, @@ -396,14 +421,14 @@ namespace detail } /* // (x * sin(1 - a) * angle / sin(angle)) + (y * sin(a) * angle / sin(angle)) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> mix(tquat<T, P> const & x, tquat<T, P> const & y, T const & a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a) { if(a <= T(0)) return x; if(a >= T(1)) return y; float fCos = dot(x, y); - tquat<T, P> y2(y); //BUG!!! tquat<T, P> y2; + tquat<T, Q> y2(y); //BUG!!! tquat<T, Q> y2; if(fCos < T(0)) { y2 = -y; @@ -426,19 +451,19 @@ namespace detail k1 = sin((T(0) + a) * fAngle) * fOneOverSin; } - return tquat<T, P>( + return tquat<T, Q>( k0 * x.w + k1 * y2.w, k0 * x.x + k1 * y2.x, k0 * x.y + k1 * y2.y, k0 * x.z + k1 * y2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> mix2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> mix2 ( - tquat<T, P> const & x, - tquat<T, P> const & y, - T const & a + tquat<T, Q> const& x, + tquat<T, Q> const& y, + T const& a ) { bool flip = false; @@ -466,13 +491,13 @@ namespace detail if(flip) alpha = -alpha; - + return normalize(beta * x + alpha * y); } */ - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> mix(tquat<T, P> const & x, tquat<T, P> const & y, T a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> const& y, T a) { T cosTheta = dot(x, y); @@ -480,7 +505,7 @@ namespace detail if(cosTheta > T(1) - epsilon<T>()) { // Linear interpolation - return tquat<T, P>( + return tquat<T, Q>( mix(x.w, y.w, a), mix(x.x, y.x, a), mix(x.y, y.y, a), @@ -494,8 +519,8 @@ namespace detail } } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> lerp(tquat<T, P> const & x, tquat<T, P> const & y, T a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> lerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a) { // Lerp is only defined in [0, 1] assert(a >= static_cast<T>(0)); @@ -504,14 +529,14 @@ namespace detail return x * (T(1) - a) + (y * a); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> slerp(tquat<T, P> const & x, tquat<T, P> const & y, T a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> slerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a) { - tquat<T, P> z = y; + tquat<T, Q> z = y; T cosTheta = dot(x, y); - // If cosTheta < 0, the interpolation will take the long way around the sphere. + // If cosTheta < 0, the interpolation will take the long way around the sphere. // To fix this, one quat must be negated. if (cosTheta < T(0)) { @@ -523,7 +548,7 @@ namespace detail if(cosTheta > T(1) - epsilon<T>()) { // Linear interpolation - return tquat<T, P>( + return tquat<T, Q>( mix(x.w, z.w, a), mix(x.x, z.x, a), mix(x.y, z.y, a), @@ -537,10 +562,10 @@ namespace detail } } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> rotate(tquat<T, P> const & q, T const & angle, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> rotate(tquat<T, Q> const& q, T const& angle, vec<3, T, Q> const& v) { - tvec3<T, P> Tmp = v; + vec<3, T, Q> Tmp = v; // Axis of rotation must be normalised T len = glm::length(Tmp); @@ -555,38 +580,45 @@ namespace detail T const AngleRad(angle); T const Sin = sin(AngleRad * T(0.5)); - return q * tquat<T, P>(cos(AngleRad * T(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); - //return gtc::quaternion::cross(q, tquat<T, P>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); + return q * tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + //return gtc::quaternion::cross(q, tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> eulerAngles(tquat<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> eulerAngles(tquat<T, Q> const& x) { - return tvec3<T, P>(pitch(x), yaw(x), roll(x)); + return vec<3, T, Q>(pitch(x), yaw(x), roll(x)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T roll(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T roll(tquat<T, Q> const& q) { - return T(atan(T(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); + return static_cast<T>(atan(static_cast<T>(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T pitch(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T pitch(tquat<T, Q> const& q) { - return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); + //return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); + const T y = static_cast<T>(2) * (q.y * q.z + q.w * q.x); + const T x = q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z; + + if(detail::compute_equal<T>::call(y, static_cast<T>(0)) && detail::compute_equal<T>::call(x, static_cast<T>(0))) //avoid atan2(0,0) - handle singularity - Matiis + return static_cast<T>(static_cast<T>(2) * atan(q.x,q.w)); + + return static_cast<T>(atan(y,x)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T yaw(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T yaw(tquat<T, Q> const& q) { - return asin(clamp(T(-2) * (q.x * q.z - q.w * q.y), T(-1), T(1))); + return asin(clamp(static_cast<T>(-2) * (q.x * q.z - q.w * q.y), static_cast<T>(-1), static_cast<T>(1))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> mat3_cast(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat3_cast(tquat<T, Q> const& q) { - tmat3x3<T, P> Result(T(1)); + mat<3, 3, T, Q> Result(T(1)); T qxx(q.x * q.x); T qyy(q.y * q.y); T qzz(q.z * q.z); @@ -611,14 +643,14 @@ namespace detail return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> mat4_cast(tquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat4_cast(tquat<T, Q> const& q) { - return tmat4x4<T, P>(mat3_cast(q)); + return mat<4, 4, T, Q>(mat3_cast(q)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> quat_cast(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quat_cast(mat<3, 3, T, Q> const& m) { T fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2]; T fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2]; @@ -643,70 +675,51 @@ namespace detail biggestIndex = 3; } - T biggestVal = sqrt(fourBiggestSquaredMinus1 + T(1)) * T(0.5); + T biggestVal = sqrt(fourBiggestSquaredMinus1 + static_cast<T>(1)) * static_cast<T>(0.5); T mult = static_cast<T>(0.25) / biggestVal; - tquat<T, P> Result(uninitialize); switch(biggestIndex) { case 0: - Result.w = biggestVal; - Result.x = (m[1][2] - m[2][1]) * mult; - Result.y = (m[2][0] - m[0][2]) * mult; - Result.z = (m[0][1] - m[1][0]) * mult; - break; + return tquat<T, Q>(biggestVal, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult); case 1: - Result.w = (m[1][2] - m[2][1]) * mult; - Result.x = biggestVal; - Result.y = (m[0][1] + m[1][0]) * mult; - Result.z = (m[2][0] + m[0][2]) * mult; - break; + return tquat<T, Q>((m[1][2] - m[2][1]) * mult, biggestVal, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult); case 2: - Result.w = (m[2][0] - m[0][2]) * mult; - Result.x = (m[0][1] + m[1][0]) * mult; - Result.y = biggestVal; - Result.z = (m[1][2] + m[2][1]) * mult; - break; + return tquat<T, Q>((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggestVal, (m[1][2] + m[2][1]) * mult); case 3: - Result.w = (m[0][1] - m[1][0]) * mult; - Result.x = (m[2][0] + m[0][2]) * mult; - Result.y = (m[1][2] + m[2][1]) * mult; - Result.z = biggestVal; - break; - - default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity. + return tquat<T, Q>((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggestVal); + default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity. assert(false); - break; + return tquat<T, Q>(1, 0, 0, 0); } - return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> quat_cast(tmat4x4<T, P> const & m4) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quat_cast(mat<4, 4, T, Q> const& m4) { - return quat_cast(tmat3x3<T, P>(m4)); + return quat_cast(mat<3, 3, T, Q>(m4)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T angle(tquat<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T angle(tquat<T, Q> const& x) { - return acos(x.w) * T(2); + return acos(x.w) * static_cast<T>(2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> axis(tquat<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> axis(tquat<T, Q> const& x) { T tmp1 = static_cast<T>(1) - x.w * x.w; if(tmp1 <= static_cast<T>(0)) - return tvec3<T, P>(0, 0, 1); + return vec<3, T, Q>(0, 0, 1); T tmp2 = static_cast<T>(1) / sqrt(tmp1); - return tvec3<T, P>(x.x * tmp2, x.y * tmp2, x.z * tmp2); + return vec<3, T, Q>(x.x * tmp2, x.y * tmp2, x.z * tmp2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> angleAxis(T const & angle, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& v) { - tquat<T, P> Result(uninitialize); + tquat<T, Q> Result; T const a(angle); T const s = glm::sin(a * static_cast<T>(0.5)); @@ -718,74 +731,74 @@ namespace detail return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> lessThan(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] < y[i]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> lessThanEqual(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] <= y[i]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> greaterThan(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] > y[i]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> greaterThanEqual(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) Result[i] = x[i] >= y[i]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> equal(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) - Result[i] = x[i] == y[i]; + Result[i] = detail::compute_equal<T>::call(x[i], y[i]); return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> notEqual(tquat<T, P> const & x, tquat<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(tquat<T, Q> const& x, tquat<T, Q> const& y) { - tvec4<bool, P> Result(uninitialize); + vec<4, bool, Q> Result; for(length_t i = 0; i < x.length(); ++i) - Result[i] = x[i] != y[i]; + Result[i] = !detail::compute_equal<T>::call(x[i], y[i]); return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> isnan(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> isnan(tquat<T, Q> const& q) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isnan' only accept floating-point inputs"); - return tvec4<bool, P>(isnan(q.x), isnan(q.y), isnan(q.z), isnan(q.w)); + return vec<4, bool, Q>(isnan(q.x), isnan(q.y), isnan(q.z), isnan(q.w)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> isinf(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> isinf(tquat<T, Q> const& q) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isinf' only accept floating-point inputs"); - return tvec4<bool, P>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w)); + return vec<4, bool, Q>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w)); } }//namespace glm diff --git a/external/include/glm/gtc/quaternion_simd.inl b/external/include/glm/gtc/quaternion_simd.inl index cca874b..06ca7b7 100644 --- a/external/include/glm/gtc/quaternion_simd.inl +++ b/external/include/glm/gtc/quaternion_simd.inl @@ -7,10 +7,10 @@ namespace glm{ namespace detail { /* - template <precision P> - struct compute_quat_mul<float, P, true> + template<qualifier Q> + struct compute_quat_mul<float, Q, true> { - static tquat<float, P> call(tquat<float, P> const& q1, tquat<float, P> const& q2) + static tquat<float, Q> call(tquat<float, Q> const& q1, tquat<float, Q> const& q2) { // SSE2 STATS: 11 shuffle, 8 mul, 8 add // SSE4 STATS: 3 shuffle, 4 mul, 4 dpps @@ -51,7 +51,7 @@ namespace detail // //return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0)); - tquat<float, P> Result(uninitialize); + tquat<float, Q> Result; _mm_store_ss(&Result.x, add4); _mm_store_ss(&Result.y, add5); _mm_store_ss(&Result.z, add6); @@ -61,122 +61,122 @@ namespace detail }; */ - template <precision P> - struct compute_dot<tquat, float, P, true> + template<qualifier Q> + struct compute_dot<tquat<float, Q>, float, true> { - static GLM_FUNC_QUALIFIER float call(tquat<float, P> const& x, tquat<float, P> const& y) + static GLM_FUNC_QUALIFIER float call(tquat<float, Q> const& x, tquat<float, Q> const& y) { return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); } }; - template <precision P> - struct compute_quat_add<float, P, true> + template<qualifier Q> + struct compute_quat_add<float, Q, true> { - static tquat<float, P> call(tquat<float, P> const& q, tquat<float, P> const& p) + static tquat<float, Q> call(tquat<float, Q> const& q, tquat<float, Q> const& p) { - tquat<float, P> Result(uninitialize); + tquat<float, Q> Result; Result.data = _mm_add_ps(q.data, p.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_quat_add<double, P, true> + template<qualifier Q> + struct compute_quat_add<double, Q, true> { - static tquat<double, P> call(tquat<double, P> const & a, tquat<double, P> const & b) + static tquat<double, Q> call(tquat<double, Q> const& a, tquat<double, Q> const& b) { - tquat<double, P> Result(uninitialize); + tquat<double, Q> Result; Result.data = _mm256_add_pd(a.data, b.data); return Result; } }; # endif - template <precision P> - struct compute_quat_sub<float, P, true> + template<qualifier Q> + struct compute_quat_sub<float, Q, true> { - static tquat<float, P> call(tquat<float, P> const& q, tquat<float, P> const& p) + static tquat<float, Q> call(tquat<float, Q> const& q, tquat<float, Q> const& p) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_sub_ps(q.data, p.data); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_quat_sub<double, P, true> + template<qualifier Q> + struct compute_quat_sub<double, Q, true> { - static tquat<double, P> call(tquat<double, P> const & a, tquat<double, P> const & b) + static tquat<double, Q> call(tquat<double, Q> const& a, tquat<double, Q> const& b) { - tquat<double, P> Result(uninitialize); + tquat<double, Q> Result; Result.data = _mm256_sub_pd(a.data, b.data); return Result; } }; # endif - template <precision P> - struct compute_quat_mul_scalar<float, P, true> + template<qualifier Q> + struct compute_quat_mul_scalar<float, Q, true> { - static tquat<float, P> call(tquat<float, P> const& q, float s) + static tquat<float, Q> call(tquat<float, Q> const& q, float s) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_mul_ps(q.data, _mm_set_ps1(s)); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_quat_mul_scalar<double, P, true> + template<qualifier Q> + struct compute_quat_mul_scalar<double, Q, true> { - static tquat<double, P> call(tquat<double, P> const& q, double s) + static tquat<double, Q> call(tquat<double, Q> const& q, double s) { - tquat<double, P> Result(uninitialize); + tquat<double, Q> Result; Result.data = _mm256_mul_pd(q.data, _mm_set_ps1(s)); return Result; } }; # endif - template <precision P> - struct compute_quat_div_scalar<float, P, true> + template<qualifier Q> + struct compute_quat_div_scalar<float, Q, true> { - static tquat<float, P> call(tquat<float, P> const& q, float s) + static tquat<float, Q> call(tquat<float, Q> const& q, float s) { - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_div_ps(q.data, _mm_set_ps1(s)); return Result; } }; # if GLM_ARCH & GLM_ARCH_AVX_BIT - template <precision P> - struct compute_quat_div_scalar<double, P, true> + template<qualifier Q> + struct compute_quat_div_scalar<double, Q, true> { - static tquat<double, P> call(tquat<double, P> const& q, double s) + static tquat<double, Q> call(tquat<double, Q> const& q, double s) { - tquat<double, P> Result(uninitialize); + tquat<double, Q> Result; Result.data = _mm256_div_pd(q.data, _mm_set_ps1(s)); return Result; } }; # endif - template <precision P> - struct compute_quat_mul_vec4<float, P, true> + template<qualifier Q> + struct compute_quat_mul_vec4<float, Q, true> { - static tvec4<float, P> call(tquat<float, P> const& q, tvec4<float, P> const& v) + static vec<4, float, Q> call(tquat<float, Q> const& q, vec<4, float, Q> const& v) { __m128 const q_wwww = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 3, 3, 3)); __m128 const q_swp0 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 0, 2, 1)); __m128 const q_swp1 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 1, 0, 2)); __m128 const v_swp0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 0, 2, 1)); __m128 const v_swp1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 1, 0, 2)); - + __m128 uv = _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0)); __m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1)); __m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2)); @@ -186,7 +186,7 @@ namespace detail uv = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two)); uuv = _mm_mul_ps(uuv, two); - tvec4<float, P> Result(uninitialize); + vec<4, float, Q> Result; Result.data = _mm_add_ps(v.Data, _mm_add_ps(uv, uuv)); return Result; } diff --git a/external/include/glm/gtc/random.hpp b/external/include/glm/gtc/random.hpp index fa3956e..9156e43 100644 --- a/external/include/glm/gtc/random.hpp +++ b/external/include/glm/gtc/random.hpp @@ -2,15 +2,14 @@ /// @file glm/gtc/random.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtx_random (extended) /// /// @defgroup gtc_random GLM_GTC_random /// @ingroup gtc /// -/// @brief Generate random number from various distribution methods. +/// Include <glm/gtc/random.hpp> to use the features of this extension. /// -/// <glm/gtc/random.hpp> need to be included to use these functionalities. +/// Generate random number from various distribution methods. #pragma once @@ -26,72 +25,56 @@ namespace glm { /// @addtogroup gtc_random /// @{ - - /// Generate random numbers in the interval [Min, Max], according a linear distribution - /// - /// @param Min - /// @param Max + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling /// @tparam genType Value type. Currently supported: float or double scalars. /// @see gtc_random - template <typename genTYpe> - GLM_FUNC_DECL genTYpe linearRand( - genTYpe Min, - genTYpe Max); + template<typename genType> + GLM_FUNC_DECL genType linearRand(genType Min, genType Max); - /// Generate random numbers in the interval [Min, Max], according a linear distribution - /// - /// @param Min - /// @param Max + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min Minimum value included in the sampling + /// @param Max Maximum value included in the sampling /// @tparam T Value type. Currently supported: float or double. - /// @tparam vecType A vertor type: tvec1, tvec2, tvec3, tvec4 or compatible + /// /// @see gtc_random - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> linearRand( - vecType<T, P> const & Min, - vecType<T, P> const & Max); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> linearRand(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max); - /// Generate random numbers in the interval [Min, Max], according a gaussian distribution - /// - /// @param Mean - /// @param Deviation + /// Generate random numbers in the interval [Min, Max], according a gaussian distribution + /// /// @see gtc_random - template <typename genType> - GLM_FUNC_DECL genType gaussRand( - genType Mean, - genType Deviation); - + template<typename genType> + GLM_FUNC_DECL genType gaussRand(genType Mean, genType Deviation); + /// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius - /// - /// @param Radius + /// /// @see gtc_random - template <typename T> - GLM_FUNC_DECL tvec2<T, defaultp> circularRand( - T Radius); - + template<typename T> + GLM_FUNC_DECL vec<2, T, defaultp> circularRand(T Radius); + /// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius - /// - /// @param Radius + /// /// @see gtc_random - template <typename T> - GLM_FUNC_DECL tvec3<T, defaultp> sphericalRand( - T Radius); - + template<typename T> + GLM_FUNC_DECL vec<3, T, defaultp> sphericalRand(T Radius); + /// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius - /// - /// @param Radius + /// /// @see gtc_random - template <typename T> - GLM_FUNC_DECL tvec2<T, defaultp> diskRand( - T Radius); - + template<typename T> + GLM_FUNC_DECL vec<2, T, defaultp> diskRand(T Radius); + /// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius - /// - /// @param Radius + /// /// @see gtc_random - template <typename T> - GLM_FUNC_DECL tvec3<T, defaultp> ballRand( - T Radius); - + template<typename T> + GLM_FUNC_DECL vec<3, T, defaultp> ballRand(T Radius); + /// @} }//namespace glm diff --git a/external/include/glm/gtc/random.inl b/external/include/glm/gtc/random.inl index ad5926e..5301c59 100644 --- a/external/include/glm/gtc/random.inl +++ b/external/include/glm/gtc/random.inl @@ -3,58 +3,61 @@ #include "../geometric.hpp" #include "../exponential.hpp" +#include "../trigonometric.hpp" +#include "../ext/vec1.hpp" #include <cstdlib> #include <ctime> #include <cassert> +#include <cmath> namespace glm{ namespace detail { - template <typename T, precision P, template <class, precision> class vecType> + template <length_t L, typename T, qualifier Q> struct compute_rand { - GLM_FUNC_QUALIFIER static vecType<T, P> call(); + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(); }; - template <precision P> - struct compute_rand<uint8, P, tvec1> + template <qualifier P> + struct compute_rand<1, uint8, P> { - GLM_FUNC_QUALIFIER static tvec1<uint8, P> call() + GLM_FUNC_QUALIFIER static vec<1, uint8, P> call() { - return tvec1<uint8, P>( + return vec<1, uint8, P>( std::rand() % std::numeric_limits<uint8>::max()); } }; - template <precision P> - struct compute_rand<uint8, P, tvec2> + template <qualifier P> + struct compute_rand<2, uint8, P> { - GLM_FUNC_QUALIFIER static tvec2<uint8, P> call() + GLM_FUNC_QUALIFIER static vec<2, uint8, P> call() { - return tvec2<uint8, P>( + return vec<2, uint8, P>( std::rand() % std::numeric_limits<uint8>::max(), std::rand() % std::numeric_limits<uint8>::max()); } }; - template <precision P> - struct compute_rand<uint8, P, tvec3> + template <qualifier P> + struct compute_rand<3, uint8, P> { - GLM_FUNC_QUALIFIER static tvec3<uint8, P> call() + GLM_FUNC_QUALIFIER static vec<3, uint8, P> call() { - return tvec3<uint8, P>( + return vec<3, uint8, P>( std::rand() % std::numeric_limits<uint8>::max(), std::rand() % std::numeric_limits<uint8>::max(), std::rand() % std::numeric_limits<uint8>::max()); } }; - template <precision P> - struct compute_rand<uint8, P, tvec4> + template <qualifier P> + struct compute_rand<4, uint8, P> { - GLM_FUNC_QUALIFIER static tvec4<uint8, P> call() + GLM_FUNC_QUALIFIER static vec<4, uint8, P> call() { - return tvec4<uint8, P>( + return vec<4, uint8, P>( std::rand() % std::numeric_limits<uint8>::max(), std::rand() % std::numeric_limits<uint8>::max(), std::rand() % std::numeric_limits<uint8>::max(), @@ -62,289 +65,234 @@ namespace detail } }; - template <precision P, template <class, precision> class vecType> - struct compute_rand<uint16, P, vecType> + template <length_t L, qualifier Q> + struct compute_rand<L, uint16, Q> { - GLM_FUNC_QUALIFIER static vecType<uint16, P> call() + GLM_FUNC_QUALIFIER static vec<L, uint16, Q> call() { return - (vecType<uint16, P>(compute_rand<uint8, P, vecType>::call()) << static_cast<uint16>(8)) | - (vecType<uint16, P>(compute_rand<uint8, P, vecType>::call()) << static_cast<uint16>(0)); + (vec<L, uint16, Q>(compute_rand<L, uint8, Q>::call()) << static_cast<uint16>(8)) | + (vec<L, uint16, Q>(compute_rand<L, uint8, Q>::call()) << static_cast<uint16>(0)); } }; - template <precision P, template <class, precision> class vecType> - struct compute_rand<uint32, P, vecType> + template <length_t L, qualifier Q> + struct compute_rand<L, uint32, Q> { - GLM_FUNC_QUALIFIER static vecType<uint32, P> call() + GLM_FUNC_QUALIFIER static vec<L, uint32, Q> call() { return - (vecType<uint32, P>(compute_rand<uint16, P, vecType>::call()) << static_cast<uint32>(16)) | - (vecType<uint32, P>(compute_rand<uint16, P, vecType>::call()) << static_cast<uint32>(0)); + (vec<L, uint32, Q>(compute_rand<L, uint16, Q>::call()) << static_cast<uint32>(16)) | + (vec<L, uint32, Q>(compute_rand<L, uint16, Q>::call()) << static_cast<uint32>(0)); } }; - template <precision P, template <class, precision> class vecType> - struct compute_rand<uint64, P, vecType> + template <length_t L, qualifier Q> + struct compute_rand<L, uint64, Q> { - GLM_FUNC_QUALIFIER static vecType<uint64, P> call() + GLM_FUNC_QUALIFIER static vec<L, uint64, Q> call() { return - (vecType<uint64, P>(compute_rand<uint32, P, vecType>::call()) << static_cast<uint64>(32)) | - (vecType<uint64, P>(compute_rand<uint32, P, vecType>::call()) << static_cast<uint64>(0)); + (vec<L, uint64, Q>(compute_rand<L, uint32, Q>::call()) << static_cast<uint64>(32)) | + (vec<L, uint64, Q>(compute_rand<L, uint32, Q>::call()) << static_cast<uint64>(0)); } }; - template <typename T, precision P, template <class, precision> class vecType> + template <length_t L, typename T, qualifier Q> struct compute_linearRand { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & Min, vecType<T, P> const & Max); + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max); }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<int8, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, int8, Q> { - GLM_FUNC_QUALIFIER static vecType<int8, P> call(vecType<int8, P> const & Min, vecType<int8, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, int8, Q> call(vec<L, int8, Q> const& Min, vec<L, int8, Q> const& Max) { - return (vecType<int8, P>(compute_rand<uint8, P, vecType>::call() % vecType<uint8, P>(Max + static_cast<int8>(1) - Min))) + Min; + return (vec<L, int8, Q>(compute_rand<L, uint8, Q>::call() % vec<L, uint8, Q>(Max + static_cast<int8>(1) - Min))) + Min; } }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<uint8, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, uint8, Q> { - GLM_FUNC_QUALIFIER static vecType<uint8, P> call(vecType<uint8, P> const & Min, vecType<uint8, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, uint8, Q> call(vec<L, uint8, Q> const& Min, vec<L, uint8, Q> const& Max) { - return (compute_rand<uint8, P, vecType>::call() % (Max + static_cast<uint8>(1) - Min)) + Min; + return (compute_rand<L, uint8, Q>::call() % (Max + static_cast<uint8>(1) - Min)) + Min; } }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<int16, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, int16, Q> { - GLM_FUNC_QUALIFIER static vecType<int16, P> call(vecType<int16, P> const & Min, vecType<int16, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, int16, Q> call(vec<L, int16, Q> const& Min, vec<L, int16, Q> const& Max) { - return (vecType<int16, P>(compute_rand<uint16, P, vecType>::call() % vecType<uint16, P>(Max + static_cast<int16>(1) - Min))) + Min; + return (vec<L, int16, Q>(compute_rand<L, uint16, Q>::call() % vec<L, uint16, Q>(Max + static_cast<int16>(1) - Min))) + Min; } }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<uint16, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, uint16, Q> { - GLM_FUNC_QUALIFIER static vecType<uint16, P> call(vecType<uint16, P> const & Min, vecType<uint16, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, uint16, Q> call(vec<L, uint16, Q> const& Min, vec<L, uint16, Q> const& Max) { - return (compute_rand<uint16, P, vecType>::call() % (Max + static_cast<uint16>(1) - Min)) + Min; + return (compute_rand<L, uint16, Q>::call() % (Max + static_cast<uint16>(1) - Min)) + Min; } }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<int32, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, int32, Q> { - GLM_FUNC_QUALIFIER static vecType<int32, P> call(vecType<int32, P> const & Min, vecType<int32, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, int32, Q> call(vec<L, int32, Q> const& Min, vec<L, int32, Q> const& Max) { - return (vecType<int32, P>(compute_rand<uint32, P, vecType>::call() % vecType<uint32, P>(Max + static_cast<int32>(1) - Min))) + Min; + return (vec<L, int32, Q>(compute_rand<L, uint32, Q>::call() % vec<L, uint32, Q>(Max + static_cast<int32>(1) - Min))) + Min; } }; - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<uint32, P, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, uint32, Q> { - GLM_FUNC_QUALIFIER static vecType<uint32, P> call(vecType<uint32, P> const & Min, vecType<uint32, P> const & Max) + GLM_FUNC_QUALIFIER static vec<L, uint32, Q> call(vec<L, uint32, Q> const& Min, vec<L, uint32, Q> const& Max) { - return (compute_rand<uint32, P, vecType>::call() % (Max + static_cast<uint32>(1) - Min)) + Min; - } - }; - - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<int64, P, vecType> - { - GLM_FUNC_QUALIFIER static vecType<int64, P> call(vecType<int64, P> const & Min, vecType<int64, P> const & Max) - { - return (vecType<int64, P>(compute_rand<uint64, P, vecType>::call() % vecType<uint64, P>(Max + static_cast<int64>(1) - Min))) + Min; - } - }; - - template <precision P, template <class, precision> class vecType> - struct compute_linearRand<uint64, P, vecType> - { - GLM_FUNC_QUALIFIER static vecType<uint64, P> call(vecType<uint64, P> const & Min, vecType<uint64, P> const & Max) - { - return (compute_rand<uint64, P, vecType>::call() % (Max + static_cast<uint64>(1) - Min)) + Min; - } - }; - - template <template <class, precision> class vecType> - struct compute_linearRand<float, lowp, vecType> - { - GLM_FUNC_QUALIFIER static vecType<float, lowp> call(vecType<float, lowp> const & Min, vecType<float, lowp> const & Max) - { - return vecType<float, lowp>(compute_rand<uint8, lowp, vecType>::call()) / static_cast<float>(std::numeric_limits<uint8>::max()) * (Max - Min) + Min; + return (compute_rand<L, uint32, Q>::call() % (Max + static_cast<uint32>(1) - Min)) + Min; } }; - template <template <class, precision> class vecType> - struct compute_linearRand<float, mediump, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, int64, Q> { - GLM_FUNC_QUALIFIER static vecType<float, mediump> call(vecType<float, mediump> const & Min, vecType<float, mediump> const & Max) + GLM_FUNC_QUALIFIER static vec<L, int64, Q> call(vec<L, int64, Q> const& Min, vec<L, int64, Q> const& Max) { - return vecType<float, mediump>(compute_rand<uint16, mediump, vecType>::call()) / static_cast<float>(std::numeric_limits<uint16>::max()) * (Max - Min) + Min; + return (vec<L, int64, Q>(compute_rand<L, uint64, Q>::call() % vec<L, uint64, Q>(Max + static_cast<int64>(1) - Min))) + Min; } }; - template <template <class, precision> class vecType> - struct compute_linearRand<float, highp, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, uint64, Q> { - GLM_FUNC_QUALIFIER static vecType<float, highp> call(vecType<float, highp> const & Min, vecType<float, highp> const & Max) + GLM_FUNC_QUALIFIER static vec<L, uint64, Q> call(vec<L, uint64, Q> const& Min, vec<L, uint64, Q> const& Max) { - return vecType<float, highp>(compute_rand<uint32, highp, vecType>::call()) / static_cast<float>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min; + return (compute_rand<L, uint64, Q>::call() % (Max + static_cast<uint64>(1) - Min)) + Min; } }; - template <template <class, precision> class vecType> - struct compute_linearRand<double, lowp, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, float, Q> { - GLM_FUNC_QUALIFIER static vecType<double, lowp> call(vecType<double, lowp> const & Min, vecType<double, lowp> const & Max) + GLM_FUNC_QUALIFIER static vec<L, float, Q> call(vec<L, float, Q> const& Min, vec<L, float, Q> const& Max) { - return vecType<double, lowp>(compute_rand<uint16, lowp, vecType>::call()) / static_cast<double>(std::numeric_limits<uint16>::max()) * (Max - Min) + Min; + return vec<L, float, Q>(compute_rand<L, uint32, Q>::call()) / static_cast<float>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min; } }; - template <template <class, precision> class vecType> - struct compute_linearRand<double, mediump, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, double, Q> { - GLM_FUNC_QUALIFIER static vecType<double, mediump> call(vecType<double, mediump> const & Min, vecType<double, mediump> const & Max) + GLM_FUNC_QUALIFIER static vec<L, double, Q> call(vec<L, double, Q> const& Min, vec<L, double, Q> const& Max) { - return vecType<double, mediump>(compute_rand<uint32, mediump, vecType>::call()) / static_cast<double>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min; + return vec<L, double, Q>(compute_rand<L, uint64, Q>::call()) / static_cast<double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min; } }; - template <template <class, precision> class vecType> - struct compute_linearRand<double, highp, vecType> + template<length_t L, qualifier Q> + struct compute_linearRand<L, long double, Q> { - GLM_FUNC_QUALIFIER static vecType<double, highp> call(vecType<double, highp> const & Min, vecType<double, highp> const & Max) + GLM_FUNC_QUALIFIER static vec<L, long double, Q> call(vec<L, long double, Q> const& Min, vec<L, long double, Q> const& Max) { - return vecType<double, highp>(compute_rand<uint64, highp, vecType>::call()) / static_cast<double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min; - } - }; - - template <template <class, precision> class vecType> - struct compute_linearRand<long double, lowp, vecType> - { - GLM_FUNC_QUALIFIER static vecType<long double, lowp> call(vecType<long double, lowp> const & Min, vecType<long double, lowp> const & Max) - { - return vecType<long double, lowp>(compute_rand<uint32, lowp, vecType>::call()) / static_cast<long double>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min; - } - }; - - template <template <class, precision> class vecType> - struct compute_linearRand<long double, mediump, vecType> - { - GLM_FUNC_QUALIFIER static vecType<long double, mediump> call(vecType<long double, mediump> const & Min, vecType<long double, mediump> const & Max) - { - return vecType<long double, mediump>(compute_rand<uint64, mediump, vecType>::call()) / static_cast<long double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min; - } - }; - - template <template <class, precision> class vecType> - struct compute_linearRand<long double, highp, vecType> - { - GLM_FUNC_QUALIFIER static vecType<long double, highp> call(vecType<long double, highp> const & Min, vecType<long double, highp> const & Max) - { - return vecType<long double, highp>(compute_rand<uint64, highp, vecType>::call()) / static_cast<long double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min; + return vec<L, long double, Q>(compute_rand<L, uint64, Q>::call()) / static_cast<long double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min; } }; }//namespace detail - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType linearRand(genType Min, genType Max) { - return detail::compute_linearRand<genType, highp, tvec1>::call( - tvec1<genType, highp>(Min), - tvec1<genType, highp>(Max)).x; + return detail::compute_linearRand<1, genType, highp>::call( + vec<1, genType, highp>(Min), + vec<1, genType, highp>(Max)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> linearRand(vecType<T, P> const & Min, vecType<T, P> const & Max) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> linearRand(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max) { - return detail::compute_linearRand<T, P, vecType>::call(Min, Max); + return detail::compute_linearRand<L, T, Q>::call(Min, Max); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType gaussRand(genType Mean, genType Deviation) { genType w, x1, x2; - + do { x1 = linearRand(genType(-1), genType(1)); x2 = linearRand(genType(-1), genType(1)); - + w = x1 * x1 + x2 * x2; } while(w > genType(1)); - + return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> gaussRand(vecType<T, P> const & Mean, vecType<T, P> const & Deviation) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> gaussRand(vec<L, T, Q> const& Mean, vec<L, T, Q> const& Deviation) { - return detail::functor2<T, P, vecType>::call(gaussRand, Mean, Deviation); + return detail::functor2<L, T, Q>::call(gaussRand, Mean, Deviation); } - template <typename T> - GLM_FUNC_QUALIFIER tvec2<T, defaultp> diskRand(T Radius) - { - tvec2<T, defaultp> Result(T(0)); + template<typename T> + GLM_FUNC_QUALIFIER vec<2, T, defaultp> diskRand(T Radius) + { + vec<2, T, defaultp> Result(T(0)); T LenRadius(T(0)); - + do { Result = linearRand( - tvec2<T, defaultp>(-Radius), - tvec2<T, defaultp>(Radius)); + vec<2, T, defaultp>(-Radius), + vec<2, T, defaultp>(Radius)); LenRadius = length(Result); } while(LenRadius > Radius); - + return Result; } - - template <typename T> - GLM_FUNC_QUALIFIER tvec3<T, defaultp> ballRand(T Radius) - { - tvec3<T, defaultp> Result(T(0)); + + template<typename T> + GLM_FUNC_QUALIFIER vec<3, T, defaultp> ballRand(T Radius) + { + vec<3, T, defaultp> Result(T(0)); T LenRadius(T(0)); - + do { Result = linearRand( - tvec3<T, defaultp>(-Radius), - tvec3<T, defaultp>(Radius)); + vec<3, T, defaultp>(-Radius), + vec<3, T, defaultp>(Radius)); LenRadius = length(Result); } while(LenRadius > Radius); - + return Result; } - - template <typename T> - GLM_FUNC_QUALIFIER tvec2<T, defaultp> circularRand(T Radius) + + template<typename T> + GLM_FUNC_QUALIFIER vec<2, T, defaultp> circularRand(T Radius) { - T a = linearRand(T(0), T(6.283185307179586476925286766559f)); - return tvec2<T, defaultp>(cos(a), sin(a)) * Radius; + T a = linearRand(T(0), static_cast<T>(6.283185307179586476925286766559)); + return vec<2, T, defaultp>(glm::cos(a), glm::sin(a)) * Radius; } - - template <typename T> - GLM_FUNC_QUALIFIER tvec3<T, defaultp> sphericalRand(T Radius) + + template<typename T> + GLM_FUNC_QUALIFIER vec<3, T, defaultp> sphericalRand(T Radius) { - T z = linearRand(T(-1), T(1)); - T a = linearRand(T(0), T(6.283185307179586476925286766559f)); - - T r = sqrt(T(1) - z * z); - - T x = r * cos(a); - T y = r * sin(a); - - return tvec3<T, defaultp>(x, y, z) * Radius; + T theta = linearRand(T(0), T(6.283185307179586476925286766559f)); + T phi = std::acos(linearRand(T(-1.0f), T(1.0f))); + + T x = std::sin(phi) * std::cos(theta); + T y = std::sin(phi) * std::sin(theta); + T z = std::cos(phi); + + return vec<3, T, defaultp>(x, y, z) * Radius; } }//namespace glm diff --git a/external/include/glm/gtc/reciprocal.hpp b/external/include/glm/gtc/reciprocal.hpp index c14a4fe..1a2e516 100644 --- a/external/include/glm/gtc/reciprocal.hpp +++ b/external/include/glm/gtc/reciprocal.hpp @@ -6,9 +6,9 @@ /// @defgroup gtc_reciprocal GLM_GTC_reciprocal /// @ingroup gtc /// -/// @brief Define secant, cosecant and cotangent functions. +/// Include <glm/gtc/reciprocal.hpp> to use the features of this extension. /// -/// <glm/gtc/reciprocal.hpp> need to be included to use these features. +/// Define secant, cosecant and cotangent functions. #pragma once @@ -26,107 +26,107 @@ namespace glm /// Secant function. /// hypotenuse / adjacent or 1 / cos(x) - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType sec(genType angle); /// Cosecant function. /// hypotenuse / opposite or 1 / sin(x) - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType csc(genType angle); - + /// Cotangent function. /// adjacent / opposite or 1 / tan(x) - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType cot(genType angle); /// Inverse secant function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType asec(genType x); /// Inverse cosecant function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType acsc(genType x); - + /// Inverse cotangent function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType acot(genType x); /// Secant hyperbolic function. - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType sech(genType angle); /// Cosecant hyperbolic function. - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType csch(genType angle); - + /// Cotangent hyperbolic function. - /// + /// /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType coth(genType angle); /// Inverse secant hyperbolic function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType asech(genType x); /// Inverse cosecant hyperbolic function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType acsch(genType x); - + /// Inverse cotangent hyperbolic function. - /// + /// /// @return Return an angle expressed in radians. /// @tparam genType Floating-point scalar or vector types. - /// + /// /// @see gtc_reciprocal - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType acoth(genType x); /// @} diff --git a/external/include/glm/gtc/reciprocal.inl b/external/include/glm/gtc/reciprocal.inl index c625ac9..b0a8a7d 100644 --- a/external/include/glm/gtc/reciprocal.inl +++ b/external/include/glm/gtc/reciprocal.inl @@ -7,84 +7,84 @@ namespace glm { // sec - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType sec(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'sec' only accept floating-point values"); return genType(1) / glm::cos(angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sec(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sec(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sec' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(sec, x); + return detail::functor1<L, T, T, Q>::call(sec, x); } // csc - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType csc(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'csc' only accept floating-point values"); return genType(1) / glm::sin(angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> csc(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> csc(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'csc' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(csc, x); + return detail::functor1<L, T, T, Q>::call(csc, x); } // cot - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType cot(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'cot' only accept floating-point values"); - + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); return glm::tan(pi_over_2 - angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> cot(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> cot(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cot' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(cot, x); + return detail::functor1<L, T, T, Q>::call(cot, x); } // asec - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType asec(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asec' only accept floating-point values"); return acos(genType(1) / x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> asec(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> asec(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'asec' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(asec, x); + return detail::functor1<L, T, T, Q>::call(asec, x); } // acsc - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType acsc(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acsc' only accept floating-point values"); return asin(genType(1) / x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acsc(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acsc(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acsc' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(acsc, x); + return detail::functor1<L, T, T, Q>::call(acsc, x); } // acot - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType acot(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acot' only accept floating-point values"); @@ -93,100 +93,100 @@ namespace glm return pi_over_2 - atan(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acot(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acot(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acot' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(acot, x); + return detail::functor1<L, T, T, Q>::call(acot, x); } // sech - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType sech(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'sech' only accept floating-point values"); return genType(1) / glm::cosh(angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> sech(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> sech(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sech' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(sech, x); + return detail::functor1<L, T, T, Q>::call(sech, x); } // csch - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType csch(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'csch' only accept floating-point values"); return genType(1) / glm::sinh(angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> csch(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> csch(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'csch' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(csch, x); + return detail::functor1<L, T, T, Q>::call(csch, x); } // coth - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType coth(genType angle) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'coth' only accept floating-point values"); return glm::cosh(angle) / glm::sinh(angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> coth(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> coth(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'coth' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(coth, x); + return detail::functor1<L, T, T, Q>::call(coth, x); } // asech - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType asech(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asech' only accept floating-point values"); return acosh(genType(1) / x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> asech(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> asech(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'asech' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(asech, x); + return detail::functor1<L, T, T, Q>::call(asech, x); } // acsch - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType acsch(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acsch' only accept floating-point values"); - return acsch(genType(1) / x); + return asinh(genType(1) / x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acsch(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acsch(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acsch' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(acsch, x); + return detail::functor1<L, T, T, Q>::call(acsch, x); } // acoth - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType acoth(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acoth' only accept floating-point values"); return atanh(genType(1) / x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> acoth(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> acoth(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acoth' only accept floating-point inputs"); - return detail::functor1<T, T, P, vecType>::call(acoth, x); + return detail::functor1<L, T, T, Q>::call(acoth, x); } }//namespace glm diff --git a/external/include/glm/gtc/round.hpp b/external/include/glm/gtc/round.hpp index a583592..d8d04c3 100644 --- a/external/include/glm/gtc/round.hpp +++ b/external/include/glm/gtc/round.hpp @@ -7,15 +7,15 @@ /// @defgroup gtc_round GLM_GTC_round /// @ingroup gtc /// -/// @brief rounding value to specific boundings +/// Include <glm/gtc/round.hpp> to use the features of this extension. /// -/// <glm/gtc/round.hpp> need to be included to use these functionalities. +/// Rounding value to specific boundings #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #include "../detail/_vectorize.hpp" #include "../vector_relational.hpp" #include "../common.hpp" @@ -33,140 +33,168 @@ namespace glm /// Return true if the value is a power of two number. /// /// @see gtc_round - template <typename genIUType> - GLM_FUNC_DECL bool isPowerOfTwo(genIUType Value); + template<typename genIUType> + GLM_FUNC_DECL bool isPowerOfTwo(genIUType v); /// Return true if the value is a power of two number. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isPowerOfTwo(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isPowerOfTwo(vec<L, T, Q> const& v); /// Return the power of two number which value is just higher the input value, /// round up to a power of two. /// /// @see gtc_round - template <typename genIUType> - GLM_FUNC_DECL genIUType ceilPowerOfTwo(genIUType Value); + template<typename genIUType> + GLM_FUNC_DECL genIUType ceilPowerOfTwo(genIUType v); /// Return the power of two number which value is just higher the input value, /// round up to a power of two. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> ceilPowerOfTwo(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> ceilPowerOfTwo(vec<L, T, Q> const& v); /// Return the power of two number which value is just lower the input value, /// round down to a power of two. /// /// @see gtc_round - template <typename genIUType> - GLM_FUNC_DECL genIUType floorPowerOfTwo(genIUType Value); + template<typename genIUType> + GLM_FUNC_DECL genIUType floorPowerOfTwo(genIUType v); /// Return the power of two number which value is just lower the input value, /// round down to a power of two. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> floorPowerOfTwo(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> floorPowerOfTwo(vec<L, T, Q> const& v); /// Return the power of two number which value is the closet to the input value. /// /// @see gtc_round - template <typename genIUType> - GLM_FUNC_DECL genIUType roundPowerOfTwo(genIUType Value); + template<typename genIUType> + GLM_FUNC_DECL genIUType roundPowerOfTwo(genIUType v); /// Return the power of two number which value is the closet to the input value. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> roundPowerOfTwo(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> roundPowerOfTwo(vec<L, T, Q> const& v); /// Return true if the 'Value' is a multiple of 'Multiple'. /// /// @see gtc_round - template <typename genIUType> - GLM_FUNC_DECL bool isMultiple(genIUType Value, genIUType Multiple); + template<typename genIUType> + GLM_FUNC_DECL bool isMultiple(genIUType v, genIUType Multiple); /// Return true if the 'Value' is a multiple of 'Multiple'. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isMultiple(vecType<T, P> const & Value, T Multiple); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isMultiple(vec<L, T, Q> const& v, T Multiple); /// Return true if the 'Value' is a multiple of 'Multiple'. /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isMultiple(vecType<T, P> const & Value, vecType<T, P> const & Multiple); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple); /// Higher multiple number of Source. /// /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// + /// @param v Source value to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename genType> - GLM_FUNC_DECL genType ceilMultiple(genType Source, genType Multiple); + template<typename genType> + GLM_FUNC_DECL genType ceilMultiple(genType v, genType Multiple); /// Higher multiple number of Source. /// - /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> ceilMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> ceilMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple); /// Lower multiple number of Source. /// /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// + /// @param v Source value to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename genType> - GLM_FUNC_DECL genType floorMultiple( - genType Source, - genType Multiple); + template<typename genType> + GLM_FUNC_DECL genType floorMultiple(genType v, genType Multiple); /// Lower multiple number of Source. /// - /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> floorMultiple( - vecType<T, P> const & Source, - vecType<T, P> const & Multiple); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> floorMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple); /// Lower multiple number of Source. /// /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// + /// @param v Source value to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename genType> - GLM_FUNC_DECL genType roundMultiple( - genType Source, - genType Multiple); + template<typename genType> + GLM_FUNC_DECL genType roundMultiple(genType v, genType Multiple); /// Lower multiple number of Source. /// - /// @tparam genType Floating-point or integer scalar or vector types. - /// @param Source + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @param v Source values to which is applied the function /// @param Multiple Must be a null or positive value /// /// @see gtc_round - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> roundMultiple( - vecType<T, P> const & Source, - vecType<T, P> const & Multiple); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> roundMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple); /// @} } //namespace glm diff --git a/external/include/glm/gtc/round.inl b/external/include/glm/gtc/round.inl index f583c40..d4e9392 100644 --- a/external/include/glm/gtc/round.inl +++ b/external/include/glm/gtc/round.inl @@ -1,78 +1,78 @@ /// @ref gtc_round /// @file glm/gtc/round.inl -#include "../detail/func_integer.hpp" +#include "../integer.hpp" namespace glm{ namespace detail { - template <typename T, precision P, template <typename, precision> class vecType, bool compute = false> + template<length_t L, typename T, qualifier Q, bool compute = false> struct compute_ceilShift { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T) { return v; } }; - template <typename T, precision P, template <typename, precision> class vecType> - struct compute_ceilShift<T, P, vecType, true> + template<length_t L, typename T, qualifier Q> + struct compute_ceilShift<L, T, Q, true> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Shift) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Shift) { return v | (v >> Shift); } }; - template <typename T, precision P, template <typename, precision> class vecType, bool isSigned = true> + template<length_t L, typename T, qualifier Q, bool isSigned = true> struct compute_ceilPowerOfTwo { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); - vecType<T, P> const Sign(sign(x)); + vec<L, T, Q> const Sign(sign(x)); - vecType<T, P> v(abs(x)); + vec<L, T, Q> v(abs(x)); v = v - static_cast<T>(1); v = v | (v >> static_cast<T>(1)); v = v | (v >> static_cast<T>(2)); v = v | (v >> static_cast<T>(4)); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 2>::call(v, 8); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 4>::call(v, 16); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 8>::call(v, 32); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 2>::call(v, 8); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 4>::call(v, 16); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 8>::call(v, 32); return (v + static_cast<T>(1)) * Sign; } }; - template <typename T, precision P, template <typename, precision> class vecType> - struct compute_ceilPowerOfTwo<T, P, vecType, false> + template<length_t L, typename T, qualifier Q> + struct compute_ceilPowerOfTwo<L, T, Q, false> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & x) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559, "'ceilPowerOfTwo' only accept integer scalar or vector inputs"); - vecType<T, P> v(x); + vec<L, T, Q> v(x); v = v - static_cast<T>(1); v = v | (v >> static_cast<T>(1)); v = v | (v >> static_cast<T>(2)); v = v | (v >> static_cast<T>(4)); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 2>::call(v, 8); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 4>::call(v, 16); - v = compute_ceilShift<T, P, vecType, sizeof(T) >= 8>::call(v, 32); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 2>::call(v, 8); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 4>::call(v, 16); + v = compute_ceilShift<L, T, Q, sizeof(T) >= 8>::call(v, 32); return v + static_cast<T>(1); } }; - template <bool is_float, bool is_signed> + template<bool is_float, bool is_signed> struct compute_ceilMultiple{}; - template <> + template<> struct compute_ceilMultiple<true, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source > genType(0)) @@ -82,10 +82,10 @@ namespace detail } }; - template <> + template<> struct compute_ceilMultiple<false, false> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { genType Tmp = Source - genType(1); @@ -93,10 +93,10 @@ namespace detail } }; - template <> + template<> struct compute_ceilMultiple<false, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source > genType(0)) @@ -109,13 +109,13 @@ namespace detail } }; - template <bool is_float, bool is_signed> + template<bool is_float, bool is_signed> struct compute_floorMultiple{}; - template <> + template<> struct compute_floorMultiple<true, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -125,10 +125,10 @@ namespace detail } }; - template <> + template<> struct compute_floorMultiple<false, false> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -141,10 +141,10 @@ namespace detail } }; - template <> + template<> struct compute_floorMultiple<false, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -157,13 +157,13 @@ namespace detail } }; - template <bool is_float, bool is_signed> + template<bool is_float, bool is_signed> struct compute_roundMultiple{}; - template <> + template<> struct compute_roundMultiple<true, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -176,10 +176,10 @@ namespace detail } }; - template <> + template<> struct compute_roundMultiple<false, false> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -192,10 +192,10 @@ namespace detail } }; - template <> + template<> struct compute_roundMultiple<false, true> { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source >= genType(0)) @@ -212,54 +212,54 @@ namespace detail //////////////// // isPowerOfTwo - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType Value) { genType const Result = glm::abs(Value); return !(Result & (Result - 1)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isPowerOfTwo(vecType<T, P> const & Value) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isPowerOfTwo(vec<L, T, Q> const& Value) { - vecType<T, P> const Result(abs(Value)); - return equal(Result & (Result - 1), vecType<T, P>(0)); + vec<L, T, Q> const Result(abs(Value)); + return equal(Result & (Result - 1), vec<L, T, Q>(0)); } ////////////////// // ceilPowerOfTwo - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType ceilPowerOfTwo(genType value) { - return detail::compute_ceilPowerOfTwo<genType, defaultp, tvec1, std::numeric_limits<genType>::is_signed>::call(tvec1<genType, defaultp>(value)).x; + return detail::compute_ceilPowerOfTwo<1, genType, defaultp, std::numeric_limits<genType>::is_signed>::call(vec<1, genType, defaultp>(value)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> ceilPowerOfTwo(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> ceilPowerOfTwo(vec<L, T, Q> const& v) { - return detail::compute_ceilPowerOfTwo<T, P, vecType, std::numeric_limits<T>::is_signed>::call(v); + return detail::compute_ceilPowerOfTwo<L, T, Q, std::numeric_limits<T>::is_signed>::call(v); } /////////////////// // floorPowerOfTwo - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType floorPowerOfTwo(genType value) { return isPowerOfTwo(value) ? value : static_cast<genType>(1) << findMSB(value); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> floorPowerOfTwo(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> floorPowerOfTwo(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(floorPowerOfTwo, v); + return detail::functor1<L, T, T, Q>::call(floorPowerOfTwo, v); } /////////////////// // roundPowerOfTwo - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType roundPowerOfTwo(genIUType value) { if(isPowerOfTwo(value)) @@ -270,75 +270,75 @@ namespace detail return (next - value) < (value - prev) ? next : prev; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> roundPowerOfTwo(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> roundPowerOfTwo(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(roundPowerOfTwo, v); + return detail::functor1<L, T, T, Q>::call(roundPowerOfTwo, v); } //////////////// // isMultiple - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool isMultiple(genType Value, genType Multiple) { - return isMultiple(tvec1<genType>(Value), tvec1<genType>(Multiple)).x; + return isMultiple(vec<1, genType>(Value), vec<1, genType>(Multiple)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isMultiple(vecType<T, P> const & Value, T Multiple) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isMultiple(vec<L, T, Q> const& Value, T Multiple) { - return (Value % Multiple) == vecType<T, P>(0); + return (Value % Multiple) == vec<L, T, Q>(0); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isMultiple(vecType<T, P> const & Value, vecType<T, P> const & Multiple) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isMultiple(vec<L, T, Q> const& Value, vec<L, T, Q> const& Multiple) { - return (Value % Multiple) == vecType<T, P>(0); + return (Value % Multiple) == vec<L, T, Q>(0); } ////////////////////// // ceilMultiple - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType ceilMultiple(genType Source, genType Multiple) { return detail::compute_ceilMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> ceilMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> ceilMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple) { - return detail::functor2<T, P, vecType>::call(ceilMultiple, Source, Multiple); + return detail::functor2<L, T, Q>::call(ceilMultiple, Source, Multiple); } ////////////////////// // floorMultiple - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType floorMultiple(genType Source, genType Multiple) { return detail::compute_floorMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> floorMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> floorMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple) { - return detail::functor2<T, P, vecType>::call(floorMultiple, Source, Multiple); + return detail::functor2<L, T, Q>::call(floorMultiple, Source, Multiple); } ////////////////////// // roundMultiple - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType roundMultiple(genType Source, genType Multiple) { return detail::compute_roundMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> roundMultiple(vecType<T, P> const & Source, vecType<T, P> const & Multiple) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> roundMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple) { - return detail::functor2<T, P, vecType>::call(roundMultiple, Source, Multiple); + return detail::functor2<L, T, Q>::call(roundMultiple, Source, Multiple); } }//namespace glm diff --git a/external/include/glm/gtc/type_aligned.hpp b/external/include/glm/gtc/type_aligned.hpp index 2e4503c..7e51ce1 100644 --- a/external/include/glm/gtc/type_aligned.hpp +++ b/external/include/glm/gtc/type_aligned.hpp @@ -6,8 +6,9 @@ /// @defgroup gtc_type_aligned GLM_GTC_type_aligned /// @ingroup gtc /// -/// @brief Aligned types. -/// <glm/gtc/type_aligned.hpp> need to be included to use these features. +/// Include <glm/gtc/type_aligned.hpp> to use the features of this extension. +/// +/// Aligned types allowing SIMD optimizations of vectors and matrices types #pragma once @@ -25,214 +26,376 @@ namespace glm { - template <typename T, precision P> struct tvec1; - template <typename T, precision P> struct tvec2; - template <typename T, precision P> struct tvec3; - template <typename T, precision P> struct tvec4; /// @addtogroup gtc_type_aligned /// @{ // -- *vec1 -- - typedef tvec1<float, aligned_highp> aligned_highp_vec1; - typedef tvec1<float, aligned_mediump> aligned_mediump_vec1; - typedef tvec1<float, aligned_lowp> aligned_lowp_vec1; - typedef tvec1<double, aligned_highp> aligned_highp_dvec1; - typedef tvec1<double, aligned_mediump> aligned_mediump_dvec1; - typedef tvec1<double, aligned_lowp> aligned_lowp_dvec1; - typedef tvec1<int, aligned_highp> aligned_highp_ivec1; - typedef tvec1<int, aligned_mediump> aligned_mediump_ivec1; - typedef tvec1<int, aligned_lowp> aligned_lowp_ivec1; - typedef tvec1<uint, aligned_highp> aligned_highp_uvec1; - typedef tvec1<uint, aligned_mediump> aligned_mediump_uvec1; - typedef tvec1<uint, aligned_lowp> aligned_lowp_uvec1; - typedef tvec1<bool, aligned_highp> aligned_highp_bvec1; - typedef tvec1<bool, aligned_mediump> aligned_mediump_bvec1; - typedef tvec1<bool, aligned_lowp> aligned_lowp_bvec1; - - typedef tvec1<float, packed_highp> packed_highp_vec1; - typedef tvec1<float, packed_mediump> packed_mediump_vec1; - typedef tvec1<float, packed_lowp> packed_lowp_vec1; - typedef tvec1<double, packed_highp> packed_highp_dvec1; - typedef tvec1<double, packed_mediump> packed_mediump_dvec1; - typedef tvec1<double, packed_lowp> packed_lowp_dvec1; - typedef tvec1<int, packed_highp> packed_highp_ivec1; - typedef tvec1<int, packed_mediump> packed_mediump_ivec1; - typedef tvec1<int, packed_lowp> packed_lowp_ivec1; - typedef tvec1<uint, packed_highp> packed_highp_uvec1; - typedef tvec1<uint, packed_mediump> packed_mediump_uvec1; - typedef tvec1<uint, packed_lowp> packed_lowp_uvec1; - typedef tvec1<bool, packed_highp> packed_highp_bvec1; - typedef tvec1<bool, packed_mediump> packed_mediump_bvec1; - typedef tvec1<bool, packed_lowp> packed_lowp_bvec1; + /// 1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_highp> aligned_highp_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_mediump> aligned_mediump_vec1; + + /// 1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, aligned_lowp> aligned_lowp_vec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_highp> aligned_highp_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_mediump> aligned_mediump_dvec1; + + /// 1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, aligned_lowp> aligned_lowp_dvec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_highp> aligned_highp_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_mediump> aligned_mediump_ivec1; + + /// 1 component vector aligned in memory of signed integer numbers. + typedef vec<1, int, aligned_lowp> aligned_lowp_ivec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_highp> aligned_highp_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_mediump> aligned_mediump_uvec1; + + /// 1 component vector aligned in memory of unsigned integer numbers. + typedef vec<1, uint, aligned_lowp> aligned_lowp_uvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_highp> aligned_highp_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_mediump> aligned_mediump_bvec1; + + /// 1 component vector aligned in memory of bool values. + typedef vec<1, bool, aligned_lowp> aligned_lowp_bvec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, float, packed_highp> packed_highp_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, float, packed_mediump> packed_mediump_vec1; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, float, packed_lowp> packed_lowp_vec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<1, double, packed_highp> packed_highp_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<1, double, packed_mediump> packed_mediump_dvec1; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<1, double, packed_lowp> packed_lowp_dvec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_highp> packed_highp_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_mediump> packed_mediump_ivec1; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef vec<1, int, packed_lowp> packed_lowp_ivec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_highp> packed_highp_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_mediump> packed_mediump_uvec1; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef vec<1, uint, packed_lowp> packed_lowp_uvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_highp> packed_highp_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_mediump> packed_mediump_bvec1; + + /// 1 component vector tightly packed in memory of bool values. + typedef vec<1, bool, packed_lowp> packed_lowp_bvec1; // -- *vec2 -- - /// 2 components vector of high single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<float, aligned_highp> aligned_highp_vec2; + /// 2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_highp> aligned_highp_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_mediump> aligned_mediump_vec2; + + /// 2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, aligned_lowp> aligned_lowp_vec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_highp> aligned_highp_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_mediump> aligned_mediump_dvec2; + + /// 2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, aligned_lowp> aligned_lowp_dvec2; + + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_highp> aligned_highp_ivec2; - /// 2 components vector of medium single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<float, aligned_mediump> aligned_mediump_vec2; + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_mediump> aligned_mediump_ivec2; - /// 2 components vector of low single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<float, aligned_lowp> aligned_lowp_vec2; + /// 2 components vector aligned in memory of signed integer numbers. + typedef vec<2, int, aligned_lowp> aligned_lowp_ivec2; - /// 2 components vector of high double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<double, aligned_highp> aligned_highp_dvec2; + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_highp> aligned_highp_uvec2; - /// 2 components vector of medium double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<double, aligned_mediump> aligned_mediump_dvec2; + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_mediump> aligned_mediump_uvec2; - /// 2 components vector of low double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<double, aligned_lowp> aligned_lowp_dvec2; + /// 2 components vector aligned in memory of unsigned integer numbers. + typedef vec<2, uint, aligned_lowp> aligned_lowp_uvec2; - /// 2 components vector of high precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<int, aligned_highp> aligned_highp_ivec2; + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_highp> aligned_highp_bvec2; - /// 2 components vector of medium precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<int, aligned_mediump> aligned_mediump_ivec2; + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_mediump> aligned_mediump_bvec2; - /// 2 components vector of low precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<int, aligned_lowp> aligned_lowp_ivec2; + /// 2 components vector aligned in memory of bool values. + typedef vec<2, bool, aligned_lowp> aligned_lowp_bvec2; - /// 2 components vector of high precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<uint, aligned_highp> aligned_highp_uvec2; + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, float, packed_highp> packed_highp_vec2; - /// 2 components vector of medium precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<uint, aligned_mediump> aligned_mediump_uvec2; + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, float, packed_mediump> packed_mediump_vec2; - /// 2 components vector of low precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<uint, aligned_lowp> aligned_lowp_uvec2; + /// 2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, float, packed_lowp> packed_lowp_vec2; - /// 2 components vector of high precision bool numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<bool, aligned_highp> aligned_highp_bvec2; + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<2, double, packed_highp> packed_highp_dvec2; - /// 2 components vector of medium precision bool numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<bool, aligned_mediump> aligned_mediump_bvec2; + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<2, double, packed_mediump> packed_mediump_dvec2; - /// 2 components vector of low precision bool numbers. - /// There is no guarantee on the actual precision. - typedef tvec2<bool, aligned_lowp> aligned_lowp_bvec2; + /// 2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<2, double, packed_lowp> packed_lowp_dvec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_highp> packed_highp_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_mediump> packed_mediump_ivec2; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef vec<2, int, packed_lowp> packed_lowp_ivec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_highp> packed_highp_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_mediump> packed_mediump_uvec2; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<2, uint, packed_lowp> packed_lowp_uvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_highp> packed_highp_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_mediump> packed_mediump_bvec2; + + /// 2 components vector tightly packed in memory of bool values. + typedef vec<2, bool, packed_lowp> packed_lowp_bvec2; // -- *vec3 -- - /// 3 components vector of high single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<float, aligned_highp> aligned_highp_vec3; + /// 3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_highp> aligned_highp_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_mediump> aligned_mediump_vec3; + + /// 3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, aligned_lowp> aligned_lowp_vec3; + + /// 3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_highp> aligned_highp_dvec3; - /// 3 components vector of medium single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<float, aligned_mediump> aligned_mediump_vec3; + /// 3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_mediump> aligned_mediump_dvec3; - /// 3 components vector of low single-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<float, aligned_lowp> aligned_lowp_vec3; + /// 3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, aligned_lowp> aligned_lowp_dvec3; - /// 3 components vector of high double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<double, aligned_highp> aligned_highp_dvec3; + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_highp> aligned_highp_ivec3; - /// 3 components vector of medium double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<double, aligned_mediump> aligned_mediump_dvec3; + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_mediump> aligned_mediump_ivec3; - /// 3 components vector of low double-precision floating-point numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<double, aligned_lowp> aligned_lowp_dvec3; + /// 3 components vector aligned in memory of signed integer numbers. + typedef vec<3, int, aligned_lowp> aligned_lowp_ivec3; - /// 3 components vector of high precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<int, aligned_highp> aligned_highp_ivec3; + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_highp> aligned_highp_uvec3; - /// 3 components vector of medium precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<int, aligned_mediump> aligned_mediump_ivec3; + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_mediump> aligned_mediump_uvec3; - /// 3 components vector of low precision signed integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<int, aligned_lowp> aligned_lowp_ivec3; + /// 3 components vector aligned in memory of unsigned integer numbers. + typedef vec<3, uint, aligned_lowp> aligned_lowp_uvec3; - /// 3 components vector of high precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<uint, aligned_highp> aligned_highp_uvec3; + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_highp> aligned_highp_bvec3; - /// 3 components vector of medium precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<uint, aligned_mediump> aligned_mediump_uvec3; + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_mediump> aligned_mediump_bvec3; - /// 3 components vector of low precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - typedef tvec3<uint, aligned_lowp> aligned_lowp_uvec3; + /// 3 components vector aligned in memory of bool values. + typedef vec<3, bool, aligned_lowp> aligned_lowp_bvec3; - /// 3 components vector of high precision bool numbers. - typedef tvec3<bool, aligned_highp> aligned_highp_bvec3; + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, float, packed_highp> packed_highp_vec3; - /// 3 components vector of medium precision bool numbers. - typedef tvec3<bool, aligned_mediump> aligned_mediump_bvec3; + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, float, packed_mediump> packed_mediump_vec3; - /// 3 components vector of low precision bool numbers. - typedef tvec3<bool, aligned_lowp> aligned_lowp_bvec3; + /// 3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, float, packed_lowp> packed_lowp_vec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<3, double, packed_highp> packed_highp_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<3, double, packed_mediump> packed_mediump_dvec3; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<3, double, packed_lowp> packed_lowp_dvec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_highp> packed_highp_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_mediump> packed_mediump_ivec3; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef vec<3, int, packed_lowp> packed_lowp_ivec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_highp> packed_highp_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_mediump> packed_mediump_uvec3; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<3, uint, packed_lowp> packed_lowp_uvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_highp> packed_highp_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_mediump> packed_mediump_bvec3; + + /// 3 components vector tightly packed in memory of bool values. + typedef vec<3, bool, packed_lowp> packed_lowp_bvec3; // -- *vec4 -- - /// 4 components vector of high single-precision floating-point numbers. - typedef tvec4<float, aligned_highp> aligned_highp_vec4; + /// 4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_highp> aligned_highp_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_mediump> aligned_mediump_vec4; + + /// 4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, aligned_lowp> aligned_lowp_vec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_highp> aligned_highp_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_mediump> aligned_mediump_dvec4; + + /// 4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, aligned_lowp> aligned_lowp_dvec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_highp> aligned_highp_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_mediump> aligned_mediump_ivec4; + + /// 4 components vector aligned in memory of signed integer numbers. + typedef vec<4, int, aligned_lowp> aligned_lowp_ivec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_highp> aligned_highp_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_mediump> aligned_mediump_uvec4; + + /// 4 components vector aligned in memory of unsigned integer numbers. + typedef vec<4, uint, aligned_lowp> aligned_lowp_uvec4; + + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_highp> aligned_highp_bvec4; - /// 4 components vector of medium single-precision floating-point numbers. - typedef tvec4<float, aligned_mediump> aligned_mediump_vec4; + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_mediump> aligned_mediump_bvec4; - /// 4 components vector of low single-precision floating-point numbers. - typedef tvec4<float, aligned_lowp> aligned_lowp_vec4; + /// 4 components vector aligned in memory of bool values. + typedef vec<4, bool, aligned_lowp> aligned_lowp_bvec4; - /// 4 components vector of high double-precision floating-point numbers. - typedef tvec4<double, aligned_highp> aligned_highp_dvec4; + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, float, packed_highp> packed_highp_vec4; - /// 4 components vector of medium double-precision floating-point numbers. - typedef tvec4<double, aligned_mediump> aligned_mediump_dvec4; + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, float, packed_mediump> packed_mediump_vec4; - /// 4 components vector of low double-precision floating-point numbers. - typedef tvec4<double, aligned_lowp> aligned_lowp_dvec4; + /// 4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, float, packed_lowp> packed_lowp_vec4; - /// 4 components vector of high precision signed integer numbers. - typedef tvec4<int, aligned_highp> aligned_highp_ivec4; + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. + typedef vec<4, double, packed_highp> packed_highp_dvec4; - /// 4 components vector of medium precision signed integer numbers. - typedef tvec4<int, aligned_mediump> aligned_mediump_ivec4; + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. + typedef vec<4, double, packed_mediump> packed_mediump_dvec4; - /// 4 components vector of low precision signed integer numbers. - typedef tvec4<int, aligned_lowp> aligned_lowp_ivec4; + /// 4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. + typedef vec<4, double, packed_lowp> packed_lowp_dvec4; - /// 4 components vector of high precision unsigned integer numbers. - typedef tvec4<uint, aligned_highp> aligned_highp_uvec4; + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_highp> packed_highp_ivec4; - /// 4 components vector of medium precision unsigned integer numbers. - typedef tvec4<uint, aligned_mediump> aligned_mediump_uvec4; + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_mediump> packed_mediump_ivec4; - /// 4 components vector of low precision unsigned integer numbers. - typedef tvec4<uint, aligned_lowp> aligned_lowp_uvec4; + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef vec<4, int, packed_lowp> packed_lowp_ivec4; - /// 4 components vector of high precision bool numbers. - typedef tvec4<bool, aligned_highp> aligned_highp_bvec4; + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_highp> packed_highp_uvec4; - /// 4 components vector of medium precision bool numbers. - typedef tvec4<bool, aligned_mediump> aligned_mediump_bvec4; + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_mediump> packed_mediump_uvec4; - /// 4 components vector of low precision bool numbers. - typedef tvec4<bool, aligned_lowp> aligned_lowp_bvec4; + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef vec<4, uint, packed_lowp> packed_lowp_uvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_highp> packed_highp_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_mediump> packed_mediump_bvec4; + + /// 4 components vector tightly packed in memory of bool values. + typedef vec<4, bool, packed_lowp> packed_lowp_bvec4; // -- default -- @@ -241,23 +404,43 @@ namespace glm typedef aligned_lowp_vec2 aligned_vec2; typedef aligned_lowp_vec3 aligned_vec3; typedef aligned_lowp_vec4 aligned_vec4; + typedef packed_lowp_vec1 packed_vec1; + typedef packed_lowp_vec2 packed_vec2; + typedef packed_lowp_vec3 packed_vec3; + typedef packed_lowp_vec4 packed_vec4; #elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) typedef aligned_mediump_vec1 aligned_vec1; typedef aligned_mediump_vec2 aligned_vec2; typedef aligned_mediump_vec3 aligned_vec3; typedef aligned_mediump_vec4 aligned_vec4; + typedef packed_mediump_vec1 packed_vec1; + typedef packed_mediump_vec2 packed_vec2; + typedef packed_mediump_vec3 packed_vec3; + typedef packed_mediump_vec4 packed_vec4; #else //defined(GLM_PRECISION_HIGHP_FLOAT) - /// 1 component vector of floating-point numbers. + /// 1 component vector aligned in memory of single-precision floating-point numbers. typedef aligned_highp_vec1 aligned_vec1; - /// 2 components vector of floating-point numbers. + /// 2 components vector aligned in memory of single-precision floating-point numbers. typedef aligned_highp_vec2 aligned_vec2; - /// 3 components vector of floating-point numbers. + /// 3 components vector aligned in memory of single-precision floating-point numbers. typedef aligned_highp_vec3 aligned_vec3; - /// 4 components vector of floating-point numbers. + /// 4 components vector aligned in memory of single-precision floating-point numbers. typedef aligned_highp_vec4 aligned_vec4; + + /// 1 component vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec1 packed_vec1; + + /// 2 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec2 packed_vec2; + + /// 3 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec3 packed_vec3; + + /// 4 components vector tightly packed in memory of single-precision floating-point numbers. + typedef packed_highp_vec4 packed_vec4; #endif//GLM_PRECISION #if(defined(GLM_PRECISION_LOWP_DOUBLE)) @@ -265,23 +448,43 @@ namespace glm typedef aligned_lowp_dvec2 aligned_dvec2; typedef aligned_lowp_dvec3 aligned_dvec3; typedef aligned_lowp_dvec4 aligned_dvec4; + typedef packed_lowp_dvec1 packed_dvec1; + typedef packed_lowp_dvec2 packed_dvec2; + typedef packed_lowp_dvec3 packed_dvec3; + typedef packed_lowp_dvec4 packed_dvec4; #elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) typedef aligned_mediump_dvec1 aligned_dvec1; typedef aligned_mediump_dvec2 aligned_dvec2; typedef aligned_mediump_dvec3 aligned_dvec3; typedef aligned_mediump_dvec4 aligned_dvec4; + typedef packed_mediump_dvec1 packed_dvec1; + typedef packed_mediump_dvec2 packed_dvec2; + typedef packed_mediump_dvec3 packed_dvec3; + typedef packed_mediump_dvec4 packed_dvec4; #else //defined(GLM_PRECISION_HIGHP_DOUBLE) - /// 1 component vector of double-precision floating-point numbers. + /// 1 component vector aligned in memory of double-precision floating-point numbers. typedef aligned_highp_dvec1 aligned_dvec1; - /// 2 components vector of double-precision floating-point numbers. + /// 2 components vector aligned in memory of double-precision floating-point numbers. typedef aligned_highp_dvec2 aligned_dvec2; - /// 3 components vector of double-precision floating-point numbers. + /// 3 components vector aligned in memory of double-precision floating-point numbers. typedef aligned_highp_dvec3 aligned_dvec3; - /// 4 components vector of double-precision floating-point numbers. + /// 4 components vector aligned in memory of double-precision floating-point numbers. typedef aligned_highp_dvec4 aligned_dvec4; + + /// 1 component vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec1 packed_dvec1; + + /// 2 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec2 packed_dvec2; + + /// 3 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec3 packed_dvec3; + + /// 4 components vector tightly packed in memory of double-precision floating-point numbers. + typedef packed_highp_dvec4 packed_dvec4; #endif//GLM_PRECISION #if(defined(GLM_PRECISION_LOWP_INT)) @@ -295,17 +498,30 @@ namespace glm typedef aligned_mediump_ivec3 aligned_ivec3; typedef aligned_mediump_ivec4 aligned_ivec4; #else //defined(GLM_PRECISION_HIGHP_INT) - /// 1 component vector of signed integer numbers. + /// 1 component vector aligned in memory of signed integer numbers. typedef aligned_highp_ivec1 aligned_ivec1; - /// 2 components vector of signed integer numbers. + /// 2 components vector aligned in memory of signed integer numbers. typedef aligned_highp_ivec2 aligned_ivec2; - /// 3 components vector of signed integer numbers. + /// 3 components vector aligned in memory of signed integer numbers. typedef aligned_highp_ivec3 aligned_ivec3; - /// 4 components vector of signed integer numbers. + /// 4 components vector aligned in memory of signed integer numbers. typedef aligned_highp_ivec4 aligned_ivec4; + + /// 1 component vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec1 packed_ivec1; + + /// 2 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec2 packed_ivec2; + + /// 3 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec3 packed_ivec3; + + /// 4 components vector tightly packed in memory of signed integer numbers. + typedef packed_highp_ivec4 packed_ivec4; + #endif//GLM_PRECISION // -- Unsigned integer definition -- @@ -321,17 +537,29 @@ namespace glm typedef aligned_mediump_uvec3 aligned_uvec3; typedef aligned_mediump_uvec4 aligned_uvec4; #else //defined(GLM_PRECISION_HIGHP_UINT) - /// 1 component vector of unsigned integer numbers. + /// 1 component vector aligned in memory of unsigned integer numbers. typedef aligned_highp_uvec1 aligned_uvec1; - /// 2 components vector of unsigned integer numbers. + /// 2 components vector aligned in memory of unsigned integer numbers. typedef aligned_highp_uvec2 aligned_uvec2; - /// 3 components vector of unsigned integer numbers. + /// 3 components vector aligned in memory of unsigned integer numbers. typedef aligned_highp_uvec3 aligned_uvec3; - /// 4 components vector of unsigned integer numbers. + /// 4 components vector aligned in memory of unsigned integer numbers. typedef aligned_highp_uvec4 aligned_uvec4; + + /// 1 component vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec1 packed_uvec1; + + /// 2 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec2 packed_uvec2; + + /// 3 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec3 packed_uvec3; + + /// 4 components vector tightly packed in memory of unsigned integer numbers. + typedef packed_highp_uvec4 packed_uvec4; #endif//GLM_PRECISION #if(defined(GLM_PRECISION_LOWP_BOOL)) @@ -345,17 +573,29 @@ namespace glm typedef aligned_mediump_bvec3 aligned_bvec3; typedef aligned_mediump_bvec4 aligned_bvec4; #else //defined(GLM_PRECISION_HIGHP_BOOL) - /// 1 component vector of boolean. + /// 1 component vector aligned in memory of bool values. typedef aligned_highp_bvec1 aligned_bvec1; - /// 2 components vector of boolean. + /// 2 components vector aligned in memory of bool values. typedef aligned_highp_bvec2 aligned_bvec2; - /// 3 components vector of boolean. + /// 3 components vector aligned in memory of bool values. typedef aligned_highp_bvec3 aligned_bvec3; - /// 4 components vector of boolean. + /// 4 components vector aligned in memory of bool values. typedef aligned_highp_bvec4 aligned_bvec4; + + /// 1 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec1 packed_bvec1; + + /// 2 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec2 packed_bvec2; + + /// 3 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec3 packed_bvec3; + + /// 4 components vector tightly packed in memory of bool values. + typedef packed_highp_bvec4 packed_bvec4; #endif//GLM_PRECISION /// @} diff --git a/external/include/glm/gtc/type_precision.hpp b/external/include/glm/gtc/type_precision.hpp index a2dbb66..a4524fe 100644 --- a/external/include/glm/gtc/type_precision.hpp +++ b/external/include/glm/gtc/type_precision.hpp @@ -2,18 +2,17 @@ /// @file glm/gtc/type_precision.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtc_quaternion (dependence) /// /// @defgroup gtc_type_precision GLM_GTC_type_precision /// @ingroup gtc /// -/// @brief Defines specific C++-based precision types. -/// -/// @ref core_precision defines types based on GLSL's precision qualifiers. This -/// extension defines types based on explicitly-sized C++ data types. +/// Include <glm/gtc/type_precision.hpp> to use the features of this extension. +/// +/// Defines specific C++-based qualifier types. /// -/// <glm/gtc/type_precision.hpp> need to be included to use these functionalities. +/// @ref core_precision defines types based on GLSL's qualifier qualifiers. This +/// extension defines types based on explicitly-sized C++ data types. #pragma once @@ -40,128 +39,128 @@ namespace glm { /////////////////////////// - // Signed int vector types + // Signed int vector types /// @addtogroup gtc_type_precision /// @{ - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_int8; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_int16; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_int32; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_int64; - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_int8_t; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_int16_t; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_int32_t; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_int64_t; - /// Low precision 8 bit signed integer type. + /// Low qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 lowp_i8; - - /// Low precision 16 bit signed integer type. + + /// Low qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 lowp_i16; - /// Low precision 32 bit signed integer type. + /// Low qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 lowp_i32; - /// Low precision 64 bit signed integer type. + /// Low qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 lowp_i64; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_int8; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_int16; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_int32; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_int64; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_int8_t; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_int16_t; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_int32_t; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_int64_t; - /// Medium precision 8 bit signed integer type. + /// Medium qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 mediump_i8; - - /// Medium precision 16 bit signed integer type. + + /// Medium qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 mediump_i16; - /// Medium precision 32 bit signed integer type. + /// Medium qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 mediump_i32; - /// Medium precision 64 bit signed integer type. + /// Medium qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 mediump_i64; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_int8; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_int16; - /// High precision 32 bit signed integer type. + /// High qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 highp_int32; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_int64; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_int8_t; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_int16_t; @@ -169,31 +168,31 @@ namespace glm /// @see gtc_type_precision typedef detail::int32 highp_int32_t; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_int64_t; - /// High precision 8 bit signed integer type. + /// High qualifier 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 highp_i8; - - /// High precision 16 bit signed integer type. + + /// High qualifier 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 highp_i16; - /// High precision 32 bit signed integer type. + /// High qualifier 32 bit signed integer type. /// @see gtc_type_precision typedef detail::int32 highp_i32; - /// High precision 64 bit signed integer type. + /// High qualifier 64 bit signed integer type. /// @see gtc_type_precision typedef detail::int64 highp_i64; - + /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 int8; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 int16; @@ -215,7 +214,7 @@ namespace glm /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 int8_t; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 int16_t; @@ -232,7 +231,7 @@ namespace glm /// 8 bit signed integer type. /// @see gtc_type_precision typedef detail::int8 i8; - + /// 16 bit signed integer type. /// @see gtc_type_precision typedef detail::int16 i16; @@ -248,232 +247,232 @@ namespace glm /// 8 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i8, defaultp> i8vec1; - + typedef vec<1, i8, defaultp> i8vec1; + /// 8 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i8, defaultp> i8vec2; + typedef vec<2, i8, defaultp> i8vec2; /// 8 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i8, defaultp> i8vec3; + typedef vec<3, i8, defaultp> i8vec3; /// 8 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i8, defaultp> i8vec4; + typedef vec<4, i8, defaultp> i8vec4; /// 16 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i16, defaultp> i16vec1; - + typedef vec<1, i16, defaultp> i16vec1; + /// 16 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i16, defaultp> i16vec2; + typedef vec<2, i16, defaultp> i16vec2; /// 16 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i16, defaultp> i16vec3; + typedef vec<3, i16, defaultp> i16vec3; /// 16 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i16, defaultp> i16vec4; + typedef vec<4, i16, defaultp> i16vec4; /// 32 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i32, defaultp> i32vec1; - + typedef vec<1, i32, defaultp> i32vec1; + /// 32 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i32, defaultp> i32vec2; + typedef vec<2, i32, defaultp> i32vec2; /// 32 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i32, defaultp> i32vec3; + typedef vec<3, i32, defaultp> i32vec3; /// 32 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i32, defaultp> i32vec4; + typedef vec<4, i32, defaultp> i32vec4; /// 64 bit signed integer scalar type. /// @see gtc_type_precision - typedef tvec1<i64, defaultp> i64vec1; - + typedef vec<1, i64, defaultp> i64vec1; + /// 64 bit signed integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<i64, defaultp> i64vec2; + typedef vec<2, i64, defaultp> i64vec2; /// 64 bit signed integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<i64, defaultp> i64vec3; + typedef vec<3, i64, defaultp> i64vec3; /// 64 bit signed integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<i64, defaultp> i64vec4; + typedef vec<4, i64, defaultp> i64vec4; ///////////////////////////// // Unsigned int vector types - /// Low precision 8 bit unsigned integer type. + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_uint8; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_uint16; - /// Low precision 32 bit unsigned integer type. + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_uint32; - /// Low precision 64 bit unsigned integer type. + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_uint64; - /// Low precision 8 bit unsigned integer type. + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_uint8_t; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_uint16_t; - /// Low precision 32 bit unsigned integer type. + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_uint32_t; - /// Low precision 64 bit unsigned integer type. + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_uint64_t; - /// Low precision 8 bit unsigned integer type. + /// Low qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 lowp_u8; - - /// Low precision 16 bit unsigned integer type. + + /// Low qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 lowp_u16; - /// Low precision 32 bit unsigned integer type. + /// Low qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 lowp_u32; - /// Low precision 64 bit unsigned integer type. + /// Low qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 lowp_u64; - - /// Medium precision 8 bit unsigned integer type. + + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_uint8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_uint16; - /// Medium precision 32 bit unsigned integer type. + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_uint32; - /// Medium precision 64 bit unsigned integer type. + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_uint64; - /// Medium precision 8 bit unsigned integer type. + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_uint8_t; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_uint16_t; - /// Medium precision 32 bit unsigned integer type. + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_uint32_t; - /// Medium precision 64 bit unsigned integer type. + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_uint64_t; - /// Medium precision 8 bit unsigned integer type. + /// Medium qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 mediump_u8; - - /// Medium precision 16 bit unsigned integer type. + + /// Medium qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 mediump_u16; - /// Medium precision 32 bit unsigned integer type. + /// Medium qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 mediump_u32; - /// Medium precision 64 bit unsigned integer type. + /// Medium qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 mediump_u64; - - /// High precision 8 bit unsigned integer type. + + /// High qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_uint8; - - /// High precision 16 bit unsigned integer type. + + /// High qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_uint16; - /// High precision 32 bit unsigned integer type. + /// High qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_uint32; - /// High precision 64 bit unsigned integer type. + /// High qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_uint64; - /// High precision 8 bit unsigned integer type. + /// High qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_uint8_t; - - /// High precision 16 bit unsigned integer type. + + /// High qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_uint16_t; - /// High precision 32 bit unsigned integer type. + /// High qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_uint32_t; - /// High precision 64 bit unsigned integer type. + /// High qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_uint64_t; - /// High precision 8 bit unsigned integer type. + /// High qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 highp_u8; - - /// High precision 16 bit unsigned integer type. + + /// High qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 highp_u16; - /// High precision 32 bit unsigned integer type. + /// High qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 highp_u32; - /// High precision 64 bit unsigned integer type. + /// High qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 highp_u64; - /// Default precision 8 bit unsigned integer type. + /// Default qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 uint8; - - /// Default precision 16 bit unsigned integer type. + + /// Default qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 uint16; - /// Default precision 32 bit unsigned integer type. + /// Default qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 uint32; - /// Default precision 64 bit unsigned integer type. + /// Default qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 uint64; @@ -483,378 +482,385 @@ namespace glm using std::uint32_t; using std::uint64_t; #else - /// Default precision 8 bit unsigned integer type. + /// Default qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 uint8_t; - - /// Default precision 16 bit unsigned integer type. + + /// Default qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 uint16_t; - /// Default precision 32 bit unsigned integer type. + /// Default qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 uint32_t; - /// Default precision 64 bit unsigned integer type. + /// Default qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 uint64_t; #endif - /// Default precision 8 bit unsigned integer type. + /// Default qualifier 8 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint8 u8; - - /// Default precision 16 bit unsigned integer type. + + /// Default qualifier 16 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint16 u16; - /// Default precision 32 bit unsigned integer type. + /// Default qualifier 32 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint32 u32; - /// Default precision 64 bit unsigned integer type. + /// Default qualifier 64 bit unsigned integer type. /// @see gtc_type_precision typedef detail::uint64 u64; - /// Default precision 8 bit unsigned integer scalar type. + /// Default qualifier 8 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u8, defaultp> u8vec1; - - /// Default precision 8 bit unsigned integer vector of 2 components type. + typedef vec<1, u8, defaultp> u8vec1; + + /// Default qualifier 8 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u8, defaultp> u8vec2; + typedef vec<2, u8, defaultp> u8vec2; - /// Default precision 8 bit unsigned integer vector of 3 components type. + /// Default qualifier 8 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u8, defaultp> u8vec3; + typedef vec<3, u8, defaultp> u8vec3; - /// Default precision 8 bit unsigned integer vector of 4 components type. + /// Default qualifier 8 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u8, defaultp> u8vec4; + typedef vec<4, u8, defaultp> u8vec4; - /// Default precision 16 bit unsigned integer scalar type. + /// Default qualifier 16 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u16, defaultp> u16vec1; - - /// Default precision 16 bit unsigned integer vector of 2 components type. + typedef vec<1, u16, defaultp> u16vec1; + + /// Default qualifier 16 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u16, defaultp> u16vec2; + typedef vec<2, u16, defaultp> u16vec2; - /// Default precision 16 bit unsigned integer vector of 3 components type. + /// Default qualifier 16 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u16, defaultp> u16vec3; + typedef vec<3, u16, defaultp> u16vec3; - /// Default precision 16 bit unsigned integer vector of 4 components type. + /// Default qualifier 16 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u16, defaultp> u16vec4; + typedef vec<4, u16, defaultp> u16vec4; - /// Default precision 32 bit unsigned integer scalar type. + /// Default qualifier 32 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u32, defaultp> u32vec1; - - /// Default precision 32 bit unsigned integer vector of 2 components type. + typedef vec<1, u32, defaultp> u32vec1; + + /// Default qualifier 32 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u32, defaultp> u32vec2; + typedef vec<2, u32, defaultp> u32vec2; - /// Default precision 32 bit unsigned integer vector of 3 components type. + /// Default qualifier 32 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u32, defaultp> u32vec3; + typedef vec<3, u32, defaultp> u32vec3; - /// Default precision 32 bit unsigned integer vector of 4 components type. + /// Default qualifier 32 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u32, defaultp> u32vec4; + typedef vec<4, u32, defaultp> u32vec4; - /// Default precision 64 bit unsigned integer scalar type. + /// Default qualifier 64 bit unsigned integer scalar type. /// @see gtc_type_precision - typedef tvec1<u64, defaultp> u64vec1; - - /// Default precision 64 bit unsigned integer vector of 2 components type. + typedef vec<1, u64, defaultp> u64vec1; + + /// Default qualifier 64 bit unsigned integer vector of 2 components type. /// @see gtc_type_precision - typedef tvec2<u64, defaultp> u64vec2; + typedef vec<2, u64, defaultp> u64vec2; - /// Default precision 64 bit unsigned integer vector of 3 components type. + /// Default qualifier 64 bit unsigned integer vector of 3 components type. /// @see gtc_type_precision - typedef tvec3<u64, defaultp> u64vec3; + typedef vec<3, u64, defaultp> u64vec3; - /// Default precision 64 bit unsigned integer vector of 4 components type. + /// Default qualifier 64 bit unsigned integer vector of 4 components type. /// @see gtc_type_precision - typedef tvec4<u64, defaultp> u64vec4; + typedef vec<4, u64, defaultp> u64vec4; ////////////////////// // Float vector types - /// 32 bit single-precision floating-point scalar. + /// 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 float32; - /// 64 bit double-precision floating-point scalar. - /// @see gtc_type_precision - typedef detail::float64 float64; - - - /// 32 bit single-precision floating-point scalar. + /// 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef detail::float32 float32_t; - /// 64 bit double-precision floating-point scalar. - /// @see gtc_type_precision - typedef detail::float64 float64_t; - - - /// 32 bit single-precision floating-point scalar. + /// 32 bit single-qualifier floating-point scalar. /// @see gtc_type_precision typedef float32 f32; - /// 64 bit double-precision floating-point scalar. - /// @see gtc_type_precision - typedef float64 f64; +# ifndef GLM_FORCE_SINGLE_ONLY + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef detail::float64 float64; + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef detail::float64 float64_t; - /// Single-precision floating-point vector of 1 component. - /// @see gtc_type_precision - typedef tvec1<float, defaultp> fvec1; + /// 64 bit double-qualifier floating-point scalar. + /// @see gtc_type_precision + typedef float64 f64; +# endif//GLM_FORCE_SINGLE_ONLY - /// Single-precision floating-point vector of 2 components. + /// Single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec2<float, defaultp> fvec2; + typedef vec<1, float, defaultp> fvec1; - /// Single-precision floating-point vector of 3 components. + /// Single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec3<float, defaultp> fvec3; + typedef vec<2, float, defaultp> fvec2; - /// Single-precision floating-point vector of 4 components. + /// Single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec4<float, defaultp> fvec4; + typedef vec<3, float, defaultp> fvec3; - - /// Single-precision floating-point vector of 1 component. + /// Single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec1<f32, defaultp> f32vec1; + typedef vec<4, float, defaultp> fvec4; - /// Single-precision floating-point vector of 2 components. - /// @see gtc_type_precision - typedef tvec2<f32, defaultp> f32vec2; - /// Single-precision floating-point vector of 3 components. + /// Single-qualifier floating-point vector of 1 component. /// @see gtc_type_precision - typedef tvec3<f32, defaultp> f32vec3; + typedef vec<1, f32, defaultp> f32vec1; - /// Single-precision floating-point vector of 4 components. + /// Single-qualifier floating-point vector of 2 components. /// @see gtc_type_precision - typedef tvec4<f32, defaultp> f32vec4; - + typedef vec<2, f32, defaultp> f32vec2; - /// Double-precision floating-point vector of 1 component. + /// Single-qualifier floating-point vector of 3 components. /// @see gtc_type_precision - typedef tvec1<f64, defaultp> f64vec1; + typedef vec<3, f32, defaultp> f32vec3; - /// Double-precision floating-point vector of 2 components. + /// Single-qualifier floating-point vector of 4 components. /// @see gtc_type_precision - typedef tvec2<f64, defaultp> f64vec2; + typedef vec<4, f32, defaultp> f32vec4; - /// Double-precision floating-point vector of 3 components. - /// @see gtc_type_precision - typedef tvec3<f64, defaultp> f64vec3; +# ifndef GLM_FORCE_SINGLE_ONLY + /// Double-qualifier floating-point vector of 1 component. + /// @see gtc_type_precision + typedef vec<1, f64, defaultp> f64vec1; - /// Double-precision floating-point vector of 4 components. - /// @see gtc_type_precision - typedef tvec4<f64, defaultp> f64vec4; + /// Double-qualifier floating-point vector of 2 components. + /// @see gtc_type_precision + typedef vec<2, f64, defaultp> f64vec2; + + /// Double-qualifier floating-point vector of 3 components. + /// @see gtc_type_precision + typedef vec<3, f64, defaultp> f64vec3; + + /// Double-qualifier floating-point vector of 4 components. + /// @see gtc_type_precision + typedef vec<4, f64, defaultp> f64vec4; +# endif//GLM_FORCE_SINGLE_ONLY ////////////////////// - // Float matrix types + // Float matrix types - /// Single-precision floating-point 1x1 matrix. + /// Single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f32> fmat1; - /// Single-precision floating-point 2x2 matrix. + /// Single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, defaultp> fmat2; + typedef mat<2, 2, f32, defaultp> fmat2; - /// Single-precision floating-point 3x3 matrix. + /// Single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, defaultp> fmat3; + typedef mat<3, 3, f32, defaultp> fmat3; - /// Single-precision floating-point 4x4 matrix. + /// Single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, defaultp> fmat4; + typedef mat<4, 4, f32, defaultp> fmat4; - /// Single-precision floating-point 1x1 matrix. + /// Single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f32 fmat1x1; - /// Single-precision floating-point 2x2 matrix. + /// Single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, defaultp> fmat2x2; + typedef mat<2, 2, f32, defaultp> fmat2x2; - /// Single-precision floating-point 2x3 matrix. + /// Single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, defaultp> fmat2x3; + typedef mat<2, 3, f32, defaultp> fmat2x3; - /// Single-precision floating-point 2x4 matrix. + /// Single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, defaultp> fmat2x4; + typedef mat<2, 4, f32, defaultp> fmat2x4; - /// Single-precision floating-point 3x2 matrix. + /// Single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, defaultp> fmat3x2; + typedef mat<3, 2, f32, defaultp> fmat3x2; - /// Single-precision floating-point 3x3 matrix. + /// Single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, defaultp> fmat3x3; + typedef mat<3, 3, f32, defaultp> fmat3x3; - /// Single-precision floating-point 3x4 matrix. + /// Single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, defaultp> fmat3x4; + typedef mat<3, 4, f32, defaultp> fmat3x4; - /// Single-precision floating-point 4x2 matrix. + /// Single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, defaultp> fmat4x2; + typedef mat<4, 2, f32, defaultp> fmat4x2; - /// Single-precision floating-point 4x3 matrix. + /// Single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, defaultp> fmat4x3; + typedef mat<4, 3, f32, defaultp> fmat4x3; - /// Single-precision floating-point 4x4 matrix. + /// Single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, defaultp> fmat4x4; + typedef mat<4, 4, f32, defaultp> fmat4x4; - /// Single-precision floating-point 1x1 matrix. + /// Single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f32, defaultp> f32mat1; - /// Single-precision floating-point 2x2 matrix. + /// Single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, defaultp> f32mat2; + typedef mat<2, 2, f32, defaultp> f32mat2; - /// Single-precision floating-point 3x3 matrix. + /// Single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, defaultp> f32mat3; + typedef mat<3, 3, f32, defaultp> f32mat3; - /// Single-precision floating-point 4x4 matrix. + /// Single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, defaultp> f32mat4; + typedef mat<4, 4, f32, defaultp> f32mat4; - /// Single-precision floating-point 1x1 matrix. + /// Single-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f32 f32mat1x1; - /// Single-precision floating-point 2x2 matrix. + /// Single-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f32, defaultp> f32mat2x2; + typedef mat<2, 2, f32, defaultp> f32mat2x2; - /// Single-precision floating-point 2x3 matrix. + /// Single-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f32, defaultp> f32mat2x3; + typedef mat<2, 3, f32, defaultp> f32mat2x3; - /// Single-precision floating-point 2x4 matrix. + /// Single-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f32, defaultp> f32mat2x4; + typedef mat<2, 4, f32, defaultp> f32mat2x4; - /// Single-precision floating-point 3x2 matrix. + /// Single-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f32, defaultp> f32mat3x2; + typedef mat<3, 2, f32, defaultp> f32mat3x2; - /// Single-precision floating-point 3x3 matrix. + /// Single-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f32, defaultp> f32mat3x3; + typedef mat<3, 3, f32, defaultp> f32mat3x3; - /// Single-precision floating-point 3x4 matrix. + /// Single-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f32, defaultp> f32mat3x4; + typedef mat<3, 4, f32, defaultp> f32mat3x4; - /// Single-precision floating-point 4x2 matrix. + /// Single-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f32, defaultp> f32mat4x2; + typedef mat<4, 2, f32, defaultp> f32mat4x2; - /// Single-precision floating-point 4x3 matrix. + /// Single-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f32, defaultp> f32mat4x3; + typedef mat<4, 3, f32, defaultp> f32mat4x3; - /// Single-precision floating-point 4x4 matrix. + /// Single-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f32, defaultp> f32mat4x4; + typedef mat<4, 4, f32, defaultp> f32mat4x4; - /// Double-precision floating-point 1x1 matrix. +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef detail::tmat1x1<f64, defaultp> f64mat1; - /// Double-precision floating-point 2x2 matrix. + /// Double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f64, defaultp> f64mat2; + typedef mat<2, 2, f64, defaultp> f64mat2; - /// Double-precision floating-point 3x3 matrix. + /// Double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f64, defaultp> f64mat3; + typedef mat<3, 3, f64, defaultp> f64mat3; - /// Double-precision floating-point 4x4 matrix. + /// Double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f64, defaultp> f64mat4; + typedef mat<4, 4, f64, defaultp> f64mat4; - /// Double-precision floating-point 1x1 matrix. + /// Double-qualifier floating-point 1x1 matrix. /// @see gtc_type_precision //typedef f64 f64mat1x1; - /// Double-precision floating-point 2x2 matrix. + /// Double-qualifier floating-point 2x2 matrix. /// @see gtc_type_precision - typedef tmat2x2<f64, defaultp> f64mat2x2; + typedef mat<2, 2, f64, defaultp> f64mat2x2; - /// Double-precision floating-point 2x3 matrix. + /// Double-qualifier floating-point 2x3 matrix. /// @see gtc_type_precision - typedef tmat2x3<f64, defaultp> f64mat2x3; + typedef mat<2, 3, f64, defaultp> f64mat2x3; - /// Double-precision floating-point 2x4 matrix. + /// Double-qualifier floating-point 2x4 matrix. /// @see gtc_type_precision - typedef tmat2x4<f64, defaultp> f64mat2x4; + typedef mat<2, 4, f64, defaultp> f64mat2x4; - /// Double-precision floating-point 3x2 matrix. + /// Double-qualifier floating-point 3x2 matrix. /// @see gtc_type_precision - typedef tmat3x2<f64, defaultp> f64mat3x2; + typedef mat<3, 2, f64, defaultp> f64mat3x2; - /// Double-precision floating-point 3x3 matrix. + /// Double-qualifier floating-point 3x3 matrix. /// @see gtc_type_precision - typedef tmat3x3<f64, defaultp> f64mat3x3; + typedef mat<3, 3, f64, defaultp> f64mat3x3; - /// Double-precision floating-point 3x4 matrix. + /// Double-qualifier floating-point 3x4 matrix. /// @see gtc_type_precision - typedef tmat3x4<f64, defaultp> f64mat3x4; + typedef mat<3, 4, f64, defaultp> f64mat3x4; - /// Double-precision floating-point 4x2 matrix. + /// Double-qualifier floating-point 4x2 matrix. /// @see gtc_type_precision - typedef tmat4x2<f64, defaultp> f64mat4x2; + typedef mat<4, 2, f64, defaultp> f64mat4x2; - /// Double-precision floating-point 4x3 matrix. + /// Double-qualifier floating-point 4x3 matrix. /// @see gtc_type_precision - typedef tmat4x3<f64, defaultp> f64mat4x3; + typedef mat<4, 3, f64, defaultp> f64mat4x3; - /// Double-precision floating-point 4x4 matrix. + /// Double-qualifier floating-point 4x4 matrix. /// @see gtc_type_precision - typedef tmat4x4<f64, defaultp> f64mat4x4; + typedef mat<4, 4, f64, defaultp> f64mat4x4; +# endif//GLM_FORCE_SINGLE_ONLY ////////////////////////// // Quaternion types - /// Single-precision floating-point quaternion. + /// Single-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f32, defaultp> f32quat; - /// Double-precision floating-point quaternion. +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point quaternion. /// @see gtc_type_precision typedef tquat<f64, defaultp> f64quat; +# endif//GLM_FORCE_SINGLE_ONLY + /// @} }//namespace glm diff --git a/external/include/glm/gtc/type_ptr.hpp b/external/include/glm/gtc/type_ptr.hpp index 008665e..5c15cc4 100644 --- a/external/include/glm/gtc/type_ptr.hpp +++ b/external/include/glm/gtc/type_ptr.hpp @@ -2,19 +2,20 @@ /// @file glm/gtc/type_ptr.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtc_quaternion (dependence) /// /// @defgroup gtc_type_ptr GLM_GTC_type_ptr /// @ingroup gtc /// -/// @brief Handles the interaction between pointers and vector, matrix types. +/// Include <glm/gtc/type_ptr.hpp> to use the features of this extension. +/// +/// Handles the interaction between pointers and vector, matrix types. /// /// This extension defines an overloaded function, glm::value_ptr, which /// takes any of the \ref core_template "core template types". It returns /// a pointer to the memory layout of the object. Matrix types store their values /// in column-major order. -/// +/// /// This is useful for uploading data to matrices or copying data to buffer objects. /// /// Example: @@ -29,12 +30,13 @@ /// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, glm::value_ptr(someMatrix)); /// @endcode /// -/// <glm/gtc/type_ptr.hpp> need to be included to use these functionalities. +/// <glm/gtc/type_ptr.hpp> need to be included to use the features of this extension. #pragma once // Dependency: #include "../gtc/quaternion.hpp" +#include "../gtc/vec1.hpp" #include "../vec2.hpp" #include "../vec3.hpp" #include "../vec4.hpp" @@ -61,82 +63,162 @@ namespace glm /// Return the constant address to the data of the input parameter. /// @see gtc_type_ptr template<typename genType> - GLM_FUNC_DECL typename genType::value_type const * value_ptr(genType const & vec); + GLM_FUNC_DECL typename genType::value_type const * value_ptr(genType const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<4, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<1, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<2, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<3, T, Q> const& v); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template <typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<4, T, Q> const& v); /// Build a vector from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tvec2<T, defaultp> make_vec2(T const * const ptr); + GLM_FUNC_DECL vec<2, T, defaultp> make_vec2(T const * const ptr); /// Build a vector from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tvec3<T, defaultp> make_vec3(T const * const ptr); + GLM_FUNC_DECL vec<3, T, defaultp> make_vec3(T const * const ptr); /// Build a vector from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tvec4<T, defaultp> make_vec4(T const * const ptr); + GLM_FUNC_DECL vec<4, T, defaultp> make_vec4(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat2x2<T, defaultp> make_mat2x2(T const * const ptr); + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2x2(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat2x3<T, defaultp> make_mat2x3(T const * const ptr); + GLM_FUNC_DECL mat<2, 3, T, defaultp> make_mat2x3(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat2x4<T, defaultp> make_mat2x4(T const * const ptr); + GLM_FUNC_DECL mat<2, 4, T, defaultp> make_mat2x4(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat3x2<T, defaultp> make_mat3x2(T const * const ptr); + GLM_FUNC_DECL mat<3, 2, T, defaultp> make_mat3x2(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat3x3<T, defaultp> make_mat3x3(T const * const ptr); + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3x3(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat3x4<T, defaultp> make_mat3x4(T const * const ptr); + GLM_FUNC_DECL mat<3, 4, T, defaultp> make_mat3x4(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat4x2<T, defaultp> make_mat4x2(T const * const ptr); + GLM_FUNC_DECL mat<4, 2, T, defaultp> make_mat4x2(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat4x3<T, defaultp> make_mat4x3(T const * const ptr); + GLM_FUNC_DECL mat<4, 3, T, defaultp> make_mat4x3(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> make_mat4x4(T const * const ptr); - + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4x4(T const * const ptr); + /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat2x2<T, defaultp> make_mat2(T const * const ptr); + GLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2(T const * const ptr); /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat3x3<T, defaultp> make_mat3(T const * const ptr); - + GLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3(T const * const ptr); + /// Build a matrix from a pointer. /// @see gtc_type_ptr template<typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> make_mat4(T const * const ptr); + GLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4(T const * const ptr); /// Build a quaternion from a pointer. /// @see gtc_type_ptr diff --git a/external/include/glm/gtc/type_ptr.inl b/external/include/glm/gtc/type_ptr.inl index 3aa6ae6..7a9e21e 100644 --- a/external/include/glm/gtc/type_ptr.inl +++ b/external/include/glm/gtc/type_ptr.inl @@ -8,437 +8,374 @@ namespace glm /// @addtogroup gtc_type_ptr /// @{ - /// Return the constant address to the data of the vector input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tvec2<T, P> const & vec - ) - { - return &(vec.x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(vec<2, T, Q> const& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(vec<2, T, Q>& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const * value_ptr(vec<3, T, Q> const& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(vec<3, T, Q>& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(vec<4, T, Q> const& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(vec<4, T, Q>& v) + { + return &(v.x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 2, T, Q>& m) + { + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 3, T, Q> const& m) + { + return &(m[0].x); } - //! Return the address to the data of the vector input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tvec2<T, P> & vec - ) - { - return &(vec.x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 3, T, Q>& m) + { + return &(m[0].x); } - /// Return the constant address to the data of the vector input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tvec3<T, P> const & vec - ) - { - return &(vec.x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 4, T, Q> const& m) + { + return &(m[0].x); } - //! Return the address to the data of the vector input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tvec3<T, P> & vec - ) - { - return &(vec.x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 4, T, Q>& m) + { + return &(m[0].x); } - - /// Return the constant address to the data of the vector input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tvec4<T, P> const & vec - ) - { - return &(vec.x); + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 3, T, Q> const& m) + { + return &(m[0].x); } - //! Return the address to the data of the vector input. - //! From GLM_GTC_type_ptr extension. - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tvec4<T, P> & vec - ) - { - return &(vec.x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 3, T, Q>& m) + { + return &(m[0].x); } - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat2x2<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat2x2<T, P> & mat - ) - { - return &(mat[0].x); + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 2, T, Q> const& m) + { + return &(m[0].x); } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat3x3<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat3x3<T, P> & mat - ) - { - return &(mat[0].x); + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 2, T, Q>& m) + { + return &(m[0].x); } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat4x4<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - //! From GLM_GTC_type_ptr extension. - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat4x4<T, P> & mat - ) - { - return &(mat[0].x); - } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat2x3<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat2x3<T, P> & mat - ) - { - return &(mat[0].x); - } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat3x2<T, P> const & mat - ) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 4, T, Q> const& m) { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat3x2<T, P> & mat - ) - { - return &(mat[0].x); - } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat2x4<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat2x4<T, P> & mat - ) + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<2, 4, T, Q>& m) { - return &(mat[0].x); - } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat4x2<T, P> const & mat - ) - { - return &(mat[0].x); - } - - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat4x2<T, P> & mat - ) + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 2, T, Q> const& m) + { + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<4, 2, T, Q>& m) + { + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 4, T, Q> const& m) + { + return &(m[0].x); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(mat<3, 4, T, Q>& m) { - return &(mat[0].x); + return &(m[0].x); } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat3x4<T, P> const & mat - ) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 3, T, Q> const& m) { - return &(mat[0].x); - } + return &(m[0].x); + } - //! Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tmat3x4<T, P> & mat - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T * value_ptr(mat<4, 3, T, Q>& m) { - return &(mat[0].x); - } - - /// Return the constant address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tmat4x3<T, P> const & mat - ) - { - return &(mat[0].x); - } - - /// Return the address to the data of the matrix input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr(tmat4x3<T, P> & mat) - { - return &(mat[0].x); + return &(m[0].x); } - /// Return the constant address to the data of the input parameter. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T const * value_ptr - ( - tquat<T, P> const & q - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T const * value_ptr(tquat<T, Q> const& q) { return &(q[0]); } - /// Return the address to the data of the quaternion input. - /// @see gtc_type_ptr - template<typename T, precision P> - GLM_FUNC_QUALIFIER T * value_ptr - ( - tquat<T, P> & q - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T* value_ptr(tquat<T, Q>& q) { return &(q[0]); } - /// Build a vector from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tvec2<T, defaultp> make_vec2(T const * const ptr) + template <typename T, qualifier Q> + inline vec<1, T, Q> make_vec1(vec<1, T, Q> const& v) { - tvec2<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tvec2<T, defaultp>)); + return v; + } + + template <typename T, qualifier Q> + inline vec<1, T, Q> make_vec1(vec<2, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<1, T, Q> make_vec1(vec<3, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<1, T, Q> make_vec1(vec<4, T, Q> const& v) + { + return vec<1, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<2, T, Q> make_vec2(vec<1, T, Q> const& v) + { + return vec<2, T, Q>(v.x, static_cast<T>(0)); + } + + template <typename T, qualifier Q> + inline vec<2, T, Q> make_vec2(vec<2, T, Q> const& v) + { + return v; + } + + template <typename T, qualifier Q> + inline vec<2, T, Q> make_vec2(vec<3, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<2, T, Q> make_vec2(vec<4, T, Q> const& v) + { + return vec<2, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<3, T, Q> make_vec3(vec<1, T, Q> const& v) + { + return vec<3, T, Q>(v.x, static_cast<T>(0), static_cast<T>(0)); + } + + template <typename T, qualifier Q> + inline vec<3, T, Q> make_vec3(vec<2, T, Q> const& v) + { + return vec<3, T, Q>(v.x, v.y, static_cast<T>(0)); + } + + template <typename T, qualifier Q> + inline vec<3, T, Q> make_vec3(vec<3, T, Q> const& v) + { + return v; + } + + template <typename T, qualifier Q> + inline vec<3, T, Q> make_vec3(vec<4, T, Q> const& v) + { + return vec<3, T, Q>(v); + } + + template <typename T, qualifier Q> + inline vec<4, T, Q> make_vec4(vec<1, T, Q> const& v) + { + return vec<4, T, Q>(v.x, static_cast<T>(0), static_cast<T>(0), static_cast<T>(1)); + } + + template <typename T, qualifier Q> + inline vec<4, T, Q> make_vec4(vec<2, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, static_cast<T>(0), static_cast<T>(1)); + } + + template <typename T, qualifier Q> + inline vec<4, T, Q> make_vec4(vec<3, T, Q> const& v) + { + return vec<4, T, Q>(v.x, v.y, v.z, static_cast<T>(1)); + } + + template <typename T, qualifier Q> + inline vec<4, T, Q> make_vec4(vec<4, T, Q> const& v) + { + return v; + } + + template<typename T> + GLM_FUNC_QUALIFIER vec<2, T, defaultp> make_vec2(T const *const ptr) + { + vec<2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<2, T, defaultp>)); return Result; } - /// Build a vector from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tvec3<T, defaultp> make_vec3(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER vec<3, T, defaultp> make_vec3(T const *const ptr) { - tvec3<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tvec3<T, defaultp>)); + vec<3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<3, T, defaultp>)); return Result; } - /// Build a vector from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tvec4<T, defaultp> make_vec4(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER vec<4, T, defaultp> make_vec4(T const *const ptr) { - tvec4<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tvec4<T, defaultp>)); + vec<4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(vec<4, T, defaultp>)); return Result; } - /// Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat2x2<T, defaultp> make_mat2x2(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2x2(T const *const ptr) { - tmat2x2<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat2x2<T, defaultp>)); + mat<2, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 2, T, defaultp>)); return Result; } - /// Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat2x3<T, defaultp> make_mat2x3(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<2, 3, T, defaultp> make_mat2x3(T const *const ptr) { - tmat2x3<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat2x3<T, defaultp>)); + mat<2, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 3, T, defaultp>)); return Result; } - /// Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat2x4<T, defaultp> make_mat2x4(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<2, 4, T, defaultp> make_mat2x4(T const *const ptr) { - tmat2x4<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat2x4<T, defaultp>)); + mat<2, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<2, 4, T, defaultp>)); return Result; } - /// Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat3x2<T, defaultp> make_mat3x2(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<3, 2, T, defaultp> make_mat3x2(T const *const ptr) { - tmat3x2<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat3x2<T, defaultp>)); + mat<3, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 2, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat3x3<T, defaultp> make_mat3x3(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3x3(T const *const ptr) { - tmat3x3<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat3x3<T, defaultp>)); + mat<3, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 3, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat3x4<T, defaultp> make_mat3x4(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<3, 4, T, defaultp> make_mat3x4(T const *const ptr) { - tmat3x4<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat3x4<T, defaultp>)); + mat<3, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<3, 4, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat4x2<T, defaultp> make_mat4x2(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 2, T, defaultp> make_mat4x2(T const *const ptr) { - tmat4x2<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat4x2<T, defaultp>)); + mat<4, 2, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 2, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat4x3<T, defaultp> make_mat4x3(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 3, T, defaultp> make_mat4x3(T const *const ptr) { - tmat4x3<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat4x3<T, defaultp>)); + mat<4, 3, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 3, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> make_mat4x4(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4x4(T const *const ptr) { - tmat4x4<T, defaultp> Result; - memcpy(value_ptr(Result), ptr, sizeof(tmat4x4<T, defaultp>)); + mat<4, 4, T, defaultp> Result; + memcpy(value_ptr(Result), ptr, sizeof(mat<4, 4, T, defaultp>)); return Result; } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat2x2<T, defaultp> make_mat2(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2(T const *const ptr) { return make_mat2x2(ptr); } - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat3x3<T, defaultp> make_mat3(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3(T const *const ptr) { return make_mat3x3(ptr); } - - //! Build a matrix from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> make_mat4(T const * const ptr) + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4(T const *const ptr) { return make_mat4x4(ptr); } - //! Build a quaternion from a pointer. - /// @see gtc_type_ptr - template <typename T> - GLM_FUNC_QUALIFIER tquat<T, defaultp> make_quat(T const * const ptr) + template<typename T> + GLM_FUNC_QUALIFIER tquat<T, defaultp> make_quat(T const *const ptr) { tquat<T, defaultp> Result; memcpy(value_ptr(Result), ptr, sizeof(tquat<T, defaultp>)); diff --git a/external/include/glm/gtc/ulp.hpp b/external/include/glm/gtc/ulp.hpp index a82fa4e..4ed48d5 100644 --- a/external/include/glm/gtc/ulp.hpp +++ b/external/include/glm/gtc/ulp.hpp @@ -6,17 +6,19 @@ /// @defgroup gtc_ulp GLM_GTC_ulp /// @ingroup gtc /// -/// @brief Allow the measurement of the accuracy of a function against a reference -/// implementation. This extension works on floating-point data and provide results +/// Include <glm/gtc/ulp.hpp> to use the features of this extension. +/// +/// Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results /// in ULP. -/// <glm/gtc/ulp.hpp> need to be included to use these features. #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" #include "../detail/type_int.hpp" +#include "../detail/compute_vector_relational.hpp" #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTC_ulp extension included") @@ -29,34 +31,34 @@ namespace glm /// Return the next ULP value(s) after the input value(s). /// @see gtc_ulp - template <typename genType> - GLM_FUNC_DECL genType next_float(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType next_float(genType const& x); /// Return the previous ULP value(s) before the input value(s). /// @see gtc_ulp - template <typename genType> - GLM_FUNC_DECL genType prev_float(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType prev_float(genType const& x); /// Return the value(s) ULP distance after the input value(s). /// @see gtc_ulp - template <typename genType> - GLM_FUNC_DECL genType next_float(genType const & x, uint const & Distance); + template<typename genType> + GLM_FUNC_DECL genType next_float(genType const& x, uint const& Distance); /// Return the value(s) ULP distance before the input value(s). /// @see gtc_ulp - template <typename genType> - GLM_FUNC_DECL genType prev_float(genType const & x, uint const & Distance); - + template<typename genType> + GLM_FUNC_DECL genType prev_float(genType const& x, uint const& Distance); + /// Return the distance in the number of ULP between 2 scalars. /// @see gtc_ulp - template <typename T> - GLM_FUNC_DECL uint float_distance(T const & x, T const & y); + template<typename T> + GLM_FUNC_DECL uint float_distance(T const& x, T const& y); /// Return the distance in the number of ULP between 2 vectors. /// @see gtc_ulp - template<typename T, template<typename> class vecType> - GLM_FUNC_DECL vecType<uint> float_distance(vecType<T> const & x, vecType<T> const & y); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, uint, Q> float_distance(vec<2, T, Q> const& x, vec<2, T, Q> const& y); + /// @} }// namespace glm diff --git a/external/include/glm/gtc/ulp.inl b/external/include/glm/gtc/ulp.inl index 54c914a..620be36 100644 --- a/external/include/glm/gtc/ulp.inl +++ b/external/include/glm/gtc/ulp.inl @@ -9,6 +9,7 @@ /// is preserved. #include "../detail/type_int.hpp" +#include "epsilon.hpp" #include <cmath> #include <cfloat> #include <limits> @@ -78,33 +79,42 @@ namespace detail ix = hx&0x7fffffff; // |x| iy = hy&0x7fffffff; // |y| - if((ix>0x7f800000) || // x is nan - (iy>0x7f800000)) // y is nan + if((ix>0x7f800000) || // x is nan + (iy>0x7f800000)) // y is nan return x+y; - if(x==y) return y; // x=y, return y - if(ix==0) { // x == 0 + if(compute_equal<float>::call(x, y)) + return y; // x=y, return y + if(ix==0) + { // x == 0 GLM_SET_FLOAT_WORD(x,(hy&0x80000000)|1);// return +-minsubnormal t = x*x; - if(t==x) return t; else return x; // raise underflow flag + if(detail::compute_equal<float>::call(t, x)) + return t; + else + return x; // raise underflow flag } - if(hx>=0) { // x > 0 - if(hx>hy) { // x > y, x -= ulp + if(hx>=0) + { // x > 0 + if(hx>hy) // x > y, x -= ulp hx -= 1; - } else { // x < y, x += ulp + else // x < y, x += ulp hx += 1; - } - } else { // x < 0 - if(hy>=0||hx>hy){ // x < y, x -= ulp + } + else + { // x < 0 + if(hy>=0||hx>hy) // x < y, x -= ulp hx -= 1; - } else { // x > y, x += ulp + else // x > y, x += ulp hx += 1; - } } hy = hx&0x7f800000; - if(hy>=0x7f800000) return x+x; // overflow - if(hy<0x00800000) { // underflow + if(hy>=0x7f800000) + return x+x; // overflow + if(hy<0x00800000) // underflow + { t = x*x; - if(t!=x) { // raise underflow flag + if(!detail::compute_equal<float>::call(t, x)) + { // raise underflow flag GLM_SET_FLOAT_WORD(y,hx); return y; } @@ -121,27 +131,32 @@ namespace detail GLM_EXTRACT_WORDS(hx, lx, x); GLM_EXTRACT_WORDS(hy, ly, y); - ix = hx & 0x7fffffff; // |x| - iy = hy & 0x7fffffff; // |y| + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| - if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || // x is nan - ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) // y is nan + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || // x is nan + ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) // y is nan return x+y; - if(x==y) return y; // x=y, return y - if((ix|lx)==0) { // x == 0 - GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal + if(detail::compute_equal<double>::call(x, y)) + return y; // x=y, return y + if((ix|lx)==0) + { // x == 0 + GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal t = x*x; - if(t==x) return t; else return x; // raise underflow flag + if(detail::compute_equal<double>::call(t, x)) + return t; + else + return x; // raise underflow flag } - if(hx>=0) { // x > 0 - if(hx>hy||((hx==hy)&&(lx>ly))) { // x > y, x -= ulp + if(hx>=0) { // x > 0 + if(hx>hy||((hx==hy)&&(lx>ly))) { // x > y, x -= ulp if(lx==0) hx -= 1; lx -= 1; } else { // x < y, x += ulp lx += 1; if(lx==0) hx += 1; } - } else { // x < 0 + } else { // x < 0 if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){// x < y, x -= ulp if(lx==0) hx -= 1; lx -= 1; @@ -151,10 +166,13 @@ namespace detail } } hy = hx&0x7ff00000; - if(hy>=0x7ff00000) return x+x; // overflow - if(hy<0x00100000) { // underflow + if(hy>=0x7ff00000) + return x+x; // overflow + if(hy<0x00100000) + { // underflow t = x*x; - if(t!=x) { // raise underflow flag + if(!detail::compute_equal<double>::call(t, x)) + { // raise underflow flag GLM_INSERT_WORDS(y,hx,lx); return y; } @@ -171,8 +189,8 @@ namespace detail namespace glm { - template <> - GLM_FUNC_QUALIFIER float next_float(float const & x) + template<> + GLM_FUNC_QUALIFIER float next_float(float const& x) { # if GLM_HAS_CXX11_STL return std::nextafter(x, std::numeric_limits<float>::max()); @@ -185,8 +203,8 @@ namespace glm # endif } - template <> - GLM_FUNC_QUALIFIER double next_float(double const & x) + template<> + GLM_FUNC_QUALIFIER double next_float(double const& x) { # if GLM_HAS_CXX11_STL return std::nextafter(x, std::numeric_limits<double>::max()); @@ -199,16 +217,16 @@ namespace glm # endif } - template<typename T, precision P, template<typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> next_float(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> next_float(vec<L, T, Q> const& x) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = next_float(x[i]); return Result; } - GLM_FUNC_QUALIFIER float prev_float(float const & x) + GLM_FUNC_QUALIFIER float prev_float(float const& x) { # if GLM_HAS_CXX11_STL return std::nextafter(x, std::numeric_limits<float>::min()); @@ -221,7 +239,7 @@ namespace glm # endif } - GLM_FUNC_QUALIFIER double prev_float(double const & x) + GLM_FUNC_QUALIFIER double prev_float(double const& x) { # if GLM_HAS_CXX11_STL return std::nextafter(x, std::numeric_limits<double>::min()); @@ -234,17 +252,17 @@ namespace glm # endif } - template<typename T, precision P, template<typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> prev_float(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> prev_float(vec<L, T, Q> const& x) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = prev_float(x[i]); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps) + template<typename T> + GLM_FUNC_QUALIFIER T next_float(T const& x, uint const& ulps) { T temp = x; for(uint i = 0; i < ulps; ++i) @@ -252,17 +270,17 @@ namespace glm return temp; } - template<typename T, precision P, template<typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> next_float(vecType<T, P> const & x, vecType<uint, P> const & ulps) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> next_float(vec<L, T, Q> const& x, vec<L, uint, Q> const& ulps) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = next_float(x[i], ulps[i]); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps) + template<typename T> + GLM_FUNC_QUALIFIER T prev_float(T const& x, uint const& ulps) { T temp = x; for(uint i = 0; i < ulps; ++i) @@ -270,24 +288,24 @@ namespace glm return temp; } - template<typename T, precision P, template<typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> prev_float(vecType<T, P> const & x, vecType<uint, P> const & ulps) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> prev_float(vec<L, T, Q> const& x, vec<L, uint, Q> const& ulps) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = prev_float(x[i], ulps[i]); return Result; } - template <typename T> - GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y) + template<typename T> + GLM_FUNC_QUALIFIER uint float_distance(T const& x, T const& y) { uint ulp = 0; if(x < y) { T temp = x; - while(temp != y)// && ulp < std::numeric_limits<std::size_t>::max()) + while(glm::epsilonNotEqual(temp, y, glm::epsilon<T>()))// && ulp < std::numeric_limits<std::size_t>::max()) { ++ulp; temp = next_float(temp); @@ -296,7 +314,7 @@ namespace glm else if(y < x) { T temp = y; - while(temp != x)// && ulp < std::numeric_limits<std::size_t>::max()) + while(glm::epsilonNotEqual(temp, x, glm::epsilon<T>()))// && ulp < std::numeric_limits<std::size_t>::max()) { ++ulp; temp = next_float(temp); @@ -310,10 +328,10 @@ namespace glm return ulp; } - template<typename T, precision P, template<typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<uint, P> float_distance(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, uint, Q> float_distance(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { - vecType<uint, P> Result(uninitialize); + vec<L, uint, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = float_distance(x[i], y[i]); return Result; diff --git a/external/include/glm/gtc/vec1.hpp b/external/include/glm/gtc/vec1.hpp index f84ff97..44da3ab 100644 --- a/external/include/glm/gtc/vec1.hpp +++ b/external/include/glm/gtc/vec1.hpp @@ -5,160 +5,18 @@ /// /// @defgroup gtc_vec1 GLM_GTC_vec1 /// @ingroup gtc -/// -/// @brief Add vec1, ivec1, uvec1 and bvec1 types. -/// <glm/gtc/vec1.hpp> need to be included to use these functionalities. +/// +/// Include <glm/gtc/vec1.hpp> to use the features of this extension. +/// +/// Add vec1, ivec1, uvec1 and bvec1 types. #pragma once // Dependency: -#include "../glm.hpp" -#include "../detail/type_vec1.hpp" +#include "../ext/vec1.hpp" #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTC_vec1 extension included") #endif -namespace glm -{ - /// 1 component vector of high precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef highp_vec1_t highp_vec1; - - /// 1 component vector of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef mediump_vec1_t mediump_vec1; - - /// 1 component vector of low precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef lowp_vec1_t lowp_vec1; - - /// 1 component vector of high precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef highp_dvec1_t highp_dvec1; - - /// 1 component vector of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef mediump_dvec1_t mediump_dvec1; - - /// 1 component vector of low precision floating-point numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef lowp_dvec1_t lowp_dvec1; - - /// 1 component vector of high precision signed integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef highp_ivec1_t highp_ivec1; - - /// 1 component vector of medium precision signed integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef mediump_ivec1_t mediump_ivec1; - - /// 1 component vector of low precision signed integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef lowp_ivec1_t lowp_ivec1; - - /// 1 component vector of high precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef highp_uvec1_t highp_uvec1; - - /// 1 component vector of medium precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef mediump_uvec1_t mediump_uvec1; - - /// 1 component vector of low precision unsigned integer numbers. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef lowp_uvec1_t lowp_uvec1; - - /// 1 component vector of high precision boolean. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef highp_bvec1_t highp_bvec1; - - /// 1 component vector of medium precision boolean. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef mediump_bvec1_t mediump_bvec1; - - /// 1 component vector of low precision boolean. - /// There is no guarantee on the actual precision. - /// @see gtc_vec1 extension. - typedef lowp_bvec1_t lowp_bvec1; - - ////////////////////////// - // vec1 definition - -#if(defined(GLM_PRECISION_HIGHP_BOOL)) - typedef highp_bvec1 bvec1; -#elif(defined(GLM_PRECISION_MEDIUMP_BOOL)) - typedef mediump_bvec1 bvec1; -#elif(defined(GLM_PRECISION_LOWP_BOOL)) - typedef lowp_bvec1 bvec1; -#else - /// 1 component vector of boolean. - /// @see gtc_vec1 extension. - typedef highp_bvec1 bvec1; -#endif//GLM_PRECISION - -#if(defined(GLM_PRECISION_HIGHP_FLOAT)) - typedef highp_vec1 vec1; -#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) - typedef mediump_vec1 vec1; -#elif(defined(GLM_PRECISION_LOWP_FLOAT)) - typedef lowp_vec1 vec1; -#else - /// 1 component vector of floating-point numbers. - /// @see gtc_vec1 extension. - typedef highp_vec1 vec1; -#endif//GLM_PRECISION - -#if(defined(GLM_PRECISION_HIGHP_DOUBLE)) - typedef highp_dvec1 dvec1; -#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE)) - typedef mediump_dvec1 dvec1; -#elif(defined(GLM_PRECISION_LOWP_DOUBLE)) - typedef lowp_dvec1 dvec1; -#else - /// 1 component vector of floating-point numbers. - /// @see gtc_vec1 extension. - typedef highp_dvec1 dvec1; -#endif//GLM_PRECISION - -#if(defined(GLM_PRECISION_HIGHP_INT)) - typedef highp_ivec1 ivec1; -#elif(defined(GLM_PRECISION_MEDIUMP_INT)) - typedef mediump_ivec1 ivec1; -#elif(defined(GLM_PRECISION_LOWP_INT)) - typedef lowp_ivec1 ivec1; -#else - /// 1 component vector of signed integer numbers. - /// @see gtc_vec1 extension. - typedef highp_ivec1 ivec1; -#endif//GLM_PRECISION - -#if(defined(GLM_PRECISION_HIGHP_UINT)) - typedef highp_uvec1 uvec1; -#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) - typedef mediump_uvec1 uvec1; -#elif(defined(GLM_PRECISION_LOWP_UINT)) - typedef lowp_uvec1 uvec1; -#else - /// 1 component vector of unsigned integer numbers. - /// @see gtc_vec1 extension. - typedef highp_uvec1 uvec1; -#endif//GLM_PRECISION - -}// namespace glm - #include "vec1.inl" diff --git a/external/include/glm/gtx/associated_min_max.hpp b/external/include/glm/gtx/associated_min_max.hpp index eb9d721..42ac2eb 100644 --- a/external/include/glm/gtx/associated_min_max.hpp +++ b/external/include/glm/gtx/associated_min_max.hpp @@ -6,15 +6,20 @@ /// /// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max /// @ingroup gtx -/// +/// +/// Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. +/// /// @brief Min and max functions that return associated values not the compared onces. -/// <glm/gtx/associated_min_max.hpp> need to be included to use these functionalities. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_associated_min_max extension included") #endif @@ -26,29 +31,29 @@ namespace glm /// Minimum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P> + template<typename T, typename U, qualifier Q> GLM_FUNC_DECL U associatedMin(T x, U a, T y, U b); /// Minimum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL tvec2<U, P> associatedMin( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<2, U, Q> associatedMin( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b); /// Minimum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - T x, const vecType<U, P>& a, - T y, const vecType<U, P>& b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + T x, const vec<L, U, Q>& a, + T y, const vec<L, U, Q>& b); /// Minimum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b); /// Minimum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max @@ -60,11 +65,11 @@ namespace glm /// Minimum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c); /// Minimum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max @@ -77,30 +82,30 @@ namespace glm /// Minimum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c, - vecType<T, P> const & w, vecType<U, P> const & d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c, + vec<L, T, Q> const& w, vec<L, U, Q> const& d); /// Minimum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c, - T w, vecType<U, P> const & d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c, + T w, vec<L, U, Q> const& d); /// Minimum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMin( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c, - vecType<T, P> const & w, U d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMin( + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c, + vec<L, T, Q> const& w, U d); /// Maximum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max @@ -109,24 +114,24 @@ namespace glm /// Maximum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL tvec2<U, P> associatedMax( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<2, U, Q> associatedMax( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b); /// Maximum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> associatedMax( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> associatedMax( + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b); /// Maximum comparison between 2 variables and returns 2 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b); /// Maximum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max @@ -138,27 +143,27 @@ namespace glm /// Maximum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c); /// Maximum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> associatedMax( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> associatedMax( + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c); /// Maximum comparison between 3 variables and returns 3 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c); /// Maximum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max @@ -171,30 +176,30 @@ namespace glm /// Maximum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c, - vecType<T, P> const & w, vecType<U, P> const & d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c, + vec<L, T, Q> const& w, vec<L, U, Q> const& d); /// Maximum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c, - T w, vecType<U, P> const & d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c, + T w, vec<L, U, Q> const& d); /// Maximum comparison between 4 variables and returns 4 associated variable values /// @see gtx_associated_min_max - template<typename T, typename U, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<U, P> associatedMax( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c, - vecType<T, P> const & w, U d); + template<length_t L, typename T, typename U, qualifier Q> + GLM_FUNC_DECL vec<L, U, Q> associatedMax( + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c, + vec<L, T, Q> const& w, U d); /// @} } //namespace glm diff --git a/external/include/glm/gtx/associated_min_max.inl b/external/include/glm/gtx/associated_min_max.inl index 6a57d48..d0666cc 100644 --- a/external/include/glm/gtx/associated_min_max.inl +++ b/external/include/glm/gtx/associated_min_max.inl @@ -4,46 +4,46 @@ namespace glm{ // Min comparison between 2 variables -template<typename T, typename U, precision P> +template<typename T, typename U, qualifier Q> GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b) { return x < y ? a : b; } -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER tvec2<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMin ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] < y[i] ? a[i] : b[i]; return Result; } -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - T x, const vecType<U, P>& a, - T y, const vecType<U, P>& b + T x, const vec<L, U, Q>& a, + T y, const vec<L, U, Q>& b ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x < y ? a[i] : b[i]; return Result; } -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] < y[i] ? a : b; return Result; @@ -62,15 +62,15 @@ GLM_FUNC_QUALIFIER U associatedMin return Result; } -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); return Result; @@ -95,16 +95,16 @@ GLM_FUNC_QUALIFIER U associatedMin } // Min comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c, - vecType<T, P> const & w, vecType<U, P> const & d + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c, + vec<L, T, Q> const& w, vec<L, U, Q> const& d ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { T Test1 = min(x[i], y[i]); @@ -117,19 +117,19 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMin } // Min comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c, - T w, vecType<U, P> const & d + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c, + T w, vec<L, U, Q> const& d ) { T Test1 = min(x, y); T Test2 = min(z, w); - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { U Result1 = x < y ? a[i] : b[i]; @@ -140,16 +140,16 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMin } // Min comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMin +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin ( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c, - vecType<T, P> const & w, U d + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c, + vec<L, T, Q> const& w, U d ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { T Test1 = min(x[i], y[i]); @@ -169,42 +169,42 @@ GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b) } // Max comparison between 2 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER tvec2<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMax ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] > y[i] ? a[i] : b[i]; return Result; } // Max comparison between 2 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<T, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax ( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x > y ? a[i] : b[i]; return Result; } // Max comparison between 2 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b ) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] > y[i] ? a : b; return Result; @@ -224,45 +224,45 @@ GLM_FUNC_QUALIFIER U associatedMax } // Max comparison between 3 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); return Result; } // Max comparison between 3 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<T, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax ( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); return Result; } // Max comparison between 3 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c ) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); return Result; @@ -287,16 +287,16 @@ GLM_FUNC_QUALIFIER U associatedMax } // Max comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - vecType<T, P> const & x, vecType<U, P> const & a, - vecType<T, P> const & y, vecType<U, P> const & b, - vecType<T, P> const & z, vecType<U, P> const & c, - vecType<T, P> const & w, vecType<U, P> const & d + vec<L, T, Q> const& x, vec<L, U, Q> const& a, + vec<L, T, Q> const& y, vec<L, U, Q> const& b, + vec<L, T, Q> const& z, vec<L, U, Q> const& c, + vec<L, T, Q> const& w, vec<L, U, Q> const& d ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { T Test1 = max(x[i], y[i]); @@ -309,19 +309,19 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMax } // Max comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - T x, vecType<U, P> const & a, - T y, vecType<U, P> const & b, - T z, vecType<U, P> const & c, - T w, vecType<U, P> const & d + T x, vec<L, U, Q> const& a, + T y, vec<L, U, Q> const& b, + T z, vec<L, U, Q> const& c, + T w, vec<L, U, Q> const& d ) { T Test1 = max(x, y); T Test2 = max(z, w); - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { U Result1 = x > y ? a[i] : b[i]; @@ -332,16 +332,16 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMax } // Max comparison between 4 variables -template<typename T, typename U, precision P, template <typename, precision> class vecType> -GLM_FUNC_QUALIFIER vecType<U, P> associatedMax +template<length_t L, typename T, typename U, qualifier Q> +GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax ( - vecType<T, P> const & x, U a, - vecType<T, P> const & y, U b, - vecType<T, P> const & z, U c, - vecType<T, P> const & w, U d + vec<L, T, Q> const& x, U a, + vec<L, T, Q> const& y, U b, + vec<L, T, Q> const& z, U c, + vec<L, T, Q> const& w, U d ) { - vecType<U, P> Result(uninitialize); + vec<L, U, Q> Result; for(length_t i = 0, n = Result.length(); i < n; ++i) { T Test1 = max(x[i], y[i]); diff --git a/external/include/glm/gtx/bit.hpp b/external/include/glm/gtx/bit.hpp index 17378f3..2eb4c26 100644 --- a/external/include/glm/gtx/bit.hpp +++ b/external/include/glm/gtx/bit.hpp @@ -2,20 +2,23 @@ /// @file glm/gtx/bit.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// /// @defgroup gtx_bit GLM_GTX_bit /// @ingroup gtx -/// -/// @brief Allow to perform bit operations on integer values -/// -/// <glm/gtx/bit.hpp> need to be included to use these functionalities. +/// +/// Include <glm/gtx/bit.hpp> to use the features of this extension. +/// +/// Allow to perform bit operations on integer values #pragma once // Dependencies #include "../gtc/bitfield.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_bit extension is deprecated, include GLM_GTC_bitfield and GLM_GTC_integer instead") #endif @@ -26,25 +29,25 @@ namespace glm /// @{ /// @see gtx_bit - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType highestBitValue(genIUType Value); /// @see gtx_bit - template <typename genIUType> + template<typename genIUType> GLM_FUNC_DECL genIUType lowestBitValue(genIUType Value); /// Find the highest bit set to 1 in a integer variable and return its value. /// /// @see gtx_bit - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> highestBitValue(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> highestBitValue(vec<L, T, Q> const& value); /// Return the power of two number which value is just higher the input value. /// Deprecated, use ceilPowerOfTwo from GTC_round instead /// /// @see gtc_round /// @see gtx_bit - template <typename genIUType> + template<typename genIUType> GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoAbove(genIUType Value); /// Return the power of two number which value is just higher the input value. @@ -52,15 +55,15 @@ namespace glm /// /// @see gtc_round /// @see gtx_bit - template <typename T, precision P, template <typename, precision> class vecType> - GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoAbove(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& value); /// Return the power of two number which value is just lower the input value. /// Deprecated, use floorPowerOfTwo from GTC_round instead /// /// @see gtc_round /// @see gtx_bit - template <typename genIUType> + template<typename genIUType> GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoBelow(genIUType Value); /// Return the power of two number which value is just lower the input value. @@ -68,15 +71,15 @@ namespace glm /// /// @see gtc_round /// @see gtx_bit - template <typename T, precision P, template <typename, precision> class vecType> - GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoBelow(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& value); /// Return the power of two number which value is the closet to the input value. /// Deprecated, use roundPowerOfTwo from GTC_round instead /// /// @see gtc_round /// @see gtx_bit - template <typename genIUType> + template<typename genIUType> GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoNearest(genIUType Value); /// Return the power of two number which value is the closet to the input value. @@ -84,8 +87,8 @@ namespace glm /// /// @see gtc_round /// @see gtx_bit - template <typename T, precision P, template <typename, precision> class vecType> - GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoNearest(vecType<T, P> const & value); + template<length_t L, typename T, qualifier Q> + GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& value); /// @} } //namespace glm diff --git a/external/include/glm/gtx/bit.inl b/external/include/glm/gtx/bit.inl index 10d5f7f..277aeaa 100644 --- a/external/include/glm/gtx/bit.inl +++ b/external/include/glm/gtx/bit.inl @@ -6,7 +6,7 @@ namespace glm /////////////////// // highestBitValue - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value) { genIUType tmp = Value; @@ -19,61 +19,61 @@ namespace glm return result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> highestBitValue(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> highestBitValue(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(highestBitValue, v); + return detail::functor1<L, T, T, Q>::call(highestBitValue, v); } /////////////////// // lowestBitValue - template <typename genIUType> + template<typename genIUType> GLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value) { return (Value & (~Value + 1)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> lowestBitValue(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> lowestBitValue(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(lowestBitValue, v); + return detail::functor1<L, T, T, Q>::call(lowestBitValue, v); } /////////////////// // powerOfTwoAbove - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value) { return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoAbove(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(powerOfTwoAbove, v); + return detail::functor1<L, T, T, Q>::call(powerOfTwoAbove, v); } /////////////////// // powerOfTwoBelow - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value) { return isPowerOfTwo(value) ? value : highestBitValue(value); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoBelow(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(powerOfTwoBelow, v); + return detail::functor1<L, T, T, Q>::call(powerOfTwoBelow, v); } ///////////////////// // powerOfTwoNearest - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value) { if(isPowerOfTwo(value)) @@ -84,10 +84,10 @@ namespace glm return (next - value) < (value - prev) ? next : prev; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoNearest(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& v) { - return detail::functor1<T, T, P, vecType>::call(powerOfTwoNearest, v); + return detail::functor1<L, T, T, Q>::call(powerOfTwoNearest, v); } }//namespace glm diff --git a/external/include/glm/gtx/closest_point.hpp b/external/include/glm/gtx/closest_point.hpp index 8d435b8..a788299 100644 --- a/external/include/glm/gtx/closest_point.hpp +++ b/external/include/glm/gtx/closest_point.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_closest_point GLM_GTX_closest_point /// @ingroup gtx /// -/// @brief Find the point on a straight line which is the closet of a point. +/// Include <glm/gtx/closest_point.hpp> to use the features of this extension. /// -/// <glm/gtx/closest_point.hpp> need to be included to use these functionalities. +/// Find the point on a straight line which is the closet of a point. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_closest_point extension included") #endif @@ -24,20 +28,20 @@ namespace glm /// @addtogroup gtx_closest_point /// @{ - /// Find the point on a straight line which is the closet of a point. + /// Find the point on a straight line which is the closet of a point. /// @see gtx_closest_point - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> closestPointOnLine( - tvec3<T, P> const & point, - tvec3<T, P> const & a, - tvec3<T, P> const & b); - - /// 2d lines work as well - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> closestPointOnLine( - tvec2<T, P> const & point, - tvec2<T, P> const & a, - tvec2<T, P> const & b); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> closestPointOnLine( + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b); + + /// 2d lines work as well + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> closestPointOnLine( + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b); /// @} }// namespace glm diff --git a/external/include/glm/gtx/closest_point.inl b/external/include/glm/gtx/closest_point.inl index ccda9ab..26d1e38 100644 --- a/external/include/glm/gtx/closest_point.inl +++ b/external/include/glm/gtx/closest_point.inl @@ -3,44 +3,44 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> closestPointOnLine + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> closestPointOnLine ( - tvec3<T, P> const & point, - tvec3<T, P> const & a, - tvec3<T, P> const & b + vec<3, T, Q> const& point, + vec<3, T, Q> const& a, + vec<3, T, Q> const& b ) { T LineLength = distance(a, b); - tvec3<T, P> Vector = point - a; - tvec3<T, P> LineDirection = (b - a) / LineLength; + vec<3, T, Q> Vector = point - a; + vec<3, T, Q> LineDirection = (b - a) / LineLength; - // Project Vector3 to LineDirection to get the distance of point from a + // Project Vector to LineDirection to get the distance of point from a T Distance = dot(Vector, LineDirection); if(Distance <= T(0)) return a; if(Distance >= LineLength) return b; return a + LineDirection * Distance; } - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> closestPointOnLine + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> closestPointOnLine ( - tvec2<T, P> const & point, - tvec2<T, P> const & a, - tvec2<T, P> const & b + vec<2, T, Q> const& point, + vec<2, T, Q> const& a, + vec<2, T, Q> const& b ) { T LineLength = distance(a, b); - tvec2<T, P> Vector = point - a; - tvec2<T, P> LineDirection = (b - a) / LineLength; + vec<2, T, Q> Vector = point - a; + vec<2, T, Q> LineDirection = (b - a) / LineLength; - // Project Vector3 to LineDirection to get the distance of point from a - T Distance = dot(Vector3, LineDirection); + // Project Vector to LineDirection to get the distance of point from a + T Distance = dot(Vector, LineDirection); if(Distance <= T(0)) return a; if(Distance >= LineLength) return b; return a + LineDirection * Distance; } - + }//namespace glm diff --git a/external/include/glm/gtx/color_encoding.hpp b/external/include/glm/gtx/color_encoding.hpp new file mode 100644 index 0000000..b57b3be --- /dev/null +++ b/external/include/glm/gtx/color_encoding.hpp @@ -0,0 +1,50 @@ +/// @ref gtx_color_encoding +/// @file glm/gtx/color_encoding.hpp +/// +/// @see core (dependence) +/// @see gtx_color_encoding (dependence) +/// +/// @defgroup gtx_color_encoding GLM_GTX_color_encoding +/// @ingroup gtx +/// +/// Include <glm/gtx/color_encoding.hpp> to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../vec3.hpp" +#include <limits> + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTC_color_encoding extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_color_encoding + /// @{ + + /// Convert a linear sRGB color to D65 YUV. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a linear sRGB color to D50 YUV. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB); + + /// Convert a D65 YUV color to linear sRGB. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ); + + /// Convert a D65 YUV color to D50 YUV. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ); + + /// @} +} //namespace glm + +#include "color_encoding.inl" diff --git a/external/include/glm/gtx/color_encoding.inl b/external/include/glm/gtx/color_encoding.inl new file mode 100644 index 0000000..8dca67b --- /dev/null +++ b/external/include/glm/gtx/color_encoding.inl @@ -0,0 +1,46 @@ +/// @ref gtx_color_encoding +/// @file glm/gtx/color_encoding.inl + +namespace glm +{ + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.490f, 0.17697f, 0.2f); + vec<3, T, Q> const N(0.31f, 0.8124f, 0.01063f); + vec<3, T, Q> const O(0.490f, 0.01f, 0.99f); + + return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast<T>(5.650675255693055f); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB) + { + vec<3, T, Q> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f); + vec<3, T, Q> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f); + vec<3, T, Q> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f); + + return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB; + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(0.41847f, -0.091169f, 0.0009209f); + vec<3, T, Q> const N(-0.15866f, 0.25243f, 0.015708f); + vec<3, T, Q> const O(0.0009209f, -0.0025498f, 0.1786f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ) + { + vec<3, T, Q> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f); + vec<3, T, Q> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f); + vec<3, T, Q> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f); + + return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ; + } + +}//namespace glm diff --git a/external/include/glm/gtx/color_space.hpp b/external/include/glm/gtx/color_space.hpp index 9ff08dc..9e95eb3 100644 --- a/external/include/glm/gtx/color_space.hpp +++ b/external/include/glm/gtx/color_space.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_color_space GLM_GTX_color_space /// @ingroup gtx /// -/// @brief Related to RGB to HSV conversions and operations. +/// Include <glm/gtx/color_space.hpp> to use the features of this extension. /// -/// <glm/gtx/color_space.hpp> need to be included to use these functionalities. +/// Related to RGB to HSV conversions and operations. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_color_space extension included") #endif @@ -26,41 +30,41 @@ namespace glm /// Converts a color from HSV color space to its color in RGB color space. /// @see gtx_color_space - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rgbColor( - tvec3<T, P> const & hsvValue); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rgbColor( + vec<3, T, Q> const& hsvValue); /// Converts a color from RGB color space to its color in HSV color space. /// @see gtx_color_space - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> hsvColor( - tvec3<T, P> const & rgbValue); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> hsvColor( + vec<3, T, Q> const& rgbValue); + /// Build a saturation matrix. /// @see gtx_color_space - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> saturation( + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> saturation( T const s); /// Modify the saturation of a color. /// @see gtx_color_space - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> saturation( + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> saturation( T const s, - tvec3<T, P> const & color); - + vec<3, T, Q> const& color); + /// Modify the saturation of a color. /// @see gtx_color_space - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> saturation( + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> saturation( T const s, - tvec4<T, P> const & color); - + vec<4, T, Q> const& color); + /// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. /// @see gtx_color_space - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL T luminosity( - tvec3<T, P> const & color); + vec<3, T, Q> const& color); /// @} }//namespace glm diff --git a/external/include/glm/gtx/color_space.inl b/external/include/glm/gtx/color_space.inl index e7cd58d..ff82395 100644 --- a/external/include/glm/gtx/color_space.inl +++ b/external/include/glm/gtx/color_space.inl @@ -3,19 +3,19 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rgbColor(const tvec3<T, P>& hsvColor) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rgbColor(const vec<3, T, Q>& hsvColor) { - tvec3<T, P> hsv = hsvColor; - tvec3<T, P> rgbColor; + vec<3, T, Q> hsv = hsvColor; + vec<3, T, Q> rgbColor; if(hsv.y == static_cast<T>(0)) // achromatic (grey) - rgbColor = tvec3<T, P>(hsv.z); + rgbColor = vec<3, T, Q>(hsv.z); else { - T sector = floor(hsv.x / T(60)); - T frac = (hsv.x / T(60)) - sector; + T sector = floor(hsv.x * (T(1) / T(60))); + T frac = (hsv.x * (T(1) / T(60))) - sector; // factorial part of h T o = hsv.z * (T(1) - hsv.y); T p = hsv.z * (T(1) - hsv.y * frac); @@ -45,13 +45,13 @@ namespace glm rgbColor.b = hsv.z; break; case 4: - rgbColor.r = q; - rgbColor.g = o; + rgbColor.r = q; + rgbColor.g = o; rgbColor.b = hsv.z; break; case 5: - rgbColor.r = hsv.z; - rgbColor.g = o; + rgbColor.r = hsv.z; + rgbColor.g = o; rgbColor.b = p; break; } @@ -60,19 +60,19 @@ namespace glm return rgbColor; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> hsvColor(const tvec3<T, P>& rgbColor) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> hsvColor(const vec<3, T, Q>& rgbColor) { - tvec3<T, P> hsv = rgbColor; + vec<3, T, Q> hsv = rgbColor; float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); float Delta = Max - Min; - hsv.z = Max; + hsv.z = Max; if(Max != static_cast<T>(0)) { - hsv.y = Delta / hsv.z; + hsv.y = Delta / hsv.z; T h = static_cast<T>(0); if(rgbColor.r == Max) @@ -85,7 +85,7 @@ namespace glm // between magenta & cyan h = static_cast<T>(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; - if(h < T(0)) + if(h < T(0)) hsv.x = h + T(360); else hsv.x = h; @@ -100,14 +100,14 @@ namespace glm return hsv; } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> saturation(T const s) + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> saturation(T const s) { - tvec3<T, defaultp> rgbw = tvec3<T, defaultp>(T(0.2126), T(0.7152), T(0.0722)); + vec<3, T, defaultp> rgbw = vec<3, T, defaultp>(T(0.2126), T(0.7152), T(0.0722)); - tvec3<T, defaultp> const col((T(1) - s) * rgbw); + vec<3, T, defaultp> const col((T(1) - s) * rgbw); - tmat4x4<T, defaultp> result(T(1)); + mat<4, 4, T, defaultp> result(T(1)); result[0][0] = col.x + s; result[0][1] = col.x; result[0][2] = col.x; @@ -117,25 +117,26 @@ namespace glm result[2][0] = col.z; result[2][1] = col.z; result[2][2] = col.z + s; + return result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> saturation(const T s, const tvec3<T, P>& color) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> saturation(const T s, const vec<3, T, Q>& color) { - return tvec3<T, P>(saturation(s) * tvec4<T, P>(color, T(0))); + return vec<3, T, Q>(saturation(s) * vec<4, T, Q>(color, T(0))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> saturation(const T s, const tvec4<T, P>& color) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> saturation(const T s, const vec<4, T, Q>& color) { return saturation(s) * color; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T luminosity(const tvec3<T, P>& color) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T luminosity(const vec<3, T, Q>& color) { - const tvec3<T, P> tmp = tvec3<T, P>(0.33, 0.59, 0.11); + const vec<3, T, Q> tmp = vec<3, T, Q>(0.33, 0.59, 0.11); return dot(color, tmp); } }//namespace glm diff --git a/external/include/glm/gtx/color_space_YCoCg.hpp b/external/include/glm/gtx/color_space_YCoCg.hpp index 428ca6d..e82cbd8 100644 --- a/external/include/glm/gtx/color_space_YCoCg.hpp +++ b/external/include/glm/gtx/color_space_YCoCg.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg /// @ingroup gtx /// -/// @brief RGB to YCoCg conversions and operations +/// Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension. /// -/// <glm/gtx/color_space_YCoCg.hpp> need to be included to use these functionalities. +/// RGB to YCoCg conversions and operations #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_color_space_YCoCg extension included") #endif @@ -26,29 +30,29 @@ namespace glm /// Convert a color from RGB color space to YCoCg color space. /// @see gtx_color_space_YCoCg - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rgb2YCoCg( - tvec3<T, P> const & rgbColor); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCg( + vec<3, T, Q> const& rgbColor); /// Convert a color from YCoCg color space to RGB color space. /// @see gtx_color_space_YCoCg - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> YCoCg2rgb( - tvec3<T, P> const & YCoCgColor); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> YCoCg2rgb( + vec<3, T, Q> const& YCoCgColor); /// Convert a color from RGB color space to YCoCgR color space. /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" /// @see gtx_color_space_YCoCg - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rgb2YCoCgR( - tvec3<T, P> const & rgbColor); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCgR( + vec<3, T, Q> const& rgbColor); /// Convert a color from YCoCgR color space to RGB color space. /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" /// @see gtx_color_space_YCoCg - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> YCoCgR2rgb( - tvec3<T, P> const & YCoCgColor); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> YCoCgR2rgb( + vec<3, T, Q> const& YCoCgColor); /// @} }//namespace glm diff --git a/external/include/glm/gtx/color_space_YCoCg.inl b/external/include/glm/gtx/color_space_YCoCg.inl index 1ca2e5b..105a576 100644 --- a/external/include/glm/gtx/color_space_YCoCg.inl +++ b/external/include/glm/gtx/color_space_YCoCg.inl @@ -3,70 +3,70 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCg + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg ( - tvec3<T, P> const & rgbColor + vec<3, T, Q> const& rgbColor ) { - tvec3<T, P> result; + vec<3, T, Q> result; result.x/*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4); result.y/*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2); result.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4); return result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> YCoCg2rgb + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb ( - tvec3<T, P> const & YCoCgColor + vec<3, T, Q> const& YCoCgColor ) { - tvec3<T, P> result; + vec<3, T, Q> result; result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; result.g = YCoCgColor.x + YCoCgColor.z; result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; return result; } - template <typename T, precision P, bool isInteger> + template<typename T, qualifier Q, bool isInteger> class compute_YCoCgR { public: - static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR ( - tvec3<T, P> const & rgbColor + vec<3, T, Q> const& rgbColor ) { - tvec3<T, P> result; - result.x/*Y */ = rgbColor.g / T(2) + (rgbColor.r + rgbColor.b) / T(4); + vec<3, T, Q> result; + result.x/*Y */ = rgbColor.g * static_cast<T>(0.5) + (rgbColor.r + rgbColor.b) * static_cast<T>(0.25); result.y/*Co*/ = rgbColor.r - rgbColor.b; - result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / T(2); + result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast<T>(0.5); return result; } - static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb ( - tvec3<T, P> const & YCoCgRColor + vec<3, T, Q> const& YCoCgRColor ) { - tvec3<T, P> result; - T tmp = YCoCgRColor.x - (YCoCgRColor.z / T(2)); + vec<3, T, Q> result; + T tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast<T>(0.5)); result.g = YCoCgRColor.z + tmp; - result.b = tmp - (YCoCgRColor.y / T(2)); + result.b = tmp - (YCoCgRColor.y * static_cast<T>(0.5)); result.r = result.b + YCoCgRColor.y; return result; } }; - template <typename T, precision P> - class compute_YCoCgR<T, P, true> { + template<typename T, qualifier Q> + class compute_YCoCgR<T, Q, true> { public: - static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR + static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR ( - tvec3<T, P> const & rgbColor + vec<3, T, Q> const& rgbColor ) { - tvec3<T, P> result; + vec<3, T, Q> result; result.y/*Co*/ = rgbColor.r - rgbColor.b; T tmp = rgbColor.b + (result.y >> 1); result.z/*Cg*/ = rgbColor.g - tmp; @@ -74,12 +74,12 @@ namespace glm return result; } - static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb + static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb ( - tvec3<T, P> const & YCoCgRColor + vec<3, T, Q> const& YCoCgRColor ) { - tvec3<T, P> result; + vec<3, T, Q> result; T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1); result.g = YCoCgRColor.z + tmp; result.b = tmp - (YCoCgRColor.y >> 1); @@ -88,21 +88,21 @@ namespace glm } }; - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR ( - tvec3<T, P> const & rgbColor + vec<3, T, Q> const& rgbColor ) { - return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor); + return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb ( - tvec3<T, P> const & YCoCgRColor + vec<3, T, Q> const& YCoCgRColor ) { - return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor); + return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor); } }//namespace glm diff --git a/external/include/glm/gtx/common.hpp b/external/include/glm/gtx/common.hpp index 6533a54..6eadf48 100644 --- a/external/include/glm/gtx/common.hpp +++ b/external/include/glm/gtx/common.hpp @@ -2,14 +2,13 @@ /// @file glm/gtx/common.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// /// @defgroup gtx_common GLM_GTX_common /// @ingroup gtx /// -/// @brief Provide functions to increase the compatibility with Cg and HLSL languages +/// Include <glm/gtx/common.hpp> to use the features of this extension. /// -/// <glm/gtx/common.hpp> need to be included to use these functionalities. +/// @brief Provide functions to increase the compatibility with Cg and HLSL languages #pragma once @@ -19,6 +18,10 @@ #include "../vec4.hpp" #include "../gtc/vec1.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_common extension included") #endif @@ -31,21 +34,41 @@ namespace glm /// Returns true if x is a denormalized number /// Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format. /// This format is less precise but can represent values closer to zero. - /// + /// /// @tparam genType Floating-point scalar or vector types. /// /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> - template <typename genType> - GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const & x); + template<typename genType> + GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const& x); /// Similar to 'mod' but with a different rounding and integer support. /// Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)' - /// + /// /// @see <a href="http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod">GLSL mod vs HLSL fmod</a> /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fmod(vecType<T, P> const & v); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fmod(vec<L, T, Q> const& v); + + /// Returns whether vector components values are within an interval. A open interval excludes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template <length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max); + + /// Returns whether vector components values are within an interval. A closed interval includes its endpoints, and is denoted with square brackets. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see ext_vector_relational + template <length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max); /// @} }//namespace glm diff --git a/external/include/glm/gtx/common.inl b/external/include/glm/gtx/common.inl index 6c9cb65..158eabe 100644 --- a/external/include/glm/gtx/common.inl +++ b/external/include/glm/gtx/common.inl @@ -2,89 +2,91 @@ /// @file glm/gtx/common.inl #include <cmath> +#include "../gtc/epsilon.hpp" +#include "../gtc/constants.hpp" namespace glm{ namespace detail { - template <typename T, precision P, template <class, precision> class vecType, bool isFloat = true> + template<length_t L, typename T, qualifier Q, bool isFloat = true> struct compute_fmod { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { - return detail::functor2<T, P, vecType>::call(std::fmod, a, b); + return detail::functor2<L, T, Q>::call(std::fmod, a, b); } }; - template <typename T, precision P, template <class, precision> class vecType> - struct compute_fmod<T, P, vecType, false> + template<length_t L, typename T, qualifier Q> + struct compute_fmod<L, T, Q, false> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b) { return a % b; } }; }//namespace detail - template <typename T> - GLM_FUNC_QUALIFIER bool isdenormal(T const & x) + template<typename T> + GLM_FUNC_QUALIFIER bool isdenormal(T const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs"); # if GLM_HAS_CXX11_STL return std::fpclassify(x) == FP_SUBNORMAL; # else - return x != static_cast<T>(0) && std::fabs(x) < std::numeric_limits<T>::min(); + return epsilonNotEqual(x, static_cast<T>(0), epsilon<T>()) && std::fabs(x) < std::numeric_limits<T>::min(); # endif } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tvec1<T, P>::bool_type isdenormal + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename vec<1, T, Q>::bool_type isdenormal ( - tvec1<T, P> const & x + vec<1, T, Q> const& x ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs"); - return typename tvec1<T, P>::bool_type( + return typename vec<1, T, Q>::bool_type( isdenormal(x.x)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tvec2<T, P>::bool_type isdenormal + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename vec<2, T, Q>::bool_type isdenormal ( - tvec2<T, P> const & x + vec<2, T, Q> const& x ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs"); - return typename tvec2<T, P>::bool_type( + return typename vec<2, T, Q>::bool_type( isdenormal(x.x), isdenormal(x.y)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tvec3<T, P>::bool_type isdenormal + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename vec<3, T, Q>::bool_type isdenormal ( - tvec3<T, P> const & x + vec<3, T, Q> const& x ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs"); - return typename tvec3<T, P>::bool_type( + return typename vec<3, T, Q>::bool_type( isdenormal(x.x), isdenormal(x.y), isdenormal(x.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tvec4<T, P>::bool_type isdenormal + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename vec<4, T, Q>::bool_type isdenormal ( - tvec4<T, P> const & x + vec<4, T, Q> const& x ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs"); - return typename tvec4<T, P>::bool_type( + return typename vec<4, T, Q>::bool_type( isdenormal(x.x), isdenormal(x.y), isdenormal(x.z), @@ -92,21 +94,33 @@ namespace detail } // fmod - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fmod(genType x, genType y) { - return fmod(tvec1<genType>(x), y).x; + return fmod(vec<1, genType>(x), y).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fmod(vecType<T, P> const & x, T y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, T y) { - return detail::compute_fmod<T, P, vecType, std::numeric_limits<T>::is_iec559>::call(x, vecType<T, P>(y)); + return detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, vec<L, T, Q>(y)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fmod(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { - return detail::compute_fmod<T, P, vecType, std::numeric_limits<T>::is_iec559>::call(x, y); + return detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, y); + } + + template <length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max) + { + return greaterThan(Value, Min) && lessThan(Value, Max); + } + + template <length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max) + { + return greaterThanEqual(Value, Min) && lessThanEqual(Value, Max); } }//namespace glm diff --git a/external/include/glm/gtx/compatibility.hpp b/external/include/glm/gtx/compatibility.hpp index 9f4819a..e5b6039 100644 --- a/external/include/glm/gtx/compatibility.hpp +++ b/external/include/glm/gtx/compatibility.hpp @@ -2,14 +2,13 @@ /// @file glm/gtx/compatibility.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// /// @defgroup gtx_compatibility GLM_GTX_compatibility /// @ingroup gtx /// -/// @brief Provide functions to increase the compatibility with Cg and HLSL languages +/// Include <glm/gtx/compatibility.hpp> to use the features of this extension. /// -/// <glm/gtx/compatibility.hpp> need to be included to use these functionalities. +/// Provide functions to increase the compatibility with Cg and HLSL languages #pragma once @@ -17,6 +16,10 @@ #include "../glm.hpp" #include "../gtc/quaternion.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_compatibility extension included") #endif @@ -35,94 +38,94 @@ namespace glm /// @addtogroup gtx_compatibility /// @{ - template <typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> lerp(const tvec2<T, P>& x, const tvec2<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> lerp(const tvec3<T, P>& x, const tvec3<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> lerp(const tvec4<T, P>& x, const tvec4<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> lerp(const tvec2<T, P>& x, const tvec2<T, P>& y, const tvec2<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> lerp(const tvec3<T, P>& x, const tvec3<T, P>& y, const tvec3<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> lerp(const tvec4<T, P>& x, const tvec4<T, P>& y, const tvec4<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, const vec<2, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, const vec<3, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, const vec<4, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> saturate(const tvec2<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> saturate(const tvec3<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> saturate(const tvec4<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> saturate(const vec<2, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> saturate(const vec<3, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> saturate(const vec<4, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> atan2(const tvec2<T, P>& x, const tvec2<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> atan2(const tvec3<T, P>& x, const tvec3<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> atan2(const tvec4<T, P>& x, const tvec4<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> atan2(const vec<2, T, Q>& x, const vec<2, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> atan2(const vec<3, T, Q>& x, const vec<3, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> atan2(const vec<4, T, Q>& x, const vec<4, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) - template <typename genType> GLM_FUNC_DECL bool isfinite(genType const & x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_DECL tvec1<bool, P> isfinite(const tvec1<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_DECL tvec2<bool, P> isfinite(const tvec2<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_DECL tvec3<bool, P> isfinite(const tvec3<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) - template <typename T, precision P> GLM_FUNC_DECL tvec4<bool, P> isfinite(const tvec4<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template<typename genType> GLM_FUNC_DECL bool isfinite(genType const& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_DECL vec<1, bool, Q> isfinite(const vec<1, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_DECL vec<2, bool, Q> isfinite(const vec<2, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_DECL vec<3, bool, Q> isfinite(const vec<3, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template<typename T, qualifier Q> GLM_FUNC_DECL vec<4, bool, Q> isfinite(const vec<4, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) typedef bool bool1; //!< \brief boolean type with 1 component. (From GLM_GTX_compatibility extension) - typedef tvec2<bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension) - typedef tvec3<bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension) - typedef tvec4<bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension) + typedef vec<2, bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension) typedef bool bool1x1; //!< \brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) - typedef tmat2x2<bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat2x3<bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat2x4<bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat3x2<bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat3x3<bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat3x4<bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat4x2<bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat4x3<bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat4x4<bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) typedef int int1; //!< \brief integer vector with 1 component. (From GLM_GTX_compatibility extension) - typedef tvec2<int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension) - typedef tvec3<int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension) - typedef tvec4<int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension) + typedef vec<2, int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension) typedef int int1x1; //!< \brief integer matrix with 1 component. (From GLM_GTX_compatibility extension) - typedef tmat2x2<int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat2x3<int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat2x4<int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat3x2<int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat3x3<int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat3x4<int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat4x2<int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat4x3<int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat4x4<int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) - - typedef float float1; //!< \brief single-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension) - typedef tvec2<float, highp> float2; //!< \brief single-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) - typedef tvec3<float, highp> float3; //!< \brief single-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension) - typedef tvec4<float, highp> float4; //!< \brief single-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension) - - typedef float float1x1; //!< \brief single-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) - typedef tmat2x2<float, highp> float2x2; //!< \brief single-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat2x3<float, highp> float2x3; //!< \brief single-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat2x4<float, highp> float2x4; //!< \brief single-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat3x2<float, highp> float3x2; //!< \brief single-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat3x3<float, highp> float3x3; //!< \brief single-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat3x4<float, highp> float3x4; //!< \brief single-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat4x2<float, highp> float4x2; //!< \brief single-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat4x3<float, highp> float4x3; //!< \brief single-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat4x4<float, highp> float4x4; //!< \brief single-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) - - typedef double double1; //!< \brief double-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension) - typedef tvec2<double, highp> double2; //!< \brief double-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) - typedef tvec3<double, highp> double3; //!< \brief double-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension) - typedef tvec4<double, highp> double4; //!< \brief double-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension) - - typedef double double1x1; //!< \brief double-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) - typedef tmat2x2<double, highp> double2x2; //!< \brief double-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat2x3<double, highp> double2x3; //!< \brief double-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat2x4<double, highp> double2x4; //!< \brief double-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat3x2<double, highp> double3x2; //!< \brief double-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat3x3<double, highp> double3x3; //!< \brief double-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat3x4<double, highp> double3x4; //!< \brief double-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) - typedef tmat4x2<double, highp> double4x2; //!< \brief double-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) - typedef tmat4x3<double, highp> double4x3; //!< \brief double-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) - typedef tmat4x4<double, highp> double4x4; //!< \brief double-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1; //!< \brief single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, float, highp> float2; //!< \brief single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, float, highp> float3; //!< \brief single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, float, highp> float4; //!< \brief single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1x1; //!< \brief single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, float, highp> float2x2; //!< \brief single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, float, highp> float2x3; //!< \brief single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, float, highp> float2x4; //!< \brief single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, float, highp> float3x2; //!< \brief single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, float, highp> float3x3; //!< \brief single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, float, highp> float3x4; //!< \brief single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, float, highp> float4x2; //!< \brief single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, float, highp> float4x3; //!< \brief single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, float, highp> float4x4; //!< \brief single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1; //!< \brief double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef vec<2, double, highp> double2; //!< \brief double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef vec<3, double, highp> double3; //!< \brief double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef vec<4, double, highp> double4; //!< \brief double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1x1; //!< \brief double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef mat<2, 2, double, highp> double2x2; //!< \brief double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 3, double, highp> double2x3; //!< \brief double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<2, 4, double, highp> double2x4; //!< \brief double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 2, double, highp> double3x2; //!< \brief double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 3, double, highp> double3x3; //!< \brief double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<3, 4, double, highp> double3x4; //!< \brief double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 2, double, highp> double4x2; //!< \brief double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 3, double, highp> double4x3; //!< \brief double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef mat<4, 4, double, highp> double4x4; //!< \brief double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) /// @} }//namespace glm diff --git a/external/include/glm/gtx/compatibility.inl b/external/include/glm/gtx/compatibility.inl index 368527a..11affa1 100644 --- a/external/include/glm/gtx/compatibility.inl +++ b/external/include/glm/gtx/compatibility.inl @@ -6,9 +6,9 @@ namespace glm { // isfinite - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool isfinite( - genType const & x) + genType const& x) { # if GLM_HAS_CXX11_STL return std::isfinite(x) != 0; @@ -24,38 +24,38 @@ namespace glm # endif } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec1<bool, P> isfinite( - tvec1<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<1, bool, Q> isfinite( + vec<1, T, Q> const& x) { - return tvec1<bool, P>( + return vec<1, bool, Q>( isfinite(x.x)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<bool, P> isfinite( - tvec2<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, bool, Q> isfinite( + vec<2, T, Q> const& x) { - return tvec2<bool, P>( + return vec<2, bool, Q>( isfinite(x.x), isfinite(x.y)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<bool, P> isfinite( - tvec3<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, bool, Q> isfinite( + vec<3, T, Q> const& x) { - return tvec3<bool, P>( + return vec<3, bool, Q>( isfinite(x.x), isfinite(x.y), isfinite(x.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> isfinite( - tvec4<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> isfinite( + vec<4, T, Q> const& x) { - return tvec4<bool, P>( + return vec<4, bool, Q>( isfinite(x.x), isfinite(x.y), isfinite(x.z), diff --git a/external/include/glm/gtx/component_wise.hpp b/external/include/glm/gtx/component_wise.hpp index c316f9e..6ed7d55 100644 --- a/external/include/glm/gtx/component_wise.hpp +++ b/external/include/glm/gtx/component_wise.hpp @@ -2,21 +2,25 @@ /// @file glm/gtx/component_wise.hpp /// @date 2007-05-21 / 2011-06-07 /// @author Christophe Riccio -/// +/// /// @see core (dependence) /// /// @defgroup gtx_component_wise GLM_GTX_component_wise /// @ingroup gtx /// -/// @brief Operations between components of a type +/// Include <glm/gtx/component_wise.hpp> to use the features of this extension. /// -/// <glm/gtx/component_wise.hpp> need to be included to use these functionalities. +/// Operations between components of a type #pragma once // Dependencies #include "../detail/setup.hpp" -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_component_wise extension included") @@ -28,36 +32,36 @@ namespace glm /// @{ /// Convert an integer vector to a normalized float vector. - /// If the parameter value type is already a floating precision type, the value is passed through. + /// If the parameter value type is already a floating qualifier type, the value is passed through. /// @see gtx_component_wise - template <typename floatType, typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<floatType, P> compNormalize(vecType<T, P> const & v); + template<typename floatType, length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v); /// Convert a normalized float vector to an integer vector. - /// If the parameter value type is already a floating precision type, the value is passed through. + /// If the parameter value type is already a floating qualifier type, the value is passed through. /// @see gtx_component_wise - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> compScale(vecType<floatType, P> const & v); + template<length_t L, typename T, typename floatType, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> compScale(vec<L, floatType, Q> const& v); - /// Add all vector components together. + /// Add all vector components together. /// @see gtx_component_wise - template <typename genType> - GLM_FUNC_DECL typename genType::value_type compAdd(genType const & v); + template<typename genType> + GLM_FUNC_DECL typename genType::value_type compAdd(genType const& v); - /// Multiply all vector components together. + /// Multiply all vector components together. /// @see gtx_component_wise - template <typename genType> - GLM_FUNC_DECL typename genType::value_type compMul(genType const & v); + template<typename genType> + GLM_FUNC_DECL typename genType::value_type compMul(genType const& v); /// Find the minimum value between single vector components. /// @see gtx_component_wise - template <typename genType> - GLM_FUNC_DECL typename genType::value_type compMin(genType const & v); + template<typename genType> + GLM_FUNC_DECL typename genType::value_type compMin(genType const& v); /// Find the maximum value between single vector components. /// @see gtx_component_wise - template <typename genType> - GLM_FUNC_DECL typename genType::value_type compMax(genType const & v); + template<typename genType> + GLM_FUNC_DECL typename genType::value_type compMax(genType const& v); /// @} }//namespace glm diff --git a/external/include/glm/gtx/component_wise.inl b/external/include/glm/gtx/component_wise.inl index add3969..8ca0ca9 100644 --- a/external/include/glm/gtx/component_wise.inl +++ b/external/include/glm/gtx/component_wise.inl @@ -6,92 +6,92 @@ namespace glm{ namespace detail { - template <typename T, typename floatType, precision P, template <typename, precision> class vecType, bool isInteger, bool signedType> + template<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType> struct compute_compNormalize {}; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compNormalize<T, floatType, P, vecType, true, true> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compNormalize<L, T, floatType, Q, true, true> { - GLM_FUNC_QUALIFIER static vecType<floatType, P> call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v) { floatType const Min = static_cast<floatType>(std::numeric_limits<T>::min()); floatType const Max = static_cast<floatType>(std::numeric_limits<T>::max()); - return (vecType<floatType, P>(v) - Min) / (Max - Min) * static_cast<floatType>(2) - static_cast<floatType>(1); + return (vec<L, floatType, Q>(v) - Min) / (Max - Min) * static_cast<floatType>(2) - static_cast<floatType>(1); } }; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compNormalize<T, floatType, P, vecType, true, false> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compNormalize<L, T, floatType, Q, true, false> { - GLM_FUNC_QUALIFIER static vecType<floatType, P> call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v) { - return vecType<floatType, P>(v) / static_cast<floatType>(std::numeric_limits<T>::max()); + return vec<L, floatType, Q>(v) / static_cast<floatType>(std::numeric_limits<T>::max()); } }; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compNormalize<T, floatType, P, vecType, false, true> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compNormalize<L, T, floatType, Q, false, true> { - GLM_FUNC_QUALIFIER static vecType<floatType, P> call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v) { return v; } }; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType, bool isInteger, bool signedType> + template<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType> struct compute_compScale {}; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compScale<T, floatType, P, vecType, true, true> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compScale<L, T, floatType, Q, true, true> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<floatType, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v) { floatType const Max = static_cast<floatType>(std::numeric_limits<T>::max()) + static_cast<floatType>(0.5); - vecType<floatType, P> const Scaled(v * Max); - vecType<T, P> const Result(Scaled - static_cast<floatType>(0.5)); + vec<L, floatType, Q> const Scaled(v * Max); + vec<L, T, Q> const Result(Scaled - static_cast<floatType>(0.5)); return Result; } }; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compScale<T, floatType, P, vecType, true, false> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compScale<L, T, floatType, Q, true, false> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<floatType, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v) { - return vecType<T, P>(vecType<floatType, P>(v) * static_cast<floatType>(std::numeric_limits<T>::max())); + return vec<L, T, Q>(vec<L, floatType, Q>(v) * static_cast<floatType>(std::numeric_limits<T>::max())); } }; - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - struct compute_compScale<T, floatType, P, vecType, false, true> + template<length_t L, typename T, typename floatType, qualifier Q> + struct compute_compScale<L, T, floatType, Q, false, true> { - GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<floatType, P> const & v) + GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v) { return v; } }; }//namespace detail - template <typename floatType, typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<floatType, P> compNormalize(vecType<T, P> const & v) + template<typename floatType, length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "'compNormalize' accepts only floating-point types for 'floatType' template parameter"); - return detail::compute_compNormalize<T, floatType, P, vecType, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v); + return detail::compute_compNormalize<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v); } - template <typename T, typename floatType, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> compScale(vecType<floatType, P> const & v) + template<typename T, length_t L, typename floatType, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> compScale(vec<L, floatType, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "'compScale' accepts only floating-point types for 'floatType' template parameter"); - return detail::compute_compScale<T, floatType, P, vecType, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v); + return detail::compute_compScale<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T compAdd(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T compAdd(vec<L, T, Q> const& v) { T Result(0); for(length_t i = 0, n = v.length(); i < n; ++i) @@ -99,8 +99,8 @@ namespace detail return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T compMul(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T compMul(vec<L, T, Q> const& v) { T Result(1); for(length_t i = 0, n = v.length(); i < n; ++i) @@ -108,8 +108,8 @@ namespace detail return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T compMin(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T compMin(vec<L, T, Q> const& v) { T Result(v[0]); for(length_t i = 1, n = v.length(); i < n; ++i) @@ -117,8 +117,8 @@ namespace detail return Result; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T compMax(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T compMax(vec<L, T, Q> const& v) { T Result(v[0]); for(length_t i = 1, n = v.length(); i < n; ++i) diff --git a/external/include/glm/gtx/dual_quaternion.hpp b/external/include/glm/gtx/dual_quaternion.hpp index 4d7b61e..5544514 100644 --- a/external/include/glm/gtx/dual_quaternion.hpp +++ b/external/include/glm/gtx/dual_quaternion.hpp @@ -3,16 +3,15 @@ /// @author Maksim Vorobiev (msomeone@gmail.com) /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtc_constants (dependence) /// @see gtc_quaternion (dependence) /// /// @defgroup gtx_dual_quaternion GLM_GTX_dual_quaternion /// @ingroup gtx /// -/// @brief Defines a templated dual-quaternion type and several dual-quaternion operations. +/// Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. /// -/// <glm/gtx/dual_quaternion.hpp> need to be included to use these functionalities. +/// Defines a templated dual-quaternion type and several dual-quaternion operations. #pragma once @@ -21,6 +20,10 @@ #include "../gtc/constants.hpp" #include "../gtc/quaternion.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_dual_quaternion extension included") #endif @@ -30,192 +33,197 @@ namespace glm /// @addtogroup gtx_dual_quaternion /// @{ - template <typename T, precision P = defaultp> + template<typename T, qualifier Q = defaultp> struct tdualquat { // -- Implementation detail -- typedef T value_type; - typedef glm::tquat<T, P> part_type; + typedef glm::tquat<T, Q> part_type; // -- Data -- - glm::tquat<T, P> real, dual; + glm::tquat<T, Q> real, dual; // -- Component accesses -- typedef length_t length_type; /// Return the count of components of a dual quaternion - GLM_FUNC_DECL static length_type length(){return 2;} + GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;} GLM_FUNC_DECL part_type & operator[](length_type i); - GLM_FUNC_DECL part_type const & operator[](length_type i) const; + GLM_FUNC_DECL part_type const& operator[](length_type i) const; // -- Implicit basic constructors -- GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT_CTOR; - GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, P> const & d) GLM_DEFAULT; - template <precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, Q> const & d); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, Q> const& d) GLM_DEFAULT; + template<qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, P> const& d); // -- Explicit basic constructors -- - GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit tdualquat(ctor); - GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, P> const & real); - GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, P> const & orientation, tvec3<T, P> const & translation); - GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, P> const & real, tquat<T, P> const & dual); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& orientation, vec<3, T, Q> const& translation); + GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real, tquat<T, Q> const& dual); // -- Conversion constructors -- - template <typename U, precision Q> - GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat<U, Q> const & q); + template<typename U, qualifier P> + GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat<U, P> const& q); - GLM_FUNC_DECL GLM_EXPLICIT tdualquat(tmat2x4<T, P> const & holder_mat); - GLM_FUNC_DECL GLM_EXPLICIT tdualquat(tmat3x4<T, P> const & aug_mat); + GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<2, 4, T, Q> const& holder_mat); + GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<3, 4, T, Q> const& aug_mat); // -- Unary arithmetic operators -- - GLM_FUNC_DECL tdualquat<T, P> & operator=(tdualquat<T, P> const & m) GLM_DEFAULT; + GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<T, Q> const& m) GLM_DEFAULT; - template <typename U> - GLM_FUNC_DECL tdualquat<T, P> & operator=(tdualquat<U, P> const & m); - template <typename U> - GLM_FUNC_DECL tdualquat<T, P> & operator*=(U s); - template <typename U> - GLM_FUNC_DECL tdualquat<T, P> & operator/=(U s); + template<typename U> + GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<U, Q> const& m); + template<typename U> + GLM_FUNC_DECL tdualquat<T, Q> & operator*=(U s); + template<typename U> + GLM_FUNC_DECL tdualquat<T, Q> & operator/=(U s); }; // -- Unary bit operators -- - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator+(tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator-(tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator-(tdualquat<T, Q> const& q); // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator+(tdualquat<T, P> const & q, tdualquat<T, P> const & p); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p); - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator*(tdualquat<T, P> const & q, tdualquat<T, P> const & p); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tdualquat<T, P> const & q, tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tdualquat<T, P> const & q, tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v); - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator*(tdualquat<T, P> const & q, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s); - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator*(T const & s, tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q); - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> operator/(tdualquat<T, P> const & q, T const & s); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s); // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_DECL bool operator==(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2); + + template<typename T, qualifier Q> + GLM_FUNC_DECL bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2); - template <typename T, precision P> - GLM_FUNC_DECL bool operator!=(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2); + /// Creates an identity dual quaternion. + /// + /// @see gtx_dual_quaternion + template <typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> dual_quat_identity(); /// Returns the normalized quaternion. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> normalize(tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> normalize(tdualquat<T, Q> const& q); /// Returns the linear interpolation of two dual quaternion. /// /// @see gtc_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> lerp(tdualquat<T, P> const & x, tdualquat<T, P> const & y, T const & a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a); /// Returns the q inverse. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> inverse(tdualquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> inverse(tdualquat<T, Q> const& q); /// Converts a quaternion to a 2 * 4 matrix. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> mat2x4_cast(tdualquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x); /// Converts a quaternion to a 3 * 4 matrix. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> mat3x4_cast(tdualquat<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x); /// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> dualquat_cast(tmat2x4<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x); /// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion. /// /// @see gtx_dual_quaternion - template <typename T, precision P> - GLM_FUNC_DECL tdualquat<T, P> dualquat_cast(tmat3x4<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x); - /// Dual-quaternion of low single-precision floating-point numbers. + /// Dual-quaternion of low single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, lowp> lowp_dualquat; - /// Dual-quaternion of medium single-precision floating-point numbers. + /// Dual-quaternion of medium single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, mediump> mediump_dualquat; - /// Dual-quaternion of high single-precision floating-point numbers. + /// Dual-quaternion of high single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, highp> highp_dualquat; - /// Dual-quaternion of low single-precision floating-point numbers. + /// Dual-quaternion of low single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, lowp> lowp_fdualquat; - /// Dual-quaternion of medium single-precision floating-point numbers. + /// Dual-quaternion of medium single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, mediump> mediump_fdualquat; - /// Dual-quaternion of high single-precision floating-point numbers. + /// Dual-quaternion of high single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<float, highp> highp_fdualquat; - /// Dual-quaternion of low double-precision floating-point numbers. + /// Dual-quaternion of low double-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<double, lowp> lowp_ddualquat; - /// Dual-quaternion of medium double-precision floating-point numbers. + /// Dual-quaternion of medium double-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<double, mediump> mediump_ddualquat; - /// Dual-quaternion of high double-precision floating-point numbers. + /// Dual-quaternion of high double-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef tdualquat<double, highp> highp_ddualquat; @@ -227,7 +235,7 @@ namespace glm /// @see gtx_dual_quaternion typedef highp_fdualquat dualquat; - /// Dual-quaternion of single-precision floating-point numbers. + /// Dual-quaternion of single-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef highp_fdualquat fdualquat; @@ -246,7 +254,7 @@ namespace glm #if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE)) - /// Dual-quaternion of default double-precision floating-point numbers. + /// Dual-quaternion of default double-qualifier floating-point numbers. /// /// @see gtx_dual_quaternion typedef highp_ddualquat ddualquat; diff --git a/external/include/glm/gtx/dual_quaternion.inl b/external/include/glm/gtx/dual_quaternion.inl index c3f2bc6..5c82b88 100644 --- a/external/include/glm/gtx/dual_quaternion.inl +++ b/external/include/glm/gtx/dual_quaternion.inl @@ -8,15 +8,15 @@ namespace glm { // -- Component accesses -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type & tdualquat<T, P>::operator[](typename tdualquat<T, P>::length_type i) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type & tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i) { assert(i >= 0 && i < this->length()); return (&real)[i]; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type const & tdualquat<T, P>::operator[](typename tdualquat<T, P>::length_type i) const + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type const& tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i) const { assert(i >= 0 && i < this->length()); return (&real)[i]; @@ -24,44 +24,40 @@ namespace glm // -- Implicit basic constructors -- -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat() -# ifndef GLM_FORCE_NO_CTOR_INIT - : real(tquat<T, P>()) - , dual(tquat<T, P>(0, 0, 0, 0)) +# if !GLM_HAS_DEFAULTED_FUNCTIONS || defined(GLM_FORCE_CTOR_INIT) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat() +# ifdef GLM_FORCE_CTOR_INIT + : real(tquat<T, Q>()) + , dual(tquat<T, Q>(0, 0, 0, 0)) # endif {} # endif # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tdualquat<T, P> const & d) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, Q> const& d) : real(d.real) , dual(d.dual) {} # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tdualquat<T, Q> const & d) + template<typename T, qualifier Q> + template<qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, P> const& d) : real(d.real) , dual(d.dual) {} // -- Explicit basic constructors -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR tdualquat<T, P>::tdualquat(ctor) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& r) + : real(r), dual(tquat<T, Q>(0, 0, 0, 0)) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tquat<T, P> const & r) - : real(r), dual(tquat<T, P>(0, 0, 0, 0)) - {} - - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tquat<T, P> const & q, tvec3<T, P> const& p) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& q, vec<3, T, Q> const& p) : real(q), dual( T(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z), T(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y), @@ -69,28 +65,28 @@ namespace glm T(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w)) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tquat<T, P> const & r, tquat<T, P> const & d) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& r, tquat<T, Q> const& d) : real(r), dual(d) {} // -- Conversion constructors -- - template <typename T, precision P> - template <typename U, precision Q> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, P>::tdualquat(tdualquat<U, Q> const & q) + template<typename T, qualifier Q> + template<typename U, qualifier P> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<U, P> const& q) : real(q.real) , dual(q.dual) {} - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat2x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q>::tdualquat(mat<2, 4, T, Q> const& m) { *this = dualquat_cast(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat3x4<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q>::tdualquat(mat<3, 4, T, Q> const& m) { *this = dualquat_cast(m); } @@ -98,8 +94,8 @@ namespace glm // -- Unary arithmetic operators -- # if !GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator=(tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<T, Q> const& q) { this->real = q.real; this->dual = q.dual; @@ -107,27 +103,27 @@ namespace glm } # endif//!GLM_HAS_DEFAULTED_FUNCTIONS - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator=(tdualquat<U, P> const & q) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<U, Q> const& q) { this->real = q.real; this->dual = q.dual; return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator*=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator*=(U s) { this->real *= static_cast<T>(s); this->dual *= static_cast<T>(s); return *this; } - template <typename T, precision P> - template <typename U> - GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator/=(U s) + template<typename T, qualifier Q> + template<typename U> + GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator/=(U s) { this->real /= static_cast<T>(s); this->dual /= static_cast<T>(s); @@ -136,100 +132,108 @@ namespace glm // -- Unary bit operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator+(tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q) { return q; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator-(tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator-(tdualquat<T, Q> const& q) { - return tdualquat<T, P>(-q.real, -q.dual); + return tdualquat<T, Q>(-q.real, -q.dual); } // -- Binary operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator+(tdualquat<T, P> const & q, tdualquat<T, P> const & p) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p) { - return tdualquat<T, P>(q.real + p.real,q.dual + p.dual); + return tdualquat<T, Q>(q.real + p.real,q.dual + p.dual); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(tdualquat<T, P> const & p, tdualquat<T, P> const & o) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& p, tdualquat<T, Q> const& o) { - return tdualquat<T, P>(p.real * o.real,p.real * o.dual + p.dual * o.real); + return tdualquat<T, Q>(p.real * o.real,p.real * o.dual + p.dual * o.real); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tdualquat<T, P> const & q, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v) { - tvec3<T, P> const real_v3(q.real.x,q.real.y,q.real.z); - tvec3<T, P> const dual_v3(q.dual.x,q.dual.y,q.dual.z); + vec<3, T, Q> const real_v3(q.real.x,q.real.y,q.real.z); + vec<3, T, Q> const dual_v3(q.dual.x,q.dual.y,q.dual.z); return (cross(real_v3, cross(real_v3,v) + v * q.real.w + dual_v3) + dual_v3 * q.real.w - real_v3 * q.dual.w) * T(2) + v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v, tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q) { return glm::inverse(q) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tdualquat<T, P> const & q, tvec4<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v) { - return tvec4<T, P>(q * tvec3<T, P>(v), v.w); + return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v, tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q) { return glm::inverse(q) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(tdualquat<T, P> const & q, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s) { - return tdualquat<T, P>(q.real * s, q.dual * s); + return tdualquat<T, Q>(q.real * s, q.dual * s); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(T const & s, tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q) { return q * s; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> operator/(tdualquat<T, P> const & q, T const & s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s) { - return tdualquat<T, P>(q.real / s, q.dual / s); + return tdualquat<T, Q>(q.real / s, q.dual / s); } // -- Boolean operators -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator==(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2) { return (q1.real == q2.real) && (q1.dual == q2.dual); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool operator!=(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2) { - return (q1.real != q2.dual) || (q1.real != q2.dual); + return (q1.real != q2.real) || (q1.dual != q2.dual); } // -- Operations -- - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> normalize(tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> dual_quat_identity() + { + return tdualquat<T, Q>( + tquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)), + tquat<T, Q>(static_cast<T>(0), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0))); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> normalize(tdualquat<T, Q> const& q) { return q / length(q.real); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> lerp(tdualquat<T, P> const & x, tdualquat<T, P> const & y, T const & a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a) { // Dual Quaternion Linear blend aka DLB: // Lerp is only defined in [0, 1] @@ -237,72 +241,72 @@ namespace glm assert(a <= static_cast<T>(1)); T const k = dot(x.real,y.real) < static_cast<T>(0) ? -a : a; T const one(1); - return tdualquat<T, P>(x * (one - a) + y * k); + return tdualquat<T, Q>(x * (one - a) + y * k); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> inverse(tdualquat<T, P> const & q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> inverse(tdualquat<T, Q> const& q) { - const glm::tquat<T, P> real = conjugate(q.real); - const glm::tquat<T, P> dual = conjugate(q.dual); - return tdualquat<T, P>(real, dual + (real * (-2.0f * dot(real,dual)))); + const glm::tquat<T, Q> real = conjugate(q.real); + const glm::tquat<T, Q> dual = conjugate(q.dual); + return tdualquat<T, Q>(real, dual + (real * (-2.0f * dot(real,dual)))); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> mat2x4_cast(tdualquat<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x) { - return tmat2x4<T, P>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w ); + return mat<2, 4, T, Q>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w ); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> mat3x4_cast(tdualquat<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x) { - tquat<T, P> r = x.real / length2(x.real); - - tquat<T, P> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z); + tquat<T, Q> r = x.real / length2(x.real); + + tquat<T, Q> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z); r *= static_cast<T>(2); - + T const xy = r.x * x.real.y; T const xz = r.x * x.real.z; T const yz = r.y * x.real.z; T const wx = r.w * x.real.x; T const wy = r.w * x.real.y; T const wz = r.w * x.real.z; - - tvec4<T, P> const a( + + vec<4, T, Q> const a( rr.w + rr.x - rr.y - rr.z, xy - wz, xz + wy, -(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y)); - - tvec4<T, P> const b( + + vec<4, T, Q> const b( xy + wz, rr.w + rr.y - rr.x - rr.z, yz - wx, -(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x)); - - tvec4<T, P> const c( + + vec<4, T, Q> const c( xz - wy, yz + wx, rr.w + rr.z - rr.x - rr.y, -(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w)); - - return tmat3x4<T, P>(a, b, c); + + return mat<3, 4, T, Q>(a, b, c); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> dualquat_cast(tmat2x4<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x) { - return tdualquat<T, P>( - tquat<T, P>( x[0].w, x[0].x, x[0].y, x[0].z ), - tquat<T, P>( x[1].w, x[1].x, x[1].y, x[1].z )); + return tdualquat<T, Q>( + tquat<T, Q>( x[0].w, x[0].x, x[0].y, x[0].z ), + tquat<T, Q>( x[1].w, x[1].x, x[1].y, x[1].z )); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tdualquat<T, P> dualquat_cast(tmat3x4<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x) { - tquat<T, P> real(uninitialize); - + tquat<T, Q> real; + T const trace = x[0].x + x[1].y + x[2].z; if(trace > static_cast<T>(0)) { @@ -340,12 +344,12 @@ namespace glm real.z = static_cast<T>(0.5) * r; real.w = (x[1].x - x[0].y) * invr; } - - tquat<T, P> dual(uninitialize); + + tquat<T, Q> dual; dual.x = static_cast<T>(0.5) * ( x[0].w * real.w + x[1].w * real.z - x[2].w * real.y); dual.y = static_cast<T>(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x); dual.z = static_cast<T>(0.5) * ( x[0].w * real.y - x[1].w * real.x + x[2].w * real.w); dual.w = -static_cast<T>(0.5) * ( x[0].w * real.x + x[1].w * real.y + x[2].w * real.z); - return tdualquat<T, P>(real, dual); + return tdualquat<T, Q>(real, dual); } }//namespace glm diff --git a/external/include/glm/gtx/easing.hpp b/external/include/glm/gtx/easing.hpp new file mode 100644 index 0000000..913ca70 --- /dev/null +++ b/external/include/glm/gtx/easing.hpp @@ -0,0 +1,221 @@ +/// @ref gtx_easing +/// @file glm/gtx/easing.hpp +/// @author Robert Chisholm +/// +/// @see core (dependence) +/// +/// @defgroup gtx_easing GLM_GTX_easing +/// @ingroup gtx +/// +/// Include <glm/gtx/easing.hpp> to use the features of this extension. +/// +/// Easing functions for animations and transitons +/// All functions take a parameter x in the range [0.0,1.0] +/// +/// Based on the AHEasing project of Warren Moore (https://github.com/warrenm/AHEasing) + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/constants.hpp" +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_int.hpp" + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_easing is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTX_easing extension included") +#endif + +namespace glm{ + /// @addtogroup gtx_easing + /// @{ + + /// Modelled after the line y = x + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType linearInterpolation(genType const & a); + + /// Modelled after the parabola y = x^2 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quadraticEaseIn(genType const & a); + + /// Modelled after the parabola y = -x^2 + 2x + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quadraticEaseOut(genType const & a); + + /// Modelled after the piecewise quadratic + /// y = (1/2)((2x)^2) ; [0, 0.5) + /// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quadraticEaseInOut(genType const & a); + + /// Modelled after the cubic y = x^3 + template <typename genType> + GLM_FUNC_DECL genType cubicEaseIn(genType const & a); + + /// Modelled after the cubic y = (x - 1)^3 + 1 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType cubicEaseOut(genType const & a); + + /// Modelled after the piecewise cubic + /// y = (1/2)((2x)^3) ; [0, 0.5) + /// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType cubicEaseInOut(genType const & a); + + /// Modelled after the quartic x^4 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quarticEaseIn(genType const & a); + + /// Modelled after the quartic y = 1 - (x - 1)^4 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quarticEaseOut(genType const & a); + + /// Modelled after the piecewise quartic + /// y = (1/2)((2x)^4) ; [0, 0.5) + /// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quarticEaseInOut(genType const & a); + + /// Modelled after the quintic y = x^5 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quinticEaseIn(genType const & a); + + /// Modelled after the quintic y = (x - 1)^5 + 1 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quinticEaseOut(genType const & a); + + /// Modelled after the piecewise quintic + /// y = (1/2)((2x)^5) ; [0, 0.5) + /// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType quinticEaseInOut(genType const & a); + + /// Modelled after quarter-cycle of sine wave + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType sineEaseIn(genType const & a); + + /// Modelled after quarter-cycle of sine wave (different phase) + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType sineEaseOut(genType const & a); + + /// Modelled after half sine wave + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType sineEaseInOut(genType const & a); + + /// Modelled after shifted quadrant IV of unit circle + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType circularEaseIn(genType const & a); + + /// Modelled after shifted quadrant II of unit circle + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType circularEaseOut(genType const & a); + + /// Modelled after the piecewise circular function + /// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) + /// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType circularEaseInOut(genType const & a); + + /// Modelled after the exponential function y = 2^(10(x - 1)) + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType exponentialEaseIn(genType const & a); + + /// Modelled after the exponential function y = -2^(-10x) + 1 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType exponentialEaseOut(genType const & a); + + /// Modelled after the piecewise exponential + /// y = (1/2)2^(10(2x - 1)) ; [0,0.5) + /// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType exponentialEaseInOut(genType const & a); + + /// Modelled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType elasticEaseIn(genType const & a); + + /// Modelled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType elasticEaseOut(genType const & a); + + /// Modelled after the piecewise exponentially-damped sine wave: + /// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) + /// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType elasticEaseInOut(genType const & a); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseIn(genType const& a); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseOut(genType const& a); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseInOut(genType const& a); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseIn(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseOut(genType const& a, genType const& o); + + /// @param a parameter + /// @param o Optional overshoot modifier + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType backEaseInOut(genType const& a, genType const& o); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType bounceEaseIn(genType const& a); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType bounceEaseOut(genType const& a); + + /// @see gtx_easing + template <typename genType> + GLM_FUNC_DECL genType bounceEaseInOut(genType const& a); + + /// @} +}//namespace glm + +#include "easing.inl" diff --git a/external/include/glm/gtx/easing.inl b/external/include/glm/gtx/easing.inl new file mode 100644 index 0000000..b6d7886 --- /dev/null +++ b/external/include/glm/gtx/easing.inl @@ -0,0 +1,437 @@ +/// @ref gtx_easing +/// @file glm/gtx/easing.inl + +#include <cmath> + +namespace glm{ + + template <typename genType> + GLM_FUNC_QUALIFIER genType linearInterpolation(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return a; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quadraticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return a * a; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quadraticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return -(a * (a - static_cast<genType>(2))); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quadraticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + { + return static_cast<genType>(2) * a * a; + } + else + { + return (-static_cast<genType>(2) * a * a) + (4 * a) - one<genType>(); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType cubicEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return a * a * a; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType cubicEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType const f = a - one<genType>(); + return f * f * f + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType cubicEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if (a < static_cast<genType>(0.5)) + { + return static_cast<genType>(4) * a * a * a; + } + else + { + genType const f = ((static_cast<genType>(2) * a) - static_cast<genType>(2)); + return static_cast<genType>(0.5) * f * f * f + one<genType>(); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quarticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return a * a * a * a; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quarticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType const f = (a - one<genType>()); + return f * f * f * (one<genType>() - a) + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quarticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + { + return static_cast<genType>(8) * a * a * a * a; + } + else + { + genType const f = (a - one<genType>()); + return -static_cast<genType>(8) * f * f * f * f + one<genType>(); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quinticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return a * a * a * a * a; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quinticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType const f = (a - one<genType>()); + return f * f * f * f * f + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quinticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + { + return static_cast<genType>(16) * a * a * a * a * a; + } + else + { + genType const f = ((static_cast<genType>(2) * a) - static_cast<genType>(2)); + return static_cast<genType>(0.5) * f * f * f * f * f + one<genType>(); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType sineEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return sin((a - one<genType>()) * half_pi<genType>()) + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType sineEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return sin(a * half_pi<genType>()); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType sineEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return static_cast<genType>(0.5) * (one<genType>() - cos(a * pi<genType>())); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType circularEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return one<genType>() - sqrt(one<genType>() - (a * a)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType circularEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return sqrt((static_cast<genType>(2) - a) * a); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType circularEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + { + return static_cast<genType>(0.5) * (one<genType>() - std::sqrt(one<genType>() - static_cast<genType>(4) * (a * a))); + } + else + { + return static_cast<genType>(0.5) * (std::sqrt(-((static_cast<genType>(2) * a) - static_cast<genType>(3)) * ((static_cast<genType>(2) * a) - one<genType>())) + one<genType>()); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType exponentialEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a <= zero<genType>()) + return a; + else + { + genType const Complementary = a - one<genType>(); + genType const Two = static_cast<genType>(2); + + return glm::pow(Two, Complementary * static_cast<genType>(10)); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType exponentialEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a >= one<genType>()) + return a; + else + { + return one<genType>() - glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * a); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType exponentialEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + return static_cast<genType>(0.5) * glm::pow(static_cast<genType>(2), (static_cast<genType>(20) * a) - static_cast<genType>(10)); + else + return -static_cast<genType>(0.5) * glm::pow(static_cast<genType>(2), (-static_cast<genType>(20) * a) + static_cast<genType>(10)) + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType elasticEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return std::sin(static_cast<genType>(13) * half_pi<genType>() * a) * glm::pow(static_cast<genType>(2), static_cast<genType>(10) * (a - one<genType>())); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType elasticEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return std::sin(-static_cast<genType>(13) * half_pi<genType>() * (a + one<genType>())) * glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * a) + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType elasticEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + return static_cast<genType>(0.5) * std::sin(static_cast<genType>(13) * half_pi<genType>() * (static_cast<genType>(2) * a)) * glm::pow(static_cast<genType>(2), static_cast<genType>(10) * ((static_cast<genType>(2) * a) - one<genType>())); + else + return static_cast<genType>(0.5) * (std::sin(-static_cast<genType>(13) * half_pi<genType>() * ((static_cast<genType>(2) * a - one<genType>()) + one<genType>())) * glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * (static_cast<genType>(2) * a - one<genType>())) + static_cast<genType>(2)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType z = ((o + one<genType>()) * a) - o; + return (a * a * z); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType n = a - one<genType>(); + genType z = ((o + one<genType>()) * n) + o; + return (n * n * z) + one<genType>(); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a, genType const& o) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + genType s = o * static_cast<genType>(1.525); + genType x = static_cast<genType>(0.5); + genType n = a / static_cast<genType>(0.5); + + if (n < static_cast<genType>(1)) + { + genType z = ((s + static_cast<genType>(1)) * n) - s; + genType m = n * n * z; + return x * m; + } + else + { + n -= static_cast<genType>(2); + genType z = ((s + static_cast<genType>(1)) * n) + s; + genType m = (n*n*z) + static_cast<genType>(2); + return x * m; + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a) + { + return backEaseIn(a, static_cast<genType>(1.70158)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a) + { + return backEaseOut(a, static_cast<genType>(1.70158)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a) + { + return backEaseInOut(a, static_cast<genType>(1.70158)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType bounceEaseOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(4.0 / 11.0)) + { + return (static_cast<genType>(121) * a * a) / static_cast<genType>(16); + } + else if(a < static_cast<genType>(8.0 / 11.0)) + { + return (static_cast<genType>(363.0 / 40.0) * a * a) - (static_cast<genType>(99.0 / 10.0) * a) + static_cast<genType>(17.0 / 5.0); + } + else if(a < static_cast<genType>(9.0 / 10.0)) + { + return (static_cast<genType>(4356.0 / 361.0) * a * a) - (static_cast<genType>(35442.0 / 1805.0) * a) + static_cast<genType>(16061.0 / 1805.0); + } + else + { + return (static_cast<genType>(54.0 / 5.0) * a * a) - (static_cast<genType>(513.0 / 25.0) * a) + static_cast<genType>(268.0 / 25.0); + } + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType bounceEaseIn(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + return one<genType>() - bounceEaseOut(one<genType>() - a); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType bounceEaseInOut(genType const& a) + { + // Only defined in [0, 1] + assert(a >= zero<genType>()); + assert(a <= one<genType>()); + + if(a < static_cast<genType>(0.5)) + { + return static_cast<genType>(0.5) * (one<genType>() - bounceEaseOut(a * static_cast<genType>(2))); + } + else + { + return static_cast<genType>(0.5) * bounceEaseOut(a * static_cast<genType>(2) - one<genType>()) + static_cast<genType>(0.5); + } + } + +}//namespace glm diff --git a/external/include/glm/gtx/euler_angles.hpp b/external/include/glm/gtx/euler_angles.hpp index fdc4f26..dccc621 100644 --- a/external/include/glm/gtx/euler_angles.hpp +++ b/external/include/glm/gtx/euler_angles.hpp @@ -2,20 +2,26 @@ /// @file glm/gtx/euler_angles.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// /// @defgroup gtx_euler_angles GLM_GTX_euler_angles /// @ingroup gtx /// -/// @brief Build matrices from Euler angles. +/// Include <glm/gtx/euler_angles.hpp> to use the features of this extension. /// -/// <glm/gtx/euler_angles.hpp> need to be included to use these functionalities. +/// Build matrices from Euler angles. +/// +/// Extraction of Euler angles from rotation matrix. +/// Based on the original paper 2014 Mike Day - Extracting Euler Angles from a Rotation Matrix. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_euler_angles extension included") #endif @@ -27,116 +33,302 @@ namespace glm /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleX( - T const & angleX); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleX( + T const& angleX); /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleY( - T const & angleY); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleY( + T const& angleY); /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZ( + T const& angleZ); + + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about X-axis. + /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZ( - T const & angleZ); + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleX( + T const & angleX, T const & angularVelocityX); - /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Y-axis. /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXY( - T const & angleX, - T const & angleY); + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleY( + T const & angleY, T const & angularVelocityY); - /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). + /// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Z-axis. /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYX( - T const & angleY, - T const & angleX); + GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleZ( + T const & angleZ, T const & angularVelocityZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). + /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXY( + T const& angleX, + T const& angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). + /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYX( + T const& angleY, + T const& angleX); /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXZ( - T const & angleX, - T const & angleZ); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZ( + T const& angleX, + T const& angleZ); /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZX( - T const & angle, - T const & angleX); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZX( + T const& angle, + T const& angleX); /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYZ( - T const & angleY, - T const & angleZ); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZ( + T const& angleY, + T const& angleZ); /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZY( - T const & angleZ, - T const & angleY); + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZY( + T const& angleZ, + T const& angleY); /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z). /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXYZ( - T const & t1, - T const & t2, - T const & t3); - + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYZ( + T const& t1, + T const& t2, + T const& t3); + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXZ( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * X). + /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYXZ( - T const & yaw, - T const & pitch, - T const & roll); - - /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * X). /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat4x4<T, defaultp> yawPitchRoll( - T const & yaw, - T const & pitch, - T const & roll); + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYX( + T const & t1, + T const & t2, + T const & t3); - /// Creates a 2D 2 * 2 rotation matrix from an euler angle. + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Y). /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat2x2<T, defaultp> orientate2(T const & angle); + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXY( + T const & t1, + T const & t2, + T const & t3); - /// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * Y). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * Z). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Z). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXZ( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * Y). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZY( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * X). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * X). + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYX( + T const & t1, + T const & t2, + T const & t3); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Y). /// @see gtx_euler_angles template <typename T> - GLM_FUNC_DECL tmat3x3<T, defaultp> orientate3(T const & angle); + GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXY( + T const & t1, + T const & t2, + T const & t3); - /// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<4, 4, T, defaultp> yawPitchRoll( + T const& yaw, + T const& pitch, + T const& roll); + + /// Creates a 2D 2 * 2 rotation matrix from an euler angle. /// @see gtx_euler_angles - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> orientate3(tvec3<T, P> const & angles); - + template<typename T> + GLM_FUNC_DECL mat<2, 2, T, defaultp> orientate2(T const& angle); + + /// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. + /// @see gtx_euler_angles + template<typename T> + GLM_FUNC_DECL mat<3, 3, T, defaultp> orientate3(T const& angle); + + /// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> orientate3(vec<3, T, Q> const& angles); + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). /// @see gtx_euler_angles - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> orientate4(tvec3<T, P> const & angles); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> orientate4(vec<3, T, Q> const& angles); /// Extracts the (X * Y * Z) Euler angles from the rotation matrix M /// @see gtx_euler_angles - template <typename T> - GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4<T, defaultp> const & M, + template<typename T> + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, T & t1, T & t2, T & t3); - + + /// Extracts the (Y * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Z) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (X * Z * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Y * Z * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * Y * X) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + + /// Extracts the (Z * X * Y) Euler angles from the rotation matrix M + /// @see gtx_euler_angles + template <typename T> + GLM_FUNC_DECL void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3); + /// @} }//namespace glm diff --git a/external/include/glm/gtx/euler_angles.inl b/external/include/glm/gtx/euler_angles.inl index dbe0a48..8a289d8 100644 --- a/external/include/glm/gtx/euler_angles.inl +++ b/external/include/glm/gtx/euler_angles.inl @@ -5,48 +5,48 @@ namespace glm { - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleX + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleX ( - T const & angleX + T const& angleX ) { T cosX = glm::cos(angleX); T sinX = glm::sin(angleX); - - return tmat4x4<T, defaultp>( + + return mat<4, 4, T, defaultp>( T(1), T(0), T(0), T(0), T(0), cosX, sinX, T(0), T(0),-sinX, cosX, T(0), T(0), T(0), T(0), T(1)); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleY + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleY ( - T const & angleY + T const& angleY ) { T cosY = glm::cos(angleY); T sinY = glm::sin(angleY); - return tmat4x4<T, defaultp>( + return mat<4, 4, T, defaultp>( cosY, T(0), -sinY, T(0), T(0), T(1), T(0), T(0), sinY, T(0), cosY, T(0), T(0), T(0), T(0), T(1)); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZ + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZ ( - T const & angleZ + T const& angleZ ) { T cosZ = glm::cos(angleZ); T sinZ = glm::sin(angleZ); - return tmat4x4<T, defaultp>( + return mat<4, 4, T, defaultp>( cosZ, sinZ, T(0), T(0), -sinZ, cosZ, T(0), T(0), T(0), T(0), T(1), T(0), @@ -54,10 +54,61 @@ namespace glm } template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXY + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleX ( T const & angleX, - T const & angleY + T const & angularVelocityX + ) + { + T cosX = glm::cos(angleX) * angularVelocityX; + T sinX = glm::sin(angleX) * angularVelocityX; + + return mat<4, 4, T, defaultp>( + T(0), T(0), T(0), T(0), + T(0),-sinX, cosX, T(0), + T(0),-cosX,-sinX, T(0), + T(0), T(0), T(0), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleY + ( + T const & angleY, + T const & angularVelocityY + ) + { + T cosY = glm::cos(angleY) * angularVelocityY; + T sinY = glm::sin(angleY) * angularVelocityY; + + return mat<4, 4, T, defaultp>( + -sinY, T(0), -cosY, T(0), + T(0), T(0), T(0), T(0), + cosY, T(0), -sinY, T(0), + T(0), T(0), T(0), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleZ + ( + T const & angleZ, + T const & angularVelocityZ + ) + { + T cosZ = glm::cos(angleZ) * angularVelocityZ; + T sinZ = glm::sin(angleZ) * angularVelocityZ; + + return mat<4, 4, T, defaultp>( + -sinZ, cosZ, T(0), T(0), + -cosZ, -sinZ, T(0), T(0), + T(0), T(0), T(0), T(0), + T(0), T(0), T(0), T(0)); + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXY + ( + T const& angleX, + T const& angleY ) { T cosX = glm::cos(angleX); @@ -65,18 +116,18 @@ namespace glm T cosY = glm::cos(angleY); T sinY = glm::sin(angleY); - return tmat4x4<T, defaultp>( + return mat<4, 4, T, defaultp>( cosY, -sinX * -sinY, cosX * -sinY, T(0), T(0), cosX, sinX, T(0), sinY, -sinX * cosY, cosX * cosY, T(0), T(0), T(0), T(0), T(1)); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYX + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYX ( - T const & angleY, - T const & angleX + T const& angleY, + T const& angleX ) { T cosX = glm::cos(angleX); @@ -84,59 +135,59 @@ namespace glm T cosY = glm::cos(angleY); T sinY = glm::sin(angleY); - return tmat4x4<T, defaultp>( + return mat<4, 4, T, defaultp>( cosY, 0, -sinY, T(0), sinY * sinX, cosX, cosY * sinX, T(0), sinY * cosX, -sinX, cosY * cosX, T(0), T(0), T(0), T(0), T(1)); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXZ + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZ ( - T const & angleX, - T const & angleZ + T const& angleX, + T const& angleZ ) { return eulerAngleX(angleX) * eulerAngleZ(angleZ); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZX + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZX ( - T const & angleZ, - T const & angleX + T const& angleZ, + T const& angleX ) { return eulerAngleZ(angleZ) * eulerAngleX(angleX); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYZ + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZ ( - T const & angleY, - T const & angleZ + T const& angleY, + T const& angleZ ) { return eulerAngleY(angleY) * eulerAngleZ(angleZ); } - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZY + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZY ( - T const & angleZ, - T const & angleY + T const& angleZ, + T const& angleY ) { return eulerAngleZ(angleZ) * eulerAngleY(angleY); } - - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXYZ + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYZ ( - T const & t1, - T const & t2, - T const & t3 + T const& t1, + T const& t2, + T const& t3 ) { T c1 = glm::cos(-t1); @@ -145,8 +196,8 @@ namespace glm T s1 = glm::sin(-t1); T s2 = glm::sin(-t2); T s3 = glm::sin(-t3); - - tmat4x4<T, defaultp> Result; + + mat<4, 4, T, defaultp> Result; Result[0][0] = c2 * c3; Result[0][1] =-c1 * s3 + s1 * s2 * c3; Result[0][2] = s1 * s3 + c1 * s2 * c3; @@ -165,13 +216,13 @@ namespace glm Result[3][3] = static_cast<T>(1); return Result; } - - template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYXZ + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXZ ( - T const & yaw, - T const & pitch, - T const & roll + T const& yaw, + T const& pitch, + T const& roll ) { T tmp_ch = glm::cos(yaw); @@ -181,7 +232,7 @@ namespace glm T tmp_cb = glm::cos(roll); T tmp_sb = glm::sin(roll); - tmat4x4<T, defaultp> Result; + mat<4, 4, T, defaultp> Result; Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; Result[0][1] = tmp_sb * tmp_cp; Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; @@ -202,11 +253,361 @@ namespace glm } template <typename T> - GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> yawPitchRoll + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = c1 * s2; + Result[0][2] = s1 * s2; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-c3 * s2; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c1 * s3 + c2 * c3 * s1; + Result[1][3] = static_cast<T>(0); + Result[2][0] = s2 * s3; + Result[2][1] =-c3 * s1 - c1 * c2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYX ( - T const & yaw, - T const & pitch, - T const & roll + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2; + Result[0][1] = s1 * s2; + Result[0][2] =-c1 * s2; + Result[0][3] = static_cast<T>(0); + Result[1][0] = s2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = c3 * s1 + c1 * c2 * s3; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c3 * s2; + Result[2][1] =-c1 * s3 - c2 * c3 * s1; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = s2* s3; + Result[0][2] =-c3 * s1 - c1 * c2 * s3; + Result[0][3] = static_cast<T>(0); + Result[1][0] = s1 * s2; + Result[1][1] = c2; + Result[1][2] = c1 * s2; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c1 * s3 + c2 * c3 * s1; + Result[2][1] =-c3 * s2; + Result[2][2] = c1 * c2 * c3 - s1 * s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c3 * s2; + Result[0][2] =-c1 * s3 - c2 * c3 * s1; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-c1 * s2; + Result[1][1] = c2; + Result[1][2] = s1 * s2; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c3 * s1 + c1 * c2 * s3; + Result[2][1] = s2 * s3; + Result[2][2] = c1 * c3 - c2 * s1 * s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2 * c3 - s1 * s3; + Result[0][1] = c1 * s3 + c2 * c3 * s1; + Result[0][2] =-c3 * s2; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-c3 * s1 - c1 * c2 * s3; + Result[1][1] = c1 * c3 - c2 * s1 * s3; + Result[1][2] = s2 * s3; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c1 * s2; + Result[2][1] = s1 * s2; + Result[2][2] = c2; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXZ + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - c2 * s1 * s3; + Result[0][1] = c3 * s1 + c1 * c2 * s3; + Result[0][2] = s2 *s3; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-c1 * s3 - c2 * c3 * s1; + Result[1][1] = c1 * c2 * c3 - s1 * s3; + Result[1][2] = c3 * s2; + Result[1][3] = static_cast<T>(0); + Result[2][0] = s1 * s2; + Result[2][1] =-c1 * s2; + Result[2][2] = c2; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c2 * c3; + Result[0][1] = s1 * s3 + c1 * c3 * s2; + Result[0][2] = c3 * s1 * s2 - c1 * s3; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-s2; + Result[1][1] = c1 * c2; + Result[1][2] = c2 * s1; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c2 * s3; + Result[2][1] = c1 * s2 * s3 - c3 * s1; + Result[2][2] = c1 * c3 + s1 * s2 *s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = s2; + Result[0][2] =-c2 * s1; + Result[0][3] = static_cast<T>(0); + Result[1][0] = s1 * s3 - c1 * c3 * s2; + Result[1][1] = c2 * c3; + Result[1][2] = c1 * s3 + c3 * s1 * s2; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c3 * s1 + c1 * s2 * s3; + Result[2][1] =-c2 * s3; + Result[2][2] = c1 * c3 - s1 * s2 * s3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYX + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c2; + Result[0][1] = c2 * s1; + Result[0][2] =-s2; + Result[0][3] = static_cast<T>(0); + Result[1][0] = c1 * s2 * s3 - c3 * s1; + Result[1][1] = c1 * c3 + s1 * s2 * s3; + Result[1][2] = c2 * s3; + Result[1][3] = static_cast<T>(0); + Result[2][0] = s1 * s3 + c1 * c3 * s2; + Result[2][1] = c3 * s1 * s2 - c1 * s3; + Result[2][2] = c2 * c3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXY + ( + T const & t1, + T const & t2, + T const & t3 + ) + { + T c1 = glm::cos(t1); + T s1 = glm::sin(t1); + T c2 = glm::cos(t2); + T s2 = glm::sin(t2); + T c3 = glm::cos(t3); + T s3 = glm::sin(t3); + + mat<4, 4, T, defaultp> Result; + Result[0][0] = c1 * c3 - s1 * s2 * s3; + Result[0][1] = c3 * s1 + c1 * s2 * s3; + Result[0][2] =-c2 * s3; + Result[0][3] = static_cast<T>(0); + Result[1][0] =-c2 * s1; + Result[1][1] = c1 * c2; + Result[1][2] = s2; + Result[1][3] = static_cast<T>(0); + Result[2][0] = c1 * s3 + c3 * s1 * s2; + Result[2][1] = s1 * s3 - c1 * c3 * s2; + Result[2][2] = c2 * c3; + Result[2][3] = static_cast<T>(0); + Result[3][0] = static_cast<T>(0); + Result[3][1] = static_cast<T>(0); + Result[3][2] = static_cast<T>(0); + Result[3][3] = static_cast<T>(1); + return Result; + } + + template<typename T> + GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> yawPitchRoll + ( + T const& yaw, + T const& pitch, + T const& roll ) { T tmp_ch = glm::cos(yaw); @@ -216,7 +617,7 @@ namespace glm T tmp_cb = glm::cos(roll); T tmp_sb = glm::sin(roll); - tmat4x4<T, defaultp> Result; + mat<4, 4, T, defaultp> Result; Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; Result[0][1] = tmp_sb * tmp_cp; Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; @@ -236,16 +637,16 @@ namespace glm return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat2x2<T, defaultp> orientate2 + template<typename T> + GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> orientate2 ( - T const & angle + T const& angle ) { T c = glm::cos(angle); T s = glm::sin(angle); - tmat2x2<T, defaultp> Result; + mat<2, 2, T, defaultp> Result; Result[0][0] = c; Result[0][1] = s; Result[1][0] = -s; @@ -253,16 +654,16 @@ namespace glm return Result; } - template <typename T> - GLM_FUNC_QUALIFIER tmat3x3<T, defaultp> orientate3 + template<typename T> + GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> orientate3 ( - T const & angle + T const& angle ) { T c = glm::cos(angle); T s = glm::sin(angle); - tmat3x3<T, defaultp> Result; + mat<3, 3, T, defaultp> Result; Result[0][0] = c; Result[0][1] = s; Result[0][2] = 0.0f; @@ -275,26 +676,26 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> orientate3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orientate3 ( - tvec3<T, P> const & angles + vec<3, T, Q> const& angles ) { - return tmat3x3<T, P>(yawPitchRoll(angles.z, angles.x, angles.y)); + return mat<3, 3, T, Q>(yawPitchRoll(angles.z, angles.x, angles.y)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> orientate4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientate4 ( - tvec3<T, P> const & angles + vec<3, T, Q> const& angles ) { return yawPitchRoll(angles.z, angles.x, angles.y); } - - template <typename T> - GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4<T, defaultp> const & M, + + template<typename T> + GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M, T & t1, T & t2, T & t3) @@ -309,4 +710,191 @@ namespace glm t2 = -T2; t3 = -T3; } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[2][0], M[2][2]); + T C2 = glm::sqrt(M[0][1]*M[0][1] + M[1][1]*M[1][1]); + T T2 = glm::atan2<T, defaultp>(-M[2][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(S1*M[1][2] - C1*M[1][0], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[0][2], M[0][1]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2<T, defaultp>(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(C1*M[1][2] - S1*M[1][1], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[0][1], -M[0][2]); + T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2<T, defaultp>(S2, M[0][0]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(-C1*M[2][1] - S1*M[2][2], C1*M[1][1] + S1*M[1][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[1][0], M[1][2]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2<T, defaultp>(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(C1*M[2][0] - S1*M[2][2], C1*M[0][0] - S1*M[0][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[1][2], -M[1][0]); + T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2<T, defaultp>(S2, M[1][1]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(-S1*M[0][0] - C1*M[0][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[2][1], M[2][0]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2<T, defaultp>(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(C1*M[0][1] - S1*M[0][0], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[2][0], -M[2][1]); + T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]); + T T2 = glm::atan2<T, defaultp>(S2, M[2][2]); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(-C1*M[1][0] - S1*M[1][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[1][2], M[1][1]); + T C2 = glm::sqrt(M[0][0]*M[0][0] + M[2][0]*M[2][0]); + T T2 = glm::atan2<T, defaultp>(-M[1][0], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(S1*M[0][1] - C1*M[0][2], C1*M[2][2] - S1*M[2][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(-M[0][2], M[0][0]); + T C2 = glm::sqrt(M[1][1]*M[1][1] + M[2][1]*M[2][1]); + T T2 = glm::atan2<T, defaultp>(M[0][1], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(S1*M[1][0] + C1*M[1][2], S1*M[2][0] + C1*M[2][2]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(M[0][1], M[0][0]); + T C2 = glm::sqrt(M[1][2]*M[1][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2<T, defaultp>(-M[0][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(S1*M[2][0] - C1*M[2][1], C1*M[1][1] - S1*M[1][0]); + t1 = T1; + t2 = T2; + t3 = T3; + } + + template <typename T> + GLM_FUNC_QUALIFIER void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M, + T & t1, + T & t2, + T & t3) + { + T T1 = glm::atan2<T, defaultp>(-M[1][0], M[1][1]); + T C2 = glm::sqrt(M[0][2]*M[0][2] + M[2][2]*M[2][2]); + T T2 = glm::atan2<T, defaultp>(M[1][2], C2); + T S1 = glm::sin(T1); + T C1 = glm::cos(T1); + T T3 = glm::atan2<T, defaultp>(C1*M[2][0] + S1*M[2][1], C1*M[0][0] + S1*M[0][1]); + t1 = T1; + t2 = T2; + t3 = T3; + } }//namespace glm diff --git a/external/include/glm/gtx/extend.hpp b/external/include/glm/gtx/extend.hpp index 26837a8..c456fae 100644 --- a/external/include/glm/gtx/extend.hpp +++ b/external/include/glm/gtx/extend.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_extend GLM_GTX_extend /// @ingroup gtx /// -/// @brief Extend a position from a source to a position at a defined length. +/// Include <glm/gtx/extend.hpp> to use the features of this extension. /// -/// <glm/gtx/extend.hpp> need to be included to use these functionalities. +/// Extend a position from a source to a position at a defined length. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_extend extension included") #endif @@ -26,10 +30,10 @@ namespace glm /// Extends of Length the Origin position using the (Source - Origin) direction. /// @see gtx_extend - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType extend( - genType const & Origin, - genType const & Source, + genType const& Origin, + genType const& Source, typename genType::value_type const Length); /// @} diff --git a/external/include/glm/gtx/extend.inl b/external/include/glm/gtx/extend.inl index 3155583..9371ee6 100644 --- a/external/include/glm/gtx/extend.inl +++ b/external/include/glm/gtx/extend.inl @@ -3,45 +3,45 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType extend ( - genType const & Origin, - genType const & Source, - genType const & Distance + genType const& Origin, + genType const& Source, + genType const& Distance ) { return Origin + (Source - Origin) * Distance; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> extend + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> extend ( - tvec2<T, P> const & Origin, - tvec2<T, P> const & Source, - T const & Distance + vec<2, T, Q> const& Origin, + vec<2, T, Q> const& Source, + T const& Distance ) { return Origin + (Source - Origin) * Distance; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> extend + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> extend ( - tvec3<T, P> const & Origin, - tvec3<T, P> const & Source, - T const & Distance + vec<3, T, Q> const& Origin, + vec<3, T, Q> const& Source, + T const& Distance ) { return Origin + (Source - Origin) * Distance; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> extend + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> extend ( - tvec4<T, P> const & Origin, - tvec4<T, P> const & Source, - T const & Distance + vec<4, T, Q> const& Origin, + vec<4, T, Q> const& Source, + T const& Distance ) { return Origin + (Source - Origin) * Distance; diff --git a/external/include/glm/gtx/extended_min_max.hpp b/external/include/glm/gtx/extended_min_max.hpp index f4d8859..b061bc8 100644 --- a/external/include/glm/gtx/extended_min_max.hpp +++ b/external/include/glm/gtx/extended_min_max.hpp @@ -2,130 +2,223 @@ /// @file glm/gtx/extended_min_max.hpp /// /// @see core (dependence) -/// @see gtx_half_float (dependence) /// -/// @defgroup gtx_extented_min_max GLM_GTX_extented_min_max +/// @defgroup gtx_extended_min_max GLM_GTX_extented_min_max /// @ingroup gtx /// -/// Min and max functions for 3 to 4 parameters. +/// Include <glm/gtx/extented_min_max.hpp> to use the features of this extension. /// -/// <glm/gtx/extented_min_max.hpp> need to be included to use these functionalities. +/// Min and max functions for 3 to 4 parameters. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_extented_min_max extension included") #endif namespace glm { - /// @addtogroup gtx_extented_min_max + /// @addtogroup gtx_extended_min_max /// @{ - /// Return the minimum component-wise values of 3 inputs + /// Return the minimum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T> + template<typename T> GLM_FUNC_DECL T min( - T const & x, - T const & y, - T const & z); + T const& x, + T const& y, + T const& z); /// Return the minimum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> min( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z); + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z); - /// Return the minimum component-wise values of 3 inputs + /// Return the minimum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> min( - C<T> const & x, - C<T> const & y, - C<T> const & z); + C<T> const& x, + C<T> const& y, + C<T> const& z); - /// Return the minimum component-wise values of 4 inputs + /// Return the minimum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T> + template<typename T> GLM_FUNC_DECL T min( - T const & x, - T const & y, - T const & z, - T const & w); + T const& x, + T const& y, + T const& z, + T const& w); - /// Return the minimum component-wise values of 4 inputs + /// Return the minimum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> min( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z, - typename C<T>::T const & w); + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z, + typename C<T>::T const& w); /// Return the minimum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> min( - C<T> const & x, - C<T> const & y, - C<T> const & z, - C<T> const & w); + C<T> const& x, + C<T> const& y, + C<T> const& z, + C<T> const& w); - /// Return the maximum component-wise values of 3 inputs + /// Return the maximum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T> + template<typename T> GLM_FUNC_DECL T max( - T const & x, - T const & y, - T const & z); + T const& x, + T const& y, + T const& z); /// Return the maximum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> max( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z); + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z); - /// Return the maximum component-wise values of 3 inputs + /// Return the maximum component-wise values of 3 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> max( - C<T> const & x, - C<T> const & y, - C<T> const & z); + C<T> const& x, + C<T> const& y, + C<T> const& z); /// Return the maximum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T> + template<typename T> GLM_FUNC_DECL T max( - T const & x, - T const & y, - T const & z, - T const & w); + T const& x, + T const& y, + T const& z, + T const& w); - /// Return the maximum component-wise values of 4 inputs + /// Return the maximum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> max( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z, - typename C<T>::T const & w); + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z, + typename C<T>::T const& w); - /// Return the maximum component-wise values of 4 inputs + /// Return the maximum component-wise values of 4 inputs /// @see gtx_extented_min_max - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_DECL C<T> max( - C<T> const & x, - C<T> const & y, - C<T> const & z, - C<T> const & w); + C<T> const& x, + C<T> const& y, + C<T> const& z, + C<T> const& w); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see gtx_extented_min_max + template<typename genType> + GLM_FUNC_DECL genType fmin(genType x, genType y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + /// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmin">std::fmin documentation</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fmin(vec<L, T, Q> const& x, T y); + + /// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + /// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmin">std::fmin documentation</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fmin(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam genType Floating-point; scalar or vector types. + /// + /// @see gtx_extented_min_max + /// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmax">std::fmax documentation</a> + template<typename genType> + GLM_FUNC_DECL genType fmax(genType x, genType y); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + /// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmax">std::fmax documentation</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fmax(vec<L, T, Q> const& x, T y); + + /// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + /// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmax">std::fmax documentation</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fmax(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see gtx_extented_min_max + template<typename genType> + GLM_FUNC_DECL genType fclamp(genType x, genType minVal, genType maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal); + + /// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see gtx_extented_min_max + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal); + /// @} }//namespace glm diff --git a/external/include/glm/gtx/extended_min_max.inl b/external/include/glm/gtx/extended_min_max.inl index 64ea445..ac3dd64 100644 --- a/external/include/glm/gtx/extended_min_max.inl +++ b/external/include/glm/gtx/extended_min_max.inl @@ -3,138 +3,217 @@ namespace glm { - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T min( - T const & x, - T const & y, - T const & z) + T const& x, + T const& y, + T const& z) { return glm::min(glm::min(x, y), z); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> min ( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z ) { return glm::min(glm::min(x, y), z); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> min ( - C<T> const & x, - C<T> const & y, - C<T> const & z + C<T> const& x, + C<T> const& y, + C<T> const& z ) { return glm::min(glm::min(x, y), z); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T min ( - T const & x, - T const & y, - T const & z, - T const & w + T const& x, + T const& y, + T const& z, + T const& w ) { return glm::min(glm::min(x, y), glm::min(z, w)); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> min ( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z, - typename C<T>::T const & w + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z, + typename C<T>::T const& w ) { return glm::min(glm::min(x, y), glm::min(z, w)); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> min ( - C<T> const & x, - C<T> const & y, - C<T> const & z, - C<T> const & w + C<T> const& x, + C<T> const& y, + C<T> const& z, + C<T> const& w ) { return glm::min(glm::min(x, y), glm::min(z, w)); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T max( - T const & x, - T const & y, - T const & z) + T const& x, + T const& y, + T const& z) { return glm::max(glm::max(x, y), z); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> max ( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z ) { return glm::max(glm::max(x, y), z); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> max ( - C<T> const & x, - C<T> const & y, - C<T> const & z + C<T> const& x, + C<T> const& y, + C<T> const& z ) { return glm::max(glm::max(x, y), z); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T max ( - T const & x, - T const & y, - T const & z, - T const & w + T const& x, + T const& y, + T const& z, + T const& w ) { return glm::max(glm::max(x, y), glm::max(z, w)); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> max ( - C<T> const & x, - typename C<T>::T const & y, - typename C<T>::T const & z, - typename C<T>::T const & w + C<T> const& x, + typename C<T>::T const& y, + typename C<T>::T const& z, + typename C<T>::T const& w ) { return glm::max(glm::max(x, y), glm::max(z, w)); } - template <typename T, template <typename> class C> + template<typename T, template<typename> class C> GLM_FUNC_QUALIFIER C<T> max ( - C<T> const & x, - C<T> const & y, - C<T> const & z, - C<T> const & w + C<T> const& x, + C<T> const& y, + C<T> const& z, + C<T> const& w ) { return glm::max(glm::max(x, y), glm::max(z, w)); } + // fmin +# if GLM_HAS_CXX11_STL + using std::fmin; +# else + template<typename genType> + GLM_FUNC_QUALIFIER genType fmin(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fmin' only accept floating-point input"); + + if (isnan(x)) + return y; + if (isnan(y)) + return x; + + return min(x, y); + } +# endif + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, T b) + { + return detail::functor2<L, T, Q>::call(fmin, a, vec<L, T, Q>(b)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, vec<L, T, Q> const& b) + { + return detail::functor2<L, T, Q>::call(fmin, a, b); + } + + // fmax +# if GLM_HAS_CXX11_STL + using std::fmax; +# else + template<typename genType> + GLM_FUNC_QUALIFIER genType fmax(genType x, genType y) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fmax' only accept floating-point input"); + + if (isnan(x)) + return y; + if (isnan(y)) + return x; + + return max(x, y); + } +# endif + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, T b) + { + return detail::functor2<L, T, Q>::call(fmax, a, vec<L, T, Q>(b)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, vec<L, T, Q> const& b) + { + return detail::functor2<L, T, Q>::call(fmax, a, b); + } + + // fclamp + template<typename genType> + GLM_FUNC_QUALIFIER genType fclamp(genType x, genType minVal, genType maxVal) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fclamp' only accept floating-point or integer inputs"); + return fmin(fmax(x, minVal), maxVal); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal) + { + return fmin(fmax(x, vec<L, T, Q>(minVal)), vec<L, T, Q>(maxVal)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal) + { + return fmin(fmax(x, minVal), maxVal); + } }//namespace glm diff --git a/external/include/glm/gtx/exterior_product.hpp b/external/include/glm/gtx/exterior_product.hpp new file mode 100644 index 0000000..4223b65 --- /dev/null +++ b/external/include/glm/gtx/exterior_product.hpp @@ -0,0 +1,41 @@ +/// @ref gtx_exterior_product +/// @file glm/gtx/exterior_product.hpp +/// +/// @see core (dependence) +/// @see gtx_exterior_product (dependence) +/// +/// @defgroup gtx_exterior_product GLM_GTX_exterior_product +/// @ingroup gtx +/// +/// Include <glm/gtx/exterior_product.hpp> to use the features of this extension. +/// +/// @brief Allow to perform bit operations on integer values + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTX_exterior_product extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_exterior_product + /// @{ + + /// Returns the cross product of x and y. + /// + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="https://en.wikipedia.org/wiki/Exterior_algebra#Cross_and_triple_products">Exterior product</a> + template<typename T, qualifier Q> + GLM_FUNC_DECL T cross(vec<2, T, Q> const& v, vec<2, T, Q> const& u); + + /// @} +} //namespace glm + +#include "exterior_product.inl" diff --git a/external/include/glm/gtx/exterior_product.inl b/external/include/glm/gtx/exterior_product.inl new file mode 100644 index 0000000..b4b3634 --- /dev/null +++ b/external/include/glm/gtx/exterior_product.inl @@ -0,0 +1,27 @@ +/// @ref core +/// @file glm/detail/func_geometric.inl + +#include <limits> + +namespace glm { +namespace detail +{ + template<typename T, qualifier Q, bool Aligned> + struct compute_cross_vec2 + { + GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& v, vec<2, T, Q> const& u) + { + GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cross' accepts only floating-point inputs"); + + return v.x * u.y - u.x * v.y; + } + }; +}//namespace detail + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T cross(vec<2, T, Q> const& x, vec<2, T, Q> const& y) + { + return detail::compute_cross_vec2<T, Q, detail::is_aligned<Q>::value>::call(x, y); + } +}//namespace glm + diff --git a/external/include/glm/gtx/fast_exponential.hpp b/external/include/glm/gtx/fast_exponential.hpp index ed64a27..2d4918e 100644 --- a/external/include/glm/gtx/fast_exponential.hpp +++ b/external/include/glm/gtx/fast_exponential.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential /// @ingroup gtx /// -/// @brief Fast but less accurate implementations of exponential based functions. +/// Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. /// -/// <glm/gtx/fast_exponential.hpp> need to be included to use these functionalities. +/// Fast but less accurate implementations of exponential based functions. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_fast_exponential extension included") #endif @@ -27,63 +31,63 @@ namespace glm /// Faster than the common pow function but less accurate. /// @see gtx_fast_exponential - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType fastPow(genType x, genType y); /// Faster than the common pow function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastPow(vecType<T, P> const & x, vecType<T, P> const & y); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y); /// Faster than the common pow function but less accurate. /// @see gtx_fast_exponential - template <typename genTypeT, typename genTypeU> + template<typename genTypeT, typename genTypeU> GLM_FUNC_DECL genTypeT fastPow(genTypeT x, genTypeU y); /// Faster than the common pow function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastPow(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x); /// Faster than the common exp function but less accurate. /// @see gtx_fast_exponential - template <typename T> + template<typename T> GLM_FUNC_DECL T fastExp(T x); /// Faster than the common exp function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastExp(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastExp(vec<L, T, Q> const& x); /// Faster than the common log function but less accurate. /// @see gtx_fast_exponential - template <typename T> + template<typename T> GLM_FUNC_DECL T fastLog(T x); /// Faster than the common exp2 function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastLog(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastLog(vec<L, T, Q> const& x); /// Faster than the common exp2 function but less accurate. /// @see gtx_fast_exponential - template <typename T> + template<typename T> GLM_FUNC_DECL T fastExp2(T x); /// Faster than the common exp2 function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastExp2(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastExp2(vec<L, T, Q> const& x); /// Faster than the common log2 function but less accurate. /// @see gtx_fast_exponential - template <typename T> + template<typename T> GLM_FUNC_DECL T fastLog2(T x); /// Faster than the common log2 function but less accurate. /// @see gtx_fast_exponential - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastLog2(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastLog2(vec<L, T, Q> const& x); /// @} }//namespace glm diff --git a/external/include/glm/gtx/fast_exponential.inl b/external/include/glm/gtx/fast_exponential.inl index 72f9f8f..9dfb109 100644 --- a/external/include/glm/gtx/fast_exponential.inl +++ b/external/include/glm/gtx/fast_exponential.inl @@ -4,19 +4,19 @@ namespace glm { // fastPow: - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastPow(genType x, genType y) { return exp(y * log(x)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastPow(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { return exp(y * log(x)); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastPow(T x, int y) { T f = static_cast<T>(1); @@ -25,10 +25,10 @@ namespace glm return f; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastPow(vecType<T, P> const & x, vecType<int, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, int, Q> const& y) { - vecType<T, P> Result(uninitialize); + vec<L, T, Q> Result; for(length_t i = 0, n = x.length(); i < n; ++i) Result[i] = fastPow(x[i], y[i]); return Result; @@ -36,7 +36,7 @@ namespace glm // fastExp // Note: This function provides accurate results only for value between -1 and 1, else avoid it. - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastExp(T x) { // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. @@ -81,14 +81,14 @@ namespace glm } */ - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastExp(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastExp(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastExp, x); + return detail::functor1<L, T, T, Q>::call(fastExp, x); } // fastLog - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastLog(genType x) { return std::log(x); @@ -103,35 +103,35 @@ namespace glm } */ - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastLog(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastLog(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastLog, x); + return detail::functor1<L, T, T, Q>::call(fastLog, x); } //fastExp2, ln2 = 0.69314718055994530941723212145818f - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastExp2(genType x) { return fastExp(0.69314718055994530941723212145818f * x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastExp2(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastExp2(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastExp2, x); + return detail::functor1<L, T, T, Q>::call(fastExp2, x); } // fastLog2, ln2 = 0.69314718055994530941723212145818f - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastLog2(genType x) { return fastLog(x) / 0.69314718055994530941723212145818f; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastLog2(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastLog2(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastLog2, x); + return detail::functor1<L, T, T, Q>::call(fastLog2, x); } }//namespace glm diff --git a/external/include/glm/gtx/fast_square_root.hpp b/external/include/glm/gtx/fast_square_root.hpp index 35aa7f3..9e15cb0 100644 --- a/external/include/glm/gtx/fast_square_root.hpp +++ b/external/include/glm/gtx/fast_square_root.hpp @@ -6,11 +6,11 @@ /// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root /// @ingroup gtx /// -/// @brief Fast but less accurate implementations of square root based functions. -/// - Sqrt optimisation based on Newton's method, -/// www.gamedev.net/community/forums/topic.asp?topic id=139956 +/// Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. /// -/// <glm/gtx/fast_square_root.hpp> need to be included to use these functionalities. +/// Fast but less accurate implementations of square root based functions. +/// - Sqrt optimisation based on Newton's method, +/// www.gamedev.net/community/forums/topic.asp?topic id=139956 #pragma once @@ -19,6 +19,10 @@ #include "../exponential.hpp" #include "../geometric.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_fast_square_root extension included") #endif @@ -31,56 +35,56 @@ namespace glm /// Faster than the common sqrt function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType fastSqrt(genType x); /// Faster than the common sqrt function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastSqrt(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x); /// Faster than the common inversesqrt function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType fastInverseSqrt(genType x); /// Faster than the common inversesqrt function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> fastInverseSqrt(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x); /// Faster than the common length function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType fastLength(genType x); /// Faster than the common length function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T fastLength(vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T fastLength(vec<L, T, Q> const& x); /// Faster than the common distance function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType fastDistance(genType x, genType y); /// Faster than the common distance function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T fastDistance(vecType<T, P> const & x, vecType<T, P> const & y); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y); /// Faster than the common normalize function but less accurate. /// /// @see gtx_fast_square_root extension. - template <typename genType> - GLM_FUNC_DECL genType fastNormalize(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType fastNormalize(genType const& x); /// @} }// namespace glm diff --git a/external/include/glm/gtx/fast_square_root.inl b/external/include/glm/gtx/fast_square_root.inl index 73950ae..e988987 100644 --- a/external/include/glm/gtx/fast_square_root.inl +++ b/external/include/glm/gtx/fast_square_root.inl @@ -4,7 +4,7 @@ namespace glm { // fastSqrt - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastSqrt(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fastSqrt' only accept floating-point input"); @@ -12,32 +12,32 @@ namespace glm return genType(1) / fastInverseSqrt(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastSqrt(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastSqrt, x); + return detail::functor1<L, T, T, Q>::call(fastSqrt, x); } // fastInversesqrt - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastInverseSqrt(genType x) { # ifdef __CUDACC__ // Wordaround for a CUDA compiler bug up to CUDA6 - tvec1<T, P> tmp(detail::compute_inversesqrt<tvec1, genType, lowp, detail::is_aligned<lowp>::value>::call(tvec1<genType, lowp>(x))); + vec<1, T, Q> tmp(detail::compute_inversesqrt<tvec1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x))); return tmp.x; # else - return detail::compute_inversesqrt<tvec1, genType, highp, detail::is_aligned<highp>::value>::call(tvec1<genType, lowp>(x)).x; + return detail::compute_inversesqrt<1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x)).x; # endif } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastInverseSqrt(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x) { - return detail::compute_inversesqrt<vecType, T, P, detail::is_aligned<P>::value>::call(x); + return detail::compute_inversesqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x); } // fastLength - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastLength(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fastLength' only accept floating-point inputs"); @@ -45,8 +45,8 @@ namespace glm return abs(x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T fastLength(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T fastLength(vec<L, T, Q> const& x) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'fastLength' only accept floating-point inputs"); @@ -54,27 +54,27 @@ namespace glm } // fastDistance - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastDistance(genType x, genType y) { return fastLength(y - x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T fastDistance(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { return fastLength(y - x); } // fastNormalize - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType fastNormalize(genType x) { return x > genType(0) ? genType(1) : -genType(1); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastNormalize(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastNormalize(vec<L, T, Q> const& x) { return x * fastInverseSqrt(dot(x, x)); } diff --git a/external/include/glm/gtx/fast_trigonometry.hpp b/external/include/glm/gtx/fast_trigonometry.hpp index ccb1d22..4ec87c3 100644 --- a/external/include/glm/gtx/fast_trigonometry.hpp +++ b/external/include/glm/gtx/fast_trigonometry.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry /// @ingroup gtx /// -/// @brief Fast but less accurate implementations of trigonometric functions. +/// Include <glm/gtx/fast_trigonometry.hpp> to use the features of this extension. /// -/// <glm/gtx/fast_trigonometry.hpp> need to be included to use these functionalities. +/// Fast but less accurate implementations of trigonometric functions. #pragma once // Dependency: #include "../gtc/constants.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_fast_trigonometry extension included") #endif @@ -26,47 +30,47 @@ namespace glm /// Wrap an angle to [0 2pi[ /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T wrapAngle(T angle); /// Faster than the common sin function but less accurate. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastSin(T angle); /// Faster than the common cos function but less accurate. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastCos(T angle); - /// Faster than the common tan function but less accurate. - /// Defined between -2pi and 2pi. + /// Faster than the common tan function but less accurate. + /// Defined between -2pi and 2pi. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastTan(T angle); - /// Faster than the common asin function but less accurate. + /// Faster than the common asin function but less accurate. /// Defined between -2pi and 2pi. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastAsin(T angle); - /// Faster than the common acos function but less accurate. - /// Defined between -2pi and 2pi. + /// Faster than the common acos function but less accurate. + /// Defined between -2pi and 2pi. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastAcos(T angle); /// Faster than the common atan function but less accurate. - /// Defined between -2pi and 2pi. + /// Defined between -2pi and 2pi. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastAtan(T y, T x); - /// Faster than the common atan function but less accurate. + /// Faster than the common atan function but less accurate. /// Defined between -2pi and 2pi. /// From GLM_GTX_fast_trigonometry extension. - template <typename T> + template<typename T> GLM_FUNC_DECL T fastAtan(T angle); /// @} diff --git a/external/include/glm/gtx/fast_trigonometry.inl b/external/include/glm/gtx/fast_trigonometry.inl index f576c17..a733160 100644 --- a/external/include/glm/gtx/fast_trigonometry.inl +++ b/external/include/glm/gtx/fast_trigonometry.inl @@ -4,45 +4,45 @@ namespace glm{ namespace detail { - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> taylorCos(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> taylorCos(vec<L, T, Q> const& x) { return static_cast<T>(1) - - (x * x) / 2.f - + (x * x * x * x) / 24.f - - (x * x * x * x * x * x) / 720.f - + (x * x * x * x * x * x * x * x) / 40320.f; + - (x * x) * (1.f / 2.f) + + ((x * x) * (x * x)) * (1.f / 24.f) + - (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f) + + (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T cos_52s(T x) { T const xx(x * x); return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095)))); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> cos_52s(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> cos_52s(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(cos_52s, x); + return detail::functor1<L, T, T, Q>::call(cos_52s, x); } }//namespace detail // wrapAngle - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T wrapAngle(T angle) { return abs<T>(mod<T>(angle, two_pi<T>())); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> wrapAngle(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> wrapAngle(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(wrapAngle, x); + return detail::functor1<L, T, T, Q>::call(wrapAngle, x); } // cos - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastCos(T x) { T const angle(wrapAngle<T>(x)); @@ -57,87 +57,87 @@ namespace detail return detail::cos_52s(two_pi<T>() - angle); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastCos(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastCos(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastCos, x); + return detail::functor1<L, T, T, Q>::call(fastCos, x); } // sin - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastSin(T x) { return fastCos<T>(half_pi<T>() - x); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastSin(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastSin(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastSin, x); + return detail::functor1<L, T, T, Q>::call(fastSin, x); } // tan - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastTan(T x) { return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastTan(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastTan(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastTan, x); + return detail::functor1<L, T, T, Q>::call(fastTan, x); } // asin - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastAsin(T x) { return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastAsin(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastAsin(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastAsin, x); + return detail::functor1<L, T, T, Q>::call(fastAsin, x); } // acos - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastAcos(T x) { return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastAcos(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastAcos(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastAcos, x); + return detail::functor1<L, T, T, Q>::call(fastAcos, x); } // atan - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastAtan(T y, T x) { T sgn = sign(y) * sign(x); return abs(fastAtan(y / x)) * sgn; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastAtan(vecType<T, P> const & y, vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& y, vec<L, T, Q> const& x) { - return detail::functor2<T, P, vecType>::call(fastAtan, y, x); + return detail::functor2<L, T, Q>::call(fastAtan, y, x); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T fastAtan(T x) { return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> fastAtan(vecType<T, P> const & x) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& x) { - return detail::functor1<T, T, P, vecType>::call(fastAtan, x); + return detail::functor1<L, T, T, Q>::call(fastAtan, x); } }//namespace glm diff --git a/external/include/glm/gtx/float_notmalize.inl b/external/include/glm/gtx/float_notmalize.inl index 4dde025..bceab10 100644 --- a/external/include/glm/gtx/float_notmalize.inl +++ b/external/include/glm/gtx/float_notmalize.inl @@ -5,10 +5,10 @@ namespace glm { - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<float, P> floatNormalize(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, float, Q> floatNormalize(vec<L, T, Q> const& v) { - return vecType<float, P>(v) / static_cast<float>(std::numeric_limits<T>::max()); + return vec<L, float, Q>(v) / static_cast<float>(std::numeric_limits<T>::max()); } }//namespace glm diff --git a/external/include/glm/gtx/functions.hpp b/external/include/glm/gtx/functions.hpp new file mode 100644 index 0000000..98b50d8 --- /dev/null +++ b/external/include/glm/gtx/functions.hpp @@ -0,0 +1,52 @@ +/// @ref gtx_functions +/// @file glm/gtx/functions.hpp +/// +/// @see core (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_functions GLM_GTX_functions +/// @ingroup gtx +/// +/// Include <glm/gtx/functions.hpp> to use the features of this extension. +/// +/// List of useful common functions. + +#pragma once + +// Dependencies +#include "../detail/setup.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_vec2.hpp" + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTX_functions extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_functions + /// @{ + + /// 1D gauss function + /// + /// @see gtc_epsilon + template<typename T> + GLM_FUNC_DECL T gauss( + T x, + T ExpectedValue, + T StandardDeviation); + + /// 2D gauss function + /// + /// @see gtc_epsilon + template<typename T, qualifier Q> + GLM_FUNC_DECL T gauss( + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation); + + /// @} +}//namespace glm + +#include "functions.inl" + diff --git a/external/include/glm/gtc/functions.inl b/external/include/glm/gtx/functions.inl index 1dbc496..ac1e112 100644 --- a/external/include/glm/gtc/functions.inl +++ b/external/include/glm/gtx/functions.inl @@ -1,11 +1,11 @@ -/// @ref gtc_functions -/// @file glm/gtc/functions.inl +/// @ref gtx_functions +/// @file glm/gtx/functions.inl -#include "../detail/func_exponential.hpp" +#include "../exponential.hpp" namespace glm { - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T gauss ( T x, @@ -16,15 +16,15 @@ namespace glm return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast<T>(6.28318530717958647692528676655900576))); } - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T gauss ( - tvec2<T, P> const& Coord, - tvec2<T, P> const& ExpectedValue, - tvec2<T, P> const& StandardDeviation + vec<2, T, Q> const& Coord, + vec<2, T, Q> const& ExpectedValue, + vec<2, T, Q> const& StandardDeviation ) { - tvec2<T, P> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation); + vec<2, T, Q> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation); return exp(-(Squared.x + Squared.y)); } }//namespace glm diff --git a/external/include/glm/gtx/gradient_paint.hpp b/external/include/glm/gtx/gradient_paint.hpp index de1f18d..2713cec 100644 --- a/external/include/glm/gtx/gradient_paint.hpp +++ b/external/include/glm/gtx/gradient_paint.hpp @@ -7,8 +7,9 @@ /// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint /// @ingroup gtx /// -/// @brief Functions that return the color of procedural gradient for specific coordinates. -/// <glm/gtx/gradient_paint.hpp> need to be included to use these functionalities. +/// Include <glm/gtx/gradient_paint.hpp> to use the features of this extension. +/// +/// Functions that return the color of procedural gradient for specific coordinates. #pragma once @@ -16,6 +17,10 @@ #include "../glm.hpp" #include "../gtx/optimum_pow.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_gradient_paint extension included") #endif @@ -27,20 +32,20 @@ namespace glm /// Return a color from a radial gradient. /// @see - gtx_gradient_paint - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL T radialGradient( - tvec2<T, P> const & Center, - T const & Radius, - tvec2<T, P> const & Focal, - tvec2<T, P> const & Position); + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position); /// Return a color from a linear gradient. /// @see - gtx_gradient_paint - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL T linearGradient( - tvec2<T, P> const & Point0, - tvec2<T, P> const & Point1, - tvec2<T, P> const & Position); + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position); /// @} }// namespace glm diff --git a/external/include/glm/gtx/gradient_paint.inl b/external/include/glm/gtx/gradient_paint.inl index aaa5ce1..e2e92b5 100644 --- a/external/include/glm/gtx/gradient_paint.inl +++ b/external/include/glm/gtx/gradient_paint.inl @@ -3,17 +3,17 @@ namespace glm { - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T radialGradient ( - tvec2<T, P> const & Center, - T const & Radius, - tvec2<T, P> const & Focal, - tvec2<T, P> const & Position + vec<2, T, Q> const& Center, + T const& Radius, + vec<2, T, Q> const& Focal, + vec<2, T, Q> const& Position ) { - tvec2<T, P> F = Focal - Center; - tvec2<T, P> D = Position - Focal; + vec<2, T, Q> F = Focal - Center; + vec<2, T, Q> D = Position - Focal; T Radius2 = pow2(Radius); T Fx2 = pow2(F.x); T Fy2 = pow2(F.y); @@ -23,15 +23,15 @@ namespace glm return Numerator / Denominator; } - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T linearGradient ( - tvec2<T, P> const & Point0, - tvec2<T, P> const & Point1, - tvec2<T, P> const & Position + vec<2, T, Q> const& Point0, + vec<2, T, Q> const& Point1, + vec<2, T, Q> const& Position ) { - tvec2<T, P> Dist = Point1 - Point0; + vec<2, T, Q> Dist = Point1 - Point0; return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); } }//namespace glm diff --git a/external/include/glm/gtx/handed_coordinate_space.hpp b/external/include/glm/gtx/handed_coordinate_space.hpp index 2ee5175..1d0d410 100644 --- a/external/include/glm/gtx/handed_coordinate_space.hpp +++ b/external/include/glm/gtx/handed_coordinate_space.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space /// @ingroup gtx /// -/// @brief To know if a set of three basis vectors defines a right or left-handed coordinate system. +/// Include <glm/gtx/handed_coordinate_system.hpp> to use the features of this extension. /// -/// <glm/gtx/handed_coordinate_system.hpp> need to be included to use these functionalities. +/// To know if a set of three basis vectors defines a right or left-handed coordinate system. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_handed_coordinate_space extension included") #endif @@ -26,19 +30,19 @@ namespace glm //! Return if a trihedron right handed or not. //! From GLM_GTX_handed_coordinate_space extension. - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL bool rightHanded( - tvec3<T, P> const & tangent, - tvec3<T, P> const & binormal, - tvec3<T, P> const & normal); + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); //! Return if a trihedron left handed or not. //! From GLM_GTX_handed_coordinate_space extension. - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL bool leftHanded( - tvec3<T, P> const & tangent, - tvec3<T, P> const & binormal, - tvec3<T, P> const & normal); + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal); /// @} }// namespace glm diff --git a/external/include/glm/gtx/handed_coordinate_space.inl b/external/include/glm/gtx/handed_coordinate_space.inl index 2e55653..1639245 100644 --- a/external/include/glm/gtx/handed_coordinate_space.inl +++ b/external/include/glm/gtx/handed_coordinate_space.inl @@ -3,23 +3,23 @@ namespace glm { - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER bool rightHanded ( - tvec3<T, P> const & tangent, - tvec3<T, P> const & binormal, - tvec3<T, P> const & normal + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal ) { return dot(cross(normal, tangent), binormal) > T(0); } - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER bool leftHanded ( - tvec3<T, P> const & tangent, - tvec3<T, P> const & binormal, - tvec3<T, P> const & normal + vec<3, T, Q> const& tangent, + vec<3, T, Q> const& binormal, + vec<3, T, Q> const& normal ) { return dot(cross(normal, tangent), binormal) < T(0); diff --git a/external/include/glm/gtx/hash.hpp b/external/include/glm/gtx/hash.hpp index 2262618..3196be7 100644 --- a/external/include/glm/gtx/hash.hpp +++ b/external/include/glm/gtx/hash.hpp @@ -5,13 +5,17 @@ /// /// @defgroup gtx_hash GLM_GTX_hash /// @ingroup gtx -/// -/// @brief Add std::hash support for glm types -/// -/// <glm/gtx/hash.hpp> need to be included to use these functionalities. +/// +/// Include <glm/gtx/hash.hpp> to use the features of this extension. +/// +/// Add std::hash support for glm types #pragma once +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #include <functional> #include "../vec2.hpp" @@ -40,94 +44,94 @@ namespace std { - template <typename T, glm::precision P> - struct hash<glm::tvec1<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::vec<1, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tvec1<T, P> const & v) const; + GLM_FUNC_DECL size_t operator()(glm::vec<1, T, Q> const& v) const; }; - template <typename T, glm::precision P> - struct hash<glm::tvec2<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::vec<2, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tvec2<T, P> const & v) const; + GLM_FUNC_DECL size_t operator()(glm::vec<2, T, Q> const& v) const; }; - template <typename T, glm::precision P> - struct hash<glm::tvec3<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::vec<3, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tvec3<T, P> const & v) const; + GLM_FUNC_DECL size_t operator()(glm::vec<3, T, Q> const& v) const; }; - template <typename T, glm::precision P> - struct hash<glm::tvec4<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::vec<4, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tvec4<T, P> const & v) const; + GLM_FUNC_DECL size_t operator()(glm::vec<4, T, Q> const& v) const; }; - template <typename T, glm::precision P> - struct hash<glm::tquat<T,P>> + template<typename T, glm::qualifier Q> + struct hash<glm::tquat<T,Q>> { - GLM_FUNC_DECL size_t operator()(glm::tquat<T, P> const & q) const; + GLM_FUNC_DECL size_t operator()(glm::tquat<T, Q> const& q) const; }; - template <typename T, glm::precision P> - struct hash<glm::tdualquat<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::tdualquat<T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tdualquat<T,P> const & q) const; + GLM_FUNC_DECL size_t operator()(glm::tdualquat<T,Q> const& q) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat2x2<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<2, 2, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat2x2<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat2x3<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<2, 3, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat2x3<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat2x4<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<2, 4, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat2x4<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat3x2<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<3, 2, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat3x2<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat3x3<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<3, 3, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat3x3<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat3x4<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<3, 4, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat3x4<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat4x2<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<4, 2, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat4x2<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const; }; - - template <typename T, glm::precision P> - struct hash<glm::tmat4x3<T,P> > + + template<typename T, glm::qualifier Q> + struct hash<glm::mat<4, 3, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat4x3<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const; }; - template <typename T, glm::precision P> - struct hash<glm::tmat4x4<T,P> > + template<typename T, glm::qualifier Q> + struct hash<glm::mat<4, 4, T,Q> > { - GLM_FUNC_DECL size_t operator()(glm::tmat4x4<T,P> const & m) const; + GLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const; }; } // namespace std diff --git a/external/include/glm/gtx/hash.inl b/external/include/glm/gtx/hash.inl index c42f4f0..32e7f12 100644 --- a/external/include/glm/gtx/hash.inl +++ b/external/include/glm/gtx/hash.inl @@ -8,7 +8,7 @@ /// /// @brief Add std::hash support for glm types /// -/// <glm/gtx/hash.inl> need to be included to use these functionalities. +/// <glm/gtx/hash.inl> need to be included to use the features of this extension. namespace glm { namespace detail @@ -22,15 +22,15 @@ namespace detail namespace std { - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tvec1<T, P>>::operator()(glm::tvec1<T, P> const & v) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::vec<1, T, Q>>::operator()(glm::vec<1, T, Q> const& v) const { hash<T> hasher; return hasher(v.x); } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tvec2<T, P>>::operator()(glm::tvec2<T, P> const & v) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::vec<2, T, Q>>::operator()(glm::vec<2, T, Q> const& v) const { size_t seed = 0; hash<T> hasher; @@ -39,8 +39,8 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tvec3<T, P>>::operator()(glm::tvec3<T, P> const & v) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::vec<3, T, Q>>::operator()(glm::vec<3, T, Q> const& v) const { size_t seed = 0; hash<T> hasher; @@ -50,8 +50,8 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tvec4<T, P>>::operator()(glm::tvec4<T, P> const & v) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::vec<4, T, Q>>::operator()(glm::vec<4, T, Q> const& v) const { size_t seed = 0; hash<T> hasher; @@ -62,8 +62,8 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, P>>::operator()(glm::tquat<T,P> const & q) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, Q>>::operator()(glm::tquat<T,Q> const& q) const { size_t seed = 0; hash<T> hasher; @@ -74,84 +74,84 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, P>>::operator()(glm::tdualquat<T, P> const & q) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, Q>>::operator()(glm::tdualquat<T, Q> const& q) const { size_t seed = 0; - hash<glm::tquat<T, P>> hasher; + hash<glm::tquat<T, Q>> hasher; glm::detail::hash_combine(seed, hasher(q.real)); glm::detail::hash_combine(seed, hasher(q.dual)); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x2<T, P>>::operator()(glm::tmat2x2<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 2, T, Q>>::operator()(glm::mat<2, 2, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec2<T, P>> hasher; + hash<glm::vec<2, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x3<T, P>>::operator()(glm::tmat2x3<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 3, T, Q>>::operator()(glm::mat<2, 3, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec3<T, P>> hasher; + hash<glm::vec<3, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x4<T, P>>::operator()(glm::tmat2x4<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 4, T, Q>>::operator()(glm::mat<2, 4, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec4<T, P>> hasher; + hash<glm::vec<4, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x2<T, P>>::operator()(glm::tmat3x2<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 2, T, Q>>::operator()(glm::mat<3, 2, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec2<T, P>> hasher; + hash<glm::vec<2, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x3<T, P>>::operator()(glm::tmat3x3<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 3, T, Q>>::operator()(glm::mat<3, 3, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec3<T, P>> hasher; + hash<glm::vec<3, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x4<T, P>>::operator()(glm::tmat3x4<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 4, T, Q>>::operator()(glm::mat<3, 4, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec4<T, P>> hasher; + hash<glm::vec<4, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x2<T,P>>::operator()(glm::tmat4x2<T,P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 2, T,Q>>::operator()(glm::mat<4, 2, T,Q> const& m) const { size_t seed = 0; - hash<glm::tvec2<T, P>> hasher; + hash<glm::vec<2, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); @@ -159,11 +159,11 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x3<T,P>>::operator()(glm::tmat4x3<T,P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 3, T,Q>>::operator()(glm::mat<4, 3, T,Q> const& m) const { size_t seed = 0; - hash<glm::tvec3<T, P>> hasher; + hash<glm::vec<3, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); @@ -171,11 +171,11 @@ namespace std return seed; } - template <typename T, glm::precision P> - GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x4<T,P>>::operator()(glm::tmat4x4<T, P> const & m) const + template<typename T, glm::qualifier Q> + GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 4, T,Q>>::operator()(glm::mat<4, 4, T, Q> const& m) const { size_t seed = 0; - hash<glm::tvec4<T, P>> hasher; + hash<glm::vec<4, T, Q>> hasher; glm::detail::hash_combine(seed, hasher(m[0])); glm::detail::hash_combine(seed, hasher(m[1])); glm::detail::hash_combine(seed, hasher(m[2])); diff --git a/external/include/glm/gtx/integer.hpp b/external/include/glm/gtx/integer.hpp index 1173a58..7b80209 100644 --- a/external/include/glm/gtx/integer.hpp +++ b/external/include/glm/gtx/integer.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_integer GLM_GTX_integer /// @ingroup gtx /// -/// @brief Add support for integer for core functions +/// Include <glm/gtx/integer.hpp> to use the features of this extension. /// -/// <glm/gtx/integer.hpp> need to be included to use these functionalities. +/// Add support for integer for core functions #pragma once @@ -16,6 +16,10 @@ #include "../glm.hpp" #include "../gtc/integer.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_integer extension included") #endif @@ -25,9 +29,9 @@ namespace glm /// @addtogroup gtx_integer /// @{ - //! Returns x raised to the y power. + //! Returns x raised to the y power. //! From GLM_GTX_integer extension. - GLM_FUNC_DECL int pow(int x, int y); + GLM_FUNC_DECL int pow(int x, uint y); //! Returns the positive square root of x. //! From GLM_GTX_integer extension. @@ -43,10 +47,10 @@ namespace glm //! Return the factorial value of a number (!12 max, integer only) //! From GLM_GTX_integer extension. - template <typename genType> - GLM_FUNC_DECL genType factorial(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType factorial(genType const& x); - //! 32bit signed integer. + //! 32bit signed integer. //! From GLM_GTX_integer extension. typedef signed int sint; @@ -54,7 +58,7 @@ namespace glm //! From GLM_GTX_integer extension. GLM_FUNC_DECL uint pow(uint x, uint y); - //! Returns the positive square root of x. + //! Returns the positive square root of x. //! From GLM_GTX_integer extension. GLM_FUNC_DECL uint sqrt(uint x); diff --git a/external/include/glm/gtx/integer.inl b/external/include/glm/gtx/integer.inl index 3a479e6..c9fcb4e 100644 --- a/external/include/glm/gtx/integer.inl +++ b/external/include/glm/gtx/integer.inl @@ -4,12 +4,13 @@ namespace glm { // pow - GLM_FUNC_QUALIFIER int pow(int x, int y) + GLM_FUNC_QUALIFIER int pow(int x, uint y) { if(y == 0) - return 1; + return x >= 0 ? 1 : -1; + int result = x; - for(int i = 1; i < y; ++i) + for(uint i = 1; i < y; ++i) result *= x; return result; } @@ -69,8 +70,8 @@ namespace detail } // factorial (!12 max, integer only) - template <typename genType> - GLM_FUNC_QUALIFIER genType factorial(genType const & x) + template<typename genType> + GLM_FUNC_QUALIFIER genType factorial(genType const& x) { genType Temp = x; genType Result; @@ -79,30 +80,30 @@ namespace detail return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> factorial( - tvec2<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> factorial( + vec<2, T, Q> const& x) { - return tvec2<T, P>( + return vec<2, T, Q>( factorial(x.x), factorial(x.y)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> factorial( - tvec3<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> factorial( + vec<3, T, Q> const& x) { - return tvec3<T, P>( + return vec<3, T, Q>( factorial(x.x), factorial(x.y), factorial(x.z)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> factorial( - tvec4<T, P> const & x) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> factorial( + vec<4, T, Q> const& x) { - return tvec4<T, P>( + return vec<4, T, Q>( factorial(x.x), factorial(x.y), factorial(x.z), @@ -111,6 +112,9 @@ namespace detail GLM_FUNC_QUALIFIER uint pow(uint x, uint y) { + if (y == 0) + return 1u; + uint result = x; for(uint i = 1; i < y; ++i) result *= x; @@ -140,7 +144,7 @@ namespace detail #if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) - GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) { return 31u - findMSB(x); } @@ -148,7 +152,7 @@ namespace detail #else // Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt - GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) { int y, m, n; diff --git a/external/include/glm/gtx/intersect.hpp b/external/include/glm/gtx/intersect.hpp index 33b6e99..cc7f929 100644 --- a/external/include/glm/gtx/intersect.hpp +++ b/external/include/glm/gtx/intersect.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_intersect GLM_GTX_intersect /// @ingroup gtx /// -/// @brief Add intersection functions +/// Include <glm/gtx/intersect.hpp> to use the features of this extension. /// -/// <glm/gtx/intersect.hpp> need to be included to use these functionalities. +/// Add intersection functions #pragma once @@ -21,6 +21,10 @@ #include "../gtx/closest_point.hpp" #include "../gtx/vector_query.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_closest_point extension included") #endif @@ -33,52 +37,53 @@ namespace glm //! Compute the intersection of a ray and a plane. //! Ray direction and plane normal must be unit length. //! From GLM_GTX_intersect extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL bool intersectRayPlane( - genType const & orig, genType const & dir, - genType const & planeOrig, genType const & planeNormal, + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, typename genType::value_type & intersectionDistance); //! Compute the intersection of a ray and a triangle. + /// Based om Tomas Möller implementation http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/ //! From GLM_GTX_intersect extension. - template <typename genType> + template<typename T, qualifier Q> GLM_FUNC_DECL bool intersectRayTriangle( - genType const & orig, genType const & dir, - genType const & vert0, genType const & vert1, genType const & vert2, - genType & baryPosition); + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, vec<3, T, Q> const& v2, + vec<2, T, Q>& baryPosition, T& distance); //! Compute the intersection of a line and a triangle. //! From GLM_GTX_intersect extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL bool intersectLineTriangle( - genType const & orig, genType const & dir, - genType const & vert0, genType const & vert1, genType const & vert2, + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, genType & position); - //! Compute the intersection distance of a ray and a sphere. + //! Compute the intersection distance of a ray and a sphere. //! The ray direction vector is unit length. //! From GLM_GTX_intersect extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL bool intersectRaySphere( - genType const & rayStarting, genType const & rayNormalizedDirection, - genType const & sphereCenter, typename genType::value_type const sphereRadiusSquered, + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, typename genType::value_type const sphereRadiusSquered, typename genType::value_type & intersectionDistance); //! Compute the intersection of a ray and a sphere. //! From GLM_GTX_intersect extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL bool intersectRaySphere( - genType const & rayStarting, genType const & rayNormalizedDirection, - genType const & sphereCenter, const typename genType::value_type sphereRadius, + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, genType & intersectionPosition, genType & intersectionNormal); //! Compute the intersection of a line and a sphere. //! From GLM_GTX_intersect extension - template <typename genType> + template<typename genType> GLM_FUNC_DECL bool intersectLineSphere( - genType const & point0, genType const & point1, - genType const & sphereCenter, typename genType::value_type sphereRadius, - genType & intersectionPosition1, genType & intersectionNormal1, + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPosition1, genType & intersectionNormal1, genType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType()); /// @} diff --git a/external/include/glm/gtx/intersect.inl b/external/include/glm/gtx/intersect.inl index 904d6cc..d10d65b 100644 --- a/external/include/glm/gtx/intersect.inl +++ b/external/include/glm/gtx/intersect.inl @@ -3,11 +3,11 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool intersectRayPlane ( - genType const & orig, genType const & dir, - genType const & planeOrig, genType const & planeNormal, + genType const& orig, genType const& dir, + genType const& planeOrig, genType const& planeNormal, typename genType::value_type & intersectionDistance ) { @@ -23,21 +23,75 @@ namespace glm return false; } - template <typename genType> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER bool intersectRayTriangle ( - genType const & orig, genType const & dir, - genType const & v0, genType const & v1, genType const & v2, - genType & baryPosition + vec<3, T, Q> const& orig, vec<3, T, Q> const& dir, + vec<3, T, Q> const& vert0, vec<3, T, Q> const& vert1, vec<3, T, Q> const& vert2, + vec<2, T, Q>& baryPosition, T& distance ) { - genType e1 = v1 - v0; - genType e2 = v2 - v0; + // find vectors for two edges sharing vert0 + vec<3, T, Q> const edge1 = vert1 - vert0; + vec<3, T, Q> const edge2 = vert2 - vert0; - genType p = glm::cross(dir, e2); + // begin calculating determinant - also used to calculate U parameter + vec<3, T, Q> const p = glm::cross(dir, edge2); - typename genType::value_type a = glm::dot(e1, p); + // if determinant is near zero, ray lies in plane of triangle + T const det = glm::dot(edge1, p); + vec<3, T, Q> qvec; + + if(det > std::numeric_limits<T>::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const tvec = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(tvec, p); + if(baryPosition.x < static_cast<T>(0) || baryPosition.x > det) + return false; + + // prepare to test V parameter + qvec = glm::cross(tvec, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, qvec); + if((baryPosition.y < static_cast<T>(0)) || ((baryPosition.x + baryPosition.y) > det)) + return false; + } + else if(det < -std::numeric_limits<T>::epsilon()) + { + // calculate distance from vert0 to ray origin + vec<3, T, Q> const tvec = orig - vert0; + + // calculate U parameter and test bounds + baryPosition.x = glm::dot(tvec, p); + if((baryPosition.x > static_cast<T>(0)) || (baryPosition.x < det)) + return false; + + // prepare to test V parameter + qvec = glm::cross(tvec, edge1); + + // calculate V parameter and test bounds + baryPosition.y = glm::dot(dir, qvec); + if((baryPosition.y > static_cast<T>(0)) || (baryPosition.x + baryPosition.y < det)) + return false; + } + else + return false; // ray is parallel to the plane of the triangle + + T inv_det = static_cast<T>(1) / det; + + // calculate distance, ray intersects triangle + distance = glm::dot(edge2, qvec) * inv_det; + baryPosition *= inv_det; + + return true; + } + +/* typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); if(a < Epsilon && a > -Epsilon) return false; @@ -62,12 +116,13 @@ namespace glm return baryPosition.z >= typename genType::value_type(0.0f); } +*/ - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool intersectLineTriangle ( - genType const & orig, genType const & dir, - genType const & vert0, genType const & vert1, genType const & vert2, + genType const& orig, genType const& dir, + genType const& vert0, genType const& vert1, genType const& vert2, genType & position ) { @@ -101,11 +156,11 @@ namespace glm return true; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool intersectRaySphere ( - genType const & rayStarting, genType const & rayNormalizedDirection, - genType const & sphereCenter, const typename genType::value_type sphereRadiusSquered, + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadiusSquered, typename genType::value_type & intersectionDistance ) { @@ -122,11 +177,11 @@ namespace glm return intersectionDistance > Epsilon; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool intersectRaySphere ( - genType const & rayStarting, genType const & rayNormalizedDirection, - genType const & sphereCenter, const typename genType::value_type sphereRadius, + genType const& rayStarting, genType const& rayNormalizedDirection, + genType const& sphereCenter, const typename genType::value_type sphereRadius, genType & intersectionPosition, genType & intersectionNormal ) { @@ -140,12 +195,12 @@ namespace glm return false; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER bool intersectLineSphere ( - genType const & point0, genType const & point1, - genType const & sphereCenter, typename genType::value_type sphereRadius, - genType & intersectionPoint1, genType & intersectionNormal1, + genType const& point0, genType const& point1, + genType const& sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPoint1, genType & intersectionNormal1, genType & intersectionPoint2, genType & intersectionNormal2 ) { diff --git a/external/include/glm/gtx/io.hpp b/external/include/glm/gtx/io.hpp index 6aa8415..93db75a 100644 --- a/external/include/glm/gtx/io.hpp +++ b/external/include/glm/gtx/io.hpp @@ -8,14 +8,14 @@ /// /// @defgroup gtx_io GLM_GTX_io /// @ingroup gtx -/// -/// @brief std::[w]ostream support for glm types /// -/// std::[w]ostream support for glm types + precision/width/etc. manipulators +/// Include <glm/gtx/io.hpp> to use the features of this extension. +/// +/// std::[w]ostream support for glm types +/// +/// std::[w]ostream support for glm types + qualifier/width/etc. manipulators /// based on howard hinnant's std::chrono io proposal /// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html] -/// -/// <glm/gtx/io.hpp> needs to be included to use these functionalities. #pragma once @@ -23,6 +23,10 @@ #include "../glm.hpp" #include "../gtx/quaternion.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_io extension included") #endif @@ -40,7 +44,7 @@ namespace glm { enum order_type { column_major, row_major}; - template <typename CTy> + template<typename CTy> class format_punct : public std::locale::facet { typedef CTy char_type; @@ -63,7 +67,7 @@ namespace glm GLM_FUNC_DECL explicit format_punct(format_punct const&); }; - template <typename CTy, typename CTr = std::char_traits<CTy> > + template<typename CTy, typename CTr = std::char_traits<CTy> > class basic_state_saver { public: @@ -92,7 +96,7 @@ namespace glm typedef basic_state_saver<char> state_saver; typedef basic_state_saver<wchar_t> wstate_saver; - template <typename CTy, typename CTr = std::char_traits<CTy> > + template<typename CTy, typename CTr = std::char_traits<CTy> > class basic_format_saver { public: @@ -124,7 +128,7 @@ namespace glm GLM_FUNC_DECL explicit width(unsigned); }; - template <typename CTy> + template<typename CTy> struct delimeter { CTy value[3]; @@ -141,55 +145,55 @@ namespace glm // functions, inlined (inline) - template <typename FTy, typename CTy, typename CTr> + template<typename FTy, typename CTy, typename CTr> FTy const& get_facet(std::basic_ios<CTy,CTr>&); - template <typename FTy, typename CTy, typename CTr> + template<typename FTy, typename CTy, typename CTr> std::basic_ios<CTy,CTr>& formatted(std::basic_ios<CTy,CTr>&); - template <typename FTy, typename CTy, typename CTr> + template<typename FTy, typename CTy, typename CTr> std::basic_ios<CTy,CTr>& unformattet(std::basic_ios<CTy,CTr>&); - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, precision const&); - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, width const&); - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, delimeter<CTy> const&); - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, order const&); }//namespace io - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tquat<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec1<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec2<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec3<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec4<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x2<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x3<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x4<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x2<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x3<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x4<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x2<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x3<T,P> const&); - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x4<T,P> const&); - - template <typename CTy, typename CTr, typename T, precision P> + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tquat<T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<1, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<2, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<3, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<4, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 2, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 3, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 4, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 2, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 3, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 4, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 2, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 3, T, Q> const&); + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 4, T, Q> const&); + + template<typename CTy, typename CTr, typename T, qualifier Q> GLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr> &, - std::pair<tmat4x4<T,P> const, tmat4x4<T,P> const> const &); + std::pair<mat<4, 4, T, Q> const, mat<4, 4, T, Q> const> const&); /// @} }//namespace glm diff --git a/external/include/glm/gtx/io.inl b/external/include/glm/gtx/io.inl index 9b70a5f..edb76bf 100644 --- a/external/include/glm/gtx/io.inl +++ b/external/include/glm/gtx/io.inl @@ -10,7 +10,7 @@ namespace glm{ namespace io { - template <typename CTy> + template<typename CTy> GLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(size_t a) : std::locale::facet(a) , formatted(true) @@ -24,7 +24,7 @@ namespace io , order(column_major) {} - template <typename CTy> + template<typename CTy> GLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(format_punct const& a) : std::locale::facet(0) , formatted(a.formatted) @@ -38,9 +38,9 @@ namespace io , order(a.order) {} - template <typename CTy> std::locale::id format_punct<CTy>::id; + template<typename CTy> std::locale::id format_punct<CTy>::id; - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::basic_state_saver(std::basic_ios<CTy, CTr>& a) : state_(a) , flags_(a.flags()) @@ -50,7 +50,7 @@ namespace io , locale_(a.getloc()) {} - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::~basic_state_saver() { state_.imbue(locale_); @@ -60,14 +60,14 @@ namespace io state_.flags(flags_); } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER basic_format_saver<CTy, CTr>::basic_format_saver(std::basic_ios<CTy, CTr>& a) : bss_(a) { a.imbue(std::locale(a.getloc(), new format_punct<CTy>(get_facet<format_punct<CTy> >(a)))); } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER basic_format_saver<CTy, CTr>::~basic_format_saver() {} @@ -80,7 +80,7 @@ namespace io : value(a) {} - template <typename CTy> + template<typename CTy> GLM_FUNC_QUALIFIER delimeter<CTy>::delimeter(CTy a, CTy b, CTy c) : value() { @@ -93,7 +93,7 @@ namespace io : value(a) {} - template <typename FTy, typename CTy, typename CTr> + template<typename FTy, typename CTy, typename CTr> GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios<CTy, CTr>& ios) { if(!std::has_facet<FTy>(ios.getloc())) @@ -102,35 +102,35 @@ namespace io return std::use_facet<FTy>(ios.getloc()); } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& formatted(std::basic_ios<CTy, CTr>& ios) { const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = true; return ios; } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& unformatted(std::basic_ios<CTy, CTr>& ios) { const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = false; return ios; } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, precision const& a) { const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).precision = a.value; return os; } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, width const& a) { const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).width = a.value; return os; } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, delimeter<CTy> const& a) { format_punct<CTy> & fmt(const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os))); @@ -142,7 +142,7 @@ namespace io return os; } - template <typename CTy, typename CTr> + template<typename CTy, typename CTr> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, order const& a) { const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).order = a.value; @@ -152,17 +152,17 @@ namespace io namespace detail { - template <typename CTy, typename CTr, template <typename, precision> class V, typename T, precision P> + template<typename CTy, typename CTr, typename V> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& - print_vector_on(std::basic_ostream<CTy, CTr>& os, V<T,P> const& a) + print_vector_on(std::basic_ostream<CTy, CTr>& os, V const& a) { typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os); if(cerberus) { - io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os)); + io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os)); - length_t const& components(type<V, T, P>::components); + length_t const& components(type<V>::components); if(fmt.formatted) { @@ -195,49 +195,49 @@ namespace detail } }//namespace detail - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tquat<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tquat<T, Q> const& a) { return detail::print_vector_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec1<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<1, T, Q> const& a) { return detail::print_vector_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec2<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<2, T, Q> const& a) { return detail::print_vector_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec3<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<3, T, Q> const& a) { return detail::print_vector_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec4<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<4, T, Q> const& a) { return detail::print_vector_on(os, a); } namespace detail { - template <typename CTy, typename CTr, template <typename, precision> class M, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_on(std::basic_ostream<CTy, CTr>& os, M<T,P> const& a) + template<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_on(std::basic_ostream<CTy, CTr>& os, M<C, R, T, Q> const& a) { typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); if(cerberus) { - io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os)); + io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os)); - length_t const& cols(type<M, T, P>::cols); - length_t const& rows(type<M, T, P>::rows); + length_t const& cols(type<M<C, R, T, Q> >::cols); + length_t const& rows(type<M<C, R, T, Q> >::rows); if(fmt.formatted) { @@ -313,74 +313,74 @@ namespace detail } }//namespace detail - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x2<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 2, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x3<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 3, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x4<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 4, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x2<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 2, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x3<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 3, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x4<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 4, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x2<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 2, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x3<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 3, T, Q> const& a) { return detail::print_matrix_on(os, a); } - template <typename CTy, typename CTr, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x4<T,P> const& a) + template<typename CTy, typename CTr, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 4, T, Q> const& a) { return detail::print_matrix_on(os, a); } namespace detail { - template <typename CTy, typename CTr, template <typename, precision> class M, typename T, precision P> - GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_pair_on(std::basic_ostream<CTy, CTr>& os, std::pair<M<T, P> const, M<T, P> const> const& a) + template<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_pair_on(std::basic_ostream<CTy, CTr>& os, std::pair<M<C, R, T, Q> const, M<C, R, T, Q> const> const& a) { typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); if(cerberus) { io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os)); - M<T,P> const& ml(a.first); - M<T,P> const& mr(a.second); - length_t const& cols(type<M, T, P>::cols); - length_t const& rows(type<M, T, P>::rows); + M<C, R, T, Q> const& ml(a.first); + M<C, R, T, Q> const& mr(a.second); + length_t const& cols(type<M<C, R, T, Q> >::cols); + length_t const& rows(type<M<C, R, T, Q> >::rows); if(fmt.formatted) { @@ -409,7 +409,7 @@ namespace detail if(0 != i) os << fmt.space; - os << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i); + os << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i); if(cols-1 != i) os << fmt.newline; @@ -430,11 +430,11 @@ namespace detail } }//namespace detail - template <typename CTy, typename CTr, typename T, precision P> + template<typename CTy, typename CTr, typename T, qualifier Q> GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<( std::basic_ostream<CTy, CTr> & os, - std::pair<tmat4x4<T, P> const, - tmat4x4<T, P> const> const& a) + std::pair<mat<4, 4, T, Q> const, + mat<4, 4, T, Q> const> const& a) { return detail::print_matrix_pair_on(os, a); } diff --git a/external/include/glm/gtx/log_base.hpp b/external/include/glm/gtx/log_base.hpp index 7958fc3..e873e35 100644 --- a/external/include/glm/gtx/log_base.hpp +++ b/external/include/glm/gtx/log_base.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_log_base GLM_GTX_log_base /// @ingroup gtx /// -/// @brief Logarithm for any base. base can be a vector or a scalar. +/// Include <glm/gtx/log_base.hpp> to use the features of this extension. /// -/// <glm/gtx/log_base.hpp> need to be included to use these functionalities. +/// Logarithm for any base. base can be a vector or a scalar. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_log_base extension included") #endif @@ -26,17 +30,17 @@ namespace glm /// Logarithm for any base. /// From GLM_GTX_log_base. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType log( - genType const & x, - genType const & base); + genType const& x, + genType const& base); /// Logarithm for any base. /// From GLM_GTX_log_base. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<T, P> sign( - vecType<T, P> const & x, - vecType<T, P> const & base); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> sign( + vec<L, T, Q> const& x, + vec<L, T, Q> const& base); /// @} }//namespace glm diff --git a/external/include/glm/gtx/log_base.inl b/external/include/glm/gtx/log_base.inl index 8005d1b..981bacc 100644 --- a/external/include/glm/gtx/log_base.inl +++ b/external/include/glm/gtx/log_base.inl @@ -3,15 +3,15 @@ namespace glm { - template <typename genType> - GLM_FUNC_QUALIFIER genType log(genType const & x, genType const & base) + template<typename genType> + GLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base) { - assert(x != genType(0)); + assert(!detail::compute_equal<genType>::call(x, static_cast<genType>(0))); return glm::log(x) / glm::log(base); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x, vecType<T, P> const & base) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> log(vec<L, T, Q> const& x, vec<L, T, Q> const& base) { return glm::log(x) / glm::log(base); } diff --git a/external/include/glm/gtx/matrix_cross_product.hpp b/external/include/glm/gtx/matrix_cross_product.hpp index d920f4e..dfad8c1 100644 --- a/external/include/glm/gtx/matrix_cross_product.hpp +++ b/external/include/glm/gtx/matrix_cross_product.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product /// @ingroup gtx /// -/// @brief Build cross product matrices +/// Include <glm/gtx/matrix_cross_product.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_cross_product.hpp> need to be included to use these functionalities. +/// Build cross product matrices #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_cross_product extension included") #endif @@ -27,15 +31,15 @@ namespace glm //! Build a cross product matrix. //! From GLM_GTX_matrix_cross_product extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> matrixCross3( - tvec3<T, P> const & x); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> matrixCross3( + vec<3, T, Q> const& x); + //! Build a cross product matrix. //! From GLM_GTX_matrix_cross_product extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> matrixCross4( - tvec3<T, P> const & x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> matrixCross4( + vec<3, T, Q> const& x); /// @} }//namespace glm diff --git a/external/include/glm/gtx/matrix_cross_product.inl b/external/include/glm/gtx/matrix_cross_product.inl index 16f07e9..d8ec11f 100644 --- a/external/include/glm/gtx/matrix_cross_product.inl +++ b/external/include/glm/gtx/matrix_cross_product.inl @@ -3,13 +3,13 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> matrixCross3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> matrixCross3 ( - tvec3<T, P> const & x + vec<3, T, Q> const& x ) { - tmat3x3<T, P> Result(T(0)); + mat<3, 3, T, Q> Result(T(0)); Result[0][1] = x.z; Result[1][0] = -x.z; Result[0][2] = -x.y; @@ -19,13 +19,13 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> matrixCross4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> matrixCross4 ( - tvec3<T, P> const & x + vec<3, T, Q> const& x ) { - tmat4x4<T, P> Result(T(0)); + mat<4, 4, T, Q> Result(T(0)); Result[0][1] = x.z; Result[1][0] = -x.z; Result[0][2] = -x.y; diff --git a/external/include/glm/gtx/matrix_decompose.hpp b/external/include/glm/gtx/matrix_decompose.hpp index e163f5a..85bb289 100644 --- a/external/include/glm/gtx/matrix_decompose.hpp +++ b/external/include/glm/gtx/matrix_decompose.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_matrix_decompose GLM_GTX_matrix_decompose /// @ingroup gtx /// -/// @brief Decomposes a model matrix to translations, rotation and scale components +/// Include <glm/gtx/matrix_decompose.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_decompose.hpp> need to be included to use these functionalities. +/// Decomposes a model matrix to translations, rotation and scale components #pragma once @@ -20,6 +20,10 @@ #include "../gtc/quaternion.hpp" #include "../gtc/matrix_transform.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_decompose extension included") #endif @@ -29,12 +33,12 @@ namespace glm /// @addtogroup gtx_matrix_decompose /// @{ - /// Decomposes a model matrix to translations, rotation and scale components + /// Decomposes a model matrix to translations, rotation and scale components /// @see gtx_matrix_decompose - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL bool decompose( - tmat4x4<T, P> const & modelMatrix, - tvec3<T, P> & scale, tquat<T, P> & orientation, tvec3<T, P> & translation, tvec3<T, P> & skew, tvec4<T, P> & perspective); + mat<4, 4, T, Q> const& modelMatrix, + vec<3, T, Q> & scale, tquat<T, Q> & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective); /// @} }//namespace glm diff --git a/external/include/glm/gtx/matrix_decompose.inl b/external/include/glm/gtx/matrix_decompose.inl index 7194e9d..02a5acc 100644 --- a/external/include/glm/gtx/matrix_decompose.inl +++ b/external/include/glm/gtx/matrix_decompose.inl @@ -1,22 +1,25 @@ /// @ref gtx_matrix_decompose /// @file glm/gtx/matrix_decompose.inl +#include "../gtc/constants.hpp" +#include "../gtc/epsilon.hpp" + namespace glm{ namespace detail { /// Make a linear combination of two vectors and return the result. // result = (a * ascl) + (b * bscl) - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> combine( - tvec3<T, P> const & a, - tvec3<T, P> const & b, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> combine( + vec<3, T, Q> const& a, + vec<3, T, Q> const& b, T ascl, T bscl) { return (a * ascl) + (b * bscl); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> scale(tvec3<T, P> const& v, T desiredLength) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> scale(vec<3, T, Q> const& v, T desiredLength) { return v * desiredLength / length(v); } @@ -26,13 +29,13 @@ namespace detail // http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp // Decomposes the mode matrix to translations,rotation scale components - template <typename T, precision P> - GLM_FUNC_QUALIFIER bool decompose(tmat4x4<T, P> const & ModelMatrix, tvec3<T, P> & Scale, tquat<T, P> & Orientation, tvec3<T, P> & Translation, tvec3<T, P> & Skew, tvec4<T, P> & Perspective) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool decompose(mat<4, 4, T, Q> const& ModelMatrix, vec<3, T, Q> & Scale, tquat<T, Q> & Orientation, vec<3, T, Q> & Translation, vec<3, T, Q> & Skew, vec<4, T, Q> & Perspective) { - tmat4x4<T, P> LocalMatrix(ModelMatrix); + mat<4, 4, T, Q> LocalMatrix(ModelMatrix); // Normalize the matrix. - if(LocalMatrix[3][3] == static_cast<T>(0)) + if(epsilonEqual(LocalMatrix[3][3], static_cast<T>(0), epsilon<T>())) return false; for(length_t i = 0; i < 4; ++i) @@ -41,21 +44,24 @@ namespace detail // perspectiveMatrix is used to solve for perspective, but it also provides // an easy way to test for singularity of the upper 3x3 component. - tmat4x4<T, P> PerspectiveMatrix(LocalMatrix); + mat<4, 4, T, Q> PerspectiveMatrix(LocalMatrix); for(length_t i = 0; i < 3; i++) PerspectiveMatrix[i][3] = static_cast<T>(0); PerspectiveMatrix[3][3] = static_cast<T>(1); /// TODO: Fixme! - if(determinant(PerspectiveMatrix) == static_cast<T>(0)) + if(epsilonEqual(determinant(PerspectiveMatrix), static_cast<T>(0), epsilon<T>())) return false; // First, isolate perspective. This is the messiest. - if(LocalMatrix[0][3] != static_cast<T>(0) || LocalMatrix[1][3] != static_cast<T>(0) || LocalMatrix[2][3] != static_cast<T>(0)) + if( + epsilonNotEqual(LocalMatrix[0][3], static_cast<T>(0), epsilon<T>()) || + epsilonNotEqual(LocalMatrix[1][3], static_cast<T>(0), epsilon<T>()) || + epsilonNotEqual(LocalMatrix[2][3], static_cast<T>(0), epsilon<T>())) { // rightHandSide is the right hand side of the equation. - tvec4<T, P> RightHandSide; + vec<4, T, Q> RightHandSide; RightHandSide[0] = LocalMatrix[0][3]; RightHandSide[1] = LocalMatrix[1][3]; RightHandSide[2] = LocalMatrix[2][3]; @@ -64,8 +70,8 @@ namespace detail // Solve the equation by inverting PerspectiveMatrix and multiplying // rightHandSide by the inverse. (This is the easiest way, not // necessarily the best.) - tmat4x4<T, P> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix); - tmat4x4<T, P> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix); + mat<4, 4, T, Q> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix); + mat<4, 4, T, Q> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix); Perspective = TransposedInversePerspectiveMatrix * RightHandSide; // v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint); @@ -77,19 +83,19 @@ namespace detail else { // No perspective. - Perspective = tvec4<T, P>(0, 0, 0, 1); + Perspective = vec<4, T, Q>(0, 0, 0, 1); } // Next take care of translation (easy). - Translation = tvec3<T, P>(LocalMatrix[3]); - LocalMatrix[3] = tvec4<T, P>(0, 0, 0, LocalMatrix[3].w); + Translation = vec<3, T, Q>(LocalMatrix[3]); + LocalMatrix[3] = vec<4, T, Q>(0, 0, 0, LocalMatrix[3].w); - tvec3<T, P> Row[3], Pdum3; + vec<3, T, Q> Row[3], Pdum3; // Now get scale and shear. for(length_t i = 0; i < 3; ++i) - for(int j = 0; j < 3; ++j) - Row[i][j] = LocalMatrix[i][j]; + for(length_t j = 0; j < 3; ++j) + Row[i][j] = LocalMatrix[i][j]; // Compute X scale factor and normalize first row. Scale.x = length(Row[0]);// v3Length(Row[0]); @@ -147,47 +153,34 @@ namespace detail // ret.rotateZ = 0; // } - T s, t, x, y, z, w; - - t = Row[0][0] + Row[1][1] + Row[2][2] + static_cast<T>(1); - - if(t > static_cast<T>(1e-4)) + int i, j, k = 0; + float root, trace = Row[0].x + Row[1].y + Row[2].z; + if(trace > static_cast<T>(0)) { - s = static_cast<T>(0.5) / sqrt(t); - w = static_cast<T>(0.25) / s; - x = (Row[2][1] - Row[1][2]) * s; - y = (Row[0][2] - Row[2][0]) * s; - z = (Row[1][0] - Row[0][1]) * s; - } - else if(Row[0][0] > Row[1][1] && Row[0][0] > Row[2][2]) - { - s = sqrt (static_cast<T>(1) + Row[0][0] - Row[1][1] - Row[2][2]) * static_cast<T>(2); // S=4*qx - x = static_cast<T>(0.25) * s; - y = (Row[0][1] + Row[1][0]) / s; - z = (Row[0][2] + Row[2][0]) / s; - w = (Row[2][1] - Row[1][2]) / s; - } - else if(Row[1][1] > Row[2][2]) - { - s = sqrt (static_cast<T>(1) + Row[1][1] - Row[0][0] - Row[2][2]) * static_cast<T>(2); // S=4*qy - x = (Row[0][1] + Row[1][0]) / s; - y = static_cast<T>(0.25) * s; - z = (Row[1][2] + Row[2][1]) / s; - w = (Row[0][2] - Row[2][0]) / s; - } + root = sqrt(trace + static_cast<T>(1.0)); + Orientation.w = static_cast<T>(0.5) * root; + root = static_cast<T>(0.5) / root; + Orientation.x = root * (Row[1].z - Row[2].y); + Orientation.y = root * (Row[2].x - Row[0].z); + Orientation.z = root * (Row[0].y - Row[1].x); + } // End if > 0 else - { - s = sqrt(static_cast<T>(1) + Row[2][2] - Row[0][0] - Row[1][1]) * static_cast<T>(2); // S=4*qz - x = (Row[0][2] + Row[2][0]) / s; - y = (Row[1][2] + Row[2][1]) / s; - z = static_cast<T>(0.25) * s; - w = (Row[1][0] - Row[0][1]) / s; - } - - Orientation.x = x; - Orientation.y = y; - Orientation.z = z; - Orientation.w = w; + { + static int Next[3] = {1, 2, 0}; + i = 0; + if(Row[1].y > Row[0].x) i = 1; + if(Row[2].z > Row[i][i]) i = 2; + j = Next[i]; + k = Next[j]; + + root = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + static_cast<T>(1.0)); + + Orientation[i] = static_cast<T>(0.5) * root; + root = static_cast<T>(0.5) / root; + Orientation[j] = root * (Row[i][j] + Row[j][i]); + Orientation[k] = root * (Row[i][k] + Row[k][i]); + Orientation.w = root * (Row[j][k] - Row[k][j]); + } // End if <= 0 return true; } diff --git a/external/include/glm/gtx/matrix_factorisation.hpp b/external/include/glm/gtx/matrix_factorisation.hpp new file mode 100644 index 0000000..e30a774 --- /dev/null +++ b/external/include/glm/gtx/matrix_factorisation.hpp @@ -0,0 +1,69 @@ +/// @ref gtx_matrix_factorisation +/// @file glm/gtx/matrix_factorisation.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_factorisation GLM_GTX_matrix_factorisation +/// @ingroup gtx +/// +/// Include <glm/gtx/matrix_factorisation.hpp> to use the features of this extension. +/// +/// Functions to factor matrices in various forms + +#pragma once + +// Dependency: +#include "../glm.hpp" + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTX_matrix_factorisation extension included") +#endif + +/* +Suggestions: + - Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances. + - Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc... +*/ + +namespace glm +{ + /// @addtogroup gtx_matrix_factorisation + /// @{ + + /// Flips the matrix rows up and down. + /// + /// From GLM_GTX_matrix_factorisation extension. + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in); + + /// Flips the matrix columns right and left. + /// + /// From GLM_GTX_matrix_factorisation extension. + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in); + + /// Performs QR factorisation of a matrix. + /// Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in. + /// Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r); + + /// Performs RQ factorisation of a matrix. + /// Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in. + /// Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left. + /// Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m). + /// + /// From GLM_GTX_matrix_factorisation extension. + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q); + + /// @} +} + +#include "matrix_factorisation.inl" diff --git a/external/include/glm/gtx/matrix_factorisation.inl b/external/include/glm/gtx/matrix_factorisation.inl new file mode 100644 index 0000000..f0d9560 --- /dev/null +++ b/external/include/glm/gtx/matrix_factorisation.inl @@ -0,0 +1,85 @@ +/// @ref gtx_matrix_factorisation +/// @file glm/gtx/matrix_factorisation.inl + +namespace glm +{ + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in) + { + mat<R, C, T, Q> tin = transpose(in); + tin = fliplr(tin); + mat<C, R, T, Q> out = transpose(tin); + + return out; + } + + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in) + { + mat<C, R, T, Q> out; + for (length_t i = 0; i < C; i++) + { + out[i] = in[(C - i) - 1]; + } + + return out; + } + + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r) + { + // Uses modified Gram-Schmidt method + // Source: https://en.wikipedia.org/wiki/Gram–Schmidt_process + // And https://en.wikipedia.org/wiki/QR_decomposition + + //For all the linearly independs columns of the input... + // (there can be no more linearly independents columns than there are rows.) + for (length_t i = 0; i < (C < R ? C : R); i++) + { + //Copy in Q the input's i-th column. + q[i] = in[i]; + + //j = [0,i[ + // Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns. + // Also: Fill the zero elements of R + for (length_t j = 0; j < i; j++) + { + q[i] -= dot(q[i], q[j])*q[j]; + r[j][i] = 0; + } + + //Now, Q i-th column is orthogonal to all the previous columns. Normalize it. + q[i] = normalize(q[i]); + + //j = [i,C[ + //Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input. + for (length_t j = i; j < C; j++) + { + r[j][i] = dot(in[j], q[i]); + } + } + } + + template <length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q) + { + // From https://en.wikipedia.org/wiki/QR_decomposition: + // The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices. + // QR decomposition is Gram–Schmidt orthogonalization of columns of A, started from the first column. + // RQ decomposition is Gram–Schmidt orthogonalization of rows of A, started from the last row. + + mat<R, C, T, Q> tin = transpose(in); + tin = fliplr(tin); + + mat<R, (C < R ? C : R), T, Q> tr; + mat<(C < R ? C : R), C, T, Q> tq; + qr_decompose(tin, tq, tr); + + tr = fliplr(tr); + r = transpose(tr); + r = fliplr(r); + + tq = fliplr(tq); + q = transpose(tq); + } +} //namespace glm diff --git a/external/include/glm/gtx/matrix_interpolation.hpp b/external/include/glm/gtx/matrix_interpolation.hpp index 77a69ea..89c4596 100644 --- a/external/include/glm/gtx/matrix_interpolation.hpp +++ b/external/include/glm/gtx/matrix_interpolation.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation /// @ingroup gtx /// -/// @brief Allows to directly interpolate two exiciting matrices. +/// Include <glm/gtx/matrix_interpolation.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_interpolation.hpp> need to be included to use these functionalities. +/// Allows to directly interpolate two matrices. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_interpolation extension included") #endif @@ -27,32 +31,32 @@ namespace glm /// Get the axis and angle of the rotation from a matrix. /// From GLM_GTX_matrix_interpolation extension. - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL void axisAngle( - tmat4x4<T, P> const & mat, - tvec3<T, P> & axis, + mat<4, 4, T, Q> const& mat, + vec<3, T, Q> & axis, T & angle); /// Build a matrix from axis and angle. /// From GLM_GTX_matrix_interpolation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> axisAngleMatrix( - tvec3<T, P> const & axis, + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> axisAngleMatrix( + vec<3, T, Q> const& axis, T const angle); /// Extracts the rotation part of a matrix. /// From GLM_GTX_matrix_interpolation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> extractMatrixRotation( - tmat4x4<T, P> const & mat); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> extractMatrixRotation( + mat<4, 4, T, Q> const& mat); /// Build a interpolation of 4 * 4 matrixes. /// From GLM_GTX_matrix_interpolation extension. /// Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> interpolate( - tmat4x4<T, P> const & m1, - tmat4x4<T, P> const & m2, + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> interpolate( + mat<4, 4, T, Q> const& m1, + mat<4, 4, T, Q> const& m2, T const delta); /// @} diff --git a/external/include/glm/gtx/matrix_interpolation.inl b/external/include/glm/gtx/matrix_interpolation.inl index 8645f96..1f2915a 100644 --- a/external/include/glm/gtx/matrix_interpolation.inl +++ b/external/include/glm/gtx/matrix_interpolation.inl @@ -1,43 +1,43 @@ /// @ref gtx_matrix_interpolation /// @file glm/gtx/matrix_interpolation.hpp +#include "../gtc/constants.hpp" + namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER void axisAngle - ( - tmat4x4<T, P> const & mat, - tvec3<T, P> & axis, - T & angle - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, Q> const& mat, vec<3, T, Q> & axis, T & angle) { - T epsilon = (T)0.01; - T epsilon2 = (T)0.1; + T epsilon = static_cast<T>(0.01); + T epsilon2 = static_cast<T>(0.1); if((abs(mat[1][0] - mat[0][1]) < epsilon) && (abs(mat[2][0] - mat[0][2]) < epsilon) && (abs(mat[2][1] - mat[1][2]) < epsilon)) { - if ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) + if ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - static_cast<T>(3.0)) < epsilon2)) { - angle = (T)0.0; - axis.x = (T)1.0; - axis.y = (T)0.0; - axis.z = (T)0.0; + angle = static_cast<T>(0.0); + axis.x = static_cast<T>(1.0); + axis.y = static_cast<T>(0.0); + axis.z = static_cast<T>(0.0); return; } angle = static_cast<T>(3.1415926535897932384626433832795); - T xx = (mat[0][0] + (T)1.0) / (T)2.0; - T yy = (mat[1][1] + (T)1.0) / (T)2.0; - T zz = (mat[2][2] + (T)1.0) / (T)2.0; - T xy = (mat[1][0] + mat[0][1]) / (T)4.0; - T xz = (mat[2][0] + mat[0][2]) / (T)4.0; - T yz = (mat[2][1] + mat[1][2]) / (T)4.0; + T xx = (mat[0][0] + static_cast<T>(1.0)) * static_cast<T>(0.5); + T yy = (mat[1][1] + static_cast<T>(1.0)) * static_cast<T>(0.5); + T zz = (mat[2][2] + static_cast<T>(1.0)) * static_cast<T>(0.5); + T xy = (mat[1][0] + mat[0][1]) * static_cast<T>(0.25); + T xz = (mat[2][0] + mat[0][2]) * static_cast<T>(0.25); + T yz = (mat[2][1] + mat[1][2]) * static_cast<T>(0.25); if((xx > yy) && (xx > zz)) { - if (xx < epsilon) { - axis.x = (T)0.0; - axis.y = (T)0.7071; - axis.z = (T)0.7071; - } else { + if(xx < epsilon) + { + axis.x = static_cast<T>(0.0); + axis.y = static_cast<T>(0.7071); + axis.z = static_cast<T>(0.7071); + } + else + { axis.x = sqrt(xx); axis.y = xy / axis.x; axis.z = xz / axis.x; @@ -45,11 +45,14 @@ namespace glm } else if (yy > zz) { - if (yy < epsilon) { - axis.x = (T)0.7071; - axis.y = (T)0.0; - axis.z = (T)0.7071; - } else { + if(yy < epsilon) + { + axis.x = static_cast<T>(0.7071); + axis.y = static_cast<T>(0.0); + axis.z = static_cast<T>(0.7071); + } + else + { axis.y = sqrt(yy); axis.x = xy / axis.y; axis.z = yz / axis.y; @@ -57,11 +60,14 @@ namespace glm } else { - if (zz < epsilon) { - axis.x = (T)0.7071; - axis.y = (T)0.7071; - axis.z = (T)0.0; - } else { + if (zz < epsilon) + { + axis.x = static_cast<T>(0.7071); + axis.y = static_cast<T>(0.7071); + axis.z = static_cast<T>(0.0); + } + else + { axis.z = sqrt(zz); axis.x = xz / axis.z; axis.y = yz / axis.z; @@ -71,61 +77,51 @@ namespace glm } T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); if (glm::abs(s) < T(0.001)) - s = (T)1.0; - angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0); + s = static_cast<T>(1); + T const angleCos = (mat[0][0] + mat[1][1] + mat[2][2] - static_cast<T>(1)) * static_cast<T>(0.5); + if(angleCos - static_cast<T>(1) < epsilon) + angle = pi<T>() * static_cast<T>(0.25); + else + angle = acos(angleCos); axis.x = (mat[1][2] - mat[2][1]) / s; axis.y = (mat[2][0] - mat[0][2]) / s; axis.z = (mat[0][1] - mat[1][0]) / s; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> axisAngleMatrix - ( - tvec3<T, P> const & axis, - T const angle - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> axisAngleMatrix(vec<3, T, Q> const& axis, T const angle) { T c = cos(angle); T s = sin(angle); T t = static_cast<T>(1) - c; - tvec3<T, P> n = normalize(axis); + vec<3, T, Q> n = normalize(axis); - return tmat4x4<T, P>( - t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0), - t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0), - t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0), - T(0), T(0), T(0), T(1) - ); + return mat<4, 4, T, Q>( + t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, static_cast<T>(0.0), + t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, static_cast<T>(0.0), + t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, static_cast<T>(0.0), + static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> extractMatrixRotation - ( - tmat4x4<T, P> const & mat - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> extractMatrixRotation(mat<4, 4, T, Q> const& m) { - return tmat4x4<T, P>( - mat[0][0], mat[0][1], mat[0][2], 0.0, - mat[1][0], mat[1][1], mat[1][2], 0.0, - mat[2][0], mat[2][1], mat[2][2], 0.0, - 0.0, 0.0, 0.0, 1.0 - ); + return mat<4, 4, T, Q>( + m[0][0], m[0][1], m[0][2], static_cast<T>(0.0), + m[1][0], m[1][1], m[1][2], static_cast<T>(0.0), + m[2][0], m[2][1], m[2][2], static_cast<T>(0.0), + static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> interpolate - ( - tmat4x4<T, P> const & m1, - tmat4x4<T, P> const & m2, - T const delta - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> interpolate(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const delta) { - tmat4x4<T, P> m1rot = extractMatrixRotation(m1); - tmat4x4<T, P> dltRotation = m2 * transpose(m1rot); - tvec3<T, P> dltAxis; + mat<4, 4, T, Q> m1rot = extractMatrixRotation(m1); + mat<4, 4, T, Q> dltRotation = m2 * transpose(m1rot); + vec<3, T, Q> dltAxis; T dltAngle; axisAngle(dltRotation, dltAxis, dltAngle); - tmat4x4<T, P> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot; + mat<4, 4, T, Q> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot; out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); diff --git a/external/include/glm/gtx/matrix_major_storage.hpp b/external/include/glm/gtx/matrix_major_storage.hpp index 9402abe..3b922df 100644 --- a/external/include/glm/gtx/matrix_major_storage.hpp +++ b/external/include/glm/gtx/matrix_major_storage.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage /// @ingroup gtx /// -/// @brief Build matrices with specific matrix order, row or column +/// Include <glm/gtx/matrix_major_storage.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_major_storage.hpp> need to be included to use these functionalities. +/// Build matrices with specific matrix order, row or column #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_major_storage extension included") #endif @@ -27,87 +31,87 @@ namespace glm //! Build a row major matrix from row vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> rowMajor2( - tvec2<T, P> const & v1, - tvec2<T, P> const & v2); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> rowMajor2( - tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2( + mat<2, 2, T, Q> const& m); //! Build a row major matrix from row vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> rowMajor3( - tvec3<T, P> const & v1, - tvec3<T, P> const & v2, - tvec3<T, P> const & v3); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> rowMajor3( - tmat3x3<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3( + mat<3, 3, T, Q> const& m); //! Build a row major matrix from row vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> rowMajor4( - tvec4<T, P> const & v1, - tvec4<T, P> const & v2, - tvec4<T, P> const & v3, - tvec4<T, P> const & v4); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> rowMajor4( - tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4( + mat<4, 4, T, Q> const& m); //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> colMajor2( - tvec2<T, P> const & v1, - tvec2<T, P> const & v2); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2); + //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> colMajor2( - tmat2x2<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2( + mat<2, 2, T, Q> const& m); //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> colMajor3( - tvec3<T, P> const & v1, - tvec3<T, P> const & v2, - tvec3<T, P> const & v3); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); + //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> colMajor3( - tmat3x3<T, P> const & m); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3( + mat<3, 3, T, Q> const& m); + //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> colMajor4( - tvec4<T, P> const & v1, - tvec4<T, P> const & v2, - tvec4<T, P> const & v3, - tvec4<T, P> const & v4); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + vec<4, T, Q> const& v1, + vec<4, T, Q> const& v2, + vec<4, T, Q> const& v3, + vec<4, T, Q> const& v4); + //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> colMajor4( - tmat4x4<T, P> const & m); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4( + mat<4, 4, T, Q> const& m); /// @} }//namespace glm diff --git a/external/include/glm/gtx/matrix_major_storage.inl b/external/include/glm/gtx/matrix_major_storage.inl index 7097739..8b1b1a8 100644 --- a/external/include/glm/gtx/matrix_major_storage.inl +++ b/external/include/glm/gtx/matrix_major_storage.inl @@ -3,14 +3,14 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> rowMajor2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2 ( - tvec2<T, P> const & v1, - tvec2<T, P> const & v2 + vec<2, T, Q> const& v1, + vec<2, T, Q> const& v2 ) { - tmat2x2<T, P> Result; + mat<2, 2, T, Q> Result; Result[0][0] = v1.x; Result[1][0] = v1.y; Result[0][1] = v2.x; @@ -18,11 +18,11 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> rowMajor2( - const tmat2x2<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2( + const mat<2, 2, T, Q>& m) { - tmat2x2<T, P> Result; + mat<2, 2, T, Q> Result; Result[0][0] = m[0][0]; Result[0][1] = m[1][0]; Result[1][0] = m[0][1]; @@ -30,13 +30,13 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> rowMajor3( - const tvec3<T, P>& v1, - const tvec3<T, P>& v2, - const tvec3<T, P>& v3) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) { - tmat3x3<T, P> Result; + mat<3, 3, T, Q> Result; Result[0][0] = v1.x; Result[1][0] = v1.y; Result[2][0] = v1.z; @@ -49,11 +49,11 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> rowMajor3( - const tmat3x3<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3( + const mat<3, 3, T, Q>& m) { - tmat3x3<T, P> Result; + mat<3, 3, T, Q> Result; Result[0][0] = m[0][0]; Result[0][1] = m[1][0]; Result[0][2] = m[2][0]; @@ -66,14 +66,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rowMajor4( - const tvec4<T, P>& v1, - const tvec4<T, P>& v2, - const tvec4<T, P>& v3, - const tvec4<T, P>& v4) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) { - tmat4x4<T, P> Result; + mat<4, 4, T, Q> Result; Result[0][0] = v1.x; Result[1][0] = v1.y; Result[2][0] = v1.z; @@ -93,11 +93,11 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rowMajor4( - const tmat4x4<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4( + const mat<4, 4, T, Q>& m) { - tmat4x4<T, P> Result; + mat<4, 4, T, Q> Result; Result[0][0] = m[0][0]; Result[0][1] = m[1][0]; Result[0][2] = m[2][0]; @@ -117,51 +117,51 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> colMajor2( - const tvec2<T, P>& v1, - const tvec2<T, P>& v2) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const vec<2, T, Q>& v1, + const vec<2, T, Q>& v2) { - return tmat2x2<T, P>(v1, v2); + return mat<2, 2, T, Q>(v1, v2); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> colMajor2( - const tmat2x2<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2( + const mat<2, 2, T, Q>& m) { - return tmat2x2<T, P>(m); + return mat<2, 2, T, Q>(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> colMajor3( - const tvec3<T, P>& v1, - const tvec3<T, P>& v2, - const tvec3<T, P>& v3) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const vec<3, T, Q>& v1, + const vec<3, T, Q>& v2, + const vec<3, T, Q>& v3) { - return tmat3x3<T, P>(v1, v2, v3); + return mat<3, 3, T, Q>(v1, v2, v3); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> colMajor3( - const tmat3x3<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3( + const mat<3, 3, T, Q>& m) { - return tmat3x3<T, P>(m); + return mat<3, 3, T, Q>(m); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> colMajor4( - const tvec4<T, P>& v1, - const tvec4<T, P>& v2, - const tvec4<T, P>& v3, - const tvec4<T, P>& v4) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const vec<4, T, Q>& v1, + const vec<4, T, Q>& v2, + const vec<4, T, Q>& v3, + const vec<4, T, Q>& v4) { - return tmat4x4<T, P>(v1, v2, v3, v4); + return mat<4, 4, T, Q>(v1, v2, v3, v4); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> colMajor4( - const tmat4x4<T, P>& m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4( + const mat<4, 4, T, Q>& m) { - return tmat4x4<T, P>(m); + return mat<4, 4, T, Q>(m); } }//namespace glm diff --git a/external/include/glm/gtx/matrix_operation.hpp b/external/include/glm/gtx/matrix_operation.hpp index 3192ae5..bce938b 100644 --- a/external/include/glm/gtx/matrix_operation.hpp +++ b/external/include/glm/gtx/matrix_operation.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation /// @ingroup gtx /// -/// @brief Build diagonal matrices from vectors. +/// Include <glm/gtx/matrix_operation.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_operation.hpp> need to be included to use these functionalities. +/// Build diagonal matrices from vectors. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_operation extension included") #endif @@ -26,57 +30,57 @@ namespace glm //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x2<T, P> diagonal2x2( - tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 2, T, Q> diagonal2x2( + vec<2, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x3<T, P> diagonal2x3( - tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 3, T, Q> diagonal2x3( + vec<2, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat2x4<T, P> diagonal2x4( - tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<2, 4, T, Q> diagonal2x4( + vec<2, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x2<T, P> diagonal3x2( - tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 2, T, Q> diagonal3x2( + vec<2, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> diagonal3x3( - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> diagonal3x3( + vec<3, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x4<T, P> diagonal3x4( - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 4, T, Q> diagonal3x4( + vec<3, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x2<T, P> diagonal4x2( - tvec2<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 2, T, Q> diagonal4x2( + vec<2, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x3<T, P> diagonal4x3( - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 3, T, Q> diagonal4x3( + vec<3, T, Q> const& v); //! Build a diagonal matrix. //! From GLM_GTX_matrix_operation extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> diagonal4x4( - tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> diagonal4x4( + vec<4, T, Q> const& v); /// @} }//namespace glm diff --git a/external/include/glm/gtx/matrix_operation.inl b/external/include/glm/gtx/matrix_operation.inl index 1553215..da1aab8 100644 --- a/external/include/glm/gtx/matrix_operation.inl +++ b/external/include/glm/gtx/matrix_operation.inl @@ -3,116 +3,116 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x2<T, P> diagonal2x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 2, T, Q> diagonal2x2 ( - tvec2<T, P> const & v + vec<2, T, Q> const& v ) { - tmat2x2<T, P> Result(static_cast<T>(1)); + mat<2, 2, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x3<T, P> diagonal2x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 3, T, Q> diagonal2x3 ( - tvec2<T, P> const & v + vec<2, T, Q> const& v ) { - tmat2x3<T, P> Result(static_cast<T>(1)); + mat<2, 3, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat2x4<T, P> diagonal2x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<2, 4, T, Q> diagonal2x4 ( - tvec2<T, P> const & v + vec<2, T, Q> const& v ) { - tmat2x4<T, P> Result(static_cast<T>(1)); + mat<2, 4, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x2<T, P> diagonal3x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 2, T, Q> diagonal3x2 ( - tvec2<T, P> const & v + vec<2, T, Q> const& v ) { - tmat3x2<T, P> Result(static_cast<T>(1)); + mat<3, 2, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> diagonal3x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> diagonal3x3 ( - tvec3<T, P> const & v + vec<3, T, Q> const& v ) { - tmat3x3<T, P> Result(static_cast<T>(1)); + mat<3, 3, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; Result[2][2] = v[2]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x4<T, P> diagonal3x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 4, T, Q> diagonal3x4 ( - tvec3<T, P> const & v + vec<3, T, Q> const& v ) { - tmat3x4<T, P> Result(static_cast<T>(1)); + mat<3, 4, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; Result[2][2] = v[2]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> diagonal4x4 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> diagonal4x4 ( - tvec4<T, P> const & v + vec<4, T, Q> const& v ) { - tmat4x4<T, P> Result(static_cast<T>(1)); + mat<4, 4, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; Result[2][2] = v[2]; Result[3][3] = v[3]; - return Result; + return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x3<T, P> diagonal4x3 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 3, T, Q> diagonal4x3 ( - tvec3<T, P> const & v + vec<3, T, Q> const& v ) { - tmat4x3<T, P> Result(static_cast<T>(1)); + mat<4, 3, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; Result[2][2] = v[2]; - return Result; + return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x2<T, P> diagonal4x2 + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 2, T, Q> diagonal4x2 ( - tvec2<T, P> const & v + vec<2, T, Q> const& v ) { - tmat4x2<T, P> Result(static_cast<T>(1)); + mat<4, 2, T, Q> Result(static_cast<T>(1)); Result[0][0] = v[0]; Result[1][1] = v[1]; - return Result; + return Result; } }//namespace glm diff --git a/external/include/glm/gtx/matrix_query.hpp b/external/include/glm/gtx/matrix_query.hpp index 2518274..4f7e855 100644 --- a/external/include/glm/gtx/matrix_query.hpp +++ b/external/include/glm/gtx/matrix_query.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_matrix_query GLM_GTX_matrix_query /// @ingroup gtx /// -/// @brief Query to evaluate matrix properties +/// Include <glm/gtx/matrix_query.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_query.hpp> need to be included to use these functionalities. +/// Query to evaluate matrix properties #pragma once @@ -18,6 +18,10 @@ #include "../gtx/vector_query.hpp" #include <limits> +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_query extension included") #endif @@ -29,43 +33,43 @@ namespace glm /// Return whether a matrix a null matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNull(tmat2x2<T, P> const & m, T const & epsilon); - + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon); + /// Return whether a matrix a null matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNull(tmat3x3<T, P> const & m, T const & epsilon); - + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon); + /// Return whether a matrix is a null matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNull(tmat4x4<T, P> const & m, T const & epsilon); - + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon); + /// Return whether a matrix is an identity matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL bool isIdentity(matType<T, P> const & m, T const & epsilon); + template<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType> + GLM_FUNC_DECL bool isIdentity(matType<C, R, T, Q> const& m, T const& epsilon); /// Return whether a matrix is a normalized matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNormalized(tmat2x2<T, P> const & m, T const & epsilon); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon); /// Return whether a matrix is a normalized matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNormalized(tmat3x3<T, P> const & m, T const & epsilon); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon); /// Return whether a matrix is a normalized matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P> - GLM_FUNC_DECL bool isNormalized(tmat4x4<T, P> const & m, T const & epsilon); + template<typename T, qualifier Q> + GLM_FUNC_DECL bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon); /// Return whether a matrix is an orthonormalized matrix. /// From GLM_GTX_matrix_query extension. - template<typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_DECL bool isOrthogonal(matType<T, P> const & m, T const & epsilon); + template<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType> + GLM_FUNC_DECL bool isOrthogonal(matType<C, R, T, Q> const& m, T const& epsilon); /// @} }//namespace glm diff --git a/external/include/glm/gtx/matrix_query.inl b/external/include/glm/gtx/matrix_query.inl index 491b774..38b520f 100644 --- a/external/include/glm/gtx/matrix_query.inl +++ b/external/include/glm/gtx/matrix_query.inl @@ -3,8 +3,8 @@ namespace glm { - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNull(tmat2x2<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon) { bool result = true; for(length_t i = 0; result && i < m.length() ; ++i) @@ -12,8 +12,8 @@ namespace glm return result; } - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNull(tmat3x3<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon) { bool result = true; for(length_t i = 0; result && i < m.length() ; ++i) @@ -21,8 +21,8 @@ namespace glm return result; } - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNull(tmat4x4<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon) { bool result = true; for(length_t i = 0; result && i < m.length() ; ++i) @@ -30,8 +30,8 @@ namespace glm return result; } - template<typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER bool isIdentity(matType<T, P> const & m, T const & epsilon) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isIdentity(mat<C, R, T, Q> const& m, T const& epsilon) { bool result = true; for(length_t i = 0; result && i < m[0].length() ; ++i) @@ -46,15 +46,15 @@ namespace glm return result; } - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNormalized(tmat2x2<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon) { bool result(true); for(length_t i = 0; result && i < m.length(); ++i) result = isNormalized(m[i], epsilon); for(length_t i = 0; result && i < m.length(); ++i) { - typename tmat2x2<T, P>::col_type v; + typename mat<2, 2, T, Q>::col_type v; for(length_t j = 0; j < m.length(); ++j) v[j] = m[j][i]; result = isNormalized(v, epsilon); @@ -62,15 +62,15 @@ namespace glm return result; } - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNormalized(tmat3x3<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon) { bool result(true); for(length_t i = 0; result && i < m.length(); ++i) result = isNormalized(m[i], epsilon); for(length_t i = 0; result && i < m.length(); ++i) { - typename tmat3x3<T, P>::col_type v; + typename mat<3, 3, T, Q>::col_type v; for(length_t j = 0; j < m.length(); ++j) v[j] = m[j][i]; result = isNormalized(v, epsilon); @@ -78,15 +78,15 @@ namespace glm return result; } - template<typename T, precision P> - GLM_FUNC_QUALIFIER bool isNormalized(tmat4x4<T, P> const & m, T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon) { bool result(true); for(length_t i = 0; result && i < m.length(); ++i) result = isNormalized(m[i], epsilon); for(length_t i = 0; result && i < m.length(); ++i) { - typename tmat4x4<T, P>::col_type v; + typename mat<4, 4, T, Q>::col_type v; for(length_t j = 0; j < m.length(); ++j) v[j] = m[j][i]; result = isNormalized(v, epsilon); @@ -94,17 +94,17 @@ namespace glm return result; } - template<typename T, precision P, template <typename, precision> class matType> - GLM_FUNC_QUALIFIER bool isOrthogonal(matType<T, P> const & m, T const & epsilon) + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isOrthogonal(mat<C, R, T, Q> const& m, T const& epsilon) { - bool result(true); + bool result = true; for(length_t i(0); result && i < m.length() - 1; ++i) for(length_t j(i + 1); result && j < m.length(); ++j) result = areOrthogonal(m[i], m[j], epsilon); if(result) { - matType<T, P> tmp = transpose(m); + mat<C, R, T, Q> tmp = transpose(m); for(length_t i(0); result && i < m.length() - 1 ; ++i) for(length_t j(i + 1); result && j < m.length(); ++j) result = areOrthogonal(tmp[i], tmp[j], epsilon); diff --git a/external/include/glm/gtx/matrix_transform_2d.hpp b/external/include/glm/gtx/matrix_transform_2d.hpp index 91f4834..56c9bb8 100644 --- a/external/include/glm/gtx/matrix_transform_2d.hpp +++ b/external/include/glm/gtx/matrix_transform_2d.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d /// @ingroup gtx /// -/// @brief Defines functions that generate common 2d transformation matrices. +/// Include <glm/gtx/matrix_transform_2d.hpp> to use the features of this extension. /// -/// <glm/gtx/matrix_transform_2d.hpp> need to be included to use these functionalities. +/// Defines functions that generate common 2d transformation matrices. #pragma once @@ -17,6 +17,9 @@ #include "../mat3x3.hpp" #include "../vec2.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_matrix_transform_2d extension included") @@ -26,50 +29,50 @@ namespace glm { /// @addtogroup gtx_matrix_transform_2d /// @{ - + /// Builds a translation 3 * 3 matrix created from a vector of 2 components. /// /// @param m Input matrix multiplied by this translation matrix. - /// @param v Coordinates of a translation vector. - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> translate( - tmat3x3<T, P> const & m, - tvec2<T, P> const & v); + /// @param v Coordinates of a translation vector. + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); - /// Builds a rotation 3 * 3 matrix created from an angle. + /// Builds a rotation 3 * 3 matrix created from an angle. /// /// @param m Input matrix multiplied by this translation matrix. - /// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is defined or degrees otherwise. - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> rotate( - tmat3x3<T, P> const & m, + /// @param angle Rotation angle expressed in radians. + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, T angle); /// Builds a scale 3 * 3 matrix created from a vector of 2 components. /// /// @param m Input matrix multiplied by this translation matrix. - /// @param v Coordinates of a scale vector. - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> scale( - tmat3x3<T, P> const & m, - tvec2<T, P> const & v); + /// @param v Coordinates of a scale vector. + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v); - /// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. + /// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. /// /// @param m Input matrix multiplied by this translation matrix. /// @param y Shear factor. - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX( - tmat3x3<T, P> const & m, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, T y); - /// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. + /// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. /// /// @param m Input matrix multiplied by this translation matrix. /// @param x Shear factor. - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY( - tmat3x3<T, P> const & m, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, T x); /// @} diff --git a/external/include/glm/gtx/matrix_transform_2d.inl b/external/include/glm/gtx/matrix_transform_2d.inl index bea5670..9ae83d9 100644 --- a/external/include/glm/gtx/matrix_transform_2d.inl +++ b/external/include/glm/gtx/matrix_transform_2d.inl @@ -6,62 +6,62 @@ namespace glm { - - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> translate( - tmat3x3<T, P> const & m, - tvec2<T, P> const & v) + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) { - tmat3x3<T, P> Result(m); + mat<3, 3, T, Q> Result(m); Result[2] = m[0] * v[0] + m[1] * v[1] + m[2]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> rotate( - tmat3x3<T, P> const & m, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate( + mat<3, 3, T, Q> const& m, T angle) { T const a = angle; T const c = cos(a); T const s = sin(a); - tmat3x3<T, P> Result(uninitialize); + mat<3, 3, T, Q> Result; Result[0] = m[0] * c + m[1] * s; Result[1] = m[0] * -s + m[1] * c; Result[2] = m[2]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> scale( - tmat3x3<T, P> const & m, - tvec2<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale( + mat<3, 3, T, Q> const& m, + vec<2, T, Q> const& v) { - tmat3x3<T, P> Result(uninitialize); + mat<3, 3, T, Q> Result; Result[0] = m[0] * v[0]; Result[1] = m[1] * v[1]; Result[2] = m[2]; return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX( - tmat3x3<T, P> const & m, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX( + mat<3, 3, T, Q> const& m, T y) { - tmat3x3<T, P> Result(1); + mat<3, 3, T, Q> Result(1); Result[0][1] = y; return m * Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY( - tmat3x3<T, P> const & m, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY( + mat<3, 3, T, Q> const& m, T x) { - tmat3x3<T, P> Result(1); + mat<3, 3, T, Q> Result(1); Result[1][0] = x; return m * Result; } diff --git a/external/include/glm/gtx/mixed_product.hpp b/external/include/glm/gtx/mixed_product.hpp index 65861f7..f1ed6e0 100644 --- a/external/include/glm/gtx/mixed_product.hpp +++ b/external/include/glm/gtx/mixed_product.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_mixed_product GLM_GTX_mixed_producte /// @ingroup gtx /// -/// @brief Mixed product of 3 vectors. +/// Include <glm/gtx/mixed_product.hpp> to use the features of this extension. /// -/// <glm/gtx/mixed_product.hpp> need to be included to use these functionalities. +/// Mixed product of 3 vectors. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_mixed_product extension included") #endif @@ -25,11 +29,11 @@ namespace glm /// @{ /// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL T mixedProduct( - tvec3<T, P> const & v1, - tvec3<T, P> const & v2, - tvec3<T, P> const & v3); + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3); /// @} }// namespace glm diff --git a/external/include/glm/gtx/mixed_product.inl b/external/include/glm/gtx/mixed_product.inl index a6ede59..01e94ec 100644 --- a/external/include/glm/gtx/mixed_product.inl +++ b/external/include/glm/gtx/mixed_product.inl @@ -3,12 +3,12 @@ namespace glm { - template <typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T mixedProduct ( - tvec3<T, P> const & v1, - tvec3<T, P> const & v2, - tvec3<T, P> const & v3 + vec<3, T, Q> const& v1, + vec<3, T, Q> const& v2, + vec<3, T, Q> const& v3 ) { return dot(cross(v1, v2), v3); diff --git a/external/include/glm/gtx/norm.hpp b/external/include/glm/gtx/norm.hpp index b3cb528..2f106d8 100644 --- a/external/include/glm/gtx/norm.hpp +++ b/external/include/glm/gtx/norm.hpp @@ -7,16 +7,20 @@ /// @defgroup gtx_norm GLM_GTX_norm /// @ingroup gtx /// -/// @brief Various ways to compute vector norms. -/// -/// <glm/gtx/norm.hpp> need to be included to use these functionalities. +/// Include <glm/gtx/norm.hpp> to use the features of this extension. +/// +/// Various ways to compute vector norms. #pragma once // Dependency: -#include "../detail/func_geometric.hpp" +#include "../geometric.hpp" #include "../gtx/quaternion.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_norm extension included") #endif @@ -28,57 +32,43 @@ namespace glm /// Returns the squared length of x. /// From GLM_GTX_norm extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T length2( - vecType<T, P> const & x); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T length2(vec<L, T, Q> const& x); /// Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). /// From GLM_GTX_norm extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T distance2( - vecType<T, P> const & p0, - vecType<T, P> const & p1); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1); //! Returns the L1 norm between x and y. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T l1Norm( - tvec3<T, P> const & x, - tvec3<T, P> const & y); - + template<typename T, qualifier Q> + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + //! Returns the L1 norm of v. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T l1Norm( - tvec3<T, P> const & v); - + template<typename T, qualifier Q> + GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& v); + //! Returns the L2 norm between x and y. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T l2Norm( - tvec3<T, P> const & x, - tvec3<T, P> const & y); - + template<typename T, qualifier Q> + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y); + //! Returns the L2 norm of v. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T l2Norm( - tvec3<T, P> const & x); - + template<typename T, qualifier Q> + GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x); + //! Returns the L norm between x and y. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T lxNorm( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - unsigned int Depth); + template<typename T, qualifier Q> + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth); //! Returns the L norm of v. //! From GLM_GTX_norm extension. - template <typename T, precision P> - GLM_FUNC_DECL T lxNorm( - tvec3<T, P> const & x, - unsigned int Depth); + template<typename T, qualifier Q> + GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, unsigned int Depth); /// @} }//namespace glm diff --git a/external/include/glm/gtx/norm.inl b/external/include/glm/gtx/norm.inl index 20954ec..7bd64e8 100644 --- a/external/include/glm/gtx/norm.inl +++ b/external/include/glm/gtx/norm.inl @@ -1,104 +1,82 @@ /// @ref gtx_norm /// @file glm/gtx/norm.inl -#include "../detail/precision.hpp" +#include "../detail/qualifier.hpp" namespace glm{ namespace detail { - template <template <typename, precision> class vecType, typename T, precision P, bool Aligned> + template<length_t L, typename T, qualifier Q, bool Aligned> struct compute_length2 { - GLM_FUNC_QUALIFIER static T call(vecType<T, P> const & v) + GLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& v) { return dot(v, v); } }; }//namespace detail - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType length2(genType x) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'length2' accepts only floating-point inputs"); return x * x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T length2(vecType<T, P> const & v) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T length2(vec<L, T, Q> const& v) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'length2' accepts only floating-point inputs"); - return detail::compute_length2<vecType, T, P, detail::is_aligned<P>::value>::call(v); + return detail::compute_length2<L, T, Q, detail::is_aligned<Q>::value>::call(v); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER T distance2(T p0, T p1) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'distance2' accepts only floating-point inputs"); return length2(p1 - p0); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T distance2(vecType<T, P> const & p0, vecType<T, P> const & p1) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'distance2' accepts only floating-point inputs"); return length2(p1 - p0); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T l1Norm - ( - tvec3<T, P> const & a, - tvec3<T, P> const & b - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b) { return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T l1Norm - ( - tvec3<T, P> const & v - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& v) { return abs(v.x) + abs(v.y) + abs(v.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T l2Norm - ( - tvec3<T, P> const & a, - tvec3<T, P> const & b + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b ) { return length(b - a); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T l2Norm - ( - tvec3<T, P> const & v - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& v) { return length(v); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T lxNorm - ( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - unsigned int Depth - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth) { return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T lxNorm - ( - tvec3<T, P> const & v, - unsigned int Depth - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& v, unsigned int Depth) { return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth)); } diff --git a/external/include/glm/gtx/normal.hpp b/external/include/glm/gtx/normal.hpp index 2e0044e..03dbffe 100644 --- a/external/include/glm/gtx/normal.hpp +++ b/external/include/glm/gtx/normal.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_normal GLM_GTX_normal /// @ingroup gtx /// -/// @brief Compute the normal of a triangle. +/// Include <glm/gtx/normal.hpp> to use the features of this extension. /// -/// <glm/gtx/normal.hpp> need to be included to use these functionalities. +/// Compute the normal of a triangle. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_normal extension included") #endif @@ -25,13 +29,11 @@ namespace glm /// @addtogroup gtx_normal /// @{ - //! Computes triangle normal from triangle points. - //! From GLM_GTX_normal extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> triangleNormal( - tvec3<T, P> const & p1, - tvec3<T, P> const & p2, - tvec3<T, P> const & p3); + /// Computes triangle normal from triangle points. + /// + /// @see gtx_normal + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> triangleNormal(vec<3, T, Q> const& p1, vec<3, T, Q> const& p2, vec<3, T, Q> const& p3); /// @} }//namespace glm diff --git a/external/include/glm/gtx/normal.inl b/external/include/glm/gtx/normal.inl index e442317..bcd74e5 100644 --- a/external/include/glm/gtx/normal.inl +++ b/external/include/glm/gtx/normal.inl @@ -3,12 +3,12 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> triangleNormal + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> triangleNormal ( - tvec3<T, P> const & p1, - tvec3<T, P> const & p2, - tvec3<T, P> const & p3 + vec<3, T, Q> const& p1, + vec<3, T, Q> const& p2, + vec<3, T, Q> const& p3 ) { return normalize(cross(p1 - p2, p1 - p3)); diff --git a/external/include/glm/gtx/normalize_dot.hpp b/external/include/glm/gtx/normalize_dot.hpp index de650d3..86048e7 100644 --- a/external/include/glm/gtx/normalize_dot.hpp +++ b/external/include/glm/gtx/normalize_dot.hpp @@ -7,15 +7,19 @@ /// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot /// @ingroup gtx /// -/// @brief Dot product of vectors that need to be normalize with a single square root. +/// Include <glm/gtx/normalized_dot.hpp> to use the features of this extension. /// -/// <glm/gtx/normalized_dot.hpp> need to be included to use these functionalities. +/// Dot product of vectors that need to be normalize with a single square root. #pragma once // Dependency: #include "../gtx/fast_square_root.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_normalize_dot extension included") #endif @@ -29,15 +33,15 @@ namespace glm /// It's faster that dot(normalize(x), normalize(y)). /// /// @see gtx_normalize_dot extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T normalizeDot(vecType<T, P> const & x, vecType<T, P> const & y); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y); /// Normalize parameters and returns the dot product of x and y. /// Faster that dot(fastNormalize(x), fastNormalize(y)). /// /// @see gtx_normalize_dot extension. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL T fastNormalizeDot(vecType<T, P> const & x, vecType<T, P> const & y); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y); /// @} }//namespace glm diff --git a/external/include/glm/gtx/normalize_dot.inl b/external/include/glm/gtx/normalize_dot.inl index 0d01ffe..8b88860 100644 --- a/external/include/glm/gtx/normalize_dot.inl +++ b/external/include/glm/gtx/normalize_dot.inl @@ -3,14 +3,14 @@ namespace glm { - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T normalizeDot(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T fastNormalizeDot(vecType<T, P> const & x, vecType<T, P> const & y) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { return glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y)); } diff --git a/external/include/glm/gtx/number_precision.hpp b/external/include/glm/gtx/number_precision.hpp index 736d035..3f4bee1 100644 --- a/external/include/glm/gtx/number_precision.hpp +++ b/external/include/glm/gtx/number_precision.hpp @@ -8,9 +8,9 @@ /// @defgroup gtx_number_precision GLM_GTX_number_precision /// @ingroup gtx /// -/// @brief Defined size types. +/// Include <glm/gtx/number_precision.hpp> to use the features of this extension. /// -/// <glm/gtx/number_precision.hpp> need to be included to use these functionalities. +/// Defined size types. #pragma once @@ -18,6 +18,10 @@ #include "../glm.hpp" #include "../gtc/type_precision.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_number_precision extension included") #endif @@ -26,7 +30,7 @@ namespace glm{ namespace gtx { ///////////////////////////// - // Unsigned int vector types + // Unsigned int vector types /// @addtogroup gtx_number_precision /// @{ @@ -37,18 +41,18 @@ namespace gtx typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) ////////////////////// - // Float vector types + // Float vector types - typedef f32 f32vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) - typedef f64 f64vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ////////////////////// - // Float matrix types + // Float matrix types - typedef f32 f32mat1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) - typedef f32 f32mat1x1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) - typedef f64 f64mat1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension) - typedef f64 f64mat1x1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1x1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1x1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) /// @} }//namespace gtx diff --git a/external/include/glm/gtx/optimum_pow.hpp b/external/include/glm/gtx/optimum_pow.hpp index e9510c4..eb09f1c 100644 --- a/external/include/glm/gtx/optimum_pow.hpp +++ b/external/include/glm/gtx/optimum_pow.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow /// @ingroup gtx /// -/// @brief Integer exponentiation of power functions. +/// Include <glm/gtx/optimum_pow.hpp> to use the features of this extension. /// -/// <glm/gtx/optimum_pow.hpp> need to be included to use these functionalities. +/// Integer exponentiation of power functions. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_optimum_pow extension included") #endif @@ -28,20 +32,20 @@ namespace gtx /// Returns x raised to the power of 2. /// /// @see gtx_optimum_pow - template <typename genType> - GLM_FUNC_DECL genType pow2(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType pow2(genType const& x); /// Returns x raised to the power of 3. /// /// @see gtx_optimum_pow - template <typename genType> - GLM_FUNC_DECL genType pow3(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType pow3(genType const& x); /// Returns x raised to the power of 4. /// /// @see gtx_optimum_pow - template <typename genType> - GLM_FUNC_DECL genType pow4(genType const & x); + template<typename genType> + GLM_FUNC_DECL genType pow4(genType const& x); /// @} }//namespace gtx diff --git a/external/include/glm/gtx/optimum_pow.inl b/external/include/glm/gtx/optimum_pow.inl index 2216a74..78b729f 100644 --- a/external/include/glm/gtx/optimum_pow.inl +++ b/external/include/glm/gtx/optimum_pow.inl @@ -3,20 +3,20 @@ namespace glm { - template <typename genType> - GLM_FUNC_QUALIFIER genType pow2(genType const & x) + template<typename genType> + GLM_FUNC_QUALIFIER genType pow2(genType const& x) { return x * x; } - template <typename genType> - GLM_FUNC_QUALIFIER genType pow3(genType const & x) + template<typename genType> + GLM_FUNC_QUALIFIER genType pow3(genType const& x) { return x * x * x; } - template <typename genType> - GLM_FUNC_QUALIFIER genType pow4(genType const & x) + template<typename genType> + GLM_FUNC_QUALIFIER genType pow4(genType const& x) { return (x * x) * (x * x); } diff --git a/external/include/glm/gtx/orthonormalize.hpp b/external/include/glm/gtx/orthonormalize.hpp index 4bea449..48b157f 100644 --- a/external/include/glm/gtx/orthonormalize.hpp +++ b/external/include/glm/gtx/orthonormalize.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize /// @ingroup gtx /// -/// @brief Orthonormalize matrices. +/// Include <glm/gtx/orthonormalize.hpp> to use the features of this extension. /// -/// <glm/gtx/orthonormalize.hpp> need to be included to use these functionalities. +/// Orthonormalize matrices. #pragma once @@ -18,6 +18,10 @@ #include "../mat3x3.hpp" #include "../geometric.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_orthonormalize extension included") #endif @@ -30,14 +34,14 @@ namespace glm /// Returns the orthonormalized matrix of m. /// /// @see gtx_orthonormalize - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> orthonormalize(tmat3x3<T, P> const & m); - + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m); + /// Orthonormalizes x according y. /// /// @see gtx_orthonormalize - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> orthonormalize(tvec3<T, P> const & x, tvec3<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y); /// @} }//namespace glm diff --git a/external/include/glm/gtx/orthonormalize.inl b/external/include/glm/gtx/orthonormalize.inl index 4796384..c65db11 100644 --- a/external/include/glm/gtx/orthonormalize.inl +++ b/external/include/glm/gtx/orthonormalize.inl @@ -3,10 +3,10 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> orthonormalize(tmat3x3<T, P> const & m) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m) { - tmat3x3<T, P> r = m; + mat<3, 3, T, Q> r = m; r[0] = normalize(r[0]); @@ -22,8 +22,8 @@ namespace glm return r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> orthonormalize(tvec3<T, P> const & x, tvec3<T, P> const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y) { return normalize(x - y * dot(y, x)); } diff --git a/external/include/glm/gtx/perpendicular.hpp b/external/include/glm/gtx/perpendicular.hpp index 8b6260a..35601ac 100644 --- a/external/include/glm/gtx/perpendicular.hpp +++ b/external/include/glm/gtx/perpendicular.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_perpendicular GLM_GTX_perpendicular /// @ingroup gtx /// -/// @brief Perpendicular of a vector from other one +/// Include <glm/gtx/perpendicular.hpp> to use the features of this extension. /// -/// <glm/gtx/perpendicular.hpp> need to be included to use these functionalities. +/// Perpendicular of a vector from other one #pragma once @@ -17,6 +17,10 @@ #include "../glm.hpp" #include "../gtx/projection.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_perpendicular extension included") #endif @@ -28,10 +32,8 @@ namespace glm //! Projects x a perpendicular axis of Normal. //! From GLM_GTX_perpendicular extension. - template <typename vecType> - GLM_FUNC_DECL vecType perp( - vecType const & x, - vecType const & Normal); + template<typename genType> + GLM_FUNC_DECL genType perp(genType const& x, genType const& Normal); /// @} }//namespace glm diff --git a/external/include/glm/gtx/perpendicular.inl b/external/include/glm/gtx/perpendicular.inl index 08a7a81..3b99eed 100644 --- a/external/include/glm/gtx/perpendicular.inl +++ b/external/include/glm/gtx/perpendicular.inl @@ -3,12 +3,8 @@ namespace glm { - template <typename vecType> - GLM_FUNC_QUALIFIER vecType perp - ( - vecType const & x, - vecType const & Normal - ) + template<typename genType> + GLM_FUNC_QUALIFIER genType perp(genType const& x, genType const& Normal) { return x - proj(x, Normal); } diff --git a/external/include/glm/gtx/polar_coordinates.hpp b/external/include/glm/gtx/polar_coordinates.hpp index c647c0f..b8421db 100644 --- a/external/include/glm/gtx/polar_coordinates.hpp +++ b/external/include/glm/gtx/polar_coordinates.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates /// @ingroup gtx /// -/// @brief Conversion from Euclidean space to polar space and revert. +/// Include <glm/gtx/polar_coordinates.hpp> to use the features of this extension. /// -/// <glm/gtx/polar_coordinates.hpp> need to be included to use these functionalities. +/// Conversion from Euclidean space to polar space and revert. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_polar_coordinates extension included") #endif @@ -27,16 +31,16 @@ namespace glm /// Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude. /// /// @see gtx_polar_coordinates - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> polar( - tvec3<T, P> const & euclidean); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> polar( + vec<3, T, Q> const& euclidean); /// Convert Polar to Euclidean coordinates. /// /// @see gtx_polar_coordinates - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> euclidean( - tvec2<T, P> const & polar); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> euclidean( + vec<2, T, Q> const& polar); /// @} }//namespace glm diff --git a/external/include/glm/gtx/polar_coordinates.inl b/external/include/glm/gtx/polar_coordinates.inl index afc9d2b..cd1f357 100644 --- a/external/include/glm/gtx/polar_coordinates.inl +++ b/external/include/glm/gtx/polar_coordinates.inl @@ -3,32 +3,32 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> polar + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> polar ( - tvec3<T, P> const & euclidean + vec<3, T, Q> const& euclidean ) { T const Length(length(euclidean)); - tvec3<T, P> const tmp(euclidean / Length); + vec<3, T, Q> const tmp(euclidean / Length); T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z)); - return tvec3<T, P>( + return vec<3, T, Q>( asin(tmp.y), // latitude atan(tmp.x, tmp.z), // longitude xz_dist); // xz distance } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> euclidean + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> euclidean ( - tvec2<T, P> const & polar + vec<2, T, Q> const& polar ) { T const latitude(polar.x); T const longitude(polar.y); - return tvec3<T, P>( + return vec<3, T, Q>( cos(latitude) * sin(longitude), sin(latitude), cos(latitude) * cos(longitude)); diff --git a/external/include/glm/gtx/projection.hpp b/external/include/glm/gtx/projection.hpp index fcddae8..9a24abf 100644 --- a/external/include/glm/gtx/projection.hpp +++ b/external/include/glm/gtx/projection.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_projection GLM_GTX_projection /// @ingroup gtx /// -/// @brief Projection of a vector to other one +/// Include <glm/gtx/projection.hpp> to use the features of this extension. /// -/// <glm/gtx/projection.hpp> need to be included to use these functionalities. +/// Projection of a vector to other one #pragma once // Dependency: #include "../geometric.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_projection extension included") #endif @@ -27,8 +31,8 @@ namespace glm /// Projects x on Normal. /// /// @see gtx_projection - template <typename vecType> - GLM_FUNC_DECL vecType proj(vecType const & x, vecType const & Normal); + template<typename genType> + GLM_FUNC_DECL genType proj(genType const& x, genType const& Normal); /// @} }//namespace glm diff --git a/external/include/glm/gtx/projection.inl b/external/include/glm/gtx/projection.inl index d21fe83..90950f8 100644 --- a/external/include/glm/gtx/projection.inl +++ b/external/include/glm/gtx/projection.inl @@ -3,8 +3,8 @@ namespace glm { - template <typename vecType> - GLM_FUNC_QUALIFIER vecType proj(vecType const & x, vecType const & Normal) + template<typename genType> + GLM_FUNC_QUALIFIER genType proj(genType const& x, genType const& Normal) { return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; } diff --git a/external/include/glm/gtx/quaternion.hpp b/external/include/glm/gtx/quaternion.hpp index 674d7e7..7310d08 100644 --- a/external/include/glm/gtx/quaternion.hpp +++ b/external/include/glm/gtx/quaternion.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_quaternion GLM_GTX_quaternion /// @ingroup gtx /// -/// @brief Extented quaternion types and functions +/// Include <glm/gtx/quaternion.hpp> to use the features of this extension. /// -/// <glm/gtx/quaternion.hpp> need to be included to use these functionalities. +/// Extented quaternion types and functions #pragma once @@ -19,6 +19,10 @@ #include "../gtc/quaternion.hpp" #include "../gtx/norm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_quaternion extension included") #endif @@ -28,156 +32,189 @@ namespace glm /// @addtogroup gtx_quaternion /// @{ + /// Create an identity quaternion. + /// + /// @see gtx_quaternion + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quat_identity(); + /// Compute a cross product between a quaternion and a vector. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> cross( - tquat<T, P> const & q, - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> cross( + tquat<T, Q> const& q, + vec<3, T, Q> const& v); //! Compute a cross product between a vector and a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> cross( - tvec3<T, P> const & v, - tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> cross( + vec<3, T, Q> const& v, + tquat<T, Q> const& q); - //! Compute a point on a path according squad equation. + //! Compute a point on a path according squad equation. //! q1 and q2 are control points; s1 and s2 are intermediate control points. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> squad( - tquat<T, P> const & q1, - tquat<T, P> const & q2, - tquat<T, P> const & s1, - tquat<T, P> const & s2, - T const & h); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> squad( + tquat<T, Q> const& q1, + tquat<T, Q> const& q2, + tquat<T, Q> const& s1, + tquat<T, Q> const& s2, + T const& h); //! Returns an intermediate control point for squad interpolation. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> intermediate( - tquat<T, P> const & prev, - tquat<T, P> const & curr, - tquat<T, P> const & next); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> intermediate( + tquat<T, Q> const& prev, + tquat<T, Q> const& curr, + tquat<T, Q> const& next); //! Returns a exp of a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> exp( - tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> exp( + tquat<T, Q> const& q); //! Returns a log of a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> log( - tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> log( + tquat<T, Q> const& q); /// Returns x raised to the y power. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> pow( - tquat<T, P> const & x, - T const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> pow( + tquat<T, Q> const& x, + T const& y); //! Returns quarternion square root. /// /// @see gtx_quaternion - //template<typename T, precision P> - //tquat<T, P> sqrt( - // tquat<T, P> const & q); + //template<typename T, qualifier Q> + //tquat<T, Q> sqrt( + // tquat<T, Q> const& q); //! Rotates a 3 components vector by a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rotate( - tquat<T, P> const & q, - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rotate( + tquat<T, Q> const& q, + vec<3, T, Q> const& v); /// Rotates a 4 components vector by a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> rotate( - tquat<T, P> const & q, - tvec4<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> rotate( + tquat<T, Q> const& q, + vec<4, T, Q> const& v); /// Extract the real component of a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> + template<typename T, qualifier Q> GLM_FUNC_DECL T extractRealComponent( - tquat<T, P> const & q); + tquat<T, Q> const& q); /// Converts a quaternion to a 3 * 3 matrix. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> toMat3( - tquat<T, P> const & x){return mat3_cast(x);} + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> toMat3( + tquat<T, Q> const& x){return mat3_cast(x);} /// Converts a quaternion to a 4 * 4 matrix. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> toMat4( - tquat<T, P> const & x){return mat4_cast(x);} + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> toMat4( + tquat<T, Q> const& x){return mat4_cast(x);} /// Converts a 3 * 3 matrix to a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> toQuat( - tmat3x3<T, P> const & x){return quat_cast(x);} + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> toQuat( + mat<3, 3, T, Q> const& x){return quat_cast(x);} /// Converts a 4 * 4 matrix to a quaternion. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> toQuat( - tmat4x4<T, P> const & x){return quat_cast(x);} + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> toQuat( + mat<4, 4, T, Q> const& x){return quat_cast(x);} /// Quaternion interpolation using the rotation short path. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> shortMix( - tquat<T, P> const & x, - tquat<T, P> const & y, - T const & a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> shortMix( + tquat<T, Q> const& x, + tquat<T, Q> const& y, + T const& a); /// Quaternion normalized linear interpolation. /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> fastMix( - tquat<T, P> const & x, - tquat<T, P> const & y, - T const & a); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> fastMix( + tquat<T, Q> const& x, + tquat<T, Q> const& y, + T const& a); /// Compute the rotation between two vectors. /// param orig vector, needs to be normalized /// param dest vector, needs to be normalized /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL tquat<T, P> rotation( - tvec3<T, P> const & orig, - tvec3<T, P> const & dest); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> rotation( + vec<3, T, Q> const& orig, + vec<3, T, Q> const& dest); + + /// Build a look at quaternion based on the default handedness. + /// + /// @param direction Desired forward direction. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quatLookAt( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a right-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the -z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quatLookAtRH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); + + /// Build a left-handed look at quaternion. + /// + /// @param direction Desired forward direction onto which the +z-axis gets mapped. Needs to be normalized. + /// @param up Up vector, how the camera is oriented. Typically (0, 1, 0). + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> quatLookAtLH( + vec<3, T, Q> const& direction, + vec<3, T, Q> const& up); /// Returns the squared length of x. - /// + /// /// @see gtx_quaternion - template<typename T, precision P> - GLM_FUNC_DECL T length2(tquat<T, P> const & q); + template<typename T, qualifier Q> + GLM_FUNC_DECL T length2(tquat<T, Q> const& q); /// @} }//namespace glm diff --git a/external/include/glm/gtx/quaternion.inl b/external/include/glm/gtx/quaternion.inl index c86ec18..fde7a8f 100644 --- a/external/include/glm/gtx/quaternion.inl +++ b/external/include/glm/gtx/quaternion.inl @@ -6,84 +6,90 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> cross(tvec3<T, P> const& v, tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quat_identity() + { + return tquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& v, tquat<T, Q> const& q) { return inverse(q) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> cross(tquat<T, P> const& q, tvec3<T, P> const& v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> cross(tquat<T, Q> const& q, vec<3, T, Q> const& v) { return q * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> squad + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> squad ( - tquat<T, P> const & q1, - tquat<T, P> const & q2, - tquat<T, P> const & s1, - tquat<T, P> const & s2, - T const & h) + tquat<T, Q> const& q1, + tquat<T, Q> const& q2, + tquat<T, Q> const& s1, + tquat<T, Q> const& s2, + T const& h) { return mix(mix(q1, q2, h), mix(s1, s2, h), static_cast<T>(2) * (static_cast<T>(1) - h) * h); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> intermediate + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> intermediate ( - tquat<T, P> const & prev, - tquat<T, P> const & curr, - tquat<T, P> const & next + tquat<T, Q> const& prev, + tquat<T, Q> const& curr, + tquat<T, Q> const& next ) { - tquat<T, P> invQuat = inverse(curr); + tquat<T, Q> invQuat = inverse(curr); return exp((log(next + invQuat) + log(prev + invQuat)) / static_cast<T>(-4)) * curr; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> exp(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> exp(tquat<T, Q> const& q) { - tvec3<T, P> u(q.x, q.y, q.z); + vec<3, T, Q> u(q.x, q.y, q.z); T const Angle = glm::length(u); if (Angle < epsilon<T>()) - return tquat<T, P>(); + return tquat<T, Q>(); - tvec3<T, P> const v(u / Angle); - return tquat<T, P>(cos(Angle), sin(Angle) * v); + vec<3, T, Q> const v(u / Angle); + return tquat<T, Q>(cos(Angle), sin(Angle) * v); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> log(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> log(tquat<T, Q> const& q) { - tvec3<T, P> u(q.x, q.y, q.z); + vec<3, T, Q> u(q.x, q.y, q.z); T Vec3Len = length(u); if (Vec3Len < epsilon<T>()) { if(q.w > static_cast<T>(0)) - return tquat<T, P>(log(q.w), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)); + return tquat<T, Q>(log(q.w), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)); else if(q.w < static_cast<T>(0)) - return tquat<T, P>(log(-q.w), pi<T>(), static_cast<T>(0), static_cast<T>(0)); + return tquat<T, Q>(log(-q.w), pi<T>(), static_cast<T>(0), static_cast<T>(0)); else - return tquat<T, P>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity()); + return tquat<T, Q>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity()); } else { T t = atan(Vec3Len, T(q.w)) / Vec3Len; T QuatLen2 = Vec3Len * Vec3Len + q.w * q.w; - return tquat<T, P>(static_cast<T>(0.5) * log(QuatLen2), t * q.x, t * q.y, t * q.z); + return tquat<T, Q>(static_cast<T>(0.5) * log(QuatLen2), t * q.x, t * q.y, t * q.z); } } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> pow(tquat<T, P> const & x, T const & y) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> pow(tquat<T, Q> const& x, T const& y) { //Raising to the power of 0 should yield 1 //Needed to prevent a division by 0 error later on if(y > -epsilon<T>() && y < epsilon<T>()) - return tquat<T, P>(1,0,0,0); + return tquat<T, Q>(1,0,0,0); //To deal with non-unit quaternions T magnitude = sqrt(x.x * x.x + x.y * x.y + x.z * x.z + x.w *x.w); @@ -91,30 +97,30 @@ namespace glm //Equivalent to raising a real number to a power //Needed to prevent a division by 0 error later on if(abs(x.w / magnitude) > static_cast<T>(1) - epsilon<T>() && abs(x.w / magnitude) < static_cast<T>(1) + epsilon<T>()) - return tquat<T, P>(pow(x.w, y),0,0,0); + return tquat<T, Q>(pow(x.w, y),0,0,0); T Angle = acos(x.w / magnitude); T NewAngle = Angle * y; T Div = sin(NewAngle) / sin(Angle); T Mag = pow(magnitude, y - static_cast<T>(1)); - return tquat<T, P>(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag); + return tquat<T, Q>(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotate(tquat<T, P> const& q, tvec3<T, P> const& v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate(tquat<T, Q> const& q, vec<3, T, Q> const& v) { return q * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> rotate(tquat<T, P> const& q, tvec4<T, P> const& v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate(tquat<T, Q> const& q, vec<4, T, Q> const& v) { return q * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T extractRealComponent(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T extractRealComponent(tquat<T, Q> const& q) { T w = static_cast<T>(1) - q.x * q.x - q.y * q.y - q.z * q.z; if(w < T(0)) @@ -123,20 +129,20 @@ namespace glm return -sqrt(w); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T length2(tquat<T, P> const& q) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T length2(tquat<T, Q> const& q) { return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> shortMix(tquat<T, P> const& x, tquat<T, P> const& y, T const& a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> shortMix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a) { if(a <= static_cast<T>(0)) return x; if(a >= static_cast<T>(1)) return y; T fCos = dot(x, y); - tquat<T, P> y2(y); //BUG!!! tquat<T> y2; + tquat<T, Q> y2(y); //BUG!!! tquat<T> y2; if(fCos < static_cast<T>(0)) { y2 = -y; @@ -159,27 +165,29 @@ namespace glm k1 = sin((static_cast<T>(0) + a) * fAngle) * fOneOverSin; } - return tquat<T, P>( + return tquat<T, Q>( k0 * x.w + k1 * y2.w, k0 * x.x + k1 * y2.x, k0 * x.y + k1 * y2.y, k0 * x.z + k1 * y2.z); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> fastMix(tquat<T, P> const& x, tquat<T, P> const& y, T const & a) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> fastMix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a) { return glm::normalize(x * (static_cast<T>(1) - a) + (y * a)); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> rotation(tvec3<T, P> const& orig, tvec3<T, P> const& dest) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> rotation(vec<3, T, Q> const& orig, vec<3, T, Q> const& dest) { T cosTheta = dot(orig, dest); - tvec3<T, P> rotationAxis; + vec<3, T, Q> rotationAxis; - if(cosTheta >= static_cast<T>(1) - epsilon<T>()) - return quat(); + if(cosTheta >= static_cast<T>(1) - epsilon<T>()) { + // orig and dest point in the same direction + return quat_identity<T,Q>(); + } if(cosTheta < static_cast<T>(-1) + epsilon<T>()) { @@ -188,9 +196,9 @@ namespace glm // So guess one; any will do as long as it's perpendicular to start // This implementation favors a rotation around the Up axis (Y), // since it's often what you want to do. - rotationAxis = cross(tvec3<T, P>(0, 0, 1), orig); + rotationAxis = cross(vec<3, T, Q>(0, 0, 1), orig); if(length2(rotationAxis) < epsilon<T>()) // bad luck, they were parallel, try again! - rotationAxis = cross(tvec3<T, P>(1, 0, 0), orig); + rotationAxis = cross(vec<3, T, Q>(1, 0, 0), orig); rotationAxis = normalize(rotationAxis); return angleAxis(pi<T>(), rotationAxis); @@ -202,11 +210,45 @@ namespace glm T s = sqrt((T(1) + cosTheta) * static_cast<T>(2)); T invs = static_cast<T>(1) / s; - return tquat<T, P>( - s * static_cast<T>(0.5f), + return tquat<T, Q>( + s * static_cast<T>(0.5f), rotationAxis.x * invs, rotationAxis.y * invs, rotationAxis.z * invs); } + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { +# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED + return quatLookAtLH(direction, up); +# else + return quatLookAtRH(direction, up); +# endif + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quatLookAtRH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = -direction; + Result[0] = normalize(cross(up, Result[2])); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } + + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> quatLookAtLH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up) + { + mat<3, 3, T, Q> Result; + + Result[2] = direction; + Result[0] = normalize(cross(up, Result[2])); + Result[1] = cross(Result[2], Result[0]); + + return quat_cast(Result); + } + }//namespace glm diff --git a/external/include/glm/gtx/range.hpp b/external/include/glm/gtx/range.hpp index 00d78b4..38c5713 100644 --- a/external/include/glm/gtx/range.hpp +++ b/external/include/glm/gtx/range.hpp @@ -5,16 +5,20 @@ /// @defgroup gtx_range GLM_GTX_range /// @ingroup gtx /// -/// @brief Defines begin and end for vectors and matrices. Useful for range-based for loop. -/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements). +/// Include <glm/gtx/range.hpp> to use the features of this extension. /// -/// <glm/gtx/range.hpp> need to be included to use these functionalities. +/// Defines begin and end for vectors and matrices. Useful for range-based for loop. +/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements). #pragma once // Dependencies #include "../detail/setup.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if !GLM_HAS_RANGE_FOR # error "GLM_GTX_range requires C++11 suppport or 'range for'" #endif @@ -27,59 +31,68 @@ namespace glm /// @addtogroup gtx_range /// @{ - template <typename T, precision P> - inline length_t components(tvec1<T, P> const & v) +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(push) +# pragma warning(disable : 4100) // unreferenced formal parameter +# endif + + template<typename T, qualifier Q> + inline length_t components(vec<1, T, Q> const& v) { return v.length(); } - - template <typename T, precision P> - inline length_t components(tvec2<T, P> const & v) + + template<typename T, qualifier Q> + inline length_t components(vec<2, T, Q> const& v) { return v.length(); } - - template <typename T, precision P> - inline length_t components(tvec3<T, P> const & v) + + template<typename T, qualifier Q> + inline length_t components(vec<3, T, Q> const& v) { return v.length(); } - - template <typename T, precision P> - inline length_t components(tvec4<T, P> const & v) + + template<typename T, qualifier Q> + inline length_t components(vec<4, T, Q> const& v) { return v.length(); } - - template <typename genType> - inline length_t components(genType const & m) + + template<typename genType> + inline length_t components(genType const& m) { return m.length() * m[0].length(); } - - template <typename genType> - inline typename genType::value_type const * begin(genType const & v) + + template<typename genType> + inline typename genType::value_type const * begin(genType const& v) { return value_ptr(v); } - template <typename genType> - inline typename genType::value_type const * end(genType const & v) + template<typename genType> + inline typename genType::value_type const * end(genType const& v) { return begin(v) + components(v); } - template <typename genType> + template<typename genType> inline typename genType::value_type * begin(genType& v) { return value_ptr(v); } - template <typename genType> + template<typename genType> inline typename genType::value_type * end(genType& v) { return begin(v) + components(v); } +# if GLM_COMPILER & GLM_COMPILER_VC +# pragma warning(pop) +# endif + /// @} }//namespace glm diff --git a/external/include/glm/gtx/raw_data.hpp b/external/include/glm/gtx/raw_data.hpp index 2625fd1..f377c4e 100644 --- a/external/include/glm/gtx/raw_data.hpp +++ b/external/include/glm/gtx/raw_data.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_raw_data GLM_GTX_raw_data /// @ingroup gtx /// -/// @brief Projection of a vector to other one +/// Include <glm/gtx/raw_data.hpp> to use the features of this extension. /// -/// <glm/gtx/raw_data.hpp> need to be included to use these functionalities. +/// Projection of a vector to other one #pragma once @@ -16,6 +16,10 @@ #include "../detail/setup.hpp" #include "../detail/type_int.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_raw_data extension included") #endif @@ -25,19 +29,19 @@ namespace glm /// @addtogroup gtx_raw_data /// @{ - //! Type for byte numbers. + //! Type for byte numbers. //! From GLM_GTX_raw_data extension. typedef detail::uint8 byte; - //! Type for word numbers. + //! Type for word numbers. //! From GLM_GTX_raw_data extension. typedef detail::uint16 word; - //! Type for dword numbers. + //! Type for dword numbers. //! From GLM_GTX_raw_data extension. typedef detail::uint32 dword; - //! Type for qword numbers. + //! Type for qword numbers. //! From GLM_GTX_raw_data extension. typedef detail::uint64 qword; diff --git a/external/include/glm/gtx/rotate_normalized_axis.hpp b/external/include/glm/gtx/rotate_normalized_axis.hpp index f1dfa7b..3ac482c 100644 --- a/external/include/glm/gtx/rotate_normalized_axis.hpp +++ b/external/include/glm/gtx/rotate_normalized_axis.hpp @@ -8,9 +8,9 @@ /// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis /// @ingroup gtx /// -/// @brief Quaternions and matrices rotations around normalized axis. +/// Include <glm/gtx/rotate_normalized_axis.hpp> to use the features of this extension. /// -/// <glm/gtx/rotate_normalized_axis.hpp> need to be included to use these functionalities. +/// Quaternions and matrices rotations around normalized axis. #pragma once @@ -19,6 +19,10 @@ #include "../gtc/epsilon.hpp" #include "../gtc/quaternion.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_rotate_normalized_axis extension included") #endif @@ -28,35 +32,35 @@ namespace glm /// @addtogroup gtx_rotate_normalized_axis /// @{ - /// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. - /// + /// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. + /// /// @param m Input matrix multiplied by this rotation matrix. - /// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param angle Rotation angle expressed in radians. /// @param axis Rotation axis, must be normalized. - /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. - /// + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double. + /// /// @see gtx_rotate_normalized_axis - /// @see - rotate(T angle, T x, T y, T z) - /// @see - rotate(tmat4x4<T, P> const & m, T angle, T x, T y, T z) - /// @see - rotate(T angle, tvec3<T, P> const & v) - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> rotateNormalizedAxis( - tmat4x4<T, P> const & m, - T const & angle, - tvec3<T, P> const & axis); + /// @see - rotate(T angle, T x, T y, T z) + /// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) + /// @see - rotate(T angle, vec<3, T, Q> const& v) + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> rotateNormalizedAxis( + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& axis); /// Rotates a quaternion from a vector of 3 components normalized axis and an angle. - /// + /// /// @param q Source orientation - /// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param angle Angle expressed in radians. /// @param axis Normalized axis of the rotation, must be normalized. - /// + /// /// @see gtx_rotate_normalized_axis - template <typename T, precision P> - GLM_FUNC_DECL tquat<T, P> rotateNormalizedAxis( - tquat<T, P> const & q, - T const & angle, - tvec3<T, P> const & axis); + template<typename T, qualifier Q> + GLM_FUNC_DECL tquat<T, Q> rotateNormalizedAxis( + tquat<T, Q> const& q, + T const& angle, + vec<3, T, Q> const& axis); /// @} }//namespace glm diff --git a/external/include/glm/gtx/rotate_normalized_axis.inl b/external/include/glm/gtx/rotate_normalized_axis.inl index dc1b1a8..66e0910 100644 --- a/external/include/glm/gtx/rotate_normalized_axis.inl +++ b/external/include/glm/gtx/rotate_normalized_axis.inl @@ -3,23 +3,23 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rotateNormalizedAxis + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotateNormalizedAxis ( - tmat4x4<T, P> const & m, - T const & angle, - tvec3<T, P> const & v + mat<4, 4, T, Q> const& m, + T const& angle, + vec<3, T, Q> const& v ) { T const a = angle; T const c = cos(a); T const s = sin(a); - tvec3<T, P> const axis(v); + vec<3, T, Q> const axis(v); - tvec3<T, P> const temp((static_cast<T>(1) - c) * axis); + vec<3, T, Q> const temp((static_cast<T>(1) - c) * axis); - tmat4x4<T, P> Rotate(uninitialize); + mat<4, 4, T, Q> Rotate; Rotate[0][0] = c + temp[0] * axis[0]; Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; @@ -32,7 +32,7 @@ namespace glm Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; Rotate[2][2] = c + temp[2] * axis[2]; - tmat4x4<T, P> Result(uninitialize); + mat<4, 4, T, Q> Result; Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; @@ -40,20 +40,20 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tquat<T, P> rotateNormalizedAxis + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER tquat<T, Q> rotateNormalizedAxis ( - tquat<T, P> const & q, - T const & angle, - tvec3<T, P> const & v + tquat<T, Q> const& q, + T const& angle, + vec<3, T, Q> const& v ) { - tvec3<T, P> const Tmp(v); + vec<3, T, Q> const Tmp(v); T const AngleRad(angle); T const Sin = sin(AngleRad * T(0.5)); - return q * tquat<T, P>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); - //return gtc::quaternion::cross(q, tquat<T, P>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); + return q * tquat<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + //return gtc::quaternion::cross(q, tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); } }//namespace glm diff --git a/external/include/glm/gtx/rotate_vector.hpp b/external/include/glm/gtx/rotate_vector.hpp index 91d1784..2ad909d 100644 --- a/external/include/glm/gtx/rotate_vector.hpp +++ b/external/include/glm/gtx/rotate_vector.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector /// @ingroup gtx /// -/// @brief Function to directly rotate a vector +/// Include <glm/gtx/rotate_vector.hpp> to use the features of this extension. /// -/// <glm/gtx/rotate_vector.hpp> need to be included to use these functionalities. +/// Function to directly rotate a vector #pragma once @@ -17,6 +17,10 @@ #include "../glm.hpp" #include "../gtx/transform.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_rotate_vector extension included") #endif @@ -27,89 +31,89 @@ namespace glm /// @{ /// Returns Spherical interpolation between two vectors - /// + /// /// @param x A first vector /// @param y A second vector /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. - /// + /// /// @see gtx_rotate_vector - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> slerp( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - T const & a); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> slerp( + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a); //! Rotate a two dimensional vector. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec2<T, P> rotate( - tvec2<T, P> const & v, - T const & angle); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<2, T, Q> rotate( + vec<2, T, Q> const& v, + T const& angle); + //! Rotate a three dimensional vector around an axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rotate( - tvec3<T, P> const & v, - T const & angle, - tvec3<T, P> const & normal); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rotate( + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + //! Rotate a four dimensional vector around an axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> rotate( - tvec4<T, P> const & v, - T const & angle, - tvec3<T, P> const & normal); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> rotate( + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal); + //! Rotate a three dimensional vector around the X axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rotateX( - tvec3<T, P> const & v, - T const & angle); + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rotateX( + vec<3, T, Q> const& v, + T const& angle); //! Rotate a three dimensional vector around the Y axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rotateY( - tvec3<T, P> const & v, - T const & angle); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rotateY( + vec<3, T, Q> const& v, + T const& angle); + //! Rotate a three dimensional vector around the Z axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec3<T, P> rotateZ( - tvec3<T, P> const & v, - T const & angle); - - //! Rotate a four dimentionnals vector around the X axis. - //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> rotateX( - tvec4<T, P> const & v, - T const & angle); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<3, T, Q> rotateZ( + vec<3, T, Q> const& v, + T const& angle); + //! Rotate a four dimensional vector around the X axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> rotateY( - tvec4<T, P> const & v, - T const & angle); - - //! Rotate a four dimensional vector around the X axis. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> rotateX( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Y axis. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tvec4<T, P> rotateZ( - tvec4<T, P> const & v, - T const & angle); - + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> rotateY( + vec<4, T, Q> const& v, + T const& angle); + + //! Rotate a four dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template<typename T, qualifier Q> + GLM_FUNC_DECL vec<4, T, Q> rotateZ( + vec<4, T, Q> const& v, + T const& angle); + //! Build a rotation matrix from a normal and a up vector. //! From GLM_GTX_rotate_vector extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> orientation( - tvec3<T, P> const & Normal, - tvec3<T, P> const & Up); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> orientation( + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up); /// @} }//namespace glm diff --git a/external/include/glm/gtx/rotate_vector.inl b/external/include/glm/gtx/rotate_vector.inl index 5620e96..5183d37 100644 --- a/external/include/glm/gtx/rotate_vector.inl +++ b/external/include/glm/gtx/rotate_vector.inl @@ -3,12 +3,12 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> slerp + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> slerp ( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - T const & a + vec<3, T, Q> const& x, + vec<3, T, Q> const& y, + T const& a ) { // get cosine of angle between vectors (-1 -> 1) @@ -25,14 +25,14 @@ namespace glm return x * t1 + y * t2; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<T, P> rotate + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, T, Q> rotate ( - tvec2<T, P> const & v, - T const & angle + vec<2, T, Q> const& v, + T const& angle ) { - tvec2<T, P> Result; + vec<2, T, Q> Result; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -41,47 +41,47 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotate + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotate ( - tvec3<T, P> const & v, - T const & angle, - tvec3<T, P> const & normal + vec<3, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal ) { - return tmat3x3<T, P>(glm::rotate(angle, normal)) * v; + return mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v; } /* - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotateGTX( - const tvec3<T, P>& x, + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX( + const vec<3, T, Q>& x, T angle, - const tvec3<T, P>& normal) + const vec<3, T, Q>& normal) { const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; } */ - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> rotate + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> rotate ( - tvec4<T, P> const & v, - T const & angle, - tvec3<T, P> const & normal + vec<4, T, Q> const& v, + T const& angle, + vec<3, T, Q> const& normal ) { return rotate(angle, normal) * v; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotateX + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateX ( - tvec3<T, P> const & v, - T const & angle + vec<3, T, Q> const& v, + T const& angle ) { - tvec3<T, P> Result(v); + vec<3, T, Q> Result(v); T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -90,14 +90,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotateY + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateY ( - tvec3<T, P> const & v, - T const & angle + vec<3, T, Q> const& v, + T const& angle ) { - tvec3<T, P> Result = v; + vec<3, T, Q> Result = v; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -106,14 +106,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<T, P> rotateZ + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ ( - tvec3<T, P> const & v, - T const & angle + vec<3, T, Q> const& v, + T const& angle ) { - tvec3<T, P> Result = v; + vec<3, T, Q> Result = v; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -122,14 +122,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> rotateX + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateX ( - tvec4<T, P> const & v, - T const & angle + vec<4, T, Q> const& v, + T const& angle ) { - tvec4<T, P> Result = v; + vec<4, T, Q> Result = v; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -138,14 +138,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> rotateY + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateY ( - tvec4<T, P> const & v, - T const & angle + vec<4, T, Q> const& v, + T const& angle ) { - tvec4<T, P> Result = v; + vec<4, T, Q> Result = v; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -154,14 +154,14 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<T, P> rotateZ + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ ( - tvec4<T, P> const & v, - T const & angle + vec<4, T, Q> const& v, + T const& angle ) { - tvec4<T, P> Result = v; + vec<4, T, Q> Result = v; T const Cos(cos(angle)); T const Sin(sin(angle)); @@ -170,17 +170,17 @@ namespace glm return Result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> orientation + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation ( - tvec3<T, P> const & Normal, - tvec3<T, P> const & Up + vec<3, T, Q> const& Normal, + vec<3, T, Q> const& Up ) { if(all(equal(Normal, Up))) - return tmat4x4<T, P>(T(1)); + return mat<4, 4, T, Q>(T(1)); - tvec3<T, P> RotationAxis = cross(Up, Normal); + vec<3, T, Q> RotationAxis = cross(Up, Normal); T Angle = acos(dot(Normal, Up)); return rotate(Angle, RotationAxis); diff --git a/external/include/glm/gtx/scalar_multiplication.hpp b/external/include/glm/gtx/scalar_multiplication.hpp index 695e841..b73edf6 100644 --- a/external/include/glm/gtx/scalar_multiplication.hpp +++ b/external/include/glm/gtx/scalar_multiplication.hpp @@ -2,7 +2,9 @@ /// @file glm/gtx/scalar_multiplication.hpp /// @author Joshua Moerman /// -/// @brief Enables scalar multiplication for all types +/// Include <glm/gtx/scalar_multiplication.hpp> to use the features of this extension. +/// +/// Enables scalar multiplication for all types /// /// Since GLSL is very strict about types, the following (often used) combinations do not work: /// double * vec4 @@ -14,6 +16,10 @@ #include "../detail/setup.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_scalar_multiplication is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if !GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC) # error "GLM_GTX_scalar_multiplication requires C++11 support or alias templates and if not support for GCC" #endif @@ -26,28 +32,28 @@ namespace glm { - template <typename T, typename Vec> + template<typename T, typename Vec> using return_type_scalar_multiplication = typename std::enable_if< !std::is_same<T, float>::value // T may not be a float && std::is_arithmetic<T>::value, Vec // But it may be an int or double (no vec3 or mat3, ...) >::type; #define GLM_IMPLEMENT_SCAL_MULT(Vec) \ - template <typename T> \ + template<typename T> \ return_type_scalar_multiplication<T, Vec> \ - operator*(T const & s, Vec rh){ \ + operator*(T const& s, Vec rh){ \ return rh *= static_cast<float>(s); \ } \ \ - template <typename T> \ + template<typename T> \ return_type_scalar_multiplication<T, Vec> \ - operator*(Vec lh, T const & s){ \ + operator*(Vec lh, T const& s){ \ return lh *= static_cast<float>(s); \ } \ \ - template <typename T> \ + template<typename T> \ return_type_scalar_multiplication<T, Vec> \ - operator/(Vec lh, T const & s){ \ + operator/(Vec lh, T const& s){ \ return lh *= 1.0f / s; \ } diff --git a/external/include/glm/gtx/scalar_relational.hpp b/external/include/glm/gtx/scalar_relational.hpp index 9695716..7fc8c1c 100644 --- a/external/include/glm/gtx/scalar_relational.hpp +++ b/external/include/glm/gtx/scalar_relational.hpp @@ -6,15 +6,19 @@ /// @defgroup gtx_scalar_relational GLM_GTX_scalar_relational /// @ingroup gtx /// -/// @brief Extend a position from a source to a position at a defined length. +/// Include <glm/gtx/scalar_relational.hpp> to use the features of this extension. /// -/// <glm/gtx/scalar_relational.hpp> need to be included to use these functionalities. +/// Extend a position from a source to a position at a defined length. #pragma once // Dependency: #include "../glm.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_extend extension included") #endif diff --git a/external/include/glm/gtx/scalar_relational.inl b/external/include/glm/gtx/scalar_relational.inl index 709da04..8da7236 100644 --- a/external/include/glm/gtx/scalar_relational.inl +++ b/external/include/glm/gtx/scalar_relational.inl @@ -3,69 +3,69 @@ namespace glm { - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool lessThan ( - T const & x, - T const & y + T const& x, + T const& y ) { return x < y; } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool lessThanEqual ( - T const & x, - T const & y + T const& x, + T const& y ) { return x <= y; } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool greaterThan ( - T const & x, - T const & y + T const& x, + T const& y ) { return x > y; } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool greaterThanEqual ( - T const & x, - T const & y + T const& x, + T const& y ) { return x >= y; } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool equal ( - T const & x, - T const & y + T const& x, + T const& y ) { - return x == y; + return detail::compute_equal<T>::call(x, y); } - template <typename T> + template<typename T> GLM_FUNC_QUALIFIER bool notEqual ( - T const & x, - T const & y + T const& x, + T const& y ) { - return x != y; + return !detail::compute_equal<T>::call(x, y); } GLM_FUNC_QUALIFIER bool any ( - bool const & x + bool const& x ) { return x; @@ -73,7 +73,7 @@ namespace glm GLM_FUNC_QUALIFIER bool all ( - bool const & x + bool const& x ) { return x; @@ -81,7 +81,7 @@ namespace glm GLM_FUNC_QUALIFIER bool not_ ( - bool const & x + bool const& x ) { return !x; diff --git a/external/include/glm/gtx/simd_mat4.hpp b/external/include/glm/gtx/simd_mat4.hpp deleted file mode 100644 index a68220c..0000000 --- a/external/include/glm/gtx/simd_mat4.hpp +++ /dev/null @@ -1,182 +0,0 @@ -/// @ref gtx_simd_mat4 -/// @file glm/gtx/simd_mat4.hpp -/// -/// @see core (dependence) -/// -/// @defgroup gtx_simd_mat4 GLM_GTX_simd_mat4 -/// @ingroup gtx -/// -/// @brief SIMD implementation of mat4 type. -/// -/// <glm/gtx/simd_mat4.hpp> need to be included to use these functionalities. - -#pragma once - -// Dependencies -#include "../detail/setup.hpp" - -#if(GLM_ARCH != GLM_ARCH_PURE) - -#if(GLM_ARCH & GLM_ARCH_SSE2_BIT) -# include "../detail/intrinsic_matrix.hpp" -# include "../gtx/simd_vec4.hpp" -#else -# error "GLM: GLM_GTX_simd_mat4 requires compiler support of SSE2 through intrinsics" -#endif - -#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) -# pragma message("GLM: GLM_GTX_simd_mat4 extension included") -# pragma message("GLM: GLM_GTX_simd_mat4 extension is deprecated and will be removed in GLM 0.9.9. Use mat4 instead and use compiler SIMD arguments.") -#endif - -namespace glm{ -namespace detail -{ - /// 4x4 Matrix implemented using SIMD SEE intrinsics. - /// \ingroup gtx_simd_mat4 - GLM_ALIGNED_STRUCT(16) fmat4x4SIMD - { - typedef float value_type; - typedef fvec4SIMD col_type; - typedef fvec4SIMD row_type; - typedef std::size_t size_type; - typedef fmat4x4SIMD type; - typedef fmat4x4SIMD transpose_type; - - typedef tmat4x4<float, defaultp> pure_type; - typedef tvec4<float, defaultp> pure_row_type; - typedef tvec4<float, defaultp> pure_col_type; - typedef tmat4x4<float, defaultp> pure_transpose_type; - - GLM_FUNC_DECL length_t length() const; - - fvec4SIMD Data[4]; - - ////////////////////////////////////// - // Constructors - - fmat4x4SIMD() GLM_DEFAULT_CTOR; - explicit fmat4x4SIMD(float const & s); - explicit fmat4x4SIMD( - float const & x0, float const & y0, float const & z0, float const & w0, - float const & x1, float const & y1, float const & z1, float const & w1, - float const & x2, float const & y2, float const & z2, float const & w2, - float const & x3, float const & y3, float const & z3, float const & w3); - explicit fmat4x4SIMD( - fvec4SIMD const & v0, - fvec4SIMD const & v1, - fvec4SIMD const & v2, - fvec4SIMD const & v3); - explicit fmat4x4SIMD( - mat4x4 const & m); - explicit fmat4x4SIMD( - __m128 const in[4]); - - // Conversions - //template <typename U> - //explicit tmat4x4(tmat4x4<U> const & m); - - //explicit tmat4x4(tmat2x2<T> const & x); - //explicit tmat4x4(tmat3x3<T> const & x); - //explicit tmat4x4(tmat2x3<T> const & x); - //explicit tmat4x4(tmat3x2<T> const & x); - //explicit tmat4x4(tmat2x4<T> const & x); - //explicit tmat4x4(tmat4x2<T> const & x); - //explicit tmat4x4(tmat3x4<T> const & x); - //explicit tmat4x4(tmat4x3<T> const & x); - - // Accesses - fvec4SIMD & operator[](length_t i); - fvec4SIMD const & operator[](length_t i) const; - - // Unary updatable operators - fmat4x4SIMD & operator= (fmat4x4SIMD const & m) GLM_DEFAULT; - fmat4x4SIMD & operator+= (float const & s); - fmat4x4SIMD & operator+= (fmat4x4SIMD const & m); - fmat4x4SIMD & operator-= (float const & s); - fmat4x4SIMD & operator-= (fmat4x4SIMD const & m); - fmat4x4SIMD & operator*= (float const & s); - fmat4x4SIMD & operator*= (fmat4x4SIMD const & m); - fmat4x4SIMD & operator/= (float const & s); - fmat4x4SIMD & operator/= (fmat4x4SIMD const & m); - fmat4x4SIMD & operator++ (); - fmat4x4SIMD & operator-- (); - }; - - // Binary operators - fmat4x4SIMD operator+ (fmat4x4SIMD const & m, float const & s); - fmat4x4SIMD operator+ (float const & s, fmat4x4SIMD const & m); - fmat4x4SIMD operator+ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); - - fmat4x4SIMD operator- (fmat4x4SIMD const & m, float const & s); - fmat4x4SIMD operator- (float const & s, fmat4x4SIMD const & m); - fmat4x4SIMD operator- (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); - - fmat4x4SIMD operator* (fmat4x4SIMD const & m, float const & s); - fmat4x4SIMD operator* (float const & s, fmat4x4SIMD const & m); - - fvec4SIMD operator* (fmat4x4SIMD const & m, fvec4SIMD const & v); - fvec4SIMD operator* (fvec4SIMD const & v, fmat4x4SIMD const & m); - - fmat4x4SIMD operator* (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); - - fmat4x4SIMD operator/ (fmat4x4SIMD const & m, float const & s); - fmat4x4SIMD operator/ (float const & s, fmat4x4SIMD const & m); - - fvec4SIMD operator/ (fmat4x4SIMD const & m, fvec4SIMD const & v); - fvec4SIMD operator/ (fvec4SIMD const & v, fmat4x4SIMD const & m); - - fmat4x4SIMD operator/ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); - - // Unary constant operators - fmat4x4SIMD const operator- (fmat4x4SIMD const & m); - fmat4x4SIMD const operator-- (fmat4x4SIMD const & m, int); - fmat4x4SIMD const operator++ (fmat4x4SIMD const & m, int); -}//namespace detail - - typedef detail::fmat4x4SIMD simdMat4; - - /// @addtogroup gtx_simd_mat4 - /// @{ - - //! Convert a simdMat4 to a mat4. - //! (From GLM_GTX_simd_mat4 extension) - mat4 mat4_cast( - detail::fmat4x4SIMD const & x); - - //! Multiply matrix x by matrix y component-wise, i.e., - //! result[i][j] is the scalar product of x[i][j] and y[i][j]. - //! (From GLM_GTX_simd_mat4 extension). - detail::fmat4x4SIMD matrixCompMult( - detail::fmat4x4SIMD const & x, - detail::fmat4x4SIMD const & y); - - //! Treats the first parameter c as a column vector - //! and the second parameter r as a row vector - //! and does a linear algebraic matrix multiply c * r. - //! (From GLM_GTX_simd_mat4 extension). - detail::fmat4x4SIMD outerProduct( - detail::fvec4SIMD const & c, - detail::fvec4SIMD const & r); - - //! Returns the transposed matrix of x - //! (From GLM_GTX_simd_mat4 extension). - detail::fmat4x4SIMD transpose( - detail::fmat4x4SIMD const & x); - - //! Return the determinant of a mat4 matrix. - //! (From GLM_GTX_simd_mat4 extension). - float determinant( - detail::fmat4x4SIMD const & m); - - //! Return the inverse of a mat4 matrix. - //! (From GLM_GTX_simd_mat4 extension). - detail::fmat4x4SIMD inverse( - detail::fmat4x4SIMD const & m); - - /// @} -}// namespace glm - -#include "simd_mat4.inl" - -#endif//(GLM_ARCH != GLM_ARCH_PURE) diff --git a/external/include/glm/gtx/simd_mat4.inl b/external/include/glm/gtx/simd_mat4.inl deleted file mode 100644 index 9643255..0000000 --- a/external/include/glm/gtx/simd_mat4.inl +++ /dev/null @@ -1,577 +0,0 @@ -/// @ref gtx_simd_mat4 -/// @file glm/gtx/simd_mat4.inl - -namespace glm{ -namespace detail{ - -GLM_FUNC_QUALIFIER length_t fmat4x4SIMD::length() const -{ - return 4; -} - -////////////////////////////////////// -// Accesses - -GLM_FUNC_QUALIFIER fvec4SIMD & fmat4x4SIMD::operator[] -( - length_t i -) -{ - assert(i < this->length()); - - return this->Data[i]; -} - -GLM_FUNC_QUALIFIER fvec4SIMD const & fmat4x4SIMD::operator[] -( - length_t i -) const -{ - assert(i < this->length()); - - return this->Data[i]; -} - -////////////////////////////////////////////////////////////// -// Constructors - -#if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD() - { -# ifndef GLM_FORCE_NO_CTOR_INIT - this->Data[0] = fvec4SIMD(1, 0, 0, 0); - this->Data[1] = fvec4SIMD(0, 1, 0, 0); - this->Data[2] = fvec4SIMD(0, 0, 1, 0); - this->Data[3] = fvec4SIMD(0, 0, 0, 1); -# endif - } -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const & s) -{ - this->Data[0] = fvec4SIMD(s, 0, 0, 0); - this->Data[1] = fvec4SIMD(0, s, 0, 0); - this->Data[2] = fvec4SIMD(0, 0, s, 0); - this->Data[3] = fvec4SIMD(0, 0, 0, s); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD -( - float const & x0, float const & y0, float const & z0, float const & w0, - float const & x1, float const & y1, float const & z1, float const & w1, - float const & x2, float const & y2, float const & z2, float const & w2, - float const & x3, float const & y3, float const & z3, float const & w3 -) -{ - this->Data[0] = fvec4SIMD(x0, y0, z0, w0); - this->Data[1] = fvec4SIMD(x1, y1, z1, w1); - this->Data[2] = fvec4SIMD(x2, y2, z2, w2); - this->Data[3] = fvec4SIMD(x3, y3, z3, w3); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD -( - fvec4SIMD const & v0, - fvec4SIMD const & v1, - fvec4SIMD const & v2, - fvec4SIMD const & v3 -) -{ - this->Data[0] = v0; - this->Data[1] = v1; - this->Data[2] = v2; - this->Data[3] = v3; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD -( - mat4 const & m -) -{ - this->Data[0] = fvec4SIMD(m[0]); - this->Data[1] = fvec4SIMD(m[1]); - this->Data[2] = fvec4SIMD(m[2]); - this->Data[3] = fvec4SIMD(m[3]); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD -( - __m128 const in[4] -) -{ - this->Data[0] = in[0]; - this->Data[1] = in[1]; - this->Data[2] = in[2]; - this->Data[3] = in[3]; -} - -////////////////////////////////////////////////////////////// -// mat4 operators - -#if !GLM_HAS_DEFAULTED_FUNCTIONS - GLM_FUNC_QUALIFIER fmat4x4SIMD& fmat4x4SIMD::operator= - ( - fmat4x4SIMD const & m - ) - { - this->Data[0] = m[0]; - this->Data[1] = m[1]; - this->Data[2] = m[2]; - this->Data[3] = m[3]; - return *this; - } -#endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+= -( - fmat4x4SIMD const & m -) -{ - this->Data[0].Data = _mm_add_ps(this->Data[0].Data, m[0].Data); - this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data); - this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data); - this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-= -( - fmat4x4SIMD const & m -) -{ - this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, m[0].Data); - this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, m[1].Data); - this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data); - this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data); - - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*= -( - fmat4x4SIMD const & m -) -{ - sse_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/= -( - fmat4x4SIMD const & m -) -{ - __m128 Inv[4]; - sse_inverse_ps(&m.Data[0].Data, Inv); - sse_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+= -( - float const & s -) -{ - __m128 Operand = _mm_set_ps1(s); - this->Data[0].Data = _mm_add_ps(this->Data[0].Data, Operand); - this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand); - this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand); - this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-= -( - float const & s -) -{ - __m128 Operand = _mm_set_ps1(s); - this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, Operand); - this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand); - this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand); - this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*= -( - float const & s -) -{ - __m128 Operand = _mm_set_ps1(s); - this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); - this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); - this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); - this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/= -( - float const & s -) -{ - __m128 Operand = _mm_div_ps(one, _mm_set_ps1(s)); - this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); - this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); - this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); - this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator++ () -{ - this->Data[0].Data = _mm_add_ps(this->Data[0].Data, one); - this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one); - this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one); - this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one); - return *this; -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- () -{ - this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, one); - this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one); - this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one); - this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one); - return *this; -} - - -////////////////////////////////////////////////////////////// -// Binary operators - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ -( - const fmat4x4SIMD &m, - float const & s -) -{ - return detail::fmat4x4SIMD - ( - m[0] + s, - m[1] + s, - m[2] + s, - m[3] + s - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ -( - float const & s, - const fmat4x4SIMD &m -) -{ - return detail::fmat4x4SIMD - ( - m[0] + s, - m[1] + s, - m[2] + s, - m[3] + s - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ -( - const fmat4x4SIMD &m1, - const fmat4x4SIMD &m2 -) -{ - return detail::fmat4x4SIMD - ( - m1[0] + m2[0], - m1[1] + m2[1], - m1[2] + m2[2], - m1[3] + m2[3] - ); -} - - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator- -( - const fmat4x4SIMD &m, - float const & s -) -{ - return detail::fmat4x4SIMD - ( - m[0] - s, - m[1] - s, - m[2] - s, - m[3] - s - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator- -( - float const & s, - const fmat4x4SIMD &m -) -{ - return detail::fmat4x4SIMD - ( - s - m[0], - s - m[1], - s - m[2], - s - m[3] - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator- -( - const fmat4x4SIMD &m1, - const fmat4x4SIMD &m2 -) -{ - return detail::fmat4x4SIMD - ( - m1[0] - m2[0], - m1[1] - m2[1], - m1[2] - m2[2], - m1[3] - m2[3] - ); -} - - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator* -( - const fmat4x4SIMD &m, - float const & s -) -{ - return detail::fmat4x4SIMD - ( - m[0] * s, - m[1] * s, - m[2] * s, - m[3] * s - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator* -( - float const & s, - const fmat4x4SIMD &m -) -{ - return detail::fmat4x4SIMD - ( - m[0] * s, - m[1] * s, - m[2] * s, - m[3] * s - ); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* -( - const fmat4x4SIMD &m, - fvec4SIMD const & v -) -{ - return sse_mul_ps(&m.Data[0].Data, v.Data); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* -( - fvec4SIMD const & v, - const fmat4x4SIMD &m -) -{ - return sse_mul_ps(v.Data, &m.Data[0].Data); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator* -( - const fmat4x4SIMD &m1, - const fmat4x4SIMD &m2 -) -{ - fmat4x4SIMD result; - sse_mul_ps(&m1.Data[0].Data, &m2.Data[0].Data, &result.Data[0].Data); - - return result; -} - - - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ -( - const fmat4x4SIMD &m, - float const & s -) -{ - return detail::fmat4x4SIMD - ( - m[0] / s, - m[1] / s, - m[2] / s, - m[3] / s - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ -( - float const & s, - const fmat4x4SIMD &m -) -{ - return detail::fmat4x4SIMD - ( - s / m[0], - s / m[1], - s / m[2], - s / m[3] - ); -} - -GLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m) -{ - detail::fmat4x4SIMD result; - detail::sse_inverse_ps(&m[0].Data, &result[0].Data); - return result; -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator/ -( - const fmat4x4SIMD & m, - fvec4SIMD const & v -) -{ - return inverse(m) * v; -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator/ -( - fvec4SIMD const & v, - const fmat4x4SIMD &m -) -{ - return v * inverse(m); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ -( - const fmat4x4SIMD &m1, - const fmat4x4SIMD &m2 -) -{ - __m128 result[4]; - __m128 inv[4]; - - sse_inverse_ps(&m2.Data[0].Data, inv); - sse_mul_ps(&m1.Data[0].Data, inv, result); - - return fmat4x4SIMD(result); -} - - -////////////////////////////////////////////////////////////// -// Unary constant operators -GLM_FUNC_QUALIFIER fmat4x4SIMD const operator- -( - fmat4x4SIMD const & m -) -{ - return detail::fmat4x4SIMD - ( - -m[0], - -m[1], - -m[2], - -m[3] - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD const operator-- -( - fmat4x4SIMD const & m, - int -) -{ - return detail::fmat4x4SIMD - ( - m[0] - 1.0f, - m[1] - 1.0f, - m[2] - 1.0f, - m[3] - 1.0f - ); -} - -GLM_FUNC_QUALIFIER fmat4x4SIMD const operator++ -( - fmat4x4SIMD const & m, - int -) -{ - return detail::fmat4x4SIMD - ( - m[0] + 1.0f, - m[1] + 1.0f, - m[2] + 1.0f, - m[3] + 1.0f - ); -} - -}//namespace detail - -GLM_FUNC_QUALIFIER mat4 mat4_cast -( - detail::fmat4x4SIMD const & x -) -{ - GLM_ALIGN(16) mat4 Result; - _mm_store_ps(&Result[0][0], x.Data[0].Data); - _mm_store_ps(&Result[1][0], x.Data[1].Data); - _mm_store_ps(&Result[2][0], x.Data[2].Data); - _mm_store_ps(&Result[3][0], x.Data[3].Data); - return Result; -} - -GLM_FUNC_QUALIFIER detail::fmat4x4SIMD matrixCompMult -( - detail::fmat4x4SIMD const & x, - detail::fmat4x4SIMD const & y -) -{ - detail::fmat4x4SIMD result; - result[0] = x[0] * y[0]; - result[1] = x[1] * y[1]; - result[2] = x[2] * y[2]; - result[3] = x[3] * y[3]; - return result; -} - -GLM_FUNC_QUALIFIER detail::fmat4x4SIMD outerProduct -( - detail::fvec4SIMD const & c, - detail::fvec4SIMD const & r -) -{ - __m128 Shu0 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(0, 0, 0, 0)); - __m128 Shu1 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(1, 1, 1, 1)); - __m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3)); - - detail::fmat4x4SIMD result(uninitialize); - result[0].Data = _mm_mul_ps(c.Data, Shu0); - result[1].Data = _mm_mul_ps(c.Data, Shu1); - result[2].Data = _mm_mul_ps(c.Data, Shu2); - result[3].Data = _mm_mul_ps(c.Data, Shu3); - return result; -} - -GLM_FUNC_QUALIFIER detail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const & m) -{ - detail::fmat4x4SIMD result; - glm_mat4_transpose(&m[0].Data, &result[0].Data); - return result; -} - -GLM_FUNC_QUALIFIER float determinant(detail::fmat4x4SIMD const & m) -{ - float Result; - _mm_store_ss(&Result, glm_mat4_determinant(&m[0].Data)); - return Result; -} - -}//namespace glm diff --git a/external/include/glm/gtx/simd_quat.hpp b/external/include/glm/gtx/simd_quat.hpp deleted file mode 100644 index b134019..0000000 --- a/external/include/glm/gtx/simd_quat.hpp +++ /dev/null @@ -1,307 +0,0 @@ -/// @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) diff --git a/external/include/glm/gtx/simd_quat.inl b/external/include/glm/gtx/simd_quat.inl deleted file mode 100644 index b84865c..0000000 --- a/external/include/glm/gtx/simd_quat.inl +++ /dev/null @@ -1,620 +0,0 @@ -/// @ref gtx_simd_quat -/// @file glm/gtx/simd_quat.inl - -namespace glm{ -namespace detail{ - - -////////////////////////////////////// -// Debugging -#if 0 -void print(__m128 v) -{ - GLM_ALIGN(16) float result[4]; - _mm_store_ps(result, v); - - printf("__m128: %f %f %f %f\n", result[0], result[1], result[2], result[3]); -} - -void print(const fvec4SIMD &v) -{ - printf("fvec4SIMD: %f %f %f %f\n", v.x, v.y, v.z, v.w); -} -#endif - -////////////////////////////////////// -// Implicit basic constructors - -# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD() -# ifdef GLM_FORCE_NO_CTOR_INIT - : Data(_mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f)) -# endif - {} -# endif - -# if !GLM_HAS_DEFAULTED_FUNCTIONS - GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(fquatSIMD const & q) : - Data(q.Data) - {} -# endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(__m128 const & Data) : - Data(Data) -{} - -////////////////////////////////////// -// Explicit basic constructors - -GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(float const & w, float const & x, float const & y, float const & z) : - Data(_mm_set_ps(w, z, y, x)) -{} - -GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(quat const & q) : - Data(_mm_set_ps(q.w, q.z, q.y, q.x)) -{} - -GLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(vec3 const & eulerAngles) -{ - vec3 c = glm::cos(eulerAngles * 0.5f); - vec3 s = glm::sin(eulerAngles * 0.5f); - - Data = _mm_set_ps( - (c.x * c.y * c.z) + (s.x * s.y * s.z), - (c.x * c.y * s.z) - (s.x * s.y * c.z), - (c.x * s.y * c.z) + (s.x * c.y * s.z), - (s.x * c.y * c.z) - (c.x * s.y * s.z)); -} - - -////////////////////////////////////// -// Unary arithmetic operators - -#if !GLM_HAS_DEFAULTED_FUNCTIONS - GLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator=(fquatSIMD const & q) - { - this->Data = q.Data; - return *this; - } -#endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator*=(float const & s) -{ - this->Data = _mm_mul_ps(this->Data, _mm_set_ps1(s)); - return *this; -} - -GLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator/=(float const & s) -{ - this->Data = _mm_div_ps(Data, _mm_set1_ps(s)); - return *this; -} - - - -// negate operator -GLM_FUNC_QUALIFIER fquatSIMD operator- (fquatSIMD const & q) -{ - return fquatSIMD(_mm_mul_ps(q.Data, _mm_set_ps(-1.0f, -1.0f, -1.0f, -1.0f))); -} - -// operator+ -GLM_FUNC_QUALIFIER fquatSIMD operator+ (fquatSIMD const & q1, fquatSIMD const & q2) -{ - return fquatSIMD(_mm_add_ps(q1.Data, q2.Data)); -} - -//operator* -GLM_FUNC_QUALIFIER fquatSIMD operator* (fquatSIMD const & q1, fquatSIMD const & q2) -{ - // SSE2 STATS: - // 11 shuffle - // 8 mul - // 8 add - - // SSE4 STATS: - // 3 shuffle - // 4 mul - // 4 dpps - - __m128 mul0 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(0, 1, 2, 3))); - __m128 mul1 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(1, 0, 3, 2))); - __m128 mul2 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(2, 3, 0, 1))); - __m128 mul3 = _mm_mul_ps(q1.Data, q2.Data); - -# if(GLM_ARCH & GLM_ARCH_SSE41_BIT) - __m128 add0 = _mm_dp_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f), 0xff); - __m128 add1 = _mm_dp_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f), 0xff); - __m128 add2 = _mm_dp_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f), 0xff); - __m128 add3 = _mm_dp_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f), 0xff); -# else - mul0 = _mm_mul_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f)); - __m128 add0 = _mm_add_ps(mul0, _mm_movehl_ps(mul0, mul0)); - add0 = _mm_add_ss(add0, _mm_shuffle_ps(add0, add0, 1)); - - mul1 = _mm_mul_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f)); - __m128 add1 = _mm_add_ps(mul1, _mm_movehl_ps(mul1, mul1)); - add1 = _mm_add_ss(add1, _mm_shuffle_ps(add1, add1, 1)); - - mul2 = _mm_mul_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f)); - __m128 add2 = _mm_add_ps(mul2, _mm_movehl_ps(mul2, mul2)); - add2 = _mm_add_ss(add2, _mm_shuffle_ps(add2, add2, 1)); - - mul3 = _mm_mul_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f)); - __m128 add3 = _mm_add_ps(mul3, _mm_movehl_ps(mul3, mul3)); - add3 = _mm_add_ss(add3, _mm_shuffle_ps(add3, add3, 1)); -#endif - - - // This SIMD code is a politically correct way of doing this, but in every test I've tried it has been slower than - // the final code below. I'll keep this here for reference - maybe somebody else can do something better... - // - //__m128 xxyy = _mm_shuffle_ps(add0, add1, _MM_SHUFFLE(0, 0, 0, 0)); - //__m128 zzww = _mm_shuffle_ps(add2, add3, _MM_SHUFFLE(0, 0, 0, 0)); - // - //return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0)); - - float x; - float y; - float z; - float w; - - _mm_store_ss(&x, add0); - _mm_store_ss(&y, add1); - _mm_store_ss(&z, add2); - _mm_store_ss(&w, add3); - - return detail::fquatSIMD(w, x, y, z); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* (fquatSIMD const & q, fvec4SIMD const & v) -{ - static const __m128 two = _mm_set1_ps(2.0f); - - __m128 q_wwww = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 q_swp0 = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 0, 2, 1)); - __m128 q_swp1 = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 1, 0, 2)); - __m128 v_swp0 = _mm_shuffle_ps(v.Data, v.Data, _MM_SHUFFLE(3, 0, 2, 1)); - __m128 v_swp1 = _mm_shuffle_ps(v.Data, v.Data, _MM_SHUFFLE(3, 1, 0, 2)); - - __m128 uv = _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0)); - __m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1)); - __m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2)); - __m128 uuv = _mm_sub_ps(_mm_mul_ps(q_swp0, uv_swp1), _mm_mul_ps(q_swp1, uv_swp0)); - - - uv = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two)); - uuv = _mm_mul_ps(uuv, two); - - return _mm_add_ps(v.Data, _mm_add_ps(uv, uuv)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* (fvec4SIMD const & v, fquatSIMD const & q) -{ - return glm::inverse(q) * v; -} - -GLM_FUNC_QUALIFIER fquatSIMD operator* (fquatSIMD const & q, float s) -{ - return fquatSIMD(_mm_mul_ps(q.Data, _mm_set1_ps(s))); -} - -GLM_FUNC_QUALIFIER fquatSIMD operator* (float s, fquatSIMD const & q) -{ - return fquatSIMD(_mm_mul_ps(_mm_set1_ps(s), q.Data)); -} - - -//operator/ -GLM_FUNC_QUALIFIER fquatSIMD operator/ (fquatSIMD const & q, float s) -{ - return fquatSIMD(_mm_div_ps(q.Data, _mm_set1_ps(s))); -} - - -}//namespace detail - - -GLM_FUNC_QUALIFIER quat quat_cast -( - detail::fquatSIMD const & x -) -{ - GLM_ALIGN(16) quat Result; - _mm_store_ps(&Result[0], x.Data); - - return Result; -} - -template <typename T> -GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast_impl(const T m0[], const T m1[], const T m2[]) -{ - T trace = m0[0] + m1[1] + m2[2] + T(1.0); - if (trace > T(0)) - { - T s = static_cast<T>(0.5) / sqrt(trace); - - return _mm_set_ps( - static_cast<float>(T(0.25) / s), - static_cast<float>((m0[1] - m1[0]) * s), - static_cast<float>((m2[0] - m0[2]) * s), - static_cast<float>((m1[2] - m2[1]) * s)); - } - else - { - if (m0[0] > m1[1]) - { - if (m0[0] > m2[2]) - { - // X is biggest. - T s = sqrt(m0[0] - m1[1] - m2[2] + T(1.0)) * T(0.5); - - return _mm_set_ps( - static_cast<float>((m1[2] - m2[1]) * s), - static_cast<float>((m2[0] + m0[2]) * s), - static_cast<float>((m0[1] + m1[0]) * s), - static_cast<float>(T(0.5) * s)); - } - } - else - { - if (m1[1] > m2[2]) - { - // Y is biggest. - T s = sqrt(m1[1] - m0[0] - m2[2] + T(1.0)) * T(0.5); - - return _mm_set_ps( - static_cast<float>((m2[0] - m0[2]) * s), - static_cast<float>((m1[2] + m2[1]) * s), - static_cast<float>(T(0.5) * s), - static_cast<float>((m0[1] + m1[0]) * s)); - } - } - - // Z is biggest. - T s = sqrt(m2[2] - m0[0] - m1[1] + T(1.0)) * T(0.5); - - return _mm_set_ps( - static_cast<float>((m0[1] - m1[0]) * s), - static_cast<float>(T(0.5) * s), - static_cast<float>((m1[2] + m2[1]) * s), - static_cast<float>((m2[0] + m0[2]) * s)); - } -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast -( - detail::fmat4x4SIMD const & m -) -{ - // Scalar implementation for now. - GLM_ALIGN(16) float m0[4]; - GLM_ALIGN(16) float m1[4]; - GLM_ALIGN(16) float m2[4]; - - _mm_store_ps(m0, m[0].Data); - _mm_store_ps(m1, m[1].Data); - _mm_store_ps(m2, m[2].Data); - - return quatSIMD_cast_impl(m0, m1, m2); -} - -template <typename T, precision P> -GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast -( - tmat4x4<T, P> const & m -) -{ - return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]); -} - -template <typename T, precision P> -GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast -( - tmat3x3<T, P> const & m -) -{ - return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]); -} - - -GLM_FUNC_QUALIFIER detail::fmat4x4SIMD mat4SIMD_cast -( - detail::fquatSIMD const & q -) -{ - detail::fmat4x4SIMD result; - - __m128 _wwww = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 _xyzw = q.Data; - __m128 _zxyw = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 1, 0, 2)); - __m128 _yzxw = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 0, 2, 1)); - - __m128 _xyzw2 = _mm_add_ps(_xyzw, _xyzw); - __m128 _zxyw2 = _mm_shuffle_ps(_xyzw2, _xyzw2, _MM_SHUFFLE(3, 1, 0, 2)); - __m128 _yzxw2 = _mm_shuffle_ps(_xyzw2, _xyzw2, _MM_SHUFFLE(3, 0, 2, 1)); - - __m128 _tmp0 = _mm_sub_ps(_mm_set1_ps(1.0f), _mm_mul_ps(_yzxw2, _yzxw)); - _tmp0 = _mm_sub_ps(_tmp0, _mm_mul_ps(_zxyw2, _zxyw)); - - __m128 _tmp1 = _mm_mul_ps(_yzxw2, _xyzw); - _tmp1 = _mm_add_ps(_tmp1, _mm_mul_ps(_zxyw2, _wwww)); - - __m128 _tmp2 = _mm_mul_ps(_zxyw2, _xyzw); - _tmp2 = _mm_sub_ps(_tmp2, _mm_mul_ps(_yzxw2, _wwww)); - - - // There's probably a better, more politically correct way of doing this... - result[0].Data = _mm_set_ps( - 0.0f, - reinterpret_cast<float*>(&_tmp2)[0], - reinterpret_cast<float*>(&_tmp1)[0], - reinterpret_cast<float*>(&_tmp0)[0]); - - result[1].Data = _mm_set_ps( - 0.0f, - reinterpret_cast<float*>(&_tmp1)[1], - reinterpret_cast<float*>(&_tmp0)[1], - reinterpret_cast<float*>(&_tmp2)[1]); - - result[2].Data = _mm_set_ps( - 0.0f, - reinterpret_cast<float*>(&_tmp0)[2], - reinterpret_cast<float*>(&_tmp2)[2], - reinterpret_cast<float*>(&_tmp1)[2]); - - result[3].Data = _mm_set_ps( - 1.0f, - 0.0f, - 0.0f, - 0.0f); - - - return result; -} - -GLM_FUNC_QUALIFIER mat4 mat4_cast -( - detail::fquatSIMD const & q -) -{ - return mat4_cast(mat4SIMD_cast(q)); -} - - - -GLM_FUNC_QUALIFIER float length -( - detail::fquatSIMD const & q -) -{ - return glm::sqrt(dot(q, q)); -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD normalize -( - detail::fquatSIMD const & q -) -{ - return _mm_mul_ps(q.Data, _mm_set1_ps(1.0f / length(q))); -} - -GLM_FUNC_QUALIFIER float dot -( - detail::fquatSIMD const & q1, - detail::fquatSIMD const & q2 -) -{ - float result; - _mm_store_ss(&result, detail::sse_dot_ps(q1.Data, q2.Data)); - - return result; -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD mix -( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, - float const & a -) -{ - float cosTheta = dot(x, y); - - if (cosTheta > 1.0f - glm::epsilon<float>()) - { - return _mm_add_ps(x.Data, _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data))); - } - else - { - float angle = glm::acos(cosTheta); - - - float s0 = glm::sin((1.0f - a) * angle); - float s1 = glm::sin(a * angle); - float d = 1.0f / glm::sin(angle); - - return (s0 * x + s1 * y) * d; - } -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD lerp -( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, - float const & a -) -{ - // Lerp is only defined in [0, 1] - assert(a >= 0.0f); - assert(a <= 1.0f); - - return _mm_add_ps(x.Data, _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data))); -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD slerp -( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, - float const & a -) -{ - detail::fquatSIMD z = y; - - float cosTheta = dot(x, y); - - // If cosTheta < 0, the interpolation will take the long way around the sphere. - // To fix this, one quat must be negated. - if (cosTheta < 0.0f) - { - z = -y; - cosTheta = -cosTheta; - } - - // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator - if(cosTheta > 1.0f - epsilon<float>()) - { - return _mm_add_ps(x.Data, _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data))); - } - else - { - float angle = glm::acos(cosTheta); - - - float s0 = glm::sin((1.0f - a) * angle); - float s1 = glm::sin(a * angle); - float d = 1.0f / glm::sin(angle); - - return (s0 * x + s1 * y) * d; - } -} - - -GLM_FUNC_QUALIFIER detail::fquatSIMD fastMix -( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, - float const & a -) -{ - float cosTheta = dot(x, y); - - if (cosTheta > 1.0f - glm::epsilon<float>()) - { - return _mm_add_ps(x.Data, _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data))); - } - else - { - float angle = glm::fastAcos(cosTheta); - - - __m128 s = glm::fastSin(_mm_set_ps((1.0f - a) * angle, a * angle, angle, 0.0f)); - - __m128 s0 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 s1 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 d = _mm_div_ps(_mm_set1_ps(1.0f), _mm_shuffle_ps(s, s, _MM_SHUFFLE(1, 1, 1, 1))); - - return _mm_mul_ps(_mm_add_ps(_mm_mul_ps(s0, x.Data), _mm_mul_ps(s1, y.Data)), d); - } -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD fastSlerp -( - detail::fquatSIMD const & x, - detail::fquatSIMD const & y, - float const & a -) -{ - detail::fquatSIMD z = y; - - float cosTheta = dot(x, y); - if (cosTheta < 0.0f) - { - z = -y; - cosTheta = -cosTheta; - } - - - if(cosTheta > 1.0f - epsilon<float>()) - { - return _mm_add_ps(x.Data, _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data))); - } - else - { - float angle = glm::fastAcos(cosTheta); - - - __m128 s = glm::fastSin(_mm_set_ps((1.0f - a) * angle, a * angle, angle, 0.0f)); - - __m128 s0 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 s1 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 d = _mm_div_ps(_mm_set1_ps(1.0f), _mm_shuffle_ps(s, s, _MM_SHUFFLE(1, 1, 1, 1))); - - return _mm_mul_ps(_mm_add_ps(_mm_mul_ps(s0, x.Data), _mm_mul_ps(s1, y.Data)), d); - } -} - - - -GLM_FUNC_QUALIFIER detail::fquatSIMD conjugate -( - detail::fquatSIMD const & q -) -{ - return detail::fquatSIMD(_mm_mul_ps(q.Data, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f))); -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD inverse -( - detail::fquatSIMD const & q -) -{ - return conjugate(q) / dot(q, q); -} - - -GLM_FUNC_QUALIFIER detail::fquatSIMD angleAxisSIMD -( - float const & angle, - vec3 const & v -) -{ - float s = glm::sin(angle * 0.5f); - - return _mm_set_ps( - glm::cos(angle * 0.5f), - v.z * s, - v.y * s, - v.x * s); -} - -GLM_FUNC_QUALIFIER detail::fquatSIMD angleAxisSIMD -( - float const & angle, - float const & x, - float const & y, - float const & z -) -{ - return angleAxisSIMD(angle, vec3(x, y, z)); -} - - -GLM_FUNC_QUALIFIER __m128 fastSin(__m128 x) -{ - static const __m128 c0 = _mm_set1_ps(0.16666666666666666666666666666667f); - static const __m128 c1 = _mm_set1_ps(0.00833333333333333333333333333333f); - static const __m128 c2 = _mm_set1_ps(0.00019841269841269841269841269841f); - - __m128 x3 = _mm_mul_ps(x, _mm_mul_ps(x, x)); - __m128 x5 = _mm_mul_ps(x3, _mm_mul_ps(x, x)); - __m128 x7 = _mm_mul_ps(x5, _mm_mul_ps(x, x)); - - __m128 y0 = _mm_mul_ps(x3, c0); - __m128 y1 = _mm_mul_ps(x5, c1); - __m128 y2 = _mm_mul_ps(x7, c2); - - return _mm_sub_ps(_mm_add_ps(_mm_sub_ps(x, y0), y1), y2); -} - - -}//namespace glm diff --git a/external/include/glm/gtx/simd_vec4.hpp b/external/include/glm/gtx/simd_vec4.hpp deleted file mode 100644 index cde540b..0000000 --- a/external/include/glm/gtx/simd_vec4.hpp +++ /dev/null @@ -1,546 +0,0 @@ -/// @ref gtx_simd_vec4 -/// @file glm/gtx/simd_vec4.hpp -/// -/// @see core (dependence) -/// -/// @defgroup gtx_simd_vec4 GLM_GTX_simd_vec4 -/// @ingroup gtx -/// -/// @brief SIMD implementation of vec4 type. -/// -/// <glm/gtx/simd_vec4.hpp> need to be included to use these functionalities. - -#pragma once - -// Dependency: -#include "../glm.hpp" - -#if(GLM_ARCH != GLM_ARCH_PURE) - -#if(GLM_ARCH & GLM_ARCH_SSE2_BIT) -# include "../detail/intrinsic_common.hpp" -# include "../detail/intrinsic_geometric.hpp" -# include "../detail/intrinsic_integer.hpp" -#else -# error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics" -#endif - -#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) -# pragma message("GLM: GLM_GTX_simd_vec4 extension included") -# pragma message("GLM: GLM_GTX_simd_vec4 extension is deprecated and will be removed in GLM 0.9.9. Use *vec4 types 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 -{ - enum comp - { - X = 0, - R = 0, - S = 0, - Y = 1, - G = 1, - T = 1, - Z = 2, - B = 2, - P = 2, - W = 3, - A = 3, - Q = 3 - }; - -}//namespace glm - -namespace glm{ -namespace detail -{ - /// 4-dimensional vector implemented using SIMD SEE intrinsics. - /// \ingroup gtx_simd_vec4 - GLM_ALIGNED_STRUCT(16) fvec4SIMD - { - typedef float value_type; - typedef std::size_t size_type; - - typedef fvec4SIMD type; - typedef tvec4<float, defaultp> pure_type; - typedef tvec4<bool, highp> bool_type; - -#ifdef GLM_SIMD_ENABLE_XYZW_UNION - union - { - __m128 Data; - struct {float x, y, z, w;}; - }; -#else - __m128 Data; -#endif - - ////////////////////////////////////// - // Implicit basic constructors - - fvec4SIMD() GLM_DEFAULT_CTOR; - fvec4SIMD(fvec4SIMD const & v) GLM_DEFAULT; - fvec4SIMD(__m128 const & Data); - - ////////////////////////////////////// - // Explicit basic constructors - - explicit fvec4SIMD( - ctor); - explicit fvec4SIMD( - float const & s); - explicit fvec4SIMD( - float const & x, - float const & y, - float const & z, - float const & w); - explicit fvec4SIMD( - vec4 const & v); - - //////////////////////////////////////// - //// Conversion vector constructors - - fvec4SIMD(vec2 const & v, float const & s1, float const & s2); - fvec4SIMD(float const & s1, vec2 const & v, float const & s2); - fvec4SIMD(float const & s1, float const & s2, vec2 const & v); - fvec4SIMD(vec3 const & v, float const & s); - fvec4SIMD(float const & s, vec3 const & v); - fvec4SIMD(vec2 const & v1, vec2 const & v2); - //fvec4SIMD(ivec4SIMD const & v); - - ////////////////////////////////////// - // Unary arithmetic operators - - fvec4SIMD& operator= (fvec4SIMD const & v) GLM_DEFAULT; - fvec4SIMD& operator+=(fvec4SIMD const & v); - fvec4SIMD& operator-=(fvec4SIMD const & v); - fvec4SIMD& operator*=(fvec4SIMD const & v); - fvec4SIMD& operator/=(fvec4SIMD const & v); - - fvec4SIMD& operator+=(float const & s); - fvec4SIMD& operator-=(float const & s); - fvec4SIMD& operator*=(float const & s); - fvec4SIMD& operator/=(float const & s); - - fvec4SIMD& operator++(); - fvec4SIMD& operator--(); - - ////////////////////////////////////// - // Swizzle operators - - template <comp X_, comp Y_, comp Z_, comp W_> - fvec4SIMD& swizzle(); - template <comp X_, comp Y_, comp Z_, comp W_> - fvec4SIMD swizzle() const; - template <comp X_, comp Y_, comp Z_> - fvec4SIMD swizzle() const; - template <comp X_, comp Y_> - fvec4SIMD swizzle() const; - template <comp X_> - fvec4SIMD swizzle() const; - }; -}//namespace detail - - typedef glm::detail::fvec4SIMD simdVec4; - - /// @addtogroup gtx_simd_vec4 - /// @{ - - //! Convert a simdVec4 to a vec4. - /// @see gtx_simd_vec4 - vec4 vec4_cast( - detail::fvec4SIMD const & x); - - //! Returns x if x >= 0; otherwise, it returns -x. - /// @see gtx_simd_vec4 - detail::fvec4SIMD abs(detail::fvec4SIMD const & x); - - //! Returns 1.0 if x > 0, 0.0 if x = 0, or -1.0 if x < 0. - /// @see gtx_simd_vec4 - detail::fvec4SIMD sign(detail::fvec4SIMD const & x); - - //! Returns a value equal to the nearest integer that is less then or equal to x. - /// @see gtx_simd_vec4 - detail::fvec4SIMD floor(detail::fvec4SIMD const & x); - - //! Returns a value equal to the nearest integer to x - //! whose absolute value is not larger than the absolute value of x. - /// @see gtx_simd_vec4 - detail::fvec4SIMD trunc(detail::fvec4SIMD const & x); - - //! Returns a value equal to the nearest integer to x. - //! The fraction 0.5 will round in a direction chosen by the - //! implementation, presumably the direction that is fastest. - //! This includes the possibility that round(x) returns the - //! same value as roundEven(x) for all values of x. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD round(detail::fvec4SIMD const & x); - - //! Returns a value equal to the nearest integer to x. - //! A fractional part of 0.5 will round toward the nearest even - //! integer. (Both 3.5 and 4.5 for x will return 4.0.) - /// - /// @see gtx_simd_vec4 - //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x); - - //! Returns a value equal to the nearest integer - //! that is greater than or equal to x. - /// @see gtx_simd_vec4 - detail::fvec4SIMD ceil(detail::fvec4SIMD const & x); - - //! Return x - floor(x). - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fract(detail::fvec4SIMD const & x); - - //! Modulus. Returns x - y * floor(x / y) - //! for each component in x using the floating point value y. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD mod( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - //! Modulus. Returns x - y * floor(x / y) - //! for each component in x using the floating point value y. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD mod( - detail::fvec4SIMD const & x, - float const & y); - - //! Returns the fractional part of x and sets i to the integer - //! part (as a whole number floating point value). Both the - //! return value and the output parameter will have the same - //! sign as x. - //! (From GLM_GTX_simd_vec4 extension, common function) - //detail::fvec4SIMD modf( - // detail::fvec4SIMD const & x, - // detail::fvec4SIMD & i); - - //! Returns y if y < x; otherwise, it returns x. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD min( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - detail::fvec4SIMD min( - detail::fvec4SIMD const & x, - float const & y); - - //! Returns y if x < y; otherwise, it returns x. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD max( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - detail::fvec4SIMD max( - detail::fvec4SIMD const & x, - float const & y); - - //! Returns min(max(x, minVal), maxVal) for each component in x - //! using the floating-point values minVal and maxVal. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD clamp( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & minVal, - detail::fvec4SIMD const & maxVal); - - detail::fvec4SIMD clamp( - detail::fvec4SIMD const & x, - float const & minVal, - float const & maxVal); - - //! \return If genTypeU is a floating scalar or vector: - //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of - //! x and y using the floating-point value a. - //! The value for a is not restricted to the range [0, 1]. - //! - //! \return If genTypeU is a boolean scalar or vector: - //! Selects which vector each returned component comes - //! from. For a component of a that is false, the - //! corresponding component of x is returned. For a - //! component of a that is true, the corresponding - //! component of y is returned. Components of x and y that - //! are not selected are allowed to be invalid floating point - //! values and will have no effect on the results. Thus, this - //! provides different functionality than - //! genType mix(genType x, genType y, genType(a)) - //! where a is a Boolean vector. - //! - //! From GLSL 1.30.08 specification, section 8.3 - //! - //! \param[in] x Floating point scalar or vector. - //! \param[in] y Floating point scalar or vector. - //! \param[in] a Floating point or boolean scalar or vector. - //! - /// \todo Test when 'a' is a boolean. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD mix( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y, - detail::fvec4SIMD const & a); - - //! Returns 0.0 if x < edge, otherwise it returns 1.0. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD step( - detail::fvec4SIMD const & edge, - detail::fvec4SIMD const & x); - - detail::fvec4SIMD step( - float const & edge, - detail::fvec4SIMD const & x); - - //! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and - //! performs smooth Hermite interpolation between 0 and 1 - //! when edge0 < x < edge1. This is useful in cases where - //! you would want a threshold function with a smooth - //! transition. This is equivalent to: - //! genType t; - //! t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); - //! return t * t * (3 - 2 * t); - //! Results are undefined if edge0 >= edge1. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD smoothstep( - detail::fvec4SIMD const & edge0, - detail::fvec4SIMD const & edge1, - detail::fvec4SIMD const & x); - - detail::fvec4SIMD smoothstep( - float const & edge0, - float const & edge1, - detail::fvec4SIMD const & x); - - //! 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. - /// - /// @see gtx_simd_vec4 - //bvec4 isnan(detail::fvec4SIMD 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. - /// - /// @see gtx_simd_vec4 - //bvec4 isinf(detail::fvec4SIMD const & x); - - //! Returns a signed or unsigned integer value representing - //! the encoding of a floating-point value. The floatingpoint - //! value's bit-level representation is preserved. - /// - /// @see gtx_simd_vec4 - //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value); - - //! Returns a floating-point value corresponding to a signed - //! or unsigned integer encoding of a floating-point value. - //! If an inf or NaN is passed in, it will not signal, and the - //! resulting floating point value is unspecified. Otherwise, - //! the bit-level representation is preserved. - /// - /// @see gtx_simd_vec4 - //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value); - - //! Computes and returns a * b + c. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fma( - detail::fvec4SIMD const & a, - detail::fvec4SIMD const & b, - detail::fvec4SIMD const & c); - - //! Splits x into a floating-point significand in the range - //! [0.5, 1.0) and an integral exponent of two, such that: - //! x = significand * exp(2, exponent) - //! The significand is returned by the function and the - //! exponent is returned in the parameter exp. For a - //! floating-point value of zero, the significant and exponent - //! are both zero. For a floating-point value that is an - //! infinity or is not a number, the results are undefined. - /// - /// @see gtx_simd_vec4 - //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp); - - //! Builds a floating-point number from x and the - //! corresponding integral exponent of two in exp, returning: - //! significand * exp(2, exponent) - //! If this product is too large to be represented in the - //! floating-point type, the result is undefined. - /// - /// @see gtx_simd_vec4 - //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp); - - //! Returns the length of x, i.e., sqrt(x * x). - /// - /// @see gtx_simd_vec4 - float length( - detail::fvec4SIMD const & x); - - //! Returns the length of x, i.e., sqrt(x * x). - //! Less accurate but much faster than simdLength. - /// - /// @see gtx_simd_vec4 - float fastLength( - detail::fvec4SIMD const & x); - - //! Returns the length of x, i.e., sqrt(x * x). - //! Slightly more accurate but much slower than simdLength. - /// - /// @see gtx_simd_vec4 - float niceLength( - detail::fvec4SIMD const & x); - - //! Returns the length of x, i.e., sqrt(x * x). - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD length4( - detail::fvec4SIMD const & x); - - //! Returns the length of x, i.e., sqrt(x * x). - //! Less accurate but much faster than simdLength4. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fastLength4( - detail::fvec4SIMD const & x); - - //! Returns the length of x, i.e., sqrt(x * x). - //! Slightly more accurate but much slower than simdLength4. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD niceLength4( - detail::fvec4SIMD const & x); - - //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). - /// - /// @see gtx_simd_vec4 - float distance( - detail::fvec4SIMD const & p0, - detail::fvec4SIMD const & p1); - - //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD distance4( - detail::fvec4SIMD const & p0, - detail::fvec4SIMD const & p1); - - //! Returns the dot product of x and y, i.e., result = x * y. - /// - /// @see gtx_simd_vec4 - float simdDot( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - //! Returns the dot product of x and y, i.e., result = x * y. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD dot4( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - //! Returns the cross product of x and y. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD cross( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y); - - //! Returns a vector in the same direction as x but with length of 1. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD normalize( - detail::fvec4SIMD const & x); - - //! Returns a vector in the same direction as x but with length of 1. - //! Less accurate but much faster than simdNormalize. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fastNormalize( - detail::fvec4SIMD const & x); - - //! If dot(Nref, I) < 0.0, return N, otherwise, return -N. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD simdFaceforward( - detail::fvec4SIMD const & N, - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & Nref); - - //! For the incident vector I and surface orientation N, - //! returns the reflection direction : result = I - 2.0 * dot(N, I) * N. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD reflect( - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & N); - - //! For the incident vector I and surface normal N, - //! and the ratio of indices of refraction eta, - //! return the refraction vector. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD refract( - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & N, - float const & eta); - - //! Returns the positive square root of x. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD sqrt( - detail::fvec4SIMD const & x); - - //! Returns the positive square root of x with the nicest quality but very slow. - //! Slightly more accurate but much slower than simdSqrt. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD niceSqrt( - detail::fvec4SIMD const & x); - - //! Returns the positive square root of x - //! Less accurate but much faster than sqrt. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fastSqrt( - detail::fvec4SIMD const & x); - - //! Returns the reciprocal of the positive square root of x. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD inversesqrt( - detail::fvec4SIMD const & x); - - //! Returns the reciprocal of the positive square root of x. - //! Faster than inversesqrt but less accurate. - /// - /// @see gtx_simd_vec4 - detail::fvec4SIMD fastInversesqrt( - detail::fvec4SIMD const & x); - - /// @} -}//namespace glm - -#include "simd_vec4.inl" - -#if (GLM_COMPILER & GLM_COMPILER_VC) -# pragma warning(pop) -#endif - -#endif//(GLM_ARCH != GLM_ARCH_PURE) diff --git a/external/include/glm/gtx/simd_vec4.inl b/external/include/glm/gtx/simd_vec4.inl deleted file mode 100644 index efc87c6..0000000 --- a/external/include/glm/gtx/simd_vec4.inl +++ /dev/null @@ -1,721 +0,0 @@ -/// @ref gtx_simd_vec4 -/// @file glm/gtx/simd_vec4.inl - -namespace glm{ -namespace detail{ - -////////////////////////////////////// -// Implicit basic constructors - -#if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT) - GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD() -# ifdef GLM_FORCE_NO_CTOR_INIT - : Data(_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f)) -# endif - {} -#endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -#if !GLM_HAS_DEFAULTED_FUNCTIONS - GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(fvec4SIMD const & v) : - Data(v.Data) - {} -#endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(__m128 const & Data) : - Data(Data) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec4 const & v) : - Data(_mm_set_ps(v.w, v.z, v.y, v.x)) -{} - -////////////////////////////////////// -// Explicit basic constructors - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s) : - Data(_mm_set1_ps(s)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & x, float const & y, float const & z, float const & w) : -// Data(_mm_setr_ps(x, y, z, w)) - Data(_mm_set_ps(w, z, y, x)) -{} -/* -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const v[4]) : - Data(_mm_load_ps(v)) -{} -*/ -////////////////////////////////////// -// Swizzle constructors - -//fvec4SIMD(ref4<float> const & r); - -////////////////////////////////////// -// Conversion vector constructors - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const & v, float const & s1, float const & s2) : - Data(_mm_set_ps(s2, s1, v.y, v.x)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s1, vec2 const & v, float const & s2) : - Data(_mm_set_ps(s2, v.y, v.x, s1)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s1, float const & s2, vec2 const & v) : - Data(_mm_set_ps(v.y, v.x, s2, s1)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec3 const & v, float const & s) : - Data(_mm_set_ps(s, v.z, v.y, v.x)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s, vec3 const & v) : - Data(_mm_set_ps(v.z, v.y, v.x, s)) -{} - -GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const & v1, vec2 const & v2) : - Data(_mm_set_ps(v2.y, v2.x, v1.y, v1.x)) -{} - -//GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(ivec4SIMD const & v) : -// Data(_mm_cvtepi32_ps(v.Data)) -//{} - -////////////////////////////////////// -// Unary arithmetic operators - -#if !GLM_HAS_DEFAULTED_FUNCTIONS - GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator=(fvec4SIMD const & v) - { - this->Data = v.Data; - return *this; - } -#endif//!GLM_HAS_DEFAULTED_FUNCTIONS - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(float const & s) -{ - this->Data = _mm_add_ps(Data, _mm_set_ps1(s)); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(fvec4SIMD const & v) -{ - this->Data = _mm_add_ps(this->Data , v.Data); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(float const & s) -{ - this->Data = _mm_sub_ps(Data, _mm_set_ps1(s)); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(fvec4SIMD const & v) -{ - this->Data = _mm_sub_ps(this->Data , v.Data); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(float const & s) -{ - this->Data = _mm_mul_ps(this->Data, _mm_set_ps1(s)); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(fvec4SIMD const & v) -{ - this->Data = _mm_mul_ps(this->Data , v.Data); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(float const & s) -{ - this->Data = _mm_div_ps(Data, _mm_set1_ps(s)); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(fvec4SIMD const & v) -{ - this->Data = _mm_div_ps(this->Data , v.Data); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator++() -{ - this->Data = _mm_add_ps(this->Data , glm::detail::one); - return *this; -} - -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator--() -{ - this->Data = _mm_sub_ps(this->Data, glm::detail::one); - return *this; -} - -////////////////////////////////////// -// Swizzle operators - -template <comp X_, comp Y_, comp Z_, comp W_> -GLM_FUNC_QUALIFIER fvec4SIMD fvec4SIMD::swizzle() const -{ - __m128 Data = _mm_shuffle_ps( - this->Data, this->Data, - shuffle_mask<(W_ << 6) | (Z_ << 4) | (Y_ << 2) | (X_ << 0)>::value); - return fvec4SIMD(Data); -} - -template <comp X_, comp Y_, comp Z_, comp W_> -GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::swizzle() -{ - this->Data = _mm_shuffle_ps( - this->Data, this->Data, - shuffle_mask<(W_ << 6) | (Z_ << 4) | (Y_ << 2) | (X_ << 0)>::value); - return *this; -} - -// operator+ -GLM_FUNC_QUALIFIER fvec4SIMD operator+ (fvec4SIMD const & v, float s) -{ - return fvec4SIMD(_mm_add_ps(v.Data, _mm_set1_ps(s))); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator+ (float s, fvec4SIMD const & v) -{ - return fvec4SIMD(_mm_add_ps(_mm_set1_ps(s), v.Data)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator+ (fvec4SIMD const & v1, fvec4SIMD const & v2) -{ - return fvec4SIMD(_mm_add_ps(v1.Data, v2.Data)); -} - -//operator- -GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v, float s) -{ - return fvec4SIMD(_mm_sub_ps(v.Data, _mm_set1_ps(s))); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator- (float s, fvec4SIMD const & v) -{ - return fvec4SIMD(_mm_sub_ps(_mm_set1_ps(s), v.Data)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v1, fvec4SIMD const & v2) -{ - return fvec4SIMD(_mm_sub_ps(v1.Data, v2.Data)); -} - -//operator* -GLM_FUNC_QUALIFIER fvec4SIMD operator* (fvec4SIMD const & v, float s) -{ - __m128 par0 = v.Data; - __m128 par1 = _mm_set1_ps(s); - return fvec4SIMD(_mm_mul_ps(par0, par1)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* (float s, fvec4SIMD const & v) -{ - __m128 par0 = _mm_set1_ps(s); - __m128 par1 = v.Data; - return fvec4SIMD(_mm_mul_ps(par0, par1)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator* (fvec4SIMD const & v1, fvec4SIMD const & v2) -{ - return fvec4SIMD(_mm_mul_ps(v1.Data, v2.Data)); -} - -//operator/ -GLM_FUNC_QUALIFIER fvec4SIMD operator/ (fvec4SIMD const & v, float s) -{ - __m128 par0 = v.Data; - __m128 par1 = _mm_set1_ps(s); - return fvec4SIMD(_mm_div_ps(par0, par1)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator/ (float s, fvec4SIMD const & v) -{ - __m128 par0 = _mm_set1_ps(s); - __m128 par1 = v.Data; - return fvec4SIMD(_mm_div_ps(par0, par1)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator/ (fvec4SIMD const & v1, fvec4SIMD const & v2) -{ - return fvec4SIMD(_mm_div_ps(v1.Data, v2.Data)); -} - -// Unary constant operators -GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v) -{ - return fvec4SIMD(_mm_sub_ps(_mm_setzero_ps(), v.Data)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator++ (fvec4SIMD const & v, int) -{ - return fvec4SIMD(_mm_add_ps(v.Data, glm::detail::one)); -} - -GLM_FUNC_QUALIFIER fvec4SIMD operator-- (fvec4SIMD const & v, int) -{ - return fvec4SIMD(_mm_sub_ps(v.Data, glm::detail::one)); -} - -}//namespace detail - -GLM_FUNC_QUALIFIER vec4 vec4_cast -( - detail::fvec4SIMD const & x -) -{ - GLM_ALIGN(16) vec4 Result; - _mm_store_ps(&Result[0], x.Data); - return Result; -} - -// Other possible implementation -//float abs(float a) -//{ -// return max(-a, a); -//} -GLM_FUNC_QUALIFIER detail::fvec4SIMD abs -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_abs_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD sign -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_sgn_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD floor -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_flr_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD trunc -( - detail::fvec4SIMD const & x -) -{ - //return x < 0 ? -floor(-x) : floor(x); - - __m128 Flr0 = detail::sse_flr_ps(_mm_sub_ps(_mm_setzero_ps(), x.Data)); - __m128 Sub0 = _mm_sub_ps(Flr0, x.Data); - __m128 Flr1 = detail::sse_flr_ps(x.Data); - - __m128 Cmp0 = _mm_cmplt_ps(x.Data, glm::detail::zero); - __m128 Cmp1 = _mm_cmpnlt_ps(x.Data, glm::detail::zero); - - __m128 And0 = _mm_and_ps(Sub0, Cmp0); - __m128 And1 = _mm_and_ps(Flr1, Cmp1); - - return _mm_or_ps(And0, And1); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD round -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_rnd_ps(x.Data); -} - -//GLM_FUNC_QUALIFIER detail::fvec4SIMD roundEven -//( -// detail::fvec4SIMD const & x -//) -//{ - -//} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD ceil -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_ceil_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fract -( - detail::fvec4SIMD const & x -) -{ - return detail::sse_frc_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD mod -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - return detail::sse_mod_ps(x.Data, y.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD mod -( - detail::fvec4SIMD const & x, - float const & y -) -{ - return detail::sse_mod_ps(x.Data, _mm_set1_ps(y)); -} - -//GLM_FUNC_QUALIFIER detail::fvec4SIMD modf -//( -// detail::fvec4SIMD const & x, -// detail::fvec4SIMD & i -//) -//{ - -//} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD min -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - return _mm_min_ps(x.Data, y.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD min -( - detail::fvec4SIMD const & x, - float const & y -) -{ - return _mm_min_ps(x.Data, _mm_set1_ps(y)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD max -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - return _mm_max_ps(x.Data, y.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD max -( - detail::fvec4SIMD const & x, - float const & y -) -{ - return _mm_max_ps(x.Data, _mm_set1_ps(y)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD clamp -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & minVal, - detail::fvec4SIMD const & maxVal -) -{ - return detail::sse_clp_ps(x.Data, minVal.Data, maxVal.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD clamp -( - detail::fvec4SIMD const & x, - float const & minVal, - float const & maxVal -) -{ - return detail::sse_clp_ps(x.Data, _mm_set1_ps(minVal), _mm_set1_ps(maxVal)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD mix -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y, - detail::fvec4SIMD const & a -) -{ - __m128 Sub0 = _mm_sub_ps(y.Data, x.Data); - __m128 Mul0 = _mm_mul_ps(a.Data, Sub0); - return _mm_add_ps(x.Data, Mul0); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD step -( - detail::fvec4SIMD const & edge, - detail::fvec4SIMD const & x -) -{ - __m128 cmp0 = _mm_cmpngt_ps(x.Data, edge.Data); - return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD step -( - float const & edge, - detail::fvec4SIMD const & x -) -{ - __m128 cmp0 = _mm_cmpngt_ps(x.Data, _mm_set1_ps(edge)); - return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep -( - detail::fvec4SIMD const & edge0, - detail::fvec4SIMD const & edge1, - detail::fvec4SIMD const & x -) -{ - return detail::sse_ssp_ps(edge0.Data, edge1.Data, x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep -( - float const & edge0, - float const & edge1, - detail::fvec4SIMD const & x -) -{ - return detail::sse_ssp_ps(_mm_set1_ps(edge0), _mm_set1_ps(edge1), x.Data); -} - -//GLM_FUNC_QUALIFIER bvec4 isnan(detail::fvec4SIMD const & x) -//{ - -//} - -//GLM_FUNC_QUALIFIER bvec4 isinf(detail::fvec4SIMD const & x) -//{ - -//} - -//GLM_FUNC_QUALIFIER detail::ivec4SIMD floatBitsToInt -//( -// detail::fvec4SIMD const & value -//) -//{ - -//} - -//GLM_FUNC_QUALIFIER detail::fvec4SIMD intBitsToFloat -//( -// detail::ivec4SIMD const & value -//) -//{ - -//} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fma -( - detail::fvec4SIMD const & a, - detail::fvec4SIMD const & b, - detail::fvec4SIMD const & c -) -{ - return _mm_add_ps(_mm_mul_ps(a.Data, b.Data), c.Data); -} - -GLM_FUNC_QUALIFIER float length -( - detail::fvec4SIMD const & x -) -{ - detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); - detail::fvec4SIMD sqt0 = sqrt(dot0); - float Result = 0; - _mm_store_ss(&Result, sqt0.Data); - return Result; -} - -GLM_FUNC_QUALIFIER float fastLength -( - detail::fvec4SIMD const & x -) -{ - detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); - detail::fvec4SIMD sqt0 = fastSqrt(dot0); - float Result = 0; - _mm_store_ss(&Result, sqt0.Data); - return Result; -} - -GLM_FUNC_QUALIFIER float niceLength -( - detail::fvec4SIMD const & x -) -{ - detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); - detail::fvec4SIMD sqt0 = niceSqrt(dot0); - float Result = 0; - _mm_store_ss(&Result, sqt0.Data); - return Result; -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD length4 -( - detail::fvec4SIMD const & x -) -{ - return sqrt(dot4(x, x)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fastLength4 -( - detail::fvec4SIMD const & x -) -{ - return fastSqrt(dot4(x, x)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD niceLength4 -( - detail::fvec4SIMD const & x -) -{ - return niceSqrt(dot4(x, x)); -} - -GLM_FUNC_QUALIFIER float distance -( - detail::fvec4SIMD const & p0, - detail::fvec4SIMD const & p1 -) -{ - float Result = 0; - _mm_store_ss(&Result, detail::sse_dst_ps(p0.Data, p1.Data)); - return Result; -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD distance4 -( - detail::fvec4SIMD const & p0, - detail::fvec4SIMD const & p1 -) -{ - return detail::sse_dst_ps(p0.Data, p1.Data); -} - -GLM_FUNC_QUALIFIER float dot -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - float Result = 0; - _mm_store_ss(&Result, detail::sse_dot_ss(x.Data, y.Data)); - return Result; -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD dot4 -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - return detail::sse_dot_ps(x.Data, y.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD cross -( - detail::fvec4SIMD const & x, - detail::fvec4SIMD const & y -) -{ - return detail::sse_xpd_ps(x.Data, y.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD normalize -( - detail::fvec4SIMD const & x -) -{ - __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data); - __m128 isr0 = inversesqrt(detail::fvec4SIMD(dot0)).Data; - __m128 mul0 = _mm_mul_ps(x.Data, isr0); - return mul0; -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fastNormalize -( - detail::fvec4SIMD const & x -) -{ - __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data); - __m128 isr0 = fastInversesqrt(dot0).Data; - __m128 mul0 = _mm_mul_ps(x.Data, isr0); - return mul0; -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD faceforward -( - detail::fvec4SIMD const & N, - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & Nref -) -{ - return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD reflect -( - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & N -) -{ - return detail::sse_rfe_ps(I.Data, N.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD refract -( - detail::fvec4SIMD const & I, - detail::fvec4SIMD const & N, - float const & eta -) -{ - return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta)); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD sqrt(detail::fvec4SIMD const & x) -{ - return _mm_mul_ps(inversesqrt(x).Data, x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD niceSqrt(detail::fvec4SIMD const & x) -{ - return _mm_sqrt_ps(x.Data); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fastSqrt(detail::fvec4SIMD const & x) -{ - return _mm_mul_ps(fastInversesqrt(x.Data).Data, x.Data); -} - -// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration -// By Elan Ruskin, http://assemblyrequired.crashworks.org/ -GLM_FUNC_QUALIFIER detail::fvec4SIMD inversesqrt(detail::fvec4SIMD const & x) -{ - GLM_ALIGN(4) static const __m128 three = {3, 3, 3, 3}; // aligned consts for fast load - GLM_ALIGN(4) static const __m128 half = {0.5,0.5,0.5,0.5}; - - __m128 recip = _mm_rsqrt_ps(x.Data); // "estimate" opcode - __m128 halfrecip = _mm_mul_ps(half, recip); - __m128 threeminus_xrr = _mm_sub_ps(three, _mm_mul_ps(x.Data, _mm_mul_ps(recip, recip))); - return _mm_mul_ps(halfrecip, threeminus_xrr); -} - -GLM_FUNC_QUALIFIER detail::fvec4SIMD fastInversesqrt(detail::fvec4SIMD const & x) -{ - return _mm_rsqrt_ps(x.Data); -} - -}//namespace glm diff --git a/external/include/glm/gtx/spline.hpp b/external/include/glm/gtx/spline.hpp index 333a5bc..f080fec 100644 --- a/external/include/glm/gtx/spline.hpp +++ b/external/include/glm/gtx/spline.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_spline GLM_GTX_spline /// @ingroup gtx /// -/// @brief Spline functions +/// Include <glm/gtx/spline.hpp> to use the features of this extension. /// -/// <glm/gtx/spline.hpp> need to be included to use these functionalities. +/// Spline functions #pragma once @@ -16,6 +16,10 @@ #include "../glm.hpp" #include "../gtx/optimum_pow.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_spline is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_spline extension included") #endif @@ -27,33 +31,33 @@ namespace glm /// Return a point from a catmull rom curve. /// @see gtx_spline extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType catmullRom( - genType const & v1, - genType const & v2, - genType const & v3, - genType const & v4, - typename genType::value_type const & s); - + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); + /// Return a point from a hermite curve. /// @see gtx_spline extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType hermite( - genType const & v1, - genType const & t1, - genType const & v2, - genType const & t2, - typename genType::value_type const & s); - - /// Return a point from a cubic curve. + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s); + + /// Return a point from a cubic curve. /// @see gtx_spline extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType cubic( - genType const & v1, - genType const & v2, - genType const & v3, - genType const & v4, - typename genType::value_type const & s); + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s); /// @} }//namespace glm diff --git a/external/include/glm/gtx/spline.inl b/external/include/glm/gtx/spline.inl index fcd3382..ca7b439 100644 --- a/external/include/glm/gtx/spline.inl +++ b/external/include/glm/gtx/spline.inl @@ -3,17 +3,16 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType catmullRom ( - genType const & v1, - genType const & v2, - genType const & v3, - genType const & v4, - typename genType::value_type const & s + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s ) { - typename genType::value_type s1 = s; typename genType::value_type s2 = pow2(s); typename genType::value_type s3 = pow3(s); @@ -26,17 +25,16 @@ namespace glm } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType hermite ( - genType const & v1, - genType const & t1, - genType const & v2, - genType const & t2, - typename genType::value_type const & s + genType const& v1, + genType const& t1, + genType const& v2, + genType const& t2, + typename genType::value_type const& s ) { - typename genType::value_type s1 = s; typename genType::value_type s2 = pow2(s); typename genType::value_type s3 = pow3(s); @@ -48,14 +46,14 @@ namespace glm return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2; } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType cubic ( - genType const & v1, - genType const & v2, - genType const & v3, - genType const & v4, - typename genType::value_type const & s + genType const& v1, + genType const& v2, + genType const& v3, + genType const& v4, + typename genType::value_type const& s ) { return ((v1 * s + v2) * s + v3) * s + v4; diff --git a/external/include/glm/gtx/std_based_type.hpp b/external/include/glm/gtx/std_based_type.hpp index ea1791b..55a2f07 100644 --- a/external/include/glm/gtx/std_based_type.hpp +++ b/external/include/glm/gtx/std_based_type.hpp @@ -7,8 +7,9 @@ /// @defgroup gtx_std_based_type GLM_GTX_std_based_type /// @ingroup gtx /// -/// @brief Adds vector types based on STL value types. -/// <glm/gtx/std_based_type.hpp> need to be included to use these functionalities. +/// Include <glm/gtx/std_based_type.hpp> to use the features of this extension. +/// +/// Adds vector types based on STL value types. #pragma once @@ -16,6 +17,10 @@ #include "../glm.hpp" #include <cstdlib> +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_std_based_type is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_std_based_type extension included") #endif @@ -27,35 +32,35 @@ namespace glm /// Vector type based of one std::size_t component. /// @see GLM_GTX_std_based_type - typedef tvec1<std::size_t, defaultp> size1; + typedef vec<1, std::size_t, defaultp> size1; /// Vector type based of two std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec2<std::size_t, defaultp> size2; + typedef vec<2, std::size_t, defaultp> size2; /// Vector type based of three std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec3<std::size_t, defaultp> size3; + typedef vec<3, std::size_t, defaultp> size3; /// Vector type based of four std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec4<std::size_t, defaultp> size4; + typedef vec<4, std::size_t, defaultp> size4; /// Vector type based of one std::size_t component. /// @see GLM_GTX_std_based_type - typedef tvec1<std::size_t, defaultp> size1_t; + typedef vec<1, std::size_t, defaultp> size1_t; /// Vector type based of two std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec2<std::size_t, defaultp> size2_t; + typedef vec<2, std::size_t, defaultp> size2_t; /// Vector type based of three std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec3<std::size_t, defaultp> size3_t; + typedef vec<3, std::size_t, defaultp> size3_t; /// Vector type based of four std::size_t components. /// @see GLM_GTX_std_based_type - typedef tvec4<std::size_t, defaultp> size4_t; + typedef vec<4, std::size_t, defaultp> size4_t; /// @} }//namespace glm diff --git a/external/include/glm/gtx/string_cast.hpp b/external/include/glm/gtx/string_cast.hpp index d2b9fc6..4b4e280 100644 --- a/external/include/glm/gtx/string_cast.hpp +++ b/external/include/glm/gtx/string_cast.hpp @@ -2,16 +2,16 @@ /// @file glm/gtx/string_cast.hpp /// /// @see core (dependence) -/// @see gtc_half_float (dependence) /// @see gtx_integer (dependence) /// @see gtx_quaternion (dependence) /// /// @defgroup gtx_string_cast GLM_GTX_string_cast /// @ingroup gtx /// -/// @brief Setup strings for GLM type values +/// Include <glm/gtx/string_cast.hpp> to use the features of this extension. +/// +/// Setup strings for GLM type values /// -/// <glm/gtx/string_cast.hpp> need to be included to use these functionalities. /// This extension is not supported with CUDA #pragma once @@ -22,6 +22,11 @@ #include "../gtc/quaternion.hpp" #include "../gtx/dual_quaternion.hpp" #include <string> +#include <cmath> + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_string_cast is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif #if(GLM_COMPILER & GLM_COMPILER_CUDA) # error "GLM_GTX_string_cast is not supported on CUDA compiler" @@ -38,8 +43,8 @@ namespace glm /// Create a string from a GLM vector or matrix typed variable. /// @see gtx_string_cast extension. - template <template <typename, precision> class matType, typename T, precision P> - GLM_FUNC_DECL std::string to_string(matType<T, P> const & x); + template<typename genType> + GLM_FUNC_DECL std::string to_string(genType const& x); /// @} }//namespace glm diff --git a/external/include/glm/gtx/string_cast.inl b/external/include/glm/gtx/string_cast.inl index 19f136b..e237e8e 100644 --- a/external/include/glm/gtx/string_cast.inl +++ b/external/include/glm/gtx/string_cast.inl @@ -7,13 +7,25 @@ namespace glm{ namespace detail { + template <typename T> + struct cast + { + typedef T value_type; + }; + + template <> + struct cast<float> + { + typedef double value_type; + }; + GLM_FUNC_QUALIFIER std::string format(const char* msg, ...) { std::size_t const STRING_BUFFER(4096); char text[STRING_BUFFER]; va_list list; - if(msg == 0) + if(msg == GLM_NULLPTR) return std::string(); va_start(list, msg); @@ -30,119 +42,119 @@ namespace detail static const char* LabelTrue = "true"; static const char* LabelFalse = "false"; - template <typename T, bool isFloat = false> + template<typename T, bool isFloat = false> struct literal { - GLM_FUNC_QUALIFIER static char const * value() {return "%d";}; + GLM_FUNC_QUALIFIER static char const * value() {return "%d";} }; - template <typename T> + template<typename T> struct literal<T, true> { - GLM_FUNC_QUALIFIER static char const * value() {return "%f";}; + GLM_FUNC_QUALIFIER static char const * value() {return "%f";} }; # if GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC - template <> + template<> struct literal<uint64_t, false> { - GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}; + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} }; - template <> + template<> struct literal<int64_t, false> { - GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}; + GLM_FUNC_QUALIFIER static char const * value() {return "%lld";} }; # endif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC - template <typename T> + template<typename T> struct prefix{}; - template <> + template<> struct prefix<float> { - GLM_FUNC_QUALIFIER static char const * value() {return "";}; + GLM_FUNC_QUALIFIER static char const * value() {return "";} }; - template <> + template<> struct prefix<double> { - GLM_FUNC_QUALIFIER static char const * value() {return "d";}; + GLM_FUNC_QUALIFIER static char const * value() {return "d";} }; - template <> + template<> struct prefix<bool> { - GLM_FUNC_QUALIFIER static char const * value() {return "b";}; + GLM_FUNC_QUALIFIER static char const * value() {return "b";} }; - template <> + template<> struct prefix<uint8_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "u8";}; + GLM_FUNC_QUALIFIER static char const * value() {return "u8";} }; - template <> + template<> struct prefix<int8_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "i8";}; + GLM_FUNC_QUALIFIER static char const * value() {return "i8";} }; - template <> + template<> struct prefix<uint16_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "u16";}; + GLM_FUNC_QUALIFIER static char const * value() {return "u16";} }; - template <> + template<> struct prefix<int16_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "i16";}; + GLM_FUNC_QUALIFIER static char const * value() {return "i16";} }; - template <> + template<> struct prefix<uint32_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "u";}; + GLM_FUNC_QUALIFIER static char const * value() {return "u";} }; - template <> + template<> struct prefix<int32_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "i";}; + GLM_FUNC_QUALIFIER static char const * value() {return "i";} }; - template <> + template<> struct prefix<uint64_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "u64";}; + GLM_FUNC_QUALIFIER static char const * value() {return "u64";} }; - template <> + template<> struct prefix<int64_t> { - GLM_FUNC_QUALIFIER static char const * value() {return "i64";}; + GLM_FUNC_QUALIFIER static char const * value() {return "i64";} }; - template <template <typename, precision> class matType, typename T, precision P> + template<typename matType> struct compute_to_string {}; - template <precision P> - struct compute_to_string<tvec1, bool, P> + template<qualifier Q> + struct compute_to_string<vec<1, bool, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec1<bool, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x) { return detail::format("bvec1(%s)", x[0] ? detail::LabelTrue : detail::LabelFalse); } }; - template <precision P> - struct compute_to_string<tvec2, bool, P> + template<qualifier Q> + struct compute_to_string<vec<2, bool, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec2<bool, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x) { return detail::format("bvec2(%s, %s)", x[0] ? detail::LabelTrue : detail::LabelFalse, @@ -150,10 +162,10 @@ namespace detail } }; - template <precision P> - struct compute_to_string<tvec3, bool, P> + template<qualifier Q> + struct compute_to_string<vec<3, bool, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec3<bool, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x) { return detail::format("bvec3(%s, %s, %s)", x[0] ? detail::LabelTrue : detail::LabelFalse, @@ -162,10 +174,10 @@ namespace detail } }; - template <precision P> - struct compute_to_string<tvec4, bool, P> + template<qualifier Q> + struct compute_to_string<vec<4, bool, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec4<bool, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x) { return detail::format("bvec4(%s, %s, %s, %s)", x[0] ? detail::LabelTrue : detail::LabelFalse, @@ -175,10 +187,10 @@ namespace detail } }; - template <typename T, precision P> - struct compute_to_string<tvec1, T, P> + template<typename T, qualifier Q> + struct compute_to_string<vec<1, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec1<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -186,14 +198,15 @@ namespace detail PrefixStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x[0]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x[0])); } }; - template <typename T, precision P> - struct compute_to_string<tvec2, T, P> + template<typename T, qualifier Q> + struct compute_to_string<vec<2, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec2<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -201,14 +214,16 @@ namespace detail PrefixStr, LiteralStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x[0], x[1]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x[0]), + static_cast<typename cast<T>::value_type>(x[1])); } }; - template <typename T, precision P> - struct compute_to_string<tvec3, T, P> + template<typename T, qualifier Q> + struct compute_to_string<vec<3, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec3<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -216,14 +231,17 @@ namespace detail PrefixStr, LiteralStr, LiteralStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x[0], x[1], x[2]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x[0]), + static_cast<typename cast<T>::value_type>(x[1]), + static_cast<typename cast<T>::value_type>(x[2])); } }; - template <typename T, precision P> - struct compute_to_string<tvec4, T, P> + template<typename T, qualifier Q> + struct compute_to_string<vec<4, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tvec4<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -231,15 +249,19 @@ namespace detail PrefixStr, LiteralStr, LiteralStr, LiteralStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x[0], x[1], x[2], x[3]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x[0]), + static_cast<typename cast<T>::value_type>(x[1]), + static_cast<typename cast<T>::value_type>(x[2]), + static_cast<typename cast<T>::value_type>(x[3])); } }; - template <typename T, precision P> - struct compute_to_string<tmat2x2, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<2, 2, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat2x2<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -249,15 +271,15 @@ namespace detail LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], - x[1][0], x[1][1]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1])); } }; - template <typename T, precision P> - struct compute_to_string<tmat2x3, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<2, 3, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat2x3<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -267,15 +289,15 @@ namespace detail LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], - x[1][0], x[1][1], x[1][2]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2])); } }; - template <typename T, precision P> - struct compute_to_string<tmat2x4, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<2, 4, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat2x4<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -285,15 +307,15 @@ namespace detail LiteralStr, LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], x[0][3], - x[1][0], x[1][1], x[1][2], x[1][3]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3])); } }; - template <typename T, precision P> - struct compute_to_string<tmat3x2, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<3, 2, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat3x2<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -304,16 +326,16 @@ namespace detail LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], - x[1][0], x[1][1], - x[2][0], x[2][1]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1])); } }; - template <typename T, precision P> - struct compute_to_string<tmat3x3, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<3, 3, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat3x3<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -324,16 +346,16 @@ namespace detail LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], - x[1][0], x[1][1], x[1][2], - x[2][0], x[2][1], x[2][2]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2])); } }; - template <typename T, precision P> - struct compute_to_string<tmat3x4, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<3, 4, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat3x4<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -344,16 +366,16 @@ namespace detail LiteralStr, LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], x[0][3], - x[1][0], x[1][1], x[1][2], x[1][3], - x[2][0], x[2][1], x[2][2], x[2][3]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3])); } }; - template <typename T, precision P> - struct compute_to_string<tmat4x2, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<4, 2, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat4x2<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -365,17 +387,17 @@ namespace detail LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], - x[1][0], x[1][1], - x[2][0], x[2][1], - x[3][0], x[3][1]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), + static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1])); } }; - template <typename T, precision P> - struct compute_to_string<tmat4x3, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<4, 3, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat4x3<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -387,17 +409,17 @@ namespace detail LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], - x[1][0], x[1][1], x[1][2], - x[2][0], x[2][1], x[2][2], - x[3][0], x[3][1], x[3][2]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), + static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2])); } }; - template <typename T, precision P> - struct compute_to_string<tmat4x4, T, P> + template<typename T, qualifier Q> + struct compute_to_string<mat<4, 4, T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tmat4x4<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); @@ -409,50 +431,62 @@ namespace detail LiteralStr, LiteralStr, LiteralStr, LiteralStr)); return detail::format(FormatStr.c_str(), - x[0][0], x[0][1], x[0][2], x[0][3], - x[1][0], x[1][1], x[1][2], x[1][3], - x[2][0], x[2][1], x[2][2], x[2][3], - x[3][0], x[3][1], x[3][2], x[3][3]); + static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]), + static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]), + static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]), + static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]), static_cast<typename cast<T>::value_type>(x[3][3])); } }; - template <typename T, precision P> - struct compute_to_string<tquat, T, P> + template<typename T, qualifier Q> + struct compute_to_string<tquat<T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tquat<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(tquat<T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); - std::string FormatStr(detail::format("%squat(%s, %s, %s, %s)", + std::string FormatStr(detail::format("%squat(%s, {%s, %s, %s})", PrefixStr, LiteralStr, LiteralStr, LiteralStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x[0], x[1], x[2], x[3]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x[3]), + static_cast<typename cast<T>::value_type>(x[0]), + static_cast<typename cast<T>::value_type>(x[1]), + static_cast<typename cast<T>::value_type>(x[2])); } }; - template <typename T, precision P> - struct compute_to_string<tdualquat, T, P> + template<typename T, qualifier Q> + struct compute_to_string<tdualquat<T, Q> > { - GLM_FUNC_QUALIFIER static std::string call(tdualquat<T, P> const & x) + GLM_FUNC_QUALIFIER static std::string call(tdualquat<T, Q> const& x) { char const * PrefixStr = prefix<T>::value(); char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value(); - std::string FormatStr(detail::format("%sdualquat((%s, %s, %s, %s), (%s, %s, %s, %s))", + std::string FormatStr(detail::format("%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))", PrefixStr, LiteralStr, LiteralStr, LiteralStr, LiteralStr)); - return detail::format(FormatStr.c_str(), x.real[0], x.real[1], x.real[2], x.real[3], x.dual[0], x.dual[1], x.dual[2], x.dual[3]); + return detail::format(FormatStr.c_str(), + static_cast<typename cast<T>::value_type>(x.real[3]), + static_cast<typename cast<T>::value_type>(x.real[0]), + static_cast<typename cast<T>::value_type>(x.real[1]), + static_cast<typename cast<T>::value_type>(x.real[2]), + static_cast<typename cast<T>::value_type>(x.dual[3]), + static_cast<typename cast<T>::value_type>(x.dual[0]), + static_cast<typename cast<T>::value_type>(x.dual[1]), + static_cast<typename cast<T>::value_type>(x.dual[2])); } }; }//namespace detail -template <template <typename, precision> class matType, typename T, precision P> -GLM_FUNC_QUALIFIER std::string to_string(matType<T, P> const & x) +template<class matType> +GLM_FUNC_QUALIFIER std::string to_string(matType const& x) { - return detail::compute_to_string<matType, T, P>::call(x); + return detail::compute_to_string<matType>::call(x); } }//namespace glm diff --git a/external/include/glm/gtx/texture.hpp b/external/include/glm/gtx/texture.hpp new file mode 100644 index 0000000..312bf39 --- /dev/null +++ b/external/include/glm/gtx/texture.hpp @@ -0,0 +1,46 @@ +/// @ref gtx_texture +/// @file glm/gtx/texture.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_texture GLM_GTX_texture +/// @ingroup gtx +/// +/// Include <glm/gtx/texture.hpp> to use the features of this extension. +/// +/// Wrapping mode of texture coordinates. + +#pragma once + +// Dependency: +#include "../glm.hpp" +#include "../gtc/integer.hpp" +#include "../gtx/component_wise.hpp" + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_texture is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + +#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) +# pragma message("GLM: GLM_GTX_texture extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_texture + /// @{ + + /// Compute the number of mipmaps levels necessary to create a mipmap complete texture + /// + /// @param Extent Extent of the texture base level mipmap + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + template <length_t L, typename T, qualifier Q> + T levels(vec<L, T, Q> const& Extent); + + /// @} +}// namespace glm + +#include "texture.inl" + diff --git a/external/include/glm/gtx/texture.inl b/external/include/glm/gtx/texture.inl new file mode 100644 index 0000000..7c124f2 --- /dev/null +++ b/external/include/glm/gtx/texture.inl @@ -0,0 +1,18 @@ +/// @ref gtx_texture +/// @file glm/gtx/texture.inl + +namespace glm +{ + template <length_t L, typename T, qualifier Q> + inline T levels(vec<L, T, Q> const& Extent) + { + return glm::log2(compMax(Extent)) + static_cast<T>(1); + } + + template <typename T> + inline T levels(T Extent) + { + return vec<1, T, defaultp>(Extent).x; + } +}//namespace glm + diff --git a/external/include/glm/gtx/transform.hpp b/external/include/glm/gtx/transform.hpp index 365748b..c4467bd 100644 --- a/external/include/glm/gtx/transform.hpp +++ b/external/include/glm/gtx/transform.hpp @@ -9,9 +9,9 @@ /// @defgroup gtx_transform GLM_GTX_transform /// @ingroup gtx /// -/// @brief Add transformation matrices +/// Include <glm/gtx/transform.hpp> to use the features of this extension. /// -/// <glm/gtx/transform.hpp> need to be included to use these functionalities. +/// Add transformation matrices #pragma once @@ -19,6 +19,10 @@ #include "../glm.hpp" #include "../gtc/matrix_transform.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_transform is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_transform extension included") #endif @@ -31,24 +35,24 @@ namespace glm /// Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. /// @see gtc_matrix_transform /// @see gtx_transform - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> translate( - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> translate( + vec<3, T, Q> const& v); - /// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. + /// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. /// @see gtc_matrix_transform /// @see gtx_transform - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> rotate( - T angle, - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> rotate( + T angle, + vec<3, T, Q> const& v); /// Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. /// @see gtc_matrix_transform /// @see gtx_transform - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> scale( - tvec3<T, P> const & v); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> scale( + vec<3, T, Q> const& v); /// @} }// namespace glm diff --git a/external/include/glm/gtx/transform.inl b/external/include/glm/gtx/transform.inl index 516d866..56bfc90 100644 --- a/external/include/glm/gtx/transform.inl +++ b/external/include/glm/gtx/transform.inl @@ -3,22 +3,22 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(vec<3, T, Q> const& v) { - return translate(tmat4x4<T, P>(static_cast<T>(1)), v); + return translate(mat<4, 4, T, Q>(static_cast<T>(1)), v); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate(T angle, tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(T angle, vec<3, T, Q> const& v) { - return rotate(tmat4x4<T, P>(static_cast<T>(1)), angle, v); + return rotate(mat<4, 4, T, Q>(static_cast<T>(1)), angle, v); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> scale(tvec3<T, P> const & v) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(vec<3, T, Q> const& v) { - return scale(tmat4x4<T, P>(static_cast<T>(1)), v); + return scale(mat<4, 4, T, Q>(static_cast<T>(1)), v); } }//namespace glm diff --git a/external/include/glm/gtx/transform2.hpp b/external/include/glm/gtx/transform2.hpp index bf5fbc9..2966cce 100644 --- a/external/include/glm/gtx/transform2.hpp +++ b/external/include/glm/gtx/transform2.hpp @@ -7,9 +7,9 @@ /// @defgroup gtx_transform2 GLM_GTX_transform2 /// @ingroup gtx /// -/// @brief Add extra transformation matrices +/// Include <glm/gtx/transform2.hpp> to use the features of this extension. /// -/// <glm/gtx/transform2.hpp> need to be included to use these functionalities. +/// Add extra transformation matrices #pragma once @@ -17,6 +17,10 @@ #include "../glm.hpp" #include "../gtx/transform.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_transform2 is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_transform2 extension included") #endif @@ -28,78 +32,56 @@ namespace glm //! Transforms a matrix with a shearing on X axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> shearX2D( - tmat3x3<T, P> const & m, - T y); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T y); //! Transforms a matrix with a shearing on Y axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> shearY2D( - tmat3x3<T, P> const & m, - T x); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T x); //! Transforms a matrix with a shearing on X axis //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> shearX3D( - const tmat4x4<T, P> & m, - T y, - T z); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T y, T z); //! Transforms a matrix with a shearing on Y axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> shearY3D( - const tmat4x4<T, P> & m, - T x, - T z); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T x, T z); - //! Transforms a matrix with a shearing on Z axis. + //! Transforms a matrix with a shearing on Z axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> shearZ3D( - const tmat4x4<T, P> & m, - T x, - T y); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T x, T y); - //template <typename T> GLM_FUNC_QUALIFIER tmat4x4<T, P> shear(const tmat4x4<T, P> & m, shearPlane, planePoint, angle) + //template<typename T> GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear(const mat<4, 4, T, Q> & m, shearPlane, planePoint, angle) // Identity + tan(angle) * cross(Normal, OnPlaneVector) 0 // - dot(PointOnPlane, normal) * OnPlaneVector 1 // Reflect functions seem to don't work - //template <typename T> tmat3x3<T, P> reflect2D(const tmat3x3<T, P> & m, const tvec3<T, P>& normal){return reflect2DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) - //template <typename T> tmat4x4<T, P> reflect3D(const tmat4x4<T, P> & m, const tvec3<T, P>& normal){return reflect3DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) - + //template<typename T> mat<3, 3, T, Q> reflect2D(const mat<3, 3, T, Q> & m, const vec<3, T, Q>& normal){return reflect2DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + //template<typename T> mat<4, 4, T, Q> reflect3D(const mat<4, 4, T, Q> & m, const vec<3, T, Q>& normal){return reflect3DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + //! Build planar projection matrix along normal axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat3x3<T, P> proj2D( - const tmat3x3<T, P> & m, - const tvec3<T, P>& normal); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<3, 3, T, Q> proj2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal); //! Build planar projection matrix along normal axis. //! From GLM_GTX_transform2 extension. - template <typename T, precision P> - GLM_FUNC_DECL tmat4x4<T, P> proj3D( - const tmat4x4<T, P> & m, - const tvec3<T, P>& normal); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> proj3D(mat<4, 4, T, Q> const & m, vec<3, T, Q> const& normal); - //! Build a scale bias matrix. + //! Build a scale bias matrix. //! From GLM_GTX_transform2 extension. - template <typename valType, precision P> - GLM_FUNC_DECL tmat4x4<valType, P> scaleBias( - valType scale, - valType bias); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(T scale, T bias); //! Build a scale bias matrix. //! From GLM_GTX_transform2 extension. - template <typename valType, precision P> - GLM_FUNC_DECL tmat4x4<valType, P> scaleBias( - tmat4x4<valType, P> const & m, - valType scale, - valType bias); + template<typename T, qualifier Q> + GLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias); /// @} }// namespace glm diff --git a/external/include/glm/gtx/transform2.inl b/external/include/glm/gtx/transform2.inl index 6e0ab31..59091eb 100644 --- a/external/include/glm/gtx/transform2.inl +++ b/external/include/glm/gtx/transform2.inl @@ -3,53 +3,53 @@ namespace glm { - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX2D(tmat3x3<T, P> const& m, T s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T s) { - tmat3x3<T, P> r(1); + mat<3, 3, T, Q> r(1); r[1][0] = s; return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY2D(tmat3x3<T, P> const& m, T s) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T s) { - tmat3x3<T, P> r(1); + mat<3, 3, T, Q> r(1); r[0][1] = s; return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> shearX3D(tmat4x4<T, P> const& m, T s, T t) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T s, T t) { - tmat4x4<T, P> r(1); + mat<4, 4, T, Q> r(1); r[0][1] = s; r[0][2] = t; return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> shearY3D(tmat4x4<T, P> const& m, T s, T t) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T s, T t) { - tmat4x4<T, P> r(1); + mat<4, 4, T, Q> r(1); r[1][0] = s; r[1][2] = t; return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> shearZ3D(tmat4x4<T, P> const& m, T s, T t) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T s, T t) { - tmat4x4<T, P> r(1); + mat<4, 4, T, Q> r(1); r[2][0] = s; r[2][1] = t; return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> reflect2D(tmat3x3<T, P> const& m, tvec3<T, P> const& normal) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> reflect2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal) { - tmat3x3<T, P> r(static_cast<T>(1)); + mat<3, 3, T, Q> r(static_cast<T>(1)); r[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x; r[0][1] = -static_cast<T>(2) * normal.x * normal.y; r[1][0] = -static_cast<T>(2) * normal.x * normal.y; @@ -57,10 +57,10 @@ namespace glm return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> reflect3D(tmat4x4<T, P> const& m, tvec3<T, P> const& normal) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> reflect3D(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& normal) { - tmat4x4<T, P> r(static_cast<T>(1)); + mat<4, 4, T, Q> r(static_cast<T>(1)); r[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x; r[0][1] = -static_cast<T>(2) * normal.x * normal.y; r[0][2] = -static_cast<T>(2) * normal.x * normal.z; @@ -75,12 +75,12 @@ namespace glm return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat3x3<T, P> proj2D( - const tmat3x3<T, P>& m, - const tvec3<T, P>& normal) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<3, 3, T, Q> proj2D( + const mat<3, 3, T, Q>& m, + const vec<3, T, Q>& normal) { - tmat3x3<T, P> r(static_cast<T>(1)); + mat<3, 3, T, Q> r(static_cast<T>(1)); r[0][0] = static_cast<T>(1) - normal.x * normal.x; r[0][1] = - normal.x * normal.y; r[1][0] = - normal.x * normal.y; @@ -88,12 +88,12 @@ namespace glm return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> proj3D( - const tmat4x4<T, P>& m, - const tvec3<T, P>& normal) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> proj3D( + const mat<4, 4, T, Q>& m, + const vec<3, T, Q>& normal) { - tmat4x4<T, P> r(static_cast<T>(1)); + mat<4, 4, T, Q> r(static_cast<T>(1)); r[0][0] = static_cast<T>(1) - normal.x * normal.x; r[0][1] = - normal.x * normal.y; r[0][2] = - normal.x * normal.z; @@ -106,19 +106,19 @@ namespace glm return m * r; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> scaleBias(T scale, T bias) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(T scale, T bias) { - tmat4x4<T, P> result; - result[3] = tvec4<T, P>(tvec3<T, P>(bias), static_cast<T>(1)); + mat<4, 4, T, Q> result; + result[3] = vec<4, T, Q>(vec<3, T, Q>(bias), static_cast<T>(1)); result[0][0] = scale; result[1][1] = scale; result[2][2] = scale; return result; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tmat4x4<T, P> scaleBias(tmat4x4<T, P> const& m, T scale, T bias) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias) { return m * scaleBias(scale, bias); } diff --git a/external/include/glm/gtx/type_aligned.hpp b/external/include/glm/gtx/type_aligned.hpp index 8962a6f..fdfadd4 100644 --- a/external/include/glm/gtx/type_aligned.hpp +++ b/external/include/glm/gtx/type_aligned.hpp @@ -7,17 +7,21 @@ /// @defgroup gtx_type_aligned GLM_GTX_type_aligned /// @ingroup gtx /// -/// @brief Defines aligned types. +/// Include <glm/gtx/type_aligned.hpp> to use the features of this extension. /// -/// @ref core_precision defines aligned types. +/// Defines aligned types. /// -/// <glm/gtx/type_aligned.hpp> need to be included to use these functionalities. +/// @ref core_precision defines aligned types. #pragma once // Dependency: #include "../gtc/type_precision.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_type_aligned is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_type_aligned extension included") #endif @@ -25,296 +29,296 @@ namespace glm { /////////////////////////// - // Signed int vector types + // Signed int vector types /// @addtogroup gtx_type_aligned /// @{ - /// Low precision 8 bit signed integer aligned scalar type. + /// Low qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1); - /// Low precision 16 bit signed integer aligned scalar type. + /// Low qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2); - /// Low precision 32 bit signed integer aligned scalar type. + /// Low qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4); - /// Low precision 64 bit signed integer aligned scalar type. + /// Low qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8); - /// Low precision 8 bit signed integer aligned scalar type. + /// Low qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1); - /// Low precision 16 bit signed integer aligned scalar type. + /// Low qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2); - /// Low precision 32 bit signed integer aligned scalar type. + /// Low qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4); - /// Low precision 64 bit signed integer aligned scalar type. + /// Low qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8); - /// Low precision 8 bit signed integer aligned scalar type. + /// Low qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1); - /// Low precision 16 bit signed integer aligned scalar type. + /// Low qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2); - /// Low precision 32 bit signed integer aligned scalar type. + /// Low qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4); - /// Low precision 64 bit signed integer aligned scalar type. + /// Low qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8); - /// Medium precision 8 bit signed integer aligned scalar type. + /// Medium qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1); - /// Medium precision 16 bit signed integer aligned scalar type. + /// Medium qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2); - /// Medium precision 32 bit signed integer aligned scalar type. + /// Medium qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4); - /// Medium precision 64 bit signed integer aligned scalar type. + /// Medium qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8); - /// Medium precision 8 bit signed integer aligned scalar type. + /// Medium qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1); - /// Medium precision 16 bit signed integer aligned scalar type. + /// Medium qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2); - /// Medium precision 32 bit signed integer aligned scalar type. + /// Medium qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4); - /// Medium precision 64 bit signed integer aligned scalar type. + /// Medium qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8); - /// Medium precision 8 bit signed integer aligned scalar type. + /// Medium qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1); - /// Medium precision 16 bit signed integer aligned scalar type. + /// Medium qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2); - /// Medium precision 32 bit signed integer aligned scalar type. + /// Medium qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4); - /// Medium precision 64 bit signed integer aligned scalar type. + /// Medium qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8); - /// High precision 8 bit signed integer aligned scalar type. + /// High qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1); - /// High precision 16 bit signed integer aligned scalar type. + /// High qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2); - /// High precision 32 bit signed integer aligned scalar type. + /// High qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4); - /// High precision 64 bit signed integer aligned scalar type. + /// High qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8); - /// High precision 8 bit signed integer aligned scalar type. + /// High qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1); - /// High precision 16 bit signed integer aligned scalar type. + /// High qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2); - /// High precision 32 bit signed integer aligned scalar type. + /// High qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4); - /// High precision 64 bit signed integer aligned scalar type. + /// High qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8); - /// High precision 8 bit signed integer aligned scalar type. + /// High qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1); - /// High precision 16 bit signed integer aligned scalar type. + /// High qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2); - /// High precision 32 bit signed integer aligned scalar type. + /// High qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4); - /// High precision 64 bit signed integer aligned scalar type. + /// High qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8); - /// Default precision 8 bit signed integer aligned scalar type. + /// Default qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1); - /// Default precision 16 bit signed integer aligned scalar type. + /// Default qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2); - /// Default precision 32 bit signed integer aligned scalar type. + /// Default qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4); - /// Default precision 64 bit signed integer aligned scalar type. + /// Default qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8); - /// Default precision 8 bit signed integer aligned scalar type. + /// Default qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1); - /// Default precision 16 bit signed integer aligned scalar type. + /// Default qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2); - /// Default precision 32 bit signed integer aligned scalar type. + /// Default qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4); - /// Default precision 64 bit signed integer aligned scalar type. + /// Default qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8); - /// Default precision 8 bit signed integer aligned scalar type. + /// Default qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1); - /// Default precision 16 bit signed integer aligned scalar type. + /// Default qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2); - /// Default precision 32 bit signed integer aligned scalar type. + /// Default qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4); - /// Default precision 64 bit signed integer aligned scalar type. + /// Default qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8); - /// Default precision 32 bit signed integer aligned scalar type. + /// Default qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4); - - /// Default precision 32 bit signed integer aligned vector of 2 components type. + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8); - /// Default precision 32 bit signed integer aligned vector of 3 components type. + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16); - /// Default precision 32 bit signed integer aligned vector of 4 components type. + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16); - /// Default precision 8 bit signed integer aligned scalar type. + /// Default qualifier 8 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1); - /// Default precision 8 bit signed integer aligned vector of 2 components type. + /// Default qualifier 8 bit signed integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2); - /// Default precision 8 bit signed integer aligned vector of 3 components type. + /// Default qualifier 8 bit signed integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4); - /// Default precision 8 bit signed integer aligned vector of 4 components type. + /// Default qualifier 8 bit signed integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4); - /// Default precision 16 bit signed integer aligned scalar type. + /// Default qualifier 16 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2); - - /// Default precision 16 bit signed integer aligned vector of 2 components type. + + /// Default qualifier 16 bit signed integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4); - /// Default precision 16 bit signed integer aligned vector of 3 components type. + /// Default qualifier 16 bit signed integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8); - /// Default precision 16 bit signed integer aligned vector of 4 components type. + /// Default qualifier 16 bit signed integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8); - /// Default precision 32 bit signed integer aligned scalar type. + /// Default qualifier 32 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4); - - /// Default precision 32 bit signed integer aligned vector of 2 components type. + + /// Default qualifier 32 bit signed integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8); - /// Default precision 32 bit signed integer aligned vector of 3 components type. + /// Default qualifier 32 bit signed integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16); - /// Default precision 32 bit signed integer aligned vector of 4 components type. + /// Default qualifier 32 bit signed integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16); - /// Default precision 64 bit signed integer aligned scalar type. + /// Default qualifier 64 bit signed integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8); - - /// Default precision 64 bit signed integer aligned vector of 2 components type. + + /// Default qualifier 64 bit signed integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16); - /// Default precision 64 bit signed integer aligned vector of 3 components type. + /// Default qualifier 64 bit signed integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32); - /// Default precision 64 bit signed integer aligned vector of 4 components type. + /// Default qualifier 64 bit signed integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32); @@ -322,291 +326,291 @@ namespace glm ///////////////////////////// // Unsigned int vector types - /// Low precision 8 bit unsigned integer aligned scalar type. + /// Low qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1); - /// Low precision 16 bit unsigned integer aligned scalar type. + /// Low qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2); - /// Low precision 32 bit unsigned integer aligned scalar type. + /// Low qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4); - /// Low precision 64 bit unsigned integer aligned scalar type. + /// Low qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8); - /// Low precision 8 bit unsigned integer aligned scalar type. + /// Low qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1); - /// Low precision 16 bit unsigned integer aligned scalar type. + /// Low qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2); - /// Low precision 32 bit unsigned integer aligned scalar type. + /// Low qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4); - /// Low precision 64 bit unsigned integer aligned scalar type. + /// Low qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8); - /// Low precision 8 bit unsigned integer aligned scalar type. + /// Low qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1); - /// Low precision 16 bit unsigned integer aligned scalar type. + /// Low qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2); - /// Low precision 32 bit unsigned integer aligned scalar type. + /// Low qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4); - /// Low precision 64 bit unsigned integer aligned scalar type. + /// Low qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8); - /// Medium precision 8 bit unsigned integer aligned scalar type. + /// Medium qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1); - /// Medium precision 16 bit unsigned integer aligned scalar type. + /// Medium qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2); - /// Medium precision 32 bit unsigned integer aligned scalar type. + /// Medium qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4); - /// Medium precision 64 bit unsigned integer aligned scalar type. + /// Medium qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8); - /// Medium precision 8 bit unsigned integer aligned scalar type. + /// Medium qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1); - /// Medium precision 16 bit unsigned integer aligned scalar type. + /// Medium qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2); - /// Medium precision 32 bit unsigned integer aligned scalar type. + /// Medium qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4); - /// Medium precision 64 bit unsigned integer aligned scalar type. + /// Medium qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8); - /// Medium precision 8 bit unsigned integer aligned scalar type. + /// Medium qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1); - /// Medium precision 16 bit unsigned integer aligned scalar type. + /// Medium qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2); - /// Medium precision 32 bit unsigned integer aligned scalar type. + /// Medium qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4); - /// Medium precision 64 bit unsigned integer aligned scalar type. + /// Medium qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8); - /// High precision 8 bit unsigned integer aligned scalar type. + /// High qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1); - /// High precision 16 bit unsigned integer aligned scalar type. + /// High qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2); - /// High precision 32 bit unsigned integer aligned scalar type. + /// High qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4); - /// High precision 64 bit unsigned integer aligned scalar type. + /// High qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8); - /// High precision 8 bit unsigned integer aligned scalar type. + /// High qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1); - /// High precision 16 bit unsigned integer aligned scalar type. + /// High qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2); - /// High precision 32 bit unsigned integer aligned scalar type. + /// High qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4); - /// High precision 64 bit unsigned integer aligned scalar type. + /// High qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8); - /// High precision 8 bit unsigned integer aligned scalar type. + /// High qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1); - /// High precision 16 bit unsigned integer aligned scalar type. + /// High qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2); - /// High precision 32 bit unsigned integer aligned scalar type. + /// High qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4); - /// High precision 64 bit unsigned integer aligned scalar type. + /// High qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8); - /// Default precision 8 bit unsigned integer aligned scalar type. + /// Default qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1); - /// Default precision 16 bit unsigned integer aligned scalar type. + /// Default qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2); - /// Default precision 32 bit unsigned integer aligned scalar type. + /// Default qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4); - /// Default precision 64 bit unsigned integer aligned scalar type. + /// Default qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8); - /// Default precision 8 bit unsigned integer aligned scalar type. + /// Default qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1); - /// Default precision 16 bit unsigned integer aligned scalar type. + /// Default qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2); - /// Default precision 32 bit unsigned integer aligned scalar type. + /// Default qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4); - /// Default precision 64 bit unsigned integer aligned scalar type. + /// Default qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8); - /// Default precision 8 bit unsigned integer aligned scalar type. + /// Default qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1); - /// Default precision 16 bit unsigned integer aligned scalar type. + /// Default qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2); - /// Default precision 32 bit unsigned integer aligned scalar type. + /// Default qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4); - /// Default precision 64 bit unsigned integer aligned scalar type. + /// Default qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8); - /// Default precision 32 bit unsigned integer aligned scalar type. + /// Default qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4); - - /// Default precision 32 bit unsigned integer aligned vector of 2 components type. + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8); - /// Default precision 32 bit unsigned integer aligned vector of 3 components type. + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16); - /// Default precision 32 bit unsigned integer aligned vector of 4 components type. + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16); - /// Default precision 8 bit unsigned integer aligned scalar type. + /// Default qualifier 8 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1); - /// Default precision 8 bit unsigned integer aligned vector of 2 components type. + /// Default qualifier 8 bit unsigned integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2); - /// Default precision 8 bit unsigned integer aligned vector of 3 components type. + /// Default qualifier 8 bit unsigned integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4); - /// Default precision 8 bit unsigned integer aligned vector of 4 components type. + /// Default qualifier 8 bit unsigned integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4); - /// Default precision 16 bit unsigned integer aligned scalar type. + /// Default qualifier 16 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2); - - /// Default precision 16 bit unsigned integer aligned vector of 2 components type. + + /// Default qualifier 16 bit unsigned integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4); - /// Default precision 16 bit unsigned integer aligned vector of 3 components type. + /// Default qualifier 16 bit unsigned integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8); - /// Default precision 16 bit unsigned integer aligned vector of 4 components type. + /// Default qualifier 16 bit unsigned integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8); - /// Default precision 32 bit unsigned integer aligned scalar type. + /// Default qualifier 32 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4); - - /// Default precision 32 bit unsigned integer aligned vector of 2 components type. + + /// Default qualifier 32 bit unsigned integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8); - /// Default precision 32 bit unsigned integer aligned vector of 3 components type. + /// Default qualifier 32 bit unsigned integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16); - /// Default precision 32 bit unsigned integer aligned vector of 4 components type. + /// Default qualifier 32 bit unsigned integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16); - /// Default precision 64 bit unsigned integer aligned scalar type. + /// Default qualifier 64 bit unsigned integer aligned scalar type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8); - - /// Default precision 64 bit unsigned integer aligned vector of 2 components type. + + /// Default qualifier 64 bit unsigned integer aligned vector of 2 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16); - /// Default precision 64 bit unsigned integer aligned vector of 3 components type. + /// Default qualifier 64 bit unsigned integer aligned vector of 3 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32); - /// Default precision 64 bit unsigned integer aligned vector of 4 components type. + /// Default qualifier 64 bit unsigned integer aligned vector of 4 components type. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32); @@ -614,352 +618,365 @@ namespace glm ////////////////////// // Float vector types - /// 32 bit single-precision floating-point aligned scalar. + /// 32 bit single-qualifier floating-point aligned scalar. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4); - /// 64 bit double-precision floating-point aligned scalar. - /// @see gtx_type_aligned - GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8); - - - /// 32 bit single-precision floating-point aligned scalar. + /// 32 bit single-qualifier floating-point aligned scalar. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4); - /// 64 bit double-precision floating-point aligned scalar. + /// 32 bit single-qualifier floating-point aligned scalar. /// @see gtx_type_aligned - GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8); + GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4); +# ifndef GLM_FORCE_SINGLE_ONLY - /// 32 bit single-precision floating-point aligned scalar. + /// 64 bit double-qualifier floating-point aligned scalar. /// @see gtx_type_aligned - GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4); + GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8); + + /// 64 bit double-qualifier floating-point aligned scalar. + /// @see gtx_type_aligned + GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8); - /// 64 bit double-precision floating-point aligned scalar. + /// 64 bit double-qualifier floating-point aligned scalar. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8); +# endif//GLM_FORCE_SINGLE_ONLY - /// Single-precision floating-point aligned vector of 1 component. + + /// Single-qualifier floating-point aligned vector of 1 component. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4); - /// Single-precision floating-point aligned vector of 2 components. + /// Single-qualifier floating-point aligned vector of 2 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8); - /// Single-precision floating-point aligned vector of 3 components. + /// Single-qualifier floating-point aligned vector of 3 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16); - /// Single-precision floating-point aligned vector of 4 components. + /// Single-qualifier floating-point aligned vector of 4 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16); - /// Single-precision floating-point aligned vector of 1 component. + /// Single-qualifier floating-point aligned vector of 1 component. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4); - /// Single-precision floating-point aligned vector of 2 components. + /// Single-qualifier floating-point aligned vector of 2 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8); - /// Single-precision floating-point aligned vector of 3 components. + /// Single-qualifier floating-point aligned vector of 3 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16); - /// Single-precision floating-point aligned vector of 4 components. + /// Single-qualifier floating-point aligned vector of 4 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16); - - /// Single-precision floating-point aligned vector of 1 component. + + /// Single-qualifier floating-point aligned vector of 1 component. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4); - /// Single-precision floating-point aligned vector of 2 components. + /// Single-qualifier floating-point aligned vector of 2 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8); - /// Single-precision floating-point aligned vector of 3 components. + /// Single-qualifier floating-point aligned vector of 3 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16); - /// Single-precision floating-point aligned vector of 4 components. + /// Single-qualifier floating-point aligned vector of 4 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16); - /// Double-precision floating-point aligned vector of 1 component. + /// Double-qualifier floating-point aligned vector of 1 component. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8); - /// Double-precision floating-point aligned vector of 2 components. + /// Double-qualifier floating-point aligned vector of 2 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16); - /// Double-precision floating-point aligned vector of 3 components. + /// Double-qualifier floating-point aligned vector of 3 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32); - /// Double-precision floating-point aligned vector of 4 components. + /// Double-qualifier floating-point aligned vector of 4 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32); - /// Double-precision floating-point aligned vector of 1 component. +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned vector of 1 component. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8); - /// Double-precision floating-point aligned vector of 2 components. + /// Double-qualifier floating-point aligned vector of 2 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16); - /// Double-precision floating-point aligned vector of 3 components. + /// Double-qualifier floating-point aligned vector of 3 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32); - /// Double-precision floating-point aligned vector of 4 components. + /// Double-qualifier floating-point aligned vector of 4 components. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32); +# endif//GLM_FORCE_SINGLE_ONLY ////////////////////// - // Float matrix types + // Float matrix types - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef detail::tmat1<f32> mat1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16); - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef detail::tmat1x1<f32> mat1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16); - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef detail::tmat1x1<f32> fmat1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16); - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef f32 fmat1x1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16); - /// Single-precision floating-point aligned 2x3 matrix. + /// Single-qualifier floating-point aligned 2x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16); - /// Single-precision floating-point aligned 2x4 matrix. + /// Single-qualifier floating-point aligned 2x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16); - /// Single-precision floating-point aligned 3x2 matrix. + /// Single-qualifier floating-point aligned 3x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16); - /// Single-precision floating-point aligned 3x4 matrix. + /// Single-qualifier floating-point aligned 3x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16); - /// Single-precision floating-point aligned 4x2 matrix. + /// Single-qualifier floating-point aligned 4x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16); - /// Single-precision floating-point aligned 4x3 matrix. + /// Single-qualifier floating-point aligned 4x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16); - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef detail::tmat1x1<f32, defaultp> f32mat1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16); - /// Single-precision floating-point aligned 1x1 matrix. + /// Single-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef f32 f32mat1x1; - /// Single-precision floating-point aligned 2x2 matrix. + /// Single-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16); - /// Single-precision floating-point aligned 2x3 matrix. + /// Single-qualifier floating-point aligned 2x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16); - /// Single-precision floating-point aligned 2x4 matrix. + /// Single-qualifier floating-point aligned 2x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16); - /// Single-precision floating-point aligned 3x2 matrix. + /// Single-qualifier floating-point aligned 3x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16); - /// Single-precision floating-point aligned 3x3 matrix. + /// Single-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16); - /// Single-precision floating-point aligned 3x4 matrix. + /// Single-qualifier floating-point aligned 3x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16); - /// Single-precision floating-point aligned 4x2 matrix. + /// Single-qualifier floating-point aligned 4x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16); - /// Single-precision floating-point aligned 4x3 matrix. + /// Single-qualifier floating-point aligned 4x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16); - /// Single-precision floating-point aligned 4x4 matrix. + /// Single-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16); - /// Double-precision floating-point aligned 1x1 matrix. +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef detail::tmat1x1<f64, defaultp> f64mat1; - /// Double-precision floating-point aligned 2x2 matrix. + /// Double-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32); - /// Double-precision floating-point aligned 3x3 matrix. + /// Double-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32); - /// Double-precision floating-point aligned 4x4 matrix. + /// Double-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32); - /// Double-precision floating-point aligned 1x1 matrix. + /// Double-qualifier floating-point aligned 1x1 matrix. /// @see gtx_type_aligned //typedef f64 f64mat1x1; - /// Double-precision floating-point aligned 2x2 matrix. + /// Double-qualifier floating-point aligned 2x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32); - /// Double-precision floating-point aligned 2x3 matrix. + /// Double-qualifier floating-point aligned 2x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32); - /// Double-precision floating-point aligned 2x4 matrix. + /// Double-qualifier floating-point aligned 2x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32); - /// Double-precision floating-point aligned 3x2 matrix. + /// Double-qualifier floating-point aligned 3x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32); - /// Double-precision floating-point aligned 3x3 matrix. + /// Double-qualifier floating-point aligned 3x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32); - /// Double-precision floating-point aligned 3x4 matrix. + /// Double-qualifier floating-point aligned 3x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32); - /// Double-precision floating-point aligned 4x2 matrix. + /// Double-qualifier floating-point aligned 4x2 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32); - /// Double-precision floating-point aligned 4x3 matrix. + /// Double-qualifier floating-point aligned 4x3 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32); - /// Double-precision floating-point aligned 4x4 matrix. + /// Double-qualifier floating-point aligned 4x4 matrix. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32); +# endif//GLM_FORCE_SINGLE_ONLY + ////////////////////////// // Quaternion types - /// Single-precision floating-point aligned quaternion. + /// Single-qualifier floating-point aligned quaternion. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16); - /// Single-precision floating-point aligned quaternion. + /// Single-qualifier floating-point aligned quaternion. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(fquat, aligned_fquat, 16); - /// Double-precision floating-point aligned quaternion. + /// Double-qualifier floating-point aligned quaternion. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32); - /// Single-precision floating-point aligned quaternion. + /// Single-qualifier floating-point aligned quaternion. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16); - /// Double-precision floating-point aligned quaternion. +# ifndef GLM_FORCE_SINGLE_ONLY + + /// Double-qualifier floating-point aligned quaternion. /// @see gtx_type_aligned GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32); +# endif//GLM_FORCE_SINGLE_ONLY + /// @} }//namespace glm diff --git a/external/include/glm/gtx/type_trait.hpp b/external/include/glm/gtx/type_trait.hpp index 0207a06..637bbd1 100644 --- a/external/include/glm/gtx/type_trait.hpp +++ b/external/include/glm/gtx/type_trait.hpp @@ -6,25 +6,18 @@ /// @defgroup gtx_type_trait GLM_GTX_type_trait /// @ingroup gtx /// -/// @brief Defines traits for each type. +/// Include <glm/gtx/type_trait.hpp> to use the features of this extension. /// -/// <glm/gtx/type_trait.hpp> need to be included to use these functionalities. +/// Defines traits for each type. #pragma once +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_type_trait is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + // Dependency: -#include "../detail/type_vec2.hpp" -#include "../detail/type_vec3.hpp" -#include "../detail/type_vec4.hpp" -#include "../detail/type_mat2x2.hpp" -#include "../detail/type_mat2x3.hpp" -#include "../detail/type_mat2x4.hpp" -#include "../detail/type_mat3x2.hpp" -#include "../detail/type_mat3x3.hpp" -#include "../detail/type_mat3x4.hpp" -#include "../detail/type_mat4x2.hpp" -#include "../detail/type_mat4x3.hpp" -#include "../detail/type_mat4x4.hpp" +#include "../detail/qualifier.hpp" #include "../gtc/quaternion.hpp" #include "../gtx/dual_quaternion.hpp" @@ -37,7 +30,7 @@ namespace glm /// @addtogroup gtx_type_trait /// @{ - template <template <typename, precision> class genType, typename T, precision P> + template<typename T> struct type { static bool const is_vec = false; @@ -48,202 +41,42 @@ namespace glm static length_t const rows = 0; }; - template <typename T, precision P> - struct type<tvec1, T, P> - { - static bool const is_vec = true; - static bool const is_mat = false; - static bool const is_quat = false; - enum - { - components = 1 - }; - }; - - template <typename T, precision P> - struct type<tvec2, T, P> - { - static bool const is_vec = true; - static bool const is_mat = false; - static bool const is_quat = false; - enum - { - components = 2 - }; - }; - - template <typename T, precision P> - struct type<tvec3, T, P> - { - static bool const is_vec = true; - static bool const is_mat = false; - static bool const is_quat = false; - enum - { - components = 3 - }; - }; - - template <typename T, precision P> - struct type<tvec4, T, P> + template<length_t L, typename T, qualifier Q> + struct type<vec<L, T, Q> > { static bool const is_vec = true; static bool const is_mat = false; static bool const is_quat = false; - enum - { - components = 4 - }; - }; - - template <typename T, precision P> - struct type<tmat2x2, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 2, - cols = 2, - rows = 2 - }; - }; - - template <typename T, precision P> - struct type<tmat2x3, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 2, - cols = 2, - rows = 3 - }; - }; - - template <typename T, precision P> - struct type<tmat2x4, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 2, - cols = 2, - rows = 4 - }; - }; - - template <typename T, precision P> - struct type<tmat3x2, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 3, - cols = 3, - rows = 2 - }; - }; - - template <typename T, precision P> - struct type<tmat3x3, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 3, - cols = 3, - rows = 3 - }; - }; - - template <typename T, precision P> - struct type<tmat3x4, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 3, - cols = 3, - rows = 4 - }; - }; - - template <typename T, precision P> - struct type<tmat4x2, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 4, - cols = 4, - rows = 2 - }; - }; - - template <typename T, precision P> - struct type<tmat4x3, T, P> - { - static bool const is_vec = false; - static bool const is_mat = true; - static bool const is_quat = false; - enum - { - components = 4, - cols = 4, - rows = 3 - }; + static length_t const components = L; }; - template <typename T, precision P> - struct type<tmat4x4, T, P> + template<length_t C, length_t R, typename T, qualifier Q> + struct type<mat<C, R, T, Q> > { static bool const is_vec = false; static bool const is_mat = true; static bool const is_quat = false; - enum - { - components = 4, - cols = 4, - rows = 4 - }; + static length_t const components = C; + static length_t const cols = C; + static length_t const rows = R; }; - template <typename T, precision P> - struct type<tquat, T, P> + template<typename T, qualifier Q> + struct type<tquat<T, Q> > { static bool const is_vec = false; static bool const is_mat = false; static bool const is_quat = true; - enum - { - components = 4 - }; + static length_t const components = 4; }; - template <typename T, precision P> - struct type<tdualquat, T, P> + template<typename T, qualifier Q> + struct type<tdualquat<T, Q> > { static bool const is_vec = false; static bool const is_mat = false; static bool const is_quat = true; - enum - { - components = 8 - }; + static length_t const components = 8; }; /// @} diff --git a/external/include/glm/gtx/type_trait.inl b/external/include/glm/gtx/type_trait.inl index e69de29..1cdf332 100644 --- a/external/include/glm/gtx/type_trait.inl +++ b/external/include/glm/gtx/type_trait.inl @@ -0,0 +1,62 @@ +/// @ref gtx_type_trait +/// @file glm/gtx/type_trait.inl + +namespace glm +{ + template<typename T> + bool const type<T>::is_vec; + template<typename T> + bool const type<T>::is_mat; + template<typename T> + bool const type<T>::is_quat; + template<typename T> + length_t const type<T>::components; + template<typename T> + length_t const type<T>::cols; + template<typename T> + length_t const type<T>::rows; + + // vec + template<length_t L, typename T, qualifier Q> + bool const type<vec<L, T, Q> >::is_vec; + template<length_t L, typename T, qualifier Q> + bool const type<vec<L, T, Q> >::is_mat; + template<length_t L, typename T, qualifier Q> + bool const type<vec<L, T, Q> >::is_quat; + template<length_t L, typename T, qualifier Q> + length_t const type<vec<L, T, Q> >::components; + + // mat + template<length_t C, length_t R, typename T, qualifier Q> + bool const type<mat<C, R, T, Q> >::is_vec; + template<length_t C, length_t R, typename T, qualifier Q> + bool const type<mat<C, R, T, Q> >::is_mat; + template<length_t C, length_t R, typename T, qualifier Q> + bool const type<mat<C, R, T, Q> >::is_quat; + template<length_t C, length_t R, typename T, qualifier Q> + length_t const type<mat<C, R, T, Q> >::components; + template<length_t C, length_t R, typename T, qualifier Q> + length_t const type<mat<C, R, T, Q> >::cols; + template<length_t C, length_t R, typename T, qualifier Q> + length_t const type<mat<C, R, T, Q> >::rows; + + // tquat + template<typename T, qualifier Q> + bool const type<tquat<T, Q> >::is_vec; + template<typename T, qualifier Q> + bool const type<tquat<T, Q> >::is_mat; + template<typename T, qualifier Q> + bool const type<tquat<T, Q> >::is_quat; + template<typename T, qualifier Q> + length_t const type<tquat<T, Q> >::components; + + // tdualquat + template<typename T, qualifier Q> + bool const type<tdualquat<T, Q> >::is_vec; + template<typename T, qualifier Q> + bool const type<tdualquat<T, Q> >::is_mat; + template<typename T, qualifier Q> + bool const type<tdualquat<T, Q> >::is_quat; + template<typename T, qualifier Q> + length_t const type<tdualquat<T, Q> >::components; +}//namespace glm diff --git a/external/include/glm/gtx/vec_swizzle.hpp b/external/include/glm/gtx/vec_swizzle.hpp new file mode 100644 index 0000000..daebac3 --- /dev/null +++ b/external/include/glm/gtx/vec_swizzle.hpp @@ -0,0 +1,2778 @@ +/// @ref gtx_vec_swizzle +/// @file glm/gtx/vec_swizzle.hpp +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vec_swizzle GLM_GTX_vec_swizzle +/// @ingroup gtx +/// +/// Include <glm/gtx/vec_swizzle.hpp> to use the features of this extension. +/// +/// Functions to perform swizzle operation. + +#pragma once + +#include "../glm.hpp" + +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + +namespace glm { + // xx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.x); + } + + // xy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.y); + } + + // xz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.z); + } + + // xw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.x, v.w); + } + + // yx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.x); + } + + // yy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.y); + } + + // yz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.z); + } + + // yw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.y, v.w); + } + + // zx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.x); + } + + // zy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.y); + } + + // zz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.z); + } + + // zw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.z, v.w); + } + + // wx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.x); + } + + // wy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.y); + } + + // wz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.z); + } + + // ww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) { + return glm::vec<2, T, Q>(v.w, v.w); + } + + // xxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.x); + } + + // xxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.y); + } + + // xxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.z); + } + + // xxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.x, v.w); + } + + // xyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.x); + } + + // xyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.y); + } + + // xyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.z); + } + + // xyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.y, v.w); + } + + // xzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.x); + } + + // xzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.y); + } + + // xzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.z); + } + + // xzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.z, v.w); + } + + // xwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.x); + } + + // xwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.y); + } + + // xwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.z); + } + + // xww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.x, v.w, v.w); + } + + // yxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.x); + } + + // yxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.y); + } + + // yxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.z); + } + + // yxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.x, v.w); + } + + // yyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.x); + } + + // yyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.y); + } + + // yyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.z); + } + + // yyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.y, v.w); + } + + // yzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.x); + } + + // yzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.y); + } + + // yzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.z); + } + + // yzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.z, v.w); + } + + // ywx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.x); + } + + // ywy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.y); + } + + // ywz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.z); + } + + // yww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.y, v.w, v.w); + } + + // zxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.x); + } + + // zxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.y); + } + + // zxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.z); + } + + // zxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.x, v.w); + } + + // zyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.x); + } + + // zyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.y); + } + + // zyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.z); + } + + // zyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.y, v.w); + } + + // zzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.x); + } + + // zzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.y); + } + + // zzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.z); + } + + // zzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.z, v.w); + } + + // zwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.x); + } + + // zwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.y); + } + + // zwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.z); + } + + // zww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.z, v.w, v.w); + } + + // wxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.x); + } + + // wxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.y); + } + + // wxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.z); + } + + // wxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.x, v.w); + } + + // wyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.x); + } + + // wyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.y); + } + + // wyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.z); + } + + // wyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.y, v.w); + } + + // wzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.x); + } + + // wzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.y); + } + + // wzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.z); + } + + // wzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.z, v.w); + } + + // wwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.x); + } + + // wwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.y); + } + + // wwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.z); + } + + // www + template<typename T, qualifier Q> + GLM_INLINE glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) { + return glm::vec<3, T, Q>(v.w, v.w, v.w); + } + + // xxxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x); + } + + // xxxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y); + } + + // xxxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z); + } + + // xxxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.x, v.w); + } + + // xxyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x); + } + + // xxyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y); + } + + // xxyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z); + } + + // xxyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.y, v.w); + } + + // xxzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x); + } + + // xxzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y); + } + + // xxzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z); + } + + // xxzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.z, v.w); + } + + // xxwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.x); + } + + // xxwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.y); + } + + // xxwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.z); + } + + // xxww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.x, v.w, v.w); + } + + // xyxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x); + } + + // xyxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y); + } + + // xyxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z); + } + + // xyxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.x, v.w); + } + + // xyyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x); + } + + // xyyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y); + } + + // xyyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z); + } + + // xyyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.y, v.w); + } + + // xyzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x); + } + + // xyzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y); + } + + // xyzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z); + } + + // xyzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.z, v.w); + } + + // xywx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.x); + } + + // xywy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.y); + } + + // xywz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.z); + } + + // xyww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.y, v.w, v.w); + } + + // xzxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x); + } + + // xzxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y); + } + + // xzxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z); + } + + // xzxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.x, v.w); + } + + // xzyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x); + } + + // xzyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y); + } + + // xzyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z); + } + + // xzyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.y, v.w); + } + + // xzzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x); + } + + // xzzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y); + } + + // xzzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z); + } + + // xzzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.z, v.w); + } + + // xzwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.x); + } + + // xzwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.y); + } + + // xzwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.z); + } + + // xzww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.z, v.w, v.w); + } + + // xwxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.x); + } + + // xwxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.y); + } + + // xwxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.z); + } + + // xwxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.x, v.w); + } + + // xwyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.x); + } + + // xwyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.y); + } + + // xwyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.z); + } + + // xwyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.y, v.w); + } + + // xwzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.x); + } + + // xwzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.y); + } + + // xwzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.z); + } + + // xwzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.z, v.w); + } + + // xwwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.x); + } + + // xwwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.y); + } + + // xwwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.z); + } + + // xwww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.x, v.w, v.w, v.w); + } + + // yxxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x); + } + + // yxxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y); + } + + // yxxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z); + } + + // yxxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.x, v.w); + } + + // yxyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x); + } + + // yxyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y); + } + + // yxyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z); + } + + // yxyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.y, v.w); + } + + // yxzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x); + } + + // yxzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y); + } + + // yxzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z); + } + + // yxzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.z, v.w); + } + + // yxwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.x); + } + + // yxwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.y); + } + + // yxwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.z); + } + + // yxww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.x, v.w, v.w); + } + + // yyxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x); + } + + // yyxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y); + } + + // yyxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z); + } + + // yyxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.x, v.w); + } + + // yyyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x); + } + + // yyyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y); + } + + // yyyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z); + } + + // yyyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.y, v.w); + } + + // yyzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x); + } + + // yyzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y); + } + + // yyzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z); + } + + // yyzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.z, v.w); + } + + // yywx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.x); + } + + // yywy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.y); + } + + // yywz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.z); + } + + // yyww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.y, v.w, v.w); + } + + // yzxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x); + } + + // yzxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y); + } + + // yzxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z); + } + + // yzxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.x, v.w); + } + + // yzyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x); + } + + // yzyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y); + } + + // yzyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z); + } + + // yzyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.y, v.w); + } + + // yzzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x); + } + + // yzzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y); + } + + // yzzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z); + } + + // yzzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.z, v.w); + } + + // yzwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.x); + } + + // yzwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.y); + } + + // yzwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.z); + } + + // yzww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.z, v.w, v.w); + } + + // ywxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.x); + } + + // ywxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.y); + } + + // ywxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.z); + } + + // ywxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.x, v.w); + } + + // ywyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.x); + } + + // ywyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.y); + } + + // ywyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.z); + } + + // ywyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.y, v.w); + } + + // ywzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.x); + } + + // ywzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.y); + } + + // ywzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.z); + } + + // ywzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.z, v.w); + } + + // ywwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.x); + } + + // ywwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.y); + } + + // ywwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.z); + } + + // ywww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.y, v.w, v.w, v.w); + } + + // zxxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x); + } + + // zxxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y); + } + + // zxxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z); + } + + // zxxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.x, v.w); + } + + // zxyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x); + } + + // zxyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y); + } + + // zxyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z); + } + + // zxyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.y, v.w); + } + + // zxzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x); + } + + // zxzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y); + } + + // zxzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z); + } + + // zxzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.z, v.w); + } + + // zxwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.x); + } + + // zxwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.y); + } + + // zxwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.z); + } + + // zxww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.x, v.w, v.w); + } + + // zyxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x); + } + + // zyxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y); + } + + // zyxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z); + } + + // zyxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.x, v.w); + } + + // zyyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x); + } + + // zyyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y); + } + + // zyyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z); + } + + // zyyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.y, v.w); + } + + // zyzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x); + } + + // zyzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y); + } + + // zyzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z); + } + + // zyzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.z, v.w); + } + + // zywx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.x); + } + + // zywy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.y); + } + + // zywz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.z); + } + + // zyww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.y, v.w, v.w); + } + + // zzxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x); + } + + // zzxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y); + } + + // zzxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z); + } + + // zzxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.x, v.w); + } + + // zzyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x); + } + + // zzyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y); + } + + // zzyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z); + } + + // zzyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.y, v.w); + } + + // zzzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x); + } + + // zzzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y); + } + + // zzzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z); + } + + // zzzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.z, v.w); + } + + // zzwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.x); + } + + // zzwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.y); + } + + // zzwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.z); + } + + // zzww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.z, v.w, v.w); + } + + // zwxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.x); + } + + // zwxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.y); + } + + // zwxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.z); + } + + // zwxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.x, v.w); + } + + // zwyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.x); + } + + // zwyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.y); + } + + // zwyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.z); + } + + // zwyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.y, v.w); + } + + // zwzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.x); + } + + // zwzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.y); + } + + // zwzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.z); + } + + // zwzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.z, v.w); + } + + // zwwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.x); + } + + // zwwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.y); + } + + // zwwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.z); + } + + // zwww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.z, v.w, v.w, v.w); + } + + // wxxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.x); + } + + // wxxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.y); + } + + // wxxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.z); + } + + // wxxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.x, v.w); + } + + // wxyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.x); + } + + // wxyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.y); + } + + // wxyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.z); + } + + // wxyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.y, v.w); + } + + // wxzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.x); + } + + // wxzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.y); + } + + // wxzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.z); + } + + // wxzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.z, v.w); + } + + // wxwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.x); + } + + // wxwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.y); + } + + // wxwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.z); + } + + // wxww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.x, v.w, v.w); + } + + // wyxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.x); + } + + // wyxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.y); + } + + // wyxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.z); + } + + // wyxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.x, v.w); + } + + // wyyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.x); + } + + // wyyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.y); + } + + // wyyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.z); + } + + // wyyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.y, v.w); + } + + // wyzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.x); + } + + // wyzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.y); + } + + // wyzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.z); + } + + // wyzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.z, v.w); + } + + // wywx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.x); + } + + // wywy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.y); + } + + // wywz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.z); + } + + // wyww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.y, v.w, v.w); + } + + // wzxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.x); + } + + // wzxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.y); + } + + // wzxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.z); + } + + // wzxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.x, v.w); + } + + // wzyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.x); + } + + // wzyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.y); + } + + // wzyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.z); + } + + // wzyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.y, v.w); + } + + // wzzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.x); + } + + // wzzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.y); + } + + // wzzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.z); + } + + // wzzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.z, v.w); + } + + // wzwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.x); + } + + // wzwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.y); + } + + // wzwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.z); + } + + // wzww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.z, v.w, v.w); + } + + // wwxx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.x); + } + + // wwxy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.y); + } + + // wwxz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.z); + } + + // wwxw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.x, v.w); + } + + // wwyx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.x); + } + + // wwyy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.y); + } + + // wwyz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.z); + } + + // wwyw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.y, v.w); + } + + // wwzx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.x); + } + + // wwzy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.y); + } + + // wwzz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.z); + } + + // wwzw + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.z, v.w); + } + + // wwwx + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.x); + } + + // wwwy + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.y); + } + + // wwwz + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.z); + } + + // wwww + template<typename T, qualifier Q> + GLM_INLINE glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) { + return glm::vec<4, T, Q>(v.w, v.w, v.w, v.w); + } + +} diff --git a/external/include/glm/gtx/vector_angle.hpp b/external/include/glm/gtx/vector_angle.hpp index d52d3f8..401a47e 100644 --- a/external/include/glm/gtx/vector_angle.hpp +++ b/external/include/glm/gtx/vector_angle.hpp @@ -8,9 +8,9 @@ /// @defgroup gtx_vector_angle GLM_GTX_vector_angle /// @ingroup gtx /// -/// @brief Compute angle between vectors +/// Include <glm/gtx/vector_angle.hpp> to use the features of this extension. /// -/// <glm/gtx/vector_angle.hpp> need to be included to use these functionalities. +/// Compute angle between vectors #pragma once @@ -20,6 +20,10 @@ #include "../gtx/quaternion.hpp" #include "../gtx/rotate_vector.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_vector_angle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_vector_angle extension included") #endif @@ -32,27 +36,20 @@ namespace glm //! Returns the absolute angle between two vectors. //! Parameters need to be normalized. /// @see gtx_vector_angle extension. - template <typename vecType> - GLM_FUNC_DECL typename vecType::value_type angle( - vecType const & x, - vecType const & y); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL T angle(vec<L, T, Q> const& x, vec<L, T, Q> const& y); //! Returns the oriented angle between two 2d vectors. //! Parameters need to be normalized. /// @see gtx_vector_angle extension. - template <typename T, precision P> - GLM_FUNC_DECL T orientedAngle( - tvec2<T, P> const & x, - tvec2<T, P> const & y); + template<typename T, qualifier Q> + GLM_FUNC_DECL T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y); //! Returns the oriented angle between two 3d vectors based from a reference axis. //! Parameters need to be normalized. /// @see gtx_vector_angle extension. - template <typename T, precision P> - GLM_FUNC_DECL T orientedAngle( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - tvec3<T, P> const & ref); + template<typename T, qualifier Q> + GLM_FUNC_DECL T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref); /// @} }// namespace glm diff --git a/external/include/glm/gtx/vector_angle.inl b/external/include/glm/gtx/vector_angle.inl index 05c3028..38f8b8c 100644 --- a/external/include/glm/gtx/vector_angle.inl +++ b/external/include/glm/gtx/vector_angle.inl @@ -3,35 +3,27 @@ namespace glm { - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType angle ( - genType const & x, - genType const & y + genType const& x, + genType const& y ) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'angle' only accept floating-point inputs"); return acos(clamp(dot(x, y), genType(-1), genType(1))); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER T angle - ( - vecType<T, P> const & x, - vecType<T, P> const & y - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER T angle(vec<L, T, Q> const& x, vec<L, T, Q> const& y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'angle' only accept floating-point inputs"); return acos(clamp(dot(x, y), T(-1), T(1))); } //! \todo epsilon is hard coded to 0.01 - template <typename T, precision P> - GLM_FUNC_QUALIFIER T orientedAngle - ( - tvec2<T, P> const & x, - tvec2<T, P> const & y - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'orientedAngle' only accept floating-point inputs"); T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); @@ -42,13 +34,8 @@ namespace glm return -Angle; } - template <typename T, precision P> - GLM_FUNC_QUALIFIER T orientedAngle - ( - tvec3<T, P> const & x, - tvec3<T, P> const & y, - tvec3<T, P> const & ref - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'orientedAngle' only accept floating-point inputs"); diff --git a/external/include/glm/gtx/vector_query.hpp b/external/include/glm/gtx/vector_query.hpp index 2c0d022..52ba57b 100644 --- a/external/include/glm/gtx/vector_query.hpp +++ b/external/include/glm/gtx/vector_query.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_vector_query GLM_GTX_vector_query /// @ingroup gtx /// -/// @brief Query informations of vector types +/// Include <glm/gtx/vector_query.hpp> to use the features of this extension. /// -/// <glm/gtx/vector_query.hpp> need to be included to use these functionalities. +/// Query informations of vector types #pragma once @@ -17,6 +17,10 @@ #include <cfloat> #include <limits> +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_vector_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_vector_query extension included") #endif @@ -28,33 +32,33 @@ namespace glm //! Check whether two vectors are collinears. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool areCollinear(vecType<T, P> const & v0, vecType<T, P> const & v1, T const & epsilon); - + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL bool areCollinear(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon); + //! Check whether two vectors are orthogonals. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool areOrthogonal(vecType<T, P> const & v0, vecType<T, P> const & v1, T const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL bool areOrthogonal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon); //! Check whether a vector is normalized. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool isNormalized(vecType<T, P> const & v, T const & epsilon); - + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL bool isNormalized(vec<L, T, Q> const& v, T const& epsilon); + //! Check whether a vector is null. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool isNull(vecType<T, P> const & v, T const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL bool isNull(vec<L, T, Q> const& v, T const& epsilon); //! Check whether a each component of a vector is null. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL vecType<bool, P> isCompNull(vecType<T, P> const & v, T const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> isCompNull(vec<L, T, Q> const& v, T const& epsilon); //! Check whether two vectors are orthonormal. /// @see gtx_vector_query extensions. - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_DECL bool areOrthonormal(vecType<T, P> const & v0, vecType<T, P> const & v1, T const & epsilon); + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL bool areOrthonormal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon); /// @} }// namespace glm diff --git a/external/include/glm/gtx/vector_query.inl b/external/include/glm/gtx/vector_query.inl index 85ea5e5..0d8cddc 100644 --- a/external/include/glm/gtx/vector_query.inl +++ b/external/include/glm/gtx/vector_query.inl @@ -6,68 +6,68 @@ namespace glm{ namespace detail { - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct compute_areCollinear{}; - template <typename T, precision P> - struct compute_areCollinear<T, P, tvec2> + template<typename T, qualifier Q> + struct compute_areCollinear<2, T, Q> { - GLM_FUNC_QUALIFIER static bool call(tvec2<T, P> const & v0, tvec2<T, P> const & v1, T const & epsilon) + GLM_FUNC_QUALIFIER static bool call(vec<2, T, Q> const& v0, vec<2, T, Q> const& v1, T const& epsilon) { - return length(cross(tvec3<T, P>(v0, static_cast<T>(0)), tvec3<T, P>(v1, static_cast<T>(0)))) < epsilon; + return length(cross(vec<3, T, Q>(v0, static_cast<T>(0)), vec<3, T, Q>(v1, static_cast<T>(0)))) < epsilon; } }; - template <typename T, precision P> - struct compute_areCollinear<T, P, tvec3> + template<typename T, qualifier Q> + struct compute_areCollinear<3, T, Q> { - GLM_FUNC_QUALIFIER static bool call(tvec3<T, P> const & v0, tvec3<T, P> const & v1, T const & epsilon) + GLM_FUNC_QUALIFIER static bool call(vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, T const& epsilon) { return length(cross(v0, v1)) < epsilon; } }; - template <typename T, precision P> - struct compute_areCollinear<T, P, tvec4> + template<typename T, qualifier Q> + struct compute_areCollinear<4, T, Q> { - GLM_FUNC_QUALIFIER static bool call(tvec4<T, P> const & v0, tvec4<T, P> const & v1, T const & epsilon) + GLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v0, vec<4, T, Q> const& v1, T const& epsilon) { - return length(cross(tvec3<T, P>(v0), tvec3<T, P>(v1))) < epsilon; + return length(cross(vec<3, T, Q>(v0), vec<3, T, Q>(v1))) < epsilon; } }; - template <typename T, precision P, template <typename, precision> class vecType> + template<length_t L, typename T, qualifier Q> struct compute_isCompNull{}; - template <typename T, precision P> - struct compute_isCompNull<T, P, tvec2> + template<typename T, qualifier Q> + struct compute_isCompNull<2, T, Q> { - GLM_FUNC_QUALIFIER static tvec2<bool, P> call(tvec2<T, P> const & v, T const & epsilon) + GLM_FUNC_QUALIFIER static vec<2, bool, Q> call(vec<2, T, Q> const& v, T const& epsilon) { - return tvec2<bool, P>( + return vec<2, bool, Q>( (abs(v.x) < epsilon), (abs(v.y) < epsilon)); } }; - template <typename T, precision P> - struct compute_isCompNull<T, P, tvec3> + template<typename T, qualifier Q> + struct compute_isCompNull<3, T, Q> { - GLM_FUNC_QUALIFIER static tvec3<bool, P> call(tvec3<T, P> const & v, T const & epsilon) + GLM_FUNC_QUALIFIER static vec<3, bool, Q> call(vec<3, T, Q> const& v, T const& epsilon) { - return tvec3<bool, P>( + return vec<3, bool, Q>( (abs(v.x) < epsilon), (abs(v.y) < epsilon), (abs(v.z) < epsilon)); } }; - template <typename T, precision P> - struct compute_isCompNull<T, P, tvec4> + template<typename T, qualifier Q> + struct compute_isCompNull<4, T, Q> { - GLM_FUNC_QUALIFIER static tvec4<bool, P> call(tvec4<T, P> const & v, T const & epsilon) + GLM_FUNC_QUALIFIER static vec<4, bool, Q> call(vec<4, T, Q> const& v, T const& epsilon) { - return tvec4<bool, P>( + return vec<4, bool, Q>( (abs(v.x) < epsilon), (abs(v.y) < epsilon), (abs(v.z) < epsilon), @@ -77,26 +77,16 @@ namespace detail }//namespace detail - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool areCollinear - ( - vecType<T, P> const & v0, - vecType<T, P> const & v1, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool areCollinear(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'areCollinear' only accept floating-point inputs"); - return detail::compute_areCollinear<T, P, vecType>::call(v0, v1, epsilon); + return detail::compute_areCollinear<L, T, Q>::call(v0, v1, epsilon); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool areOrthogonal - ( - vecType<T, P> const & v0, - vecType<T, P> const & v1, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool areOrthogonal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'areOrthogonal' only accept floating-point inputs"); @@ -105,87 +95,59 @@ namespace detail length(v0)) * max(static_cast<T>(1), length(v1)) * epsilon; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool isNormalized - ( - vecType<T, P> const & v, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNormalized(vec<L, T, Q> const& v, T const& epsilon) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isNormalized' only accept floating-point inputs"); return abs(length(v) - static_cast<T>(1)) <= static_cast<T>(2) * epsilon; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool isNull - ( - vecType<T, P> const & v, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool isNull(vec<L, T, Q> const& v, T const& epsilon) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isNull' only accept floating-point inputs"); return length(v) <= epsilon; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<bool, P> isCompNull - ( - vecType<T, P> const & v, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, bool, Q> isCompNull(vec<L, T, Q> const& v, T const& epsilon) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isCompNull' only accept floating-point inputs"); - return detail::compute_isCompNull<T, P, vecType>::call(v, epsilon); + return detail::compute_isCompNull<L, T, Q>::call(v, epsilon); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec2<bool, P> isCompNull - ( - tvec2<T, P> const & v, - T const & epsilon) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<2, bool, Q> isCompNull(vec<2, T, Q> const& v, T const& epsilon) { - return tvec2<bool, P>( + return vec<2, bool, Q>( abs(v.x) < epsilon, abs(v.y) < epsilon); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec3<bool, P> isCompNull - ( - tvec3<T, P> const & v, - T const & epsilon - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<3, bool, Q> isCompNull(vec<3, T, Q> const& v, T const& epsilon) { - return tvec3<bool, P>( + return vec<3, bool, Q>( abs(v.x) < epsilon, abs(v.y) < epsilon, abs(v.z) < epsilon); } - template <typename T, precision P> - GLM_FUNC_QUALIFIER tvec4<bool, P> isCompNull - ( - tvec4<T, P> const & v, - T const & epsilon - ) + template<typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<4, bool, Q> isCompNull(vec<4, T, Q> const& v, T const& epsilon) { - return tvec4<bool, P>( + return vec<4, bool, Q>( abs(v.x) < epsilon, abs(v.y) < epsilon, abs(v.z) < epsilon, abs(v.w) < epsilon); } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER bool areOrthonormal - ( - vecType<T, P> const & v0, - vecType<T, P> const & v1, - T const & epsilon - ) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER bool areOrthonormal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon) { return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); } diff --git a/external/include/glm/gtx/wrap.hpp b/external/include/glm/gtx/wrap.hpp index 0060073..2c4b55d 100644 --- a/external/include/glm/gtx/wrap.hpp +++ b/external/include/glm/gtx/wrap.hpp @@ -6,9 +6,9 @@ /// @defgroup gtx_wrap GLM_GTX_wrap /// @ingroup gtx /// -/// @brief Wrapping mode of texture coordinates. +/// Include <glm/gtx/wrap.hpp> to use the features of this extension. /// -/// <glm/gtx/wrap.hpp> need to be included to use these functionalities. +/// Wrapping mode of texture coordinates. #pragma once @@ -16,6 +16,10 @@ #include "../glm.hpp" #include "../gtc/vec1.hpp" +#ifndef GLM_ENABLE_EXPERIMENTAL +# error "GLM: GLM_GTX_wrap is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it." +#endif + #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_wrap extension included") #endif @@ -27,22 +31,22 @@ namespace glm /// Simulate GL_CLAMP OpenGL wrap mode /// @see gtx_wrap extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType clamp(genType const& Texcoord); /// Simulate GL_REPEAT OpenGL wrap mode /// @see gtx_wrap extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType repeat(genType const& Texcoord); /// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode /// @see gtx_wrap extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType mirrorClamp(genType const& Texcoord); /// Simulate GL_MIRROR_REPEAT OpenGL wrap mode /// @see gtx_wrap extension. - template <typename genType> + template<typename genType> GLM_FUNC_DECL genType mirrorRepeat(genType const& Texcoord); /// @} diff --git a/external/include/glm/gtx/wrap.inl b/external/include/glm/gtx/wrap.inl index 941a803..83e350f 100644 --- a/external/include/glm/gtx/wrap.inl +++ b/external/include/glm/gtx/wrap.inl @@ -3,56 +3,56 @@ namespace glm { - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const& Texcoord) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& Texcoord) { - return glm::clamp(Texcoord, vecType<T, P>(0), vecType<T, P>(1)); + return glm::clamp(Texcoord, vec<L, T, Q>(0), vec<L, T, Q>(1)); } - template <typename genType> - GLM_FUNC_QUALIFIER genType clamp(genType const & Texcoord) + template<typename genType> + GLM_FUNC_QUALIFIER genType clamp(genType const& Texcoord) { - return clamp(tvec1<genType, defaultp>(Texcoord)).x; + return clamp(vec<1, genType, defaultp>(Texcoord)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> repeat(vecType<T, P> const& Texcoord) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> repeat(vec<L, T, Q> const& Texcoord) { return glm::fract(Texcoord); } - template <typename genType> - GLM_FUNC_QUALIFIER genType repeat(genType const & Texcoord) + template<typename genType> + GLM_FUNC_QUALIFIER genType repeat(genType const& Texcoord) { - return repeat(tvec1<genType, defaultp>(Texcoord)).x; + return repeat(vec<1, genType, defaultp>(Texcoord)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mirrorClamp(vecType<T, P> const& Texcoord) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mirrorClamp(vec<L, T, Q> const& Texcoord) { return glm::fract(glm::abs(Texcoord)); } - template <typename genType> - GLM_FUNC_QUALIFIER genType mirrorClamp(genType const & Texcoord) + template<typename genType> + GLM_FUNC_QUALIFIER genType mirrorClamp(genType const& Texcoord) { - return mirrorClamp(tvec1<genType, defaultp>(Texcoord)).x; + return mirrorClamp(vec<1, genType, defaultp>(Texcoord)).x; } - template <typename T, precision P, template <typename, precision> class vecType> - GLM_FUNC_QUALIFIER vecType<T, P> mirrorRepeat(vecType<T, P> const& Texcoord) + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER vec<L, T, Q> mirrorRepeat(vec<L, T, Q> const& Texcoord) { - vecType<T, P> const Abs = glm::abs(Texcoord); - vecType<T, P> const Clamp = glm::mod(glm::floor(Abs), vecType<T, P>(2)); - vecType<T, P> const Floor = glm::floor(Abs); - vecType<T, P> const Rest = Abs - Floor; - vecType<T, P> const Mirror = Clamp + Rest; - return mix(Rest, vecType<T, P>(1) - Rest, glm::greaterThanEqual(Mirror, vecType<T, P>(1))); + vec<L, T, Q> const Abs = glm::abs(Texcoord); + vec<L, T, Q> const Clamp = glm::mod(glm::floor(Abs), vec<L, T, Q>(2)); + vec<L, T, Q> const Floor = glm::floor(Abs); + vec<L, T, Q> const Rest = Abs - Floor; + vec<L, T, Q> const Mirror = Clamp + Rest; + return mix(Rest, vec<L, T, Q>(1) - Rest, glm::greaterThanEqual(Mirror, vec<L, T, Q>(1))); } - template <typename genType> + template<typename genType> GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord) { - return mirrorRepeat(tvec1<genType, defaultp>(Texcoord)).x; + return mirrorRepeat(vec<1, genType, defaultp>(Texcoord)).x; } }//namespace glm diff --git a/external/include/glm/integer.hpp b/external/include/glm/integer.hpp index 178e10e..fca4e69 100644 --- a/external/include/glm/integer.hpp +++ b/external/include/glm/integer.hpp @@ -1,6 +1,211 @@ /// @ref core /// @file glm/integer.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> +/// +/// @defgroup core_func_integer Integer functions +/// @ingroup core +/// +/// Include <glm/integer.hpp> to use these core features. +/// +/// These all operate component-wise. The description is per component. +/// The notation [a, b] means the set of bits from bit-number a through bit-number +/// b, inclusive. The lowest-order bit is bit 0. #pragma once -#include "detail/func_integer.hpp" +#include "detail/setup.hpp" +#include "detail/qualifier.hpp" +#include "common.hpp" +#include "vector_relational.hpp" + +namespace glm +{ + /// @addtogroup core_func_integer + /// @{ + + /// Adds 32-bit unsigned integer x and y, returning the sum + /// modulo pow(2, 32). The value carry is set to 0 if the sum was + /// less than pow(2, 32), or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml">GLSL uaddCarry man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, uint, Q> uaddCarry( + vec<L, uint, Q> const& x, + vec<L, uint, Q> const& y, + vec<L, uint, Q> & carry); + + /// Subtracts the 32-bit unsigned integer y from x, returning + /// the difference if non-negative, or pow(2, 32) plus the difference + /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml">GLSL usubBorrow man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, uint, Q> usubBorrow( + vec<L, uint, Q> const& x, + vec<L, uint, Q> const& y, + vec<L, uint, Q> & borrow); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml">GLSL umulExtended man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL void umulExtended( + vec<L, uint, Q> const& x, + vec<L, uint, Q> const& y, + vec<L, uint, Q> & msb, + vec<L, uint, Q> & lsb); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml">GLSL imulExtended man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL void imulExtended( + vec<L, int, Q> const& x, + vec<L, int, Q> const& y, + vec<L, int, Q> & msb, + vec<L, int, Q> & lsb); + + /// Extracts bits [offset, offset + bits - 1] from value, + /// returning them in the least significant bits of the result. + /// For unsigned data types, the most significant bits of the + /// result will be set to zero. For signed data types, the + /// most significant bits will be set to the value of bit offset + base - 1. + /// + /// If bits is zero, the result will be zero. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used + /// to store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml">GLSL bitfieldExtract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldExtract( + vec<L, T, Q> const& Value, + int Offset, + int Bits); + + /// Returns the insertion the bits least-significant bits of insert into base. + /// + /// The result will have bits [offset, offset + bits - 1] taken + /// from bits [0, bits - 1] of insert, and all other bits taken + /// directly from the corresponding bits of base. If bits is + /// zero, the result will simply be base. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used to + /// store the operand. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml">GLSL bitfieldInsert man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldInsert( + vec<L, T, Q> const& Base, + vec<L, T, Q> const& Insert, + int Offset, + int Bits); + + /// Returns the reversal of the bits of value. + /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, + /// where bits is the total number of bits used to represent value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml">GLSL bitfieldReverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> bitfieldReverse(vec<L, T, Q> const& v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam genType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<typename genType> + GLM_FUNC_DECL int bitCount(genType v); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, int, Q> bitCount(vec<L, T, Q> const& v); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<typename genIUType> + GLM_FUNC_DECL int findLSB(genIUType x); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, int, Q> findLSB(vec<L, T, Q> const& v); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<typename genIUType> + GLM_FUNC_DECL int findMSB(genIUType x); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T Signed or unsigned integer scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, int, Q> findMSB(vec<L, T, Q> const& v); + + /// @} +}//namespace glm + +#include "detail/func_integer.inl" diff --git a/external/include/glm/mat2x2.hpp b/external/include/glm/mat2x2.hpp index 420fe9d..057466d 100644 --- a/external/include/glm/mat2x2.hpp +++ b/external/include/glm/mat2x2.hpp @@ -1,52 +1,54 @@ /// @ref core /// @file glm/mat2x2.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat2x2.hpp" namespace glm { - /// 2 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, lowp> lowp_mat2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, lowp> lowp_mat2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, mediump> mediump_mat2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, mediump> mediump_mat2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, highp> highp_mat2; - - /// 2 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, highp> highp_mat2; + + /// 2 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, lowp> lowp_mat2x2; - - /// 2 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, lowp> lowp_mat2x2; + + /// 2 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, mediump> mediump_mat2x2; - - /// 2 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 2, float, mediump> mediump_mat2x2; + + /// 2 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x2<float, highp> highp_mat2x2; + typedef mat<2, 2, float, highp> highp_mat2x2; }//namespace glm diff --git a/external/include/glm/mat2x3.hpp b/external/include/glm/mat2x3.hpp index 5c1cc70..bf0170f 100644 --- a/external/include/glm/mat2x3.hpp +++ b/external/include/glm/mat2x3.hpp @@ -1,32 +1,34 @@ /// @ref core /// @file glm/mat2x3.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat2x3.hpp" namespace glm { - /// 2 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, lowp> lowp_mat2x3; + typedef mat<2, 3, float, lowp> lowp_mat2x3; - /// 2 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, mediump> mediump_mat2x3; + typedef mat<2, 3, float, mediump> mediump_mat2x3; - /// 2 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x3<float, highp> highp_mat2x3; + typedef mat<2, 3, float, highp> highp_mat2x3; }//namespace glm diff --git a/external/include/glm/mat2x4.hpp b/external/include/glm/mat2x4.hpp index a82f136..d3c813d 100644 --- a/external/include/glm/mat2x4.hpp +++ b/external/include/glm/mat2x4.hpp @@ -1,31 +1,33 @@ /// @ref core /// @file glm/mat2x4.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat2x4.hpp" namespace glm { - /// 2 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 2 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, lowp> lowp_mat2x4; - - /// 2 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 4, float, lowp> lowp_mat2x4; + + /// 2 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, mediump> mediump_mat2x4; - - /// 2 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<2, 4, float, mediump> mediump_mat2x4; + + /// 2 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat2x4<float, highp> highp_mat2x4; + typedef mat<2, 4, float, highp> highp_mat2x4; }//namespace glm diff --git a/external/include/glm/mat3x2.hpp b/external/include/glm/mat3x2.hpp index 40a56de..4500769 100644 --- a/external/include/glm/mat3x2.hpp +++ b/external/include/glm/mat3x2.hpp @@ -1,31 +1,33 @@ /// @ref core /// @file glm/mat3x2.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat3x2.hpp" namespace glm { - /// 3 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, lowp> lowp_mat3x2; - - /// 3 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 2, float, lowp> lowp_mat3x2; + + /// 3 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, mediump> mediump_mat3x2; - - /// 3 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 2, float, mediump> mediump_mat3x2; + + /// 3 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x2<float, highp> highp_mat3x2; + typedef mat<3, 2, float, highp> highp_mat3x2; }//namespace diff --git a/external/include/glm/mat3x3.hpp b/external/include/glm/mat3x3.hpp index 66bfdfa..586d1f0 100644 --- a/external/include/glm/mat3x3.hpp +++ b/external/include/glm/mat3x3.hpp @@ -1,52 +1,54 @@ /// @ref core /// @file glm/mat3x3.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat3x3.hpp" namespace glm { - /// 3 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, lowp> lowp_mat3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, lowp> lowp_mat3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, mediump> mediump_mat3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, mediump> mediump_mat3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, highp> highp_mat3; - - /// 3 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, highp> highp_mat3; + + /// 3 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, lowp> lowp_mat3x3; - - /// 3 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, lowp> lowp_mat3x3; + + /// 3 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, mediump> mediump_mat3x3; - - /// 3 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 3, float, mediump> mediump_mat3x3; + + /// 3 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x3<float, highp> highp_mat3x3; + typedef mat<3, 3, float, highp> highp_mat3x3; }//namespace glm diff --git a/external/include/glm/mat3x4.hpp b/external/include/glm/mat3x4.hpp index 5f83407..d1294ae 100644 --- a/external/include/glm/mat3x4.hpp +++ b/external/include/glm/mat3x4.hpp @@ -1,31 +1,33 @@ /// @ref core /// @file glm/mat3x4.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat3x4.hpp" namespace glm { - /// 3 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 3 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, lowp> lowp_mat3x4; - - /// 3 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 4, float, lowp> lowp_mat3x4; + + /// 3 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, mediump> mediump_mat3x4; - - /// 3 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<3, 4, float, mediump> mediump_mat3x4; + + /// 3 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat3x4<float, highp> highp_mat3x4; + typedef mat<3, 4, float, highp> highp_mat3x4; }//namespace glm diff --git a/external/include/glm/mat4x2.hpp b/external/include/glm/mat4x2.hpp index fe67c4f..c6f8758 100644 --- a/external/include/glm/mat4x2.hpp +++ b/external/include/glm/mat4x2.hpp @@ -1,31 +1,33 @@ /// @ref core /// @file glm/mat4x2.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat4x2.hpp" namespace glm { - /// 4 columns of 2 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 4 columns of 2 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, lowp> lowp_mat4x2; - - /// 4 columns of 2 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 2, float, lowp> lowp_mat4x2; + + /// 4 columns of 2 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, mediump> mediump_mat4x2; - - /// 4 columns of 2 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 2, float, mediump> mediump_mat4x2; + + /// 4 columns of 2 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x2<float, highp> highp_mat4x2; + typedef mat<4, 2, float, highp> highp_mat4x2; }//namespace glm diff --git a/external/include/glm/mat4x3.hpp b/external/include/glm/mat4x3.hpp index ea1cf88..8801493 100644 --- a/external/include/glm/mat4x3.hpp +++ b/external/include/glm/mat4x3.hpp @@ -1,31 +1,33 @@ /// @ref core /// @file glm/mat4x3.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat4x3.hpp" namespace glm { - /// 4 columns of 3 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 4 columns of 3 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, lowp> lowp_mat4x3; - - /// 4 columns of 3 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 3, float, lowp> lowp_mat4x3; + + /// 4 columns of 3 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, mediump> mediump_mat4x3; - - /// 4 columns of 3 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 3, float, mediump> mediump_mat4x3; + + /// 4 columns of 3 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x3<float, highp> highp_mat4x3; + typedef mat<4, 3, float, highp> highp_mat4x3; }//namespace glm diff --git a/external/include/glm/mat4x4.hpp b/external/include/glm/mat4x4.hpp index d6c44e8..f3019f2 100644 --- a/external/include/glm/mat4x4.hpp +++ b/external/include/glm/mat4x4.hpp @@ -1,52 +1,54 @@ /// @ref core /// @file glm/mat4x4.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_mat4x4.hpp" namespace glm { - /// 4 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, lowp> lowp_mat4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, lowp> lowp_mat4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, mediump> mediump_mat4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, mediump> mediump_mat4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, highp> highp_mat4; - - /// 4 columns of 4 components matrix of low precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, highp> highp_mat4; + + /// 4 columns of 4 components matrix of low qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, lowp> lowp_mat4x4; - - /// 4 columns of 4 components matrix of medium precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, lowp> lowp_mat4x4; + + /// 4 columns of 4 components matrix of medium qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, mediump> mediump_mat4x4; - - /// 4 columns of 4 components matrix of high precision floating-point numbers. - /// There is no guarantee on the actual precision. + typedef mat<4, 4, float, mediump> mediump_mat4x4; + + /// 4 columns of 4 components matrix of high qualifier floating-point numbers. + /// There is no guarantee on the actual qualifier. /// /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> - typedef tmat4x4<float, highp> highp_mat4x4; + typedef mat<4, 4, float, highp> highp_mat4x4; }//namespace glm diff --git a/external/include/glm/matrix.hpp b/external/include/glm/matrix.hpp index 736dd49..437e388 100644 --- a/external/include/glm/matrix.hpp +++ b/external/include/glm/matrix.hpp @@ -1,6 +1,164 @@ /// @ref core /// @file glm/matrix.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> +/// +/// @defgroup core_func_matrix Matrix functions +/// @ingroup core +/// +/// Include <glm/matrix.hpp> to use these core features. +/// +/// For each of the following built-in matrix functions, there is both a +/// single-qualifier floating point version, where all arguments and return values +/// are single qualifier, and a double-qualifier floating version, where all +/// arguments and return values are double qualifier. Only the single-qualifier +/// floating point version is shown. #pragma once -#include "detail/func_matrix.hpp" +// Dependencies +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" +#include "detail/type_mat.hpp" +#include "vec2.hpp" +#include "vec3.hpp" +#include "vec4.hpp" +#include "mat2x2.hpp" +#include "mat2x3.hpp" +#include "mat2x4.hpp" +#include "mat3x2.hpp" +#include "mat3x3.hpp" +#include "mat3x4.hpp" +#include "mat4x2.hpp" +#include "mat4x3.hpp" +#include "mat4x4.hpp" + +namespace glm { + namespace detail + { + template<typename T, qualifier Q> + struct outerProduct_trait<2, 2, T, Q> + { + typedef mat<2, 2, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<2, 3, T, Q> + { + typedef mat<3, 2, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<2, 4, T, Q> + { + typedef mat<4, 2, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<3, 2, T, Q> + { + typedef mat<2, 3, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<3, 3, T, Q> + { + typedef mat<3, 3, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<3, 4, T, Q> + { + typedef mat<4, 3, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<4, 2, T, Q> + { + typedef mat<2, 4, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<4, 3, T, Q> + { + typedef mat<3, 4, T, Q> type; + }; + + template<typename T, qualifier Q> + struct outerProduct_trait<4, 4, T, Q> + { + typedef mat<4, 4, T, Q> type; + }; + + }//namespace detail + + /// @addtogroup core_func_matrix + /// @{ + + /// Multiply matrix x by matrix y component-wise, i.e., + /// result[i][j] is the scalar product of x[i][j] and y[i][j]. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml">GLSL matrixCompMult man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL mat<C, R, T, Q> matrixCompMult(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y); + + /// Treats the first parameter c as a column vector + /// and the second parameter r as a row vector + /// and does a linear algebraic matrix multiply c * r. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml">GLSL outerProduct man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL typename detail::outerProduct_trait<C, R, T, Q>::type outerProduct(vec<C, T, Q> const& c, vec<R, T, Q> const& r); + + /// Returns the transposed matrix of x + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml">GLSL transpose man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL typename mat<C, R, T, Q>::transpose_type transpose(mat<C, R, T, Q> const& x); + + /// Return the determinant of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL T determinant(mat<C, R, T, Q> const& m); + + /// Return the inverse of a squared matrix. + /// + /// @tparam C Integer between 1 and 4 included that qualify the number a column + /// @tparam R Integer between 1 and 4 included that qualify the number a row + /// @tparam T Floating-point or signed integer scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template<length_t C, length_t R, typename T, qualifier Q> + GLM_FUNC_DECL mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m); + + /// @} +}//namespace glm + +#include "detail/func_matrix.inl" diff --git a/external/include/glm/packing.hpp b/external/include/glm/packing.hpp index 4545adb..c509fbf 100644 --- a/external/include/glm/packing.hpp +++ b/external/include/glm/packing.hpp @@ -1,6 +1,170 @@ /// @ref core /// @file glm/packing.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> +/// @see gtc_packing +/// +/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions +/// @ingroup core +/// +/// Include <glm/packing.hpp> to use these core features. +/// +/// These functions do not operate component-wise, rather as described in each case. #pragma once -#include "detail/func_packing.hpp" +#include "detail/type_vec2.hpp" +#include "detail/type_vec4.hpp" + +namespace glm +{ + /// @addtogroup core_func_packing + /// @{ + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packUnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packSnorm2x16(vec2 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packUnorm4x8: round(clamp(c, 0, +1) * 255.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packUnorm4x8(vec4 const& v); + + /// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + /// Then, the results are packed into the returned 32-bit unsigned integer. + /// + /// The conversion for component c of v to fixed point is done as follows: + /// packSnorm4x8: round(clamp(c, -1, +1) * 127.0) + /// + /// The first component of the vector will be written to the least significant bits of the output; + /// the last component will be written to the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packSnorm4x8(vec4 const& v); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm2x16: f / 65535.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm2x16: clamp(f / 32767.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); + + /// Returns a double-qualifier value obtained by packing the components of v into a 64-bit value. + /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. + /// Otherwise, the bit- level representation of v is preserved. + /// The first vector component specifies the 32 least significant bits; + /// the second component specifies the 32 most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml">GLSL packDouble2x32 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL double packDouble2x32(uvec2 const& v); + + /// Returns a two-component unsigned integer vector representation of v. + /// The bit-level representation of v is preserved. + /// The first component of the vector contains the 32 least significant bits of the double; + /// the second component consists the 32 most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml">GLSL unpackDouble2x32 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uvec2 unpackDouble2x32(double v); + + /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these two 16- bit integers into a 32-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the second component specifies the 16 most-significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packHalf2x16(vec2 const& v); + + /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the second component is obtained from the 16 most-significant bits of v. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); + + /// @} +}//namespace glm + +#include "detail/func_packing.inl" diff --git a/external/include/glm/simd/common.h b/external/include/glm/simd/common.h index d8c212d..78ff4d2 100644 --- a/external/include/glm/simd/common.h +++ b/external/include/glm/simd/common.h @@ -63,7 +63,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_swizzle_xyzw(glm_vec4 a) GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_fma(glm_vec4 a, glm_vec4 b, glm_vec4 c) { -# if GLM_ARCH & GLM_ARCH_AVX2_BIT +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) return _mm_fmadd_ss(a, b, c); # else return _mm_add_ss(_mm_mul_ss(a, b), c); @@ -72,7 +72,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec1_fma(glm_vec4 a, glm_vec4 b, glm_vec4 c) GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_fma(glm_vec4 a, glm_vec4 b, glm_vec4 c) { -# if GLM_ARCH & GLM_ARCH_AVX2_BIT +# if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG) return _mm_fmadd_ps(a, b, c); # else return glm_vec4_add(glm_vec4_mul(a, b), c); @@ -112,7 +112,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_round(glm_vec4 x) # if GLM_ARCH & GLM_ARCH_SSE41_BIT return _mm_round_ps(x, _MM_FROUND_TO_NEAREST_INT); # else - glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(0x80000000)); + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); glm_vec4 const and0 = _mm_and_ps(sgn0, x); glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); glm_vec4 const add0 = glm_vec4_add(x, or0); @@ -144,7 +144,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_trunc(glm_vec4 x) //roundEven GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_roundEven(glm_vec4 x) { - glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(0x80000000)); + glm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000))); glm_vec4 const and0 = _mm_and_ps(sgn0, x); glm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f)); glm_vec4 const add0 = glm_vec4_add(x, or0); @@ -220,7 +220,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_nan(glm_vec4 x) { glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit - glm_ivec4 const t3 = _mm_set1_epi32(0xFF000000); // exponent mask + glm_ivec4 const t3 = _mm_set1_epi32(int(0xFF000000)); // exponent mask glm_ivec4 const t4 = _mm_and_si128(t2, t3); // exponent glm_ivec4 const t5 = _mm_andnot_si128(t3, t2); // fraction glm_ivec4 const Equal = _mm_cmpeq_epi32(t3, t4); @@ -234,7 +234,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_vec4_inf(glm_vec4 x) { glm_ivec4 const t1 = _mm_castps_si128(x); // reinterpret as 32-bit integer glm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1)); // shift out sign bit - return _mm_castsi128_ps(_mm_cmpeq_epi32(t2, _mm_set1_epi32(0xFF000000))); // exponent is all 1s, fraction is 0 + return _mm_castsi128_ps(_mm_cmpeq_epi32(t2, _mm_set1_epi32(int(0xFF000000)))); // exponent is all 1s, fraction is 0 } #endif//GLM_ARCH & GLM_ARCH_SSE2_BIT diff --git a/external/include/glm/simd/geometric.h b/external/include/glm/simd/geometric.h index ca53387..07d7cbc 100644 --- a/external/include/glm/simd/geometric.h +++ b/external/include/glm/simd/geometric.h @@ -108,7 +108,7 @@ GLM_FUNC_QUALIFIER __m128 glm_vec4_refract(glm_vec4 I, glm_vec4 N, glm_vec4 eta) glm_vec4 const sub0 = _mm_sub_ps(_mm_set1_ps(1.0f), mul0); glm_vec4 const sub1 = _mm_sub_ps(_mm_set1_ps(1.0f), mul1); glm_vec4 const mul2 = _mm_mul_ps(sub0, sub1); - + if(_mm_movemask_ps(_mm_cmplt_ss(mul2, _mm_set1_ps(0.0f))) == 0) return _mm_set1_ps(0.0f); diff --git a/external/include/glm/simd/integer.h b/external/include/glm/simd/integer.h index 50fd824..9381418 100644 --- a/external/include/glm/simd/integer.h +++ b/external/include/glm/simd/integer.h @@ -55,7 +55,7 @@ GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave(glm_uvec4 x) Reg2 = _mm_slli_epi32(Reg1, 1); Reg2 = _mm_srli_si128(Reg2, 8); Reg1 = _mm_or_si128(Reg1, Reg2); - + return Reg1; } @@ -108,7 +108,7 @@ GLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave2(glm_uvec4 x, glm_uvec4 y) Reg2 = _mm_slli_epi32(Reg1, 1); Reg2 = _mm_srli_si128(Reg2, 8); Reg1 = _mm_or_si128(Reg1, Reg2); - + return Reg1; } diff --git a/external/include/glm/simd/matrix.h b/external/include/glm/simd/matrix.h index 549d40c..b6c42ea 100644 --- a/external/include/glm/simd/matrix.h +++ b/external/include/glm/simd/matrix.h @@ -410,7 +410,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_lowp(glm_vec4 const m[4]) __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); - //tvec4<T, P> DetCof( + //vec<4, T, Q> DetCof( // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), @@ -473,7 +473,7 @@ GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant(glm_vec4 const m[4]) __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); - //tvec4<T, P> DetCof( + //vec<4, T, Q> DetCof( // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), @@ -712,9 +712,9 @@ GLM_FUNC_QUALIFIER void glm_mat4_inverse(glm_vec4 const in[4], glm_vec4 out[4]) __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); - // valType Determinant = m[0][0] * Inverse[0][0] - // + m[0][1] * Inverse[1][0] - // + m[0][2] * Inverse[2][0] + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] // + m[0][3] * Inverse[3][0]; __m128 Det0 = glm_vec4_dot(in[0], Row2); __m128 Rcp0 = _mm_div_ps(_mm_set1_ps(1.0f), Det0); @@ -933,9 +933,9 @@ GLM_FUNC_QUALIFIER void glm_mat4_inverse_lowp(glm_vec4 const in[4], glm_vec4 out __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); - // valType Determinant = m[0][0] * Inverse[0][0] - // + m[0][1] * Inverse[1][0] - // + m[0][2] * Inverse[2][0] + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] // + m[0][3] * Inverse[3][0]; __m128 Det0 = glm_vec4_dot(in[0], Row2); __m128 Rcp0 = _mm_rcp_ps(Det0); @@ -962,10 +962,10 @@ GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float c __m128 Sin0 = _mm_set_ss(s); __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0)); - // tvec3<T, P> temp = (valType(1) - c) * axis; + // vec<3, T, Q> temp = (valType(1) - c) * axis; __m128 Temp0 = _mm_sub_ps(one, CosA); __m128 Temp1 = _mm_mul_ps(Temp0, AxisC); - + //Rotate[0][0] = c + temp[0] * axis[0]; //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; @@ -1008,7 +1008,7 @@ GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float c Result[2] = TmpC4; Result[3] = _mm_set_ps(1, 0, 0, 0); - //tmat4x4<valType> Result(uninitialize); + //mat<4, 4, valType> Result; //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; @@ -1017,7 +1017,7 @@ GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float c sse_mul_ps(in, Result, out); } */ -GLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const & c, __m128 const & r, __m128 out[4]) +GLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const& c, __m128 const& r, __m128 out[4]) { out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0))); out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1))); diff --git a/external/include/glm/simd/platform.h b/external/include/glm/simd/platform.h index f779390..b92c9bb 100644 --- a/external/include/glm/simd/platform.h +++ b/external/include/glm/simd/platform.h @@ -77,58 +77,37 @@ // Intel #define GLM_COMPILER_INTEL 0x00100000 -#define GLM_COMPILER_INTEL12 0x00100010 -#define GLM_COMPILER_INTEL12_1 0x00100020 -#define GLM_COMPILER_INTEL13 0x00100030 #define GLM_COMPILER_INTEL14 0x00100040 #define GLM_COMPILER_INTEL15 0x00100050 #define GLM_COMPILER_INTEL16 0x00100060 +#define GLM_COMPILER_INTEL17 0x00100070 // Visual C++ defines #define GLM_COMPILER_VC 0x01000000 -#define GLM_COMPILER_VC10 0x01000090 -#define GLM_COMPILER_VC11 0x010000A0 #define GLM_COMPILER_VC12 0x010000B0 #define GLM_COMPILER_VC14 0x010000C0 #define GLM_COMPILER_VC15 0x010000D0 +#define GLM_COMPILER_VC16 0x010000E0 // GCC defines #define GLM_COMPILER_GCC 0x02000000 -#define GLM_COMPILER_GCC44 0x020000B0 -#define GLM_COMPILER_GCC45 0x020000C0 #define GLM_COMPILER_GCC46 0x020000D0 #define GLM_COMPILER_GCC47 0x020000E0 #define GLM_COMPILER_GCC48 0x020000F0 #define GLM_COMPILER_GCC49 0x02000100 -#define GLM_COMPILER_GCC50 0x02000200 -#define GLM_COMPILER_GCC51 0x02000300 -#define GLM_COMPILER_GCC52 0x02000400 -#define GLM_COMPILER_GCC53 0x02000500 -#define GLM_COMPILER_GCC54 0x02000600 -#define GLM_COMPILER_GCC60 0x02000700 -#define GLM_COMPILER_GCC61 0x02000800 -#define GLM_COMPILER_GCC62 0x02000900 -#define GLM_COMPILER_GCC70 0x02000A00 -#define GLM_COMPILER_GCC71 0x02000B00 -#define GLM_COMPILER_GCC72 0x02000C00 -#define GLM_COMPILER_GCC80 0x02000D00 +#define GLM_COMPILER_GCC5 0x02000200 +#define GLM_COMPILER_GCC6 0x02000300 +#define GLM_COMPILER_GCC7 0x02000400 +#define GLM_COMPILER_GCC8 0x02000500 // CUDA #define GLM_COMPILER_CUDA 0x10000000 -#define GLM_COMPILER_CUDA40 0x10000040 -#define GLM_COMPILER_CUDA41 0x10000050 -#define GLM_COMPILER_CUDA42 0x10000060 -#define GLM_COMPILER_CUDA50 0x10000070 -#define GLM_COMPILER_CUDA60 0x10000080 -#define GLM_COMPILER_CUDA65 0x10000090 #define GLM_COMPILER_CUDA70 0x100000A0 #define GLM_COMPILER_CUDA75 0x100000B0 #define GLM_COMPILER_CUDA80 0x100000C0 // Clang #define GLM_COMPILER_CLANG 0x20000000 -#define GLM_COMPILER_CLANG32 0x20000030 -#define GLM_COMPILER_CLANG33 0x20000040 #define GLM_COMPILER_CLANG34 0x20000050 #define GLM_COMPILER_CLANG35 0x20000060 #define GLM_COMPILER_CLANG36 0x20000070 @@ -148,20 +127,16 @@ # define GLM_COMPILER GLM_COMPILER_UNKNOWN #elif defined(__INTEL_COMPILER) -# if __INTEL_COMPILER == 1200 -# define GLM_COMPILER GLM_COMPILER_INTEL12 -# elif __INTEL_COMPILER == 1210 -# define GLM_COMPILER GLM_COMPILER_INTEL12_1 -# elif __INTEL_COMPILER == 1300 -# define GLM_COMPILER GLM_COMPILER_INTEL13 +# if (__INTEL_COMPILER < 1400) +# error "GLM requires ICC 2013 SP1 or newer" # elif __INTEL_COMPILER == 1400 # define GLM_COMPILER GLM_COMPILER_INTEL14 # elif __INTEL_COMPILER == 1500 # define GLM_COMPILER GLM_COMPILER_INTEL15 -# elif __INTEL_COMPILER >= 1600 +# elif __INTEL_COMPILER == 1600 # define GLM_COMPILER GLM_COMPILER_INTEL16 -# else -# define GLM_COMPILER GLM_COMPILER_INTEL +# elif __INTEL_COMPILER >= 1700 +# define GLM_COMPILER GLM_COMPILER_INTEL17 # endif // CUDA @@ -169,37 +144,31 @@ # if !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA) # include <cuda.h> // make sure version is defined since nvcc does not define it itself! # endif -# if CUDA_VERSION < 3000 -# error "GLM requires CUDA 3.0 or higher" -# else -# define GLM_COMPILER GLM_COMPILER_CUDA +# if CUDA_VERSION < 7000 +# error "GLM requires CUDA 7.0 or higher" +# elif (CUDA_VERSION >= 7000 && CUDA_VERSION < 7500) +# define GLM_COMPILER GLM_COMPILER_CUDA70 +# elif (CUDA_VERSION >= 7500 && CUDA_VERSION < 8000) +# define GLM_COMPILER GLM_COMPILER_CUDA75 +# elif (CUDA_VERSION >= 8000) +# define GLM_COMPILER GLM_COMPILER_CUDA80 # endif // Clang #elif defined(__clang__) -# if GLM_PLATFORM & GLM_PLATFORM_APPLE -# if __clang_major__ == 5 && __clang_minor__ == 0 -# define GLM_COMPILER GLM_COMPILER_CLANG33 -# elif __clang_major__ == 5 && __clang_minor__ == 1 -# define GLM_COMPILER GLM_COMPILER_CLANG34 +# if defined(__apple_build_version__) +# if (__clang_major__ < 6) +# error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher" # elif __clang_major__ == 6 && __clang_minor__ == 0 # define GLM_COMPILER GLM_COMPILER_CLANG35 # elif __clang_major__ == 6 && __clang_minor__ >= 1 # define GLM_COMPILER GLM_COMPILER_CLANG36 # elif __clang_major__ >= 7 # define GLM_COMPILER GLM_COMPILER_CLANG37 -# else -# define GLM_COMPILER GLM_COMPILER_CLANG # endif # else -# if __clang_major__ == 3 && __clang_minor__ == 0 -# define GLM_COMPILER GLM_COMPILER_CLANG30 -# elif __clang_major__ == 3 && __clang_minor__ == 1 -# define GLM_COMPILER GLM_COMPILER_CLANG31 -# elif __clang_major__ == 3 && __clang_minor__ == 2 -# define GLM_COMPILER GLM_COMPILER_CLANG32 -# elif __clang_major__ == 3 && __clang_minor__ == 3 -# define GLM_COMPILER GLM_COMPILER_CLANG33 +# if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3) +# error "GLM requires Clang 3.4 or higher" # elif __clang_major__ == 3 && __clang_minor__ == 4 # define GLM_COMPILER GLM_COMPILER_CLANG34 # elif __clang_major__ == 3 && __clang_minor__ == 5 @@ -220,39 +189,25 @@ # define GLM_COMPILER GLM_COMPILER_CLANG42 # elif __clang_major__ >= 4 # define GLM_COMPILER GLM_COMPILER_CLANG42 -# else -# define GLM_COMPILER GLM_COMPILER_CLANG # endif # endif // Visual C++ #elif defined(_MSC_VER) -# if _MSC_VER < 1600 -# error "GLM requires Visual C++ 10 - 2010 or higher" -# elif _MSC_VER == 1600 -# define GLM_COMPILER GLM_COMPILER_VC11 -# elif _MSC_VER == 1700 -# define GLM_COMPILER GLM_COMPILER_VC11 +# if _MSC_VER < 1800 +# error "GLM requires Visual C++ 12 - 2013 or higher" # elif _MSC_VER == 1800 # define GLM_COMPILER GLM_COMPILER_VC12 # elif _MSC_VER == 1900 # define GLM_COMPILER GLM_COMPILER_VC14 # elif _MSC_VER >= 1910 # define GLM_COMPILER GLM_COMPILER_VC15 -# else//_MSC_VER -# define GLM_COMPILER GLM_COMPILER_VC # endif//_MSC_VER // G++ #elif defined(__GNUC__) || defined(__MINGW32__) -# if (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) -# define GLM_COMPILER (GLM_COMPILER_GCC42) -# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) -# define GLM_COMPILER (GLM_COMPILER_GCC43) -# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 4) -# define GLM_COMPILER (GLM_COMPILER_GCC44) -# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 5) -# define GLM_COMPILER (GLM_COMPILER_GCC45) +# if ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4) +# error "GLM requires GCC 4.7 or higher" # elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6) # define GLM_COMPILER (GLM_COMPILER_GCC46) # elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7) @@ -261,32 +216,14 @@ # define GLM_COMPILER (GLM_COMPILER_GCC48) # elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) # define GLM_COMPILER (GLM_COMPILER_GCC49) -# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 0) -# define GLM_COMPILER (GLM_COMPILER_GCC50) -# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 1) -# define GLM_COMPILER (GLM_COMPILER_GCC51) -# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 2) -# define GLM_COMPILER (GLM_COMPILER_GCC52) -# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 3) -# define GLM_COMPILER (GLM_COMPILER_GCC53) -# elif (__GNUC__ == 5) && (__GNUC_MINOR__ >= 4) -# define GLM_COMPILER (GLM_COMPILER_GCC54) -# elif (__GNUC__ == 6) && (__GNUC_MINOR__ == 0) -# define GLM_COMPILER (GLM_COMPILER_GCC60) -# elif (__GNUC__ == 6) && (__GNUC_MINOR__ == 1) -# define GLM_COMPILER (GLM_COMPILER_GCC61) -# elif (__GNUC__ == 6) && (__GNUC_MINOR__ >= 2) -# define GLM_COMPILER (GLM_COMPILER_GCC62) -# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 0) -# define GLM_COMPILER (GLM_COMPILER_GCC70) -# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 1) -# define GLM_COMPILER (GLM_COMPILER_GCC71) -# elif (__GNUC__ == 7) && (__GNUC_MINOR__ == 2) -# define GLM_COMPILER (GLM_COMPILER_GCC72) +# elif (__GNUC__ == 5) +# define GLM_COMPILER (GLM_COMPILER_GCC5) +# elif (__GNUC__ == 6) +# define GLM_COMPILER (GLM_COMPILER_GCC6) +# elif (__GNUC__ == 7) +# define GLM_COMPILER (GLM_COMPILER_GCC7) # elif (__GNUC__ >= 8) -# define GLM_COMPILER (GLM_COMPILER_GCC80) -# else -# define GLM_COMPILER (GLM_COMPILER_GCC) +# define GLM_COMPILER (GLM_COMPILER_GCC8) # endif #else @@ -310,9 +247,9 @@ #define GLM_ARCH_SSE42_BIT 0x00000020 #define GLM_ARCH_AVX_BIT 0x00000040 #define GLM_ARCH_AVX2_BIT 0x00000080 -#define GLM_ARCH_AVX512_BIT 0x00000100 // Skylake subset -#define GLM_ARCH_ARM_BIT 0x00000100 -#define GLM_ARCH_NEON_BIT 0x00000200 +#define GLM_ARCH_AVX512_BIT 0x00000200 // Skylake subset +#define GLM_ARCH_ARM_BIT 0x00000400 +#define GLM_ARCH_NEON_BIT 0x00000800 #define GLM_ARCH_MIPS_BIT 0x00010000 #define GLM_ARCH_PPC_BIT 0x01000000 diff --git a/external/include/glm/trigonometric.hpp b/external/include/glm/trigonometric.hpp index a9ce87c..15caadb 100644 --- a/external/include/glm/trigonometric.hpp +++ b/external/include/glm/trigonometric.hpp @@ -1,6 +1,208 @@ /// @ref core /// @file glm/trigonometric.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> +/// +/// @defgroup core_func_trigonometric Angle and Trigonometry Functions +/// @ingroup core +/// +/// Include <glm/trigonometric.hpp> to use these core features. +/// +/// Function parameters specified as angle are assumed to be in units of radians. +/// In no case will any of these functions result in a divide by zero error. If +/// the divisor of a ratio is 0, then results will be undefined. +/// +/// These all operate component-wise. The description is per component. #pragma once -#include "detail/func_trigonometric.hpp" +#include "detail/setup.hpp" +#include "detail/qualifier.hpp" + +namespace glm +{ + /// @addtogroup core_func_trigonometric + /// @{ + + /// Converts degrees to radians and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL GLM_CONSTEXPR vec<L, T, Q> radians(vec<L, T, Q> const& degrees); + + /// Converts radians to degrees and returns the result. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL GLM_CONSTEXPR vec<L, T, Q> degrees(vec<L, T, Q> const& radians); + + /// The standard trigonometric sine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml">GLSL sin man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> sin(vec<L, T, Q> const& angle); + + /// The standard trigonometric cosine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml">GLSL cos man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> cos(vec<L, T, Q> const& angle); + + /// The standard trigonometric tangent function. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml">GLSL tan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> tan(vec<L, T, Q> const& angle); + + /// Arc sine. Returns an angle whose sine is x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml">GLSL asin man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> asin(vec<L, T, Q> const& x); + + /// Arc cosine. Returns an angle whose sine is x. + /// The range of values returned by this function is [0, PI]. + /// Results are undefined if |x| > 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml">GLSL acos man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> acos(vec<L, T, Q> const& x); + + /// Arc tangent. Returns an angle whose tangent is y/x. + /// The signs of x and y are used to determine what + /// quadrant the angle is in. The range of values returned + /// by this function is [-PI, PI]. Results are undefined + /// if x and y are both 0. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> atan(vec<L, T, Q> const& y, vec<L, T, Q> const& x); + + /// Arc tangent. Returns an angle whose tangent is y_over_x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> atan(vec<L, T, Q> const& y_over_x); + + /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml">GLSL sinh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> sinh(vec<L, T, Q> const& angle); + + /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml">GLSL cosh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> cosh(vec<L, T, Q> const& angle); + + /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml">GLSL tanh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> tanh(vec<L, T, Q> const& angle); + + /// Arc hyperbolic sine; returns the inverse of sinh. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml">GLSL asinh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> asinh(vec<L, T, Q> const& x); + + /// Arc hyperbolic cosine; returns the non-negative inverse + /// of cosh. Results are undefined if x < 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml">GLSL acosh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> acosh(vec<L, T, Q> const& x); + + /// Arc hyperbolic tangent; returns the inverse of tanh. + /// Results are undefined if abs(x) >= 1. + /// + /// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector + /// @tparam T Floating-point scalar types + /// @tparam Q Value from qualifier enum + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml">GLSL atanh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, T, Q> atanh(vec<L, T, Q> const& x); + + /// @} +}//namespace glm + +#include "detail/func_trigonometric.inl" diff --git a/external/include/glm/vec2.hpp b/external/include/glm/vec2.hpp index 764c2e0..8f5bf60 100644 --- a/external/include/glm/vec2.hpp +++ b/external/include/glm/vec2.hpp @@ -1,6 +1,8 @@ /// @ref core /// @file glm/vec2.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_vec2.hpp" diff --git a/external/include/glm/vec3.hpp b/external/include/glm/vec3.hpp index eccda31..d2aedd1 100644 --- a/external/include/glm/vec3.hpp +++ b/external/include/glm/vec3.hpp @@ -1,6 +1,8 @@ /// @ref core /// @file glm/vec3.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_vec3.hpp" diff --git a/external/include/glm/vec4.hpp b/external/include/glm/vec4.hpp index ad66f5e..428b541 100644 --- a/external/include/glm/vec4.hpp +++ b/external/include/glm/vec4.hpp @@ -1,6 +1,8 @@ /// @ref core /// @file glm/vec4.hpp +#include "detail/setup.hpp" + #pragma once #include "detail/type_vec4.hpp" diff --git a/external/include/glm/vector_relational.hpp b/external/include/glm/vector_relational.hpp index d234190..ed99671 100644 --- a/external/include/glm/vector_relational.hpp +++ b/external/include/glm/vector_relational.hpp @@ -1,6 +1,119 @@ /// @ref core /// @file glm/vector_relational.hpp +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> +/// +/// @defgroup core_func_vector_relational Vector Relational Functions +/// @ingroup core +/// +/// Include <glm/vector_relational.hpp> to use these core features. +/// +/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to +/// operate on scalars and produce scalar Boolean results. For vector results, +/// use the following built-in functions. +/// +/// In all cases, the sizes of all the input and return vectors for any particular +/// call must match. #pragma once -#include "detail/func_vector_relational.hpp" +#include "detail/qualifier.hpp" +#include "detail/setup.hpp" + +namespace glm +{ + /// @addtogroup core_func_vector_relational + /// @{ + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml">GLSL lessThan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> lessThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml">GLSL lessThanEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> lessThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml">GLSL greaterThan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> greaterThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point or integer scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml">GLSL greaterThanEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> greaterThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml">GLSL equal man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// @tparam T A floating-point, integer or bool scalar type. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml">GLSL notEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, typename T, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y); + + /// Returns true if any component of x is true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml">GLSL any man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL bool any(vec<L, bool, Q> const& v); + + /// Returns true if all components of x are true. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml">GLSL all man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL bool all(vec<L, bool, Q> const& v); + + /// Returns the component-wise logical complement of x. + /// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead. + /// + /// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml">GLSL not man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template<length_t L, qualifier Q> + GLM_FUNC_DECL vec<L, bool, Q> not_(vec<L, bool, Q> const& v); + + /// @} +}//namespace glm + +#include "detail/func_vector_relational.inl" |