summaryrefslogtreecommitdiff
path: root/include/gal/opengl/glm/core
diff options
context:
space:
mode:
Diffstat (limited to 'include/gal/opengl/glm/core')
-rw-r--r--include/gal/opengl/glm/core/_detail.hpp482
-rw-r--r--include/gal/opengl/glm/core/_fixes.hpp55
-rw-r--r--include/gal/opengl/glm/core/_swizzle.hpp861
-rw-r--r--include/gal/opengl/glm/core/_swizzle_func.hpp787
-rw-r--r--include/gal/opengl/glm/core/_vectorize.hpp159
-rw-r--r--include/gal/opengl/glm/core/dummy.cpp40
-rw-r--r--include/gal/opengl/glm/core/func_common.hpp430
-rw-r--r--include/gal/opengl/glm/core/func_common.inl1226
-rw-r--r--include/gal/opengl/glm/core/func_exponential.hpp123
-rw-r--r--include/gal/opengl/glm/core/func_exponential.inl156
-rw-r--r--include/gal/opengl/glm/core/func_geometric.hpp138
-rw-r--r--include/gal/opengl/glm/core/func_geometric.inl321
-rw-r--r--include/gal/opengl/glm/core/func_integer.hpp201
-rw-r--r--include/gal/opengl/glm/core/func_integer.inl648
-rw-r--r--include/gal/opengl/glm/core/func_matrix.hpp150
-rw-r--r--include/gal/opengl/glm/core/func_matrix.inl582
-rw-r--r--include/gal/opengl/glm/core/func_noise.hpp87
-rw-r--r--include/gal/opengl/glm/core/func_noise.inl364
-rw-r--r--include/gal/opengl/glm/core/func_packing.hpp193
-rw-r--r--include/gal/opengl/glm/core/func_packing.inl208
-rw-r--r--include/gal/opengl/glm/core/func_trigonometric.hpp203
-rw-r--r--include/gal/opengl/glm/core/func_trigonometric.inl244
-rw-r--r--include/gal/opengl/glm/core/func_vector_relational.hpp138
-rw-r--r--include/gal/opengl/glm/core/func_vector_relational.inl178
-rw-r--r--include/gal/opengl/glm/core/hint.hpp40
-rw-r--r--include/gal/opengl/glm/core/intrinsic_common.hpp89
-rw-r--r--include/gal/opengl/glm/core/intrinsic_common.inl313
-rw-r--r--include/gal/opengl/glm/core/intrinsic_exponential.hpp79
-rw-r--r--include/gal/opengl/glm/core/intrinsic_exponential.inl27
-rw-r--r--include/gal/opengl/glm/core/intrinsic_geometric.hpp76
-rw-r--r--include/gal/opengl/glm/core/intrinsic_geometric.inl146
-rw-r--r--include/gal/opengl/glm/core/intrinsic_matrix.hpp69
-rw-r--r--include/gal/opengl/glm/core/intrinsic_matrix.inl1070
-rw-r--r--include/gal/opengl/glm/core/intrinsic_trigonometric.hpp48
-rw-r--r--include/gal/opengl/glm/core/intrinsic_trigonometric.inl27
-rw-r--r--include/gal/opengl/glm/core/intrinsic_vector_relational.hpp48
-rw-r--r--include/gal/opengl/glm/core/intrinsic_vector_relational.inl366
-rw-r--r--include/gal/opengl/glm/core/setup.hpp694
-rw-r--r--include/gal/opengl/glm/core/type.hpp341
-rw-r--r--include/gal/opengl/glm/core/type_float.hpp84
-rw-r--r--include/gal/opengl/glm/core/type_gentype.hpp169
-rw-r--r--include/gal/opengl/glm/core/type_gentype.inl366
-rw-r--r--include/gal/opengl/glm/core/type_half.hpp118
-rw-r--r--include/gal/opengl/glm/core/type_half.inl421
-rw-r--r--include/gal/opengl/glm/core/type_int.hpp142
-rw-r--r--include/gal/opengl/glm/core/type_mat.hpp41
-rw-r--r--include/gal/opengl/glm/core/type_mat.inl27
-rw-r--r--include/gal/opengl/glm/core/type_mat2x2.hpp314
-rw-r--r--include/gal/opengl/glm/core/type_mat2x2.inl688
-rw-r--r--include/gal/opengl/glm/core/type_mat2x3.hpp258
-rw-r--r--include/gal/opengl/glm/core/type_mat2x3.inl633
-rw-r--r--include/gal/opengl/glm/core/type_mat2x4.hpp260
-rw-r--r--include/gal/opengl/glm/core/type_mat2x4.inl652
-rw-r--r--include/gal/opengl/glm/core/type_mat3x2.hpp265
-rw-r--r--include/gal/opengl/glm/core/type_mat3x2.inl670
-rw-r--r--include/gal/opengl/glm/core/type_mat3x3.hpp318
-rw-r--r--include/gal/opengl/glm/core/type_mat3x3.inl800
-rw-r--r--include/gal/opengl/glm/core/type_mat3x4.hpp266
-rw-r--r--include/gal/opengl/glm/core/type_mat3x4.inl700
-rw-r--r--include/gal/opengl/glm/core/type_mat4x2.hpp270
-rw-r--r--include/gal/opengl/glm/core/type_mat4x2.inl716
-rw-r--r--include/gal/opengl/glm/core/type_mat4x3.hpp268
-rw-r--r--include/gal/opengl/glm/core/type_mat4x3.inl725
-rw-r--r--include/gal/opengl/glm/core/type_mat4x4.hpp320
-rw-r--r--include/gal/opengl/glm/core/type_mat4x4.inl893
-rw-r--r--include/gal/opengl/glm/core/type_size.hpp43
-rw-r--r--include/gal/opengl/glm/core/type_vec.hpp41
-rw-r--r--include/gal/opengl/glm/core/type_vec.inl27
-rw-r--r--include/gal/opengl/glm/core/type_vec1.hpp212
-rw-r--r--include/gal/opengl/glm/core/type_vec1.inl928
-rw-r--r--include/gal/opengl/glm/core/type_vec2.hpp317
-rw-r--r--include/gal/opengl/glm/core/type_vec2.inl998
-rw-r--r--include/gal/opengl/glm/core/type_vec3.hpp342
-rw-r--r--include/gal/opengl/glm/core/type_vec3.inl1122
-rw-r--r--include/gal/opengl/glm/core/type_vec4.hpp399
-rw-r--r--include/gal/opengl/glm/core/type_vec4.inl1348
76 files changed, 27568 insertions, 0 deletions
diff --git a/include/gal/opengl/glm/core/_detail.hpp b/include/gal/opengl/glm/core/_detail.hpp
new file mode 100644
index 0000000..e6b42c2
--- /dev/null
+++ b/include/gal/opengl/glm/core/_detail.hpp
@@ -0,0 +1,482 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/_detail.hpp
+/// @date 2008-07-24 / 2011-06-14
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_detail
+#define glm_core_detail
+
+#include "setup.hpp"
+#include <cassert>
+#if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
+#include <cstdint>
+#endif
+
+namespace glm{
+namespace detail
+{
+ class half;
+
+#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 | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG))
+ __extension__ typedef signed long long sint64;
+ __extension__ typedef unsigned long long uint64;
+#elif(GLM_COMPILER & GLM_COMPILER_BC)
+ typedef Int64 sint64;
+ typedef Uint64 uint64;
+#else//unknown compiler
+ typedef signed long long sint64;
+ typedef unsigned long long uint64;
+#endif//GLM_COMPILER
+
+ template<bool C>
+ struct If
+ {
+ template<typename F, typename T>
+ static GLM_FUNC_QUALIFIER T apply(F functor, const T& val)
+ {
+ return functor(val);
+ }
+ };
+
+ template<>
+ struct If<false>
+ {
+ template<typename F, typename T>
+ static GLM_FUNC_QUALIFIER T apply(F, const T& val)
+ {
+ return val;
+ }
+ };
+
+ //template <typename T>
+ //struct traits
+ //{
+ // static const bool is_signed = false;
+ // static const bool is_float = false;
+ // static const bool is_vector = false;
+ // static const bool is_matrix = false;
+ // static const bool is_genType = false;
+ // static const bool is_genIType = false;
+ // static const bool is_genUType = false;
+ //};
+
+ //template <>
+ //struct traits<half>
+ //{
+ // static const bool is_float = true;
+ // static const bool is_genType = true;
+ //};
+
+ //template <>
+ //struct traits<float>
+ //{
+ // static const bool is_float = true;
+ // static const bool is_genType = true;
+ //};
+
+ //template <>
+ //struct traits<double>
+ //{
+ // static const bool is_float = true;
+ // static const bool is_genType = true;
+ //};
+
+ //template <typename genType>
+ //struct desc
+ //{
+ // typedef genType type;
+ // typedef genType * pointer;
+ // typedef genType const* const_pointer;
+ // typedef genType const *const const_pointer_const;
+ // typedef genType *const pointer_const;
+ // 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>
+ //const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size();
+
+ union uif32
+ {
+ GLM_FUNC_QUALIFIER uif32() :
+ i(0)
+ {}
+
+ GLM_FUNC_QUALIFIER uif32(float f) :
+ f(f)
+ {}
+
+ GLM_FUNC_QUALIFIER uif32(unsigned int i) :
+ i(i)
+ {}
+
+ float f;
+ unsigned int i;
+ };
+
+ union uif64
+ {
+ GLM_FUNC_QUALIFIER uif64() :
+ i(0)
+ {}
+
+ GLM_FUNC_QUALIFIER uif64(double f) :
+ f(f)
+ {}
+
+ GLM_FUNC_QUALIFIER uif64(uint64 i) :
+ i(i)
+ {}
+
+ double f;
+ uint64 i;
+ };
+
+ typedef uif32 uif;
+
+ //////////////////
+ // int
+
+ template <typename T>
+ struct is_int
+ {
+ enum is_int_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+#define GLM_DETAIL_IS_INT(T) \
+ template <> \
+ struct is_int<T> \
+ { \
+ enum is_int_enum \
+ { \
+ _YES = 1, \
+ _NO = 0 \
+ }; \
+ }
+
+ //////////////////
+ // uint
+
+ template <typename T>
+ struct is_uint
+ {
+ enum is_uint_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+#define GLM_DETAIL_IS_UINT(T) \
+ template <> \
+ struct is_uint<T> \
+ { \
+ enum is_uint_enum \
+ { \
+ _YES = 1, \
+ _NO = 0 \
+ }; \
+ }
+
+ //GLM_DETAIL_IS_UINT(unsigned long long)
+
+ //////////////////
+ // float
+
+ template <typename T>
+ struct is_float
+ {
+ enum is_float_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+#define GLM_DETAIL_IS_FLOAT(T) \
+ template <> \
+ struct is_float<T> \
+ { \
+ enum is_float_enum \
+ { \
+ _YES = 1, \
+ _NO = 0 \
+ }; \
+ }
+
+ GLM_DETAIL_IS_FLOAT(detail::half);
+ GLM_DETAIL_IS_FLOAT(float);
+ GLM_DETAIL_IS_FLOAT(double);
+ GLM_DETAIL_IS_FLOAT(long double);
+
+ //////////////////
+ // bool
+
+ template <typename T>
+ struct is_bool
+ {
+ enum is_bool_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+ template <>
+ struct is_bool<bool>
+ {
+ enum is_bool_enum
+ {
+ _YES = 1,
+ _NO = 0
+ };
+ };
+
+ //////////////////
+ // vector
+
+ template <typename T>
+ struct is_vector
+ {
+ enum is_vector_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+# define GLM_DETAIL_IS_VECTOR(TYPE) \
+ template <typename T> \
+ struct is_vector<TYPE<T> > \
+ { \
+ enum is_vector_enum \
+ { \
+ _YES = 1, \
+ _NO = 0 \
+ }; \
+ }
+
+ //////////////////
+ // matrix
+
+ template <typename T>
+ struct is_matrix
+ {
+ enum is_matrix_enum
+ {
+ _YES = 0,
+ _NO = 1
+ };
+ };
+
+#define GLM_DETAIL_IS_MATRIX(T) \
+ template <> \
+ struct is_matrix \
+ { \
+ enum is_matrix_enum \
+ { \
+ _YES = 1, \
+ _NO = 0 \
+ }; \
+ }
+
+ //////////////////
+ // type
+
+ template <typename T>
+ struct type
+ {
+ enum type_enum
+ {
+ is_float = is_float<T>::_YES,
+ is_int = is_int<T>::_YES,
+ is_uint = is_uint<T>::_YES,
+ is_bool = is_bool<T>::_YES
+ };
+ };
+
+ //////////////////
+ // type
+
+ typedef signed char int8;
+ typedef signed short int16;
+ typedef signed int int32;
+ typedef detail::sint64 int64;
+
+ typedef unsigned char uint8;
+ typedef unsigned short uint16;
+ typedef unsigned int uint32;
+ typedef detail::uint64 uint64;
+
+ typedef detail::half float16;
+ typedef float float32;
+ typedef double float64;
+
+ //////////////////
+ // float_or_int_trait
+
+ struct float_or_int_value
+ {
+ enum
+ {
+ GLM_ERROR,
+ GLM_FLOAT,
+ GLM_INT
+ };
+ };
+
+ template <typename T>
+ struct float_or_int_trait
+ {
+ enum{ID = float_or_int_value::GLM_ERROR};
+ };
+
+ template <>
+ struct float_or_int_trait<int8>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<int16>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<int32>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<int64>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<uint8>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<uint16>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<uint32>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<uint64>
+ {
+ enum{ID = float_or_int_value::GLM_INT};
+ };
+
+ template <>
+ struct float_or_int_trait<float16>
+ {
+ enum{ID = float_or_int_value::GLM_FLOAT};
+ };
+
+ template <>
+ struct float_or_int_trait<float32>
+ {
+ enum{ID = float_or_int_value::GLM_FLOAT};
+ };
+
+ template <>
+ struct float_or_int_trait<float64>
+ {
+ enum{ID = float_or_int_value::GLM_FLOAT};
+ };
+
+}//namespace detail
+}//namespace glm
+
+#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005))
+# define GLM_DEPRECATED __declspec(deprecated)
+# define GLM_ALIGN(x) __declspec(align(x))
+# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct
+# define GLM_RESTRICT __declspec(restrict)
+# define GLM_RESTRICT_VAR __restrict
+# define GLM_CONSTEXPR
+#elif(GLM_COMPILER & GLM_COMPILER_INTEL)
+# define GLM_DEPRECATED
+# define GLM_ALIGN(x) __declspec(align(x))
+# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct
+# define GLM_RESTRICT
+# define GLM_RESTRICT_VAR __restrict
+# define GLM_CONSTEXPR
+#elif(((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) || (GLM_COMPILER & GLM_COMPILER_CLANG))
+# define GLM_DEPRECATED __attribute__((__deprecated__))
+# define GLM_ALIGN(x) __attribute__((aligned(x)))
+# define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))
+# if(GLM_COMPILER >= GLM_COMPILER_GCC33)
+# define GLM_RESTRICT __restrict__
+# define GLM_RESTRICT_VAR __restrict__
+# else
+# define GLM_RESTRICT
+# define GLM_RESTRICT_VAR
+# endif
+# define GLM_RESTRICT __restrict__
+# define GLM_RESTRICT_VAR __restrict__
+# if((GLM_COMPILER >= GLM_COMPILER_GCC47) && ((GLM_LANG & GLM_LANG_CXX0X) == GLM_LANG_CXX0X))
+# define GLM_CONSTEXPR constexpr
+# else
+# define GLM_CONSTEXPR
+# endif
+#else
+# define GLM_DEPRECATED
+# define GLM_ALIGN
+# define GLM_ALIGNED_STRUCT(x)
+# define GLM_RESTRICT
+# define GLM_RESTRICT_VAR
+# define GLM_CONSTEXPR
+#endif//GLM_COMPILER
+
+#endif//glm_core_detail
diff --git a/include/gal/opengl/glm/core/_fixes.hpp b/include/gal/opengl/glm/core/_fixes.hpp
new file mode 100644
index 0000000..b4cec5f
--- /dev/null
+++ b/include/gal/opengl/glm/core/_fixes.hpp
@@ -0,0 +1,55 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/_fixes.hpp
+/// @date 2011-02-21 / 2011-11-22
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#include <cmath>
+
+//! Workaround for compatibility with other libraries
+#ifdef max
+#undef max
+#endif
+
+//! Workaround for compatibility with other libraries
+#ifdef min
+#undef min
+#endif
+
+//! Workaround for Android
+#ifdef isnan
+#undef isnan
+#endif
+
+//! Workaround for Android
+#ifdef isinf
+#undef isinf
+#endif
+
+//! Workaround for Chrone Native Client
+#ifdef log2
+#undef log2
+#endif
+
diff --git a/include/gal/opengl/glm/core/_swizzle.hpp b/include/gal/opengl/glm/core/_swizzle.hpp
new file mode 100644
index 0000000..dc06944
--- /dev/null
+++ b/include/gal/opengl/glm/core/_swizzle.hpp
@@ -0,0 +1,861 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/_swizzle.hpp
+/// @date 2006-04-20 / 2011-02-16
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_swizzle
+#define glm_core_swizzle
+
+#include "_swizzle_func.hpp"
+
+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
+{
+ // Internal class for implementing swizzle operators
+ template <typename T, int N>
+ struct _swizzle_base0
+ {
+ typedef T value_type;
+
+ protected:
+ GLM_FUNC_QUALIFIER value_type& elem (size_t i) { return (reinterpret_cast<value_type*>(_buffer))[i]; }
+ GLM_FUNC_QUALIFIER const value_type& elem (size_t i) const { return (reinterpret_cast<const value_type*>(_buffer))[i]; }
+
+ // 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()
+ char _buffer[1];
+ };
+
+ template <typename T, typename V, int E0, int E1, int E2, int E3, int N>
+ struct _swizzle_base1 : public _swizzle_base0<T,N>
+ {
+ };
+
+ template <typename T, typename V, int E0, int E1>
+ struct _swizzle_base1<T,V,E0,E1,-1,-2,2> : public _swizzle_base0<T,2>
+ {
+ GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1)); }
+ };
+
+ template <typename T, typename V, int E0, int E1, int E2>
+ struct _swizzle_base1<T,V,E0,E1,E2,-1,3> : public _swizzle_base0<T,3>
+ {
+ GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2)); }
+ };
+
+ template <typename T, typename V, int E0, int E1, int E2, int E3>
+ struct _swizzle_base1<T,V,E0,E1,E2,E3,4> : public _swizzle_base0<T,4>
+ {
+ GLM_FUNC_QUALIFIER V operator ()() const { return V(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
+
+ 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).
+ */
+ template <typename ValueType, typename VecType, int N, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS>
+ struct _swizzle_base2 : public _swizzle_base1<ValueType,VecType,E0,E1,E2,E3,N>
+ {
+ typedef VecType vec_type;
+ typedef ValueType value_type;
+
+ GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const ValueType& t)
+ {
+ for (int i = 0; i < N; ++i)
+ (*this)[i] = t;
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const VecType& that)
+ {
+ struct op {
+ GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e = t; }
+ };
+ _apply_op(that, op());
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER void operator -= (const VecType& that)
+ {
+ struct op {
+ GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e -= t; }
+ };
+ _apply_op(that, op());
+ }
+
+ GLM_FUNC_QUALIFIER void operator += (const VecType& that)
+ {
+ struct op {
+ GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e += t; }
+ };
+ _apply_op(that, op());
+ }
+
+ GLM_FUNC_QUALIFIER void operator *= (const VecType& that)
+ {
+ struct op {
+ GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e *= t; }
+ };
+ _apply_op(that, op());
+ }
+
+ GLM_FUNC_QUALIFIER void operator /= (const VecType& that)
+ {
+ struct op {
+ GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e /= t; }
+ };
+ _apply_op(that, op());
+ }
+
+ GLM_FUNC_QUALIFIER value_type& operator[] (size_t i)
+ {
+#ifndef __CUDA_ARCH__
+ static
+#endif
+ const int offset_dst[4] = { E0, E1, E2, E3 };
+ return this->elem(offset_dst[i]);
+ }
+ GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const
+ {
+#ifndef __CUDA_ARCH__
+ static
+#endif
+ const int offset_dst[4] = { E0, E1, E2, E3 };
+ return this->elem(offset_dst[i]);
+ }
+ protected:
+ template <typename T>
+ GLM_FUNC_QUALIFIER void _apply_op(const VecType& that, T op)
+ {
+ // Make a copy of the data in this == &that.
+ // The copier should optimize out the copy in cases where the function is
+ // properly inlined and the copy is not necessary.
+ ValueType t[N];
+ for (int i = 0; i < N; ++i)
+ t[i] = that[i];
+ for (int i = 0; i < N; ++i)
+ op( (*this)[i], t[i] );
+ }
+ };
+
+ // Specialization for swizzles containing duplicate elements. These cannot be modified.
+ template <typename ValueType, typename VecType, int N, int E0, int E1, int E2, int E3>
+ struct _swizzle_base2<ValueType,VecType,N,E0,E1,E2,E3,1> : public _swizzle_base1<ValueType,VecType,E0,E1,E2,E3,N>
+ {
+ typedef VecType vec_type;
+ typedef ValueType value_type;
+
+ struct Stub {};
+ GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const &) { return *this; }
+
+ GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const
+ {
+#ifndef __CUDA_ARCH__
+ static
+#endif
+ const int offset_dst[4] = { E0, E1, E2, E3 };
+ return this->elem(offset_dst[i]);
+ }
+ };
+
+ template <int N,typename ValueType, typename VecType, int E0,int E1,int E2,int E3>
+ struct swizzle : public _swizzle_base2<ValueType,VecType,N,E0,E1,E2,E3,(E0==E1||E0==E2||E0==E3||E1==E2||E1==E3||E2==E3)>
+ {
+ typedef _swizzle_base2<ValueType,VecType,N,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 () 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, typename V, int E0, int E1, int E2, int E3>
+#define _GLM_SWIZZLE_TEMPLATE2 template <int N, typename T, typename V, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3>
+#define _GLM_SWIZZLE_TYPE1 glm::detail::swizzle<N,T,V,E0,E1,E2,E3>
+#define _GLM_SWIZZLE_TYPE2 glm::detail::swizzle<N,T,V,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 V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \
+ { \
+ return a() OPERAND b(); \
+ } \
+ _GLM_SWIZZLE_TEMPLATE1 \
+ GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const V& b) \
+ { \
+ return a() OPERAND b; \
+ } \
+ _GLM_SWIZZLE_TEMPLATE1 \
+ GLM_FUNC_QUALIFIER V operator OPERAND ( const V& a, const _GLM_SWIZZLE_TYPE1& b) \
+ { \
+ return a OPERAND b(); \
+ }
+
+//
+// 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 V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \
+ { \
+ return a() OPERAND b; \
+ } \
+ _GLM_SWIZZLE_TEMPLATE1 \
+ GLM_FUNC_QUALIFIER V operator OPERAND ( const T& a, const _GLM_SWIZZLE_TYPE1& b) \
+ { \
+ return a OPERAND b(); \
+ }
+
+//
+// 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) \
+ { \
+ return FUNCTION(a()); \
+ }
+
+//
+// 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) \
+ { \
+ 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) \
+ { \
+ 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) \
+ { \
+ 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) \
+ { \
+ 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) \
+ { \
+ 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) \
+ { \
+ 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)\
+ { \
+ 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) \
+ { \
+ return FUNCTION(a, b(), c); \
+ }
+
+}//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(/)
+ }
+
+ //
+ // Swizzles are distinct types from the unswizzled type. The below macros will
+ // provide template specializations for the swizzle types for the given functions
+ // so that the compiler does not have any ambiguity to choosing how to handle
+ // the function.
+ //
+ // The alternative is to use the operator()() when calling the function in order
+ // 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_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,E0,E1) \
+ struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; };
+
+#define _GLM_SWIZZLE2_3_MEMBERS(T,P2,E0,E1) \
+ struct { glm::detail::swizzle<3,T,P2,0,0,0,-1> E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P2,0,0,1,-1> E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P2,0,1,0,-1> E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P2,0,1,1,-1> E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P2,1,0,0,-1> E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P2,1,0,1,-1> E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P2,1,1,0,-1> E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P2,1,1,1,-1> E1 ## E1 ## E1; };
+
+#define _GLM_SWIZZLE2_4_MEMBERS(T,P2,E0,E1) \
+ struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; };
+
+#define _GLM_SWIZZLE3_2_MEMBERS(T,P2,E0,E1,E2) \
+ struct { glm::detail::swizzle<2,T,P2,0,0,-1,-2> E0 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P2,0,1,-1,-2> E0 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P2,0,2,-1,-2> E0 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P2,1,0,-1,-2> E1 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P2,1,1,-1,-2> E1 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P2,1,2,-1,-2> E1 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P2,2,0,-1,-2> E2 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P2,2,1,-1,-2> E2 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P2,2,2,-1,-2> E2 ## E2; };
+
+#define _GLM_SWIZZLE3_3_MEMBERS(T,P,E0,E1,E2) \
+ struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; };
+
+#define _GLM_SWIZZLE3_4_MEMBERS(T,P2,E0,E1,E2) \
+ struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P2,2,2,2,2> E2 ## E2 ## E2 ## E2; };
+
+#define _GLM_SWIZZLE4_2_MEMBERS(T,P,E0,E1,E2,E3) \
+ struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P,0,2,-1,-2> E0 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P,0,3,-1,-2> E0 ## E3; }; \
+ struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P,1,2,-1,-2> E1 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P,1,3,-1,-2> E1 ## E3; }; \
+ struct { glm::detail::swizzle<2,T,P,2,0,-1,-2> E2 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,2,1,-1,-2> E2 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P,2,2,-1,-2> E2 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P,2,3,-1,-2> E2 ## E3; }; \
+ struct { glm::detail::swizzle<2,T,P,3,0,-1,-2> E3 ## E0; }; \
+ struct { glm::detail::swizzle<2,T,P,3,1,-1,-2> E3 ## E1; }; \
+ struct { glm::detail::swizzle<2,T,P,3,2,-1,-2> E3 ## E2; }; \
+ struct { glm::detail::swizzle<2,T,P,3,3,-1,-2> E3 ## E3; };
+
+#define _GLM_SWIZZLE4_3_MEMBERS(T,P,E0,E1,E2,E3) \
+ struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,0,3,-1> E0 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,1,3,-1> E0 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,2,3,-1> E0 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,0,3,0,-1> E0 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,0,3,1,-1> E0 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,0,3,2,-1> E0 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,0,3,3,-1> E0 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,0,3,-1> E1 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,1,3,-1> E1 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,2,3,-1> E1 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,1,3,0,-1> E1 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,1,3,1,-1> E1 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,1,3,2,-1> E1 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,1,3,3,-1> E1 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,0,3,-1> E2 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,1,3,-1> E2 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,2,3,-1> E2 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,2,3,0,-1> E2 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,2,3,1,-1> E2 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,2,3,2,-1> E2 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,2,3,3,-1> E2 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,3,0,0,-1> E3 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,3,0,1,-1> E3 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,3,0,2,-1> E3 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,3,0,3,-1> E3 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,3,1,0,-1> E3 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,3,1,1,-1> E3 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,3,1,2,-1> E3 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,3,1,3,-1> E3 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,3,2,0,-1> E3 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,3,2,1,-1> E3 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,3,2,2,-1> E3 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,3,2,3,-1> E3 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<3,T,P,3,3,0,-1> E3 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<3,T,P,3,3,1,-1> E3 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<3,T,P,3,3,2,-1> E3 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<3,T,P,3,3,3,-1> E3 ## E3 ## E3; };
+
+#define _GLM_SWIZZLE4_4_MEMBERS(T,P,E0,E1,E2,E3) \
+ struct { glm::detail::swizzle<4,T,P,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,0,3> E0 ## E0 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,1,3> E0 ## E0 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,2,3> E0 ## E0 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,3,0> E0 ## E0 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,3,1> E0 ## E0 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,3,2> E0 ## E0 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,0,3,3> E0 ## E0 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,0,3> E0 ## E1 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,1,3> E0 ## E1 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,2,3> E0 ## E1 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,3,0> E0 ## E1 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,3,1> E0 ## E1 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,3,2> E0 ## E1 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,1,3,3> E0 ## E1 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,0,3> E0 ## E2 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,1,3> E0 ## E2 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,2,3> E0 ## E2 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,3,0> E0 ## E2 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,3,1> E0 ## E2 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,3,2> E0 ## E2 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,2,3,3> E0 ## E2 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,0,0> E0 ## E3 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,0,1> E0 ## E3 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,0,2> E0 ## E3 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,0,3> E0 ## E3 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,1,0> E0 ## E3 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,1,1> E0 ## E3 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,1,2> E0 ## E3 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,1,3> E0 ## E3 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,2,0> E0 ## E3 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,2,1> E0 ## E3 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,2,2> E0 ## E3 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,2,3> E0 ## E3 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,3,0> E0 ## E3 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,3,1> E0 ## E3 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,3,2> E0 ## E3 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,0,3,3,3> E0 ## E3 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,0,3> E1 ## E0 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,1,3> E1 ## E0 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,2,3> E1 ## E0 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,3,0> E1 ## E0 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,3,1> E1 ## E0 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,3,2> E1 ## E0 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,0,3,3> E1 ## E0 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,0,3> E1 ## E1 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,1,3> E1 ## E1 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,2,3> E1 ## E1 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,3,0> E1 ## E1 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,3,1> E1 ## E1 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,3,2> E1 ## E1 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,1,3,3> E1 ## E1 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,0,3> E1 ## E2 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,1,3> E1 ## E2 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,2,3> E1 ## E2 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,3,0> E1 ## E2 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,3,1> E1 ## E2 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,3,2> E1 ## E2 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,2,3,3> E1 ## E2 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,0,0> E1 ## E3 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,0,1> E1 ## E3 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,0,2> E1 ## E3 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,0,3> E1 ## E3 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,1,0> E1 ## E3 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,1,1> E1 ## E3 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,1,2> E1 ## E3 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,1,3> E1 ## E3 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,2,0> E1 ## E3 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,2,1> E1 ## E3 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,2,2> E1 ## E3 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,2,3> E1 ## E3 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,3,0> E1 ## E3 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,3,1> E1 ## E3 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,3,2> E1 ## E3 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,1,3,3,3> E1 ## E3 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,0,3> E2 ## E0 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,1,3> E2 ## E0 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,2,3> E2 ## E0 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,3,0> E2 ## E0 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,3,1> E2 ## E0 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,3,2> E2 ## E0 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,0,3,3> E2 ## E0 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,0,3> E2 ## E1 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,1,3> E2 ## E1 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,2,3> E2 ## E1 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,3,0> E2 ## E1 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,3,1> E2 ## E1 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,3,2> E2 ## E1 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,1,3,3> E2 ## E1 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,0,3> E2 ## E2 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,1,3> E2 ## E2 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,2,2> E2 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,2,3> E2 ## E2 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,3,0> E2 ## E2 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,3,1> E2 ## E2 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,3,2> E2 ## E2 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,2,3,3> E2 ## E2 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,0,0> E2 ## E3 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,0,1> E2 ## E3 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,0,2> E2 ## E3 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,0,3> E2 ## E3 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,1,0> E2 ## E3 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,1,1> E2 ## E3 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,1,2> E2 ## E3 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,1,3> E2 ## E3 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,2,0> E2 ## E3 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,2,1> E2 ## E3 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,2,2> E2 ## E3 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,2,3> E2 ## E3 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,3,0> E2 ## E3 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,3,1> E2 ## E3 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,3,2> E2 ## E3 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,2,3,3,3> E2 ## E3 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,0,0> E3 ## E0 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,0,1> E3 ## E0 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,0,2> E3 ## E0 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,0,3> E3 ## E0 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,1,0> E3 ## E0 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,1,1> E3 ## E0 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,1,2> E3 ## E0 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,1,3> E3 ## E0 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,2,0> E3 ## E0 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,2,1> E3 ## E0 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,2,2> E3 ## E0 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,2,3> E3 ## E0 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,3,0> E3 ## E0 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,3,1> E3 ## E0 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,3,2> E3 ## E0 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,0,3,3> E3 ## E0 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,0,0> E3 ## E1 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,0,1> E3 ## E1 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,0,2> E3 ## E1 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,0,3> E3 ## E1 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,1,0> E3 ## E1 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,1,1> E3 ## E1 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,1,2> E3 ## E1 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,1,3> E3 ## E1 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,2,0> E3 ## E1 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,2,1> E3 ## E1 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,2,2> E3 ## E1 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,2,3> E3 ## E1 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,3,0> E3 ## E1 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,3,1> E3 ## E1 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,3,2> E3 ## E1 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,1,3,3> E3 ## E1 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,0,0> E3 ## E2 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,0,1> E3 ## E2 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,0,2> E3 ## E2 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,0,3> E3 ## E2 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,1,0> E3 ## E2 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,1,1> E3 ## E2 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,1,2> E3 ## E2 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,1,3> E3 ## E2 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,2,0> E3 ## E2 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,2,1> E3 ## E2 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,2,2> E3 ## E2 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,2,3> E3 ## E2 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,3,0> E3 ## E2 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,3,1> E3 ## E2 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,3,2> E3 ## E2 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,2,3,3> E3 ## E2 ## E3 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,0,0> E3 ## E3 ## E0 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,0,1> E3 ## E3 ## E0 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,0,2> E3 ## E3 ## E0 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,0,3> E3 ## E3 ## E0 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,1,0> E3 ## E3 ## E1 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,1,1> E3 ## E3 ## E1 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,1,2> E3 ## E3 ## E1 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,1,3> E3 ## E3 ## E1 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,2,0> E3 ## E3 ## E2 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,2,1> E3 ## E3 ## E2 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,2,2> E3 ## E3 ## E2 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,2,3> E3 ## E3 ## E2 ## E3; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,3,0> E3 ## E3 ## E3 ## E0; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,3,1> E3 ## E3 ## E3 ## E1; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,3,2> E3 ## E3 ## E3 ## E2; }; \
+ struct { glm::detail::swizzle<4,T,P,3,3,3,3> E3 ## E3 ## E3 ## E3; };
+
+#endif//glm_core_swizzle
diff --git a/include/gal/opengl/glm/core/_swizzle_func.hpp b/include/gal/opengl/glm/core/_swizzle_func.hpp
new file mode 100644
index 0000000..be66784
--- /dev/null
+++ b/include/gal/opengl/glm/core/_swizzle_func.hpp
@@ -0,0 +1,787 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/_swizzle_func.hpp
+/// @date 2011-10-16 / 2011-10-16
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_swizzle_func
+#define glm_core_swizzle_func
+
+#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \
+ SWIZZLED_TYPE<TMPL_TYPE> A ## B() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B); \
+ }
+
+#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \
+ SWIZZLED_TYPE<TMPL_TYPE> A ## B ## C() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C); \
+ }
+
+#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \
+ SWIZZLED_TYPE<TMPL_TYPE> A ## B ## C ## D() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C, this->D); \
+ }
+
+#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \
+ template <typename TMPL_TYPE> \
+ SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B); \
+ }
+
+#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \
+ template <typename TMPL_TYPE> \
+ SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B ## C() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C); \
+ }
+
+#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \
+ template <typename TMPL_TYPE> \
+ SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B ## C ## D() CONST \
+ { \
+ return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C, this->D); \
+ }
+
+#define GLM_MUTABLE
+
+#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A)
+
+#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, 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, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B)
+
+#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A)
+
+#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C)
+
+#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, q)
+
+//GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3)
+
+#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C)
+
+#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B)
+
+#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A)
+
+#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D)
+
+#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \
+ GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p)
+
+//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, CLASS_TYPE, SWIZZLED_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B)
+
+#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B)
+
+#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, 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, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C)
+
+#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C)
+
+#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q)
+
+//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, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \
+ GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D)
+
+#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \
+ GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D)
+
+#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \
+ GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \
+ GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D)
+
+#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p)
+
+//GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4)
+
+#endif//glm_core_swizzle_func
diff --git a/include/gal/opengl/glm/core/_vectorize.hpp b/include/gal/opengl/glm/core/_vectorize.hpp
new file mode 100644
index 0000000..9984014
--- /dev/null
+++ b/include/gal/opengl/glm/core/_vectorize.hpp
@@ -0,0 +1,159 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/_vectorize.hpp
+/// @date 2011-10-14 / 2011-10-14
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#define VECTORIZE2_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec2<T> func( \
+ detail::tvec2<T> const & v) \
+ { \
+ return detail::tvec2<T>( \
+ func(v.x), \
+ func(v.y)); \
+ }
+
+#define VECTORIZE3_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec3<T> func( \
+ detail::tvec3<T> const & v) \
+ { \
+ return detail::tvec3<T>( \
+ func(v.x), \
+ func(v.y), \
+ func(v.z)); \
+ }
+
+#define VECTORIZE4_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec4<T> func( \
+ detail::tvec4<T> const & v) \
+ { \
+ return detail::tvec4<T>( \
+ func(v.x), \
+ func(v.y), \
+ func(v.z), \
+ func(v.w)); \
+ }
+
+#define VECTORIZE_VEC(func) \
+ VECTORIZE2_VEC(func) \
+ VECTORIZE3_VEC(func) \
+ VECTORIZE4_VEC(func)
+
+#define VECTORIZE2_VEC_SCA(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec2<T> func \
+ ( \
+ detail::tvec2<T> const & x, \
+ typename detail::tvec2<T>::value_type const & y \
+ ) \
+ { \
+ return detail::tvec2<T>( \
+ func(x.x, y), \
+ func(x.y, y)); \
+ }
+
+#define VECTORIZE3_VEC_SCA(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec3<T> func \
+ ( \
+ detail::tvec3<T> const & x, \
+ typename detail::tvec3<T>::value_type const & y \
+ ) \
+ { \
+ return detail::tvec3<T>( \
+ func(x.x, y), \
+ func(x.y, y), \
+ func(x.z, y)); \
+ }
+
+#define VECTORIZE4_VEC_SCA(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec4<T> func \
+ ( \
+ detail::tvec4<T> const & x, \
+ typename detail::tvec4<T>::value_type const & y \
+ ) \
+ { \
+ return detail::tvec4<T>( \
+ func(x.x, y), \
+ func(x.y, y), \
+ func(x.z, y), \
+ func(x.w, y)); \
+ }
+
+#define VECTORIZE_VEC_SCA(func) \
+ VECTORIZE2_VEC_SCA(func) \
+ VECTORIZE3_VEC_SCA(func) \
+ VECTORIZE4_VEC_SCA(func)
+
+#define VECTORIZE2_VEC_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec2<T> func \
+ ( \
+ detail::tvec2<T> const & x, \
+ detail::tvec2<T> const & y \
+ ) \
+ { \
+ return detail::tvec2<T>( \
+ func(x.x, y.x), \
+ func(x.y, y.y)); \
+ }
+
+#define VECTORIZE3_VEC_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec3<T> func \
+ ( \
+ detail::tvec3<T> const & x, \
+ detail::tvec3<T> const & y \
+ ) \
+ { \
+ return detail::tvec3<T>( \
+ func(x.x, y.x), \
+ func(x.y, y.y), \
+ func(x.z, y.z)); \
+ }
+
+#define VECTORIZE4_VEC_VEC(func) \
+ template <typename T> \
+ GLM_FUNC_QUALIFIER detail::tvec4<T> func \
+ ( \
+ detail::tvec4<T> const & x, \
+ detail::tvec4<T> const & y \
+ ) \
+ { \
+ return detail::tvec4<T>( \
+ func(x.x, y.x), \
+ func(x.y, y.y), \
+ func(x.z, y.z), \
+ func(x.w, y.w)); \
+ }
+
+#define VECTORIZE_VEC_VEC(func) \
+ VECTORIZE2_VEC_VEC(func) \
+ VECTORIZE3_VEC_VEC(func) \
+ VECTORIZE4_VEC_VEC(func)
diff --git a/include/gal/opengl/glm/core/dummy.cpp b/include/gal/opengl/glm/core/dummy.cpp
new file mode 100644
index 0000000..38fcca0
--- /dev/null
+++ b/include/gal/opengl/glm/core/dummy.cpp
@@ -0,0 +1,40 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/dummy.cpp
+/// @date 2011-01-19 / 2011-06-15
+/// @author Christophe Riccio
+///
+/// GLM is a header only library. There is nothing to compile.
+/// dummy.cpp exist only a wordaround for CMake file.
+///////////////////////////////////////////////////////////////////////////////////
+
+#define GLM_MESSAGES
+#include "../glm.hpp"
+
+//#error "GLM is a header only library"
+
+int main()
+{
+
+}
diff --git a/include/gal/opengl/glm/core/func_common.hpp b/include/gal/opengl/glm/core/func_common.hpp
new file mode 100644
index 0000000..fcf7eb7
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_common.hpp
@@ -0,0 +1,430 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_common.hpp
+/// @date 2008-03-08 / 2010-01-26
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GLM_CORE_func_common
+#define GLM_CORE_func_common GLM_VERSION
+
+#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 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 genType>
+ GLM_FUNC_DECL genType sign(genType 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 genType>
+ GLM_FUNC_DECL genType floor(genType 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 genType>
+ GLM_FUNC_DECL genType trunc(genType 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 genType>
+ GLM_FUNC_DECL genType round(genType 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 genType>
+ GLM_FUNC_DECL genType roundEven(genType 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 genType>
+ GLM_FUNC_DECL genType ceil(genType 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 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 const & x,
+ genType const & y);
+
+ /// 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 const & x,
+ typename genType::value_type 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 const & 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 const & x,
+ genType const & y);
+
+ template <typename genType>
+ GLM_FUNC_DECL genType min(
+ genType const & x,
+ typename genType::value_type 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 const & x,
+ genType const & y);
+
+ template <typename genType>
+ GLM_FUNC_DECL genType max(
+ genType const & x,
+ typename genType::value_type 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 const & x,
+ genType const & minVal,
+ genType const & maxVal);
+
+ template <typename genType>
+ GLM_FUNC_DECL genType clamp(
+ genType const & x,
+ typename genType::value_type const & minVal,
+ typename genType::value_type 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 genTypeT, typename genTypeU>
+ GLM_FUNC_DECL genTypeT mix(genTypeT const & x, genTypeT const & y, genTypeU const & a);
+
+ //! 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 <typename genType>
+ GLM_FUNC_DECL genType step(
+ genType const & edge,
+ genType const & x);
+
+ template <typename genType>
+ GLM_FUNC_DECL genType step(
+ typename genType::value_type const & edge,
+ genType 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 const & edge0,
+ genType const & edge1,
+ genType const & x);
+
+ template <typename genType>
+ GLM_FUNC_DECL genType smoothstep(
+ typename genType::value_type const & edge0,
+ typename genType::value_type const & edge1,
+ genType 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 genType>
+ GLM_FUNC_DECL typename genType::bool_type isnan(genType 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 genType>
+ GLM_FUNC_DECL typename genType::bool_type isinf(genType const & x);
+
+ /// Returns a signed integer value representing
+ /// the encoding of a floating-point value. The floatingpoint
+ /// value's bit-level representation is preserved.
+ ///
+ /// @tparam genType Single-precision floating-point scalar or vector types.
+ /// @tparam genIType Signed integer scalar or vector types.
+ ///
+ /// @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 <typename genType, typename genIType>
+ GLM_FUNC_DECL genIType floatBitsToInt(genType const & value);
+
+ /// Returns a unsigned integer value representing
+ /// the encoding of a floating-point value. The floatingpoint
+ /// value's bit-level representation is preserved.
+ ///
+ /// @tparam genType Single-precision floating-point scalar or vector types.
+ /// @tparam genUType Unsigned integer scalar or vector types.
+ ///
+ /// @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 <typename genType, typename genUType>
+ GLM_FUNC_DECL genUType floatBitsToUint(genType const & value);
+
+ /// 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 genType Single-precision floating-point scalar or vector types.
+ /// @tparam genIType Signed integer scalar or vector types.
+ ///
+ /// @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>
+ ///
+ /// @todo Clarify this declaration, we don't need to actually specify the return type
+ template <typename genType, typename genIType>
+ GLM_FUNC_DECL genType intBitsToFloat(genIType const & value);
+
+ /// 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 genType Single-precision floating-point scalar or vector types.
+ /// @tparam genUType Unsigned integer scalar or vector types.
+ ///
+ /// @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>
+ ///
+ /// @todo Clarify this declaration, we don't need to actually specify the return type
+ template <typename genType, typename genUType>
+ GLM_FUNC_DECL genType uintBitsToFloat(genUType const & value);
+
+ /// 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"
+
+#endif//GLM_CORE_func_common
diff --git a/include/gal/opengl/glm/core/func_common.inl b/include/gal/opengl/glm/core/func_common.inl
new file mode 100644
index 0000000..1c0d9df
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_common.inl
@@ -0,0 +1,1226 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_common.inl
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename genFIType, bool /*signed*/>
+ struct Abs_
+ {};
+
+ template <typename genFIType>
+ struct Abs_<genFIType, true>
+ {
+ GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x)
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<genFIType>::is_float ||
+ detail::type<genFIType>::is_int, "'abs' only accept floating-point and integer inputs");
+ return x >= genFIType(0) ? x : -x;
+ // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff;
+ }
+ };
+
+ template <typename genFIType>
+ struct Abs_<genFIType, false>
+ {
+ GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x)
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<genFIType>::is_uint, "'abs' only accept floating-point and integer inputs");
+ return x;
+ }
+ };
+}//namespace detail
+
+ // abs
+ template <typename genFIType>
+ GLM_FUNC_QUALIFIER genFIType abs
+ (
+ genFIType const & x
+ )
+ {
+ return detail::Abs_<genFIType, std::numeric_limits<genFIType>::is_signed>::get(x);
+ }
+
+ VECTORIZE_VEC(abs)
+
+ // sign
+ //Try something like based on x >> 31 to get the sign bit
+ template <typename genFIType>
+ GLM_FUNC_QUALIFIER genFIType sign
+ (
+ genFIType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<genFIType>::is_float ||
+ detail::type<genFIType>::is_int, "'sign' only accept signed inputs");
+
+ genFIType result;
+ if(x > genFIType(0))
+ result = genFIType(1);
+ else if(x < genFIType(0))
+ result = genFIType(-1);
+ else
+ result = genFIType(0);
+ return result;
+ }
+
+ VECTORIZE_VEC(sign)
+
+ // floor
+ template <>
+ GLM_FUNC_QUALIFIER detail::half floor<detail::half>(detail::half const & x)
+ {
+ return detail::half(::std::floor(float(x)));
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType floor(genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'floor' only accept floating-point inputs");
+
+ return ::std::floor(x);
+ }
+
+ VECTORIZE_VEC(floor)
+
+ // trunc
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType trunc(genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'trunc' only accept floating-point inputs");
+ return x < 0 ? -floor(-x) : floor(x);
+ }
+
+ VECTORIZE_VEC(trunc)
+
+ // round
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType round(genType const& x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'round' only accept floating-point inputs");
+
+ if(x < 0)
+ return genType(int(x - genType(0.5)));
+ return genType(int(x + genType(0.5)));
+ }
+
+ VECTORIZE_VEC(round)
+
+/*
+ // roundEven
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType roundEven(genType const& x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'roundEven' only accept floating-point inputs");
+
+ return genType(int(x + genType(int(x) % 2)));
+ }
+*/
+
+ // roundEven
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType roundEven(genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'roundEven' only accept floating-point inputs");
+
+ int Integer = int(x);
+ genType IntegerPart = genType(Integer);
+ genType FractionalPart = fract(x);
+
+ if(FractionalPart > genType(0.5) || FractionalPart < genType(0.5))
+ {
+ return round(x);
+ }
+ else if((Integer % 2) == 0)
+ {
+ return IntegerPart;
+ }
+ else if(x <= genType(0)) // Work around...
+ {
+ return IntegerPart - 1;
+ }
+ else
+ {
+ return IntegerPart + 1;
+ }
+ //else // Bug on MinGW 4.5.2
+ //{
+ // return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0));
+ //}
+ }
+
+ VECTORIZE_VEC(roundEven)
+
+ // ceil
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType ceil(genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'ceil' only accept floating-point inputs");
+
+ return ::std::ceil(x);
+ }
+
+ VECTORIZE_VEC(ceil)
+
+ // fract
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType fract
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fract' only accept floating-point inputs");
+
+ return x - ::std::floor(x);
+ }
+
+ VECTORIZE_VEC(fract)
+
+ // mod
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType mod
+ (
+ genType const & x,
+ genType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'mod' only accept floating-point inputs");
+
+ return x - y * floor(x / y);
+ }
+
+ VECTORIZE_VEC_SCA(mod)
+ VECTORIZE_VEC_VEC(mod)
+
+ // modf
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType modf
+ (
+ genType const & x,
+ genType & i
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'modf' only accept floating-point inputs");
+
+ return std::modf(x, &i);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec2<valType> modf
+ (
+ detail::tvec2<valType> const & x,
+ detail::tvec2<valType> & i
+ )
+ {
+ return detail::tvec2<valType>(
+ modf(x.x, i.x),
+ modf(x.y, i.y));
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec3<valType> modf
+ (
+ detail::tvec3<valType> const & x,
+ detail::tvec3<valType> & i
+ )
+ {
+ return detail::tvec3<valType>(
+ modf(x.x, i.x),
+ modf(x.y, i.y),
+ modf(x.z, i.z));
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec4<valType> modf
+ (
+ detail::tvec4<valType> const & x,
+ detail::tvec4<valType> & i
+ )
+ {
+ return detail::tvec4<valType>(
+ modf(x.x, i.x),
+ modf(x.y, i.y),
+ modf(x.z, i.z),
+ modf(x.w, i.w));
+ }
+
+ //// Only valid if (INT_MIN <= x-y <= INT_MAX)
+ //// min(x,y)
+ //r = y + ((x - y) & ((x - y) >> (sizeof(int) *
+ //CHAR_BIT - 1)));
+ //// max(x,y)
+ //r = x - ((x - y) & ((x - y) >> (sizeof(int) *
+ //CHAR_BIT - 1)));
+
+ // min
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType min
+ (
+ genType const & x,
+ genType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<genType>::is_float ||
+ detail::type<genType>::is_int ||
+ detail::type<genType>::is_uint, "'min' only accept numbers");
+
+ return x < y ? x : y;
+ }
+
+ VECTORIZE_VEC_SCA(min)
+ VECTORIZE_VEC_VEC(min)
+
+ // max
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType max
+ (
+ genType const & x,
+ genType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<genType>::is_float ||
+ detail::type<genType>::is_int ||
+ detail::type<genType>::is_uint, "'max' only accept numbers");
+
+ return x > y ? x : y;
+ }
+
+ VECTORIZE_VEC_SCA(max)
+ VECTORIZE_VEC_VEC(max)
+
+ // clamp
+ template <typename valType>
+ GLM_FUNC_QUALIFIER valType clamp
+ (
+ valType const & x,
+ valType const & minVal,
+ valType const & maxVal
+ )
+ {
+ GLM_STATIC_ASSERT(
+ detail::type<valType>::is_float ||
+ detail::type<valType>::is_int ||
+ detail::type<valType>::is_uint, "'clamp' only accept numbers");
+
+ return min(maxVal, max(minVal, x));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> clamp
+ (
+ detail::tvec2<T> const & x,
+ typename detail::tvec2<T>::value_type const & minVal,
+ typename detail::tvec2<T>::value_type const & maxVal
+ )
+ {
+ return detail::tvec2<T>(
+ clamp(x.x, minVal, maxVal),
+ clamp(x.y, minVal, maxVal));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> clamp
+ (
+ detail::tvec3<T> const & x,
+ typename detail::tvec3<T>::value_type const & minVal,
+ typename detail::tvec3<T>::value_type const & maxVal
+ )
+ {
+ return detail::tvec3<T>(
+ clamp(x.x, minVal, maxVal),
+ clamp(x.y, minVal, maxVal),
+ clamp(x.z, minVal, maxVal));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> clamp
+ (
+ detail::tvec4<T> const & x,
+ typename detail::tvec4<T>::value_type const & minVal,
+ typename detail::tvec4<T>::value_type const & maxVal
+ )
+ {
+ return detail::tvec4<T>(
+ clamp(x.x, minVal, maxVal),
+ clamp(x.y, minVal, maxVal),
+ clamp(x.z, minVal, maxVal),
+ clamp(x.w, minVal, maxVal));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> clamp
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & minVal,
+ detail::tvec2<T> const & maxVal
+ )
+ {
+ return detail::tvec2<T>(
+ clamp(x.x, minVal.x, maxVal.x),
+ clamp(x.y, minVal.y, maxVal.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> clamp
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & minVal,
+ detail::tvec3<T> const & maxVal
+ )
+ {
+ return detail::tvec3<T>(
+ clamp(x.x, minVal.x, maxVal.x),
+ clamp(x.y, minVal.y, maxVal.y),
+ clamp(x.z, minVal.z, maxVal.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> clamp
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & minVal,
+ detail::tvec4<T> const & maxVal
+ )
+ {
+ return detail::tvec4<T>(
+ clamp(x.x, minVal.x, maxVal.x),
+ clamp(x.y, minVal.y, maxVal.y),
+ clamp(x.z, minVal.z, maxVal.z),
+ clamp(x.w, minVal.w, maxVal.w));
+ }
+
+ // mix
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType mix
+ (
+ genType const & x,
+ genType const & y,
+ genType const & a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float , "'genType' is not floating-point type");
+
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec2<valType> mix
+ (
+ detail::tvec2<valType> const & x,
+ detail::tvec2<valType> const & y,
+ valType const & a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<valType>::is_float , "'genType' is not floating-point type");
+
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec3<valType> mix
+ (
+ detail::tvec3<valType> const & x,
+ detail::tvec3<valType> const & y,
+ valType const & a
+ )
+ {
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec4<valType> mix
+ (
+ detail::tvec4<valType> const & x,
+ detail::tvec4<valType> const & y,
+ valType const & a
+ )
+ {
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec2<valType> mix
+ (
+ detail::tvec2<valType> const & x,
+ detail::tvec2<valType> const & y,
+ detail::tvec2<valType> const & a
+ )
+ {
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec3<valType> mix
+ (
+ detail::tvec3<valType> const & x,
+ detail::tvec3<valType> const & y,
+ detail::tvec3<valType> const & a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<valType>::is_float , "'genType' is not floating-point type");
+
+ return x + a * (y - x);
+ }
+
+ template <typename valType>
+ GLM_FUNC_QUALIFIER detail::tvec4<valType> mix
+ (
+ detail::tvec4<valType> const & x,
+ detail::tvec4<valType> const & y,
+ detail::tvec4<valType> const & a
+ )
+ {
+ return x + a * (y - x);
+ }
+
+ //template <typename genTypeT>
+ //GLM_FUNC_QUALIFIER genTypeT mix
+ //(
+ // genTypeT const & x,
+ // genTypeT const & y,
+ // float const & a
+ //)
+ //{
+ // // It could be a vector too
+ // //GLM_STATIC_ASSERT(
+ // // detail::type<genTypeT>::is_float &&
+ // // detail::type<genTypeU>::is_float);
+
+ // return x + a * (y - x);
+ //}
+
+ template <>
+ GLM_FUNC_QUALIFIER float mix
+ (
+ float const & x,
+ float const & y,
+ bool const & a
+ )
+ {
+ return a ? y : x;
+ }
+
+ template <>
+ GLM_FUNC_QUALIFIER double mix
+ (
+ double const & x,
+ double const & y,
+ bool const & a
+ )
+ {
+ return a ? y : x;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> mix
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ bool a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ return a ? y : x;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> mix
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ bool a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ return a ? y : x;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> mix
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ bool a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ return a ? y : x;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> mix
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ typename detail::tvec2<T>::bool_type a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ detail::tvec2<T> result;
+ for
+ (
+ typename detail::tvec2<T>::size_type i = 0;
+ i < x.length(); ++i
+ )
+ {
+ result[i] = a[i] ? y[i] : x[i];
+ }
+ return result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> mix
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ typename detail::tvec3<T>::bool_type a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ detail::tvec3<T> result;
+ for
+ (
+ typename detail::tvec3<T>::size_type i = 0;
+ i < x.length(); ++i
+ )
+ {
+ result[i] = a[i] ? y[i] : x[i];
+ }
+ return result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> mix
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ typename detail::tvec4<T>::bool_type a
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs");
+
+ detail::tvec4<T> result;
+ for
+ (
+ typename detail::tvec4<T>::size_type i = 0;
+ i < x.length(); ++i
+ )
+ {
+ result[i] = a[i] ? y[i] : x[i];
+ }
+ return result;
+ }
+
+ // step
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType step
+ (
+ genType const & edge,
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'step' only accept floating-point inputs");
+
+ return x < edge ? genType(0) : genType(1);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> step
+ (
+ typename detail::tvec2<T>::value_type const & edge,
+ detail::tvec2<T> const & x
+ )
+ {
+ return detail::tvec2<T>(
+ x.x < edge ? T(0) : T(1),
+ x.y < edge ? T(0) : T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> step
+ (
+ typename detail::tvec3<T>::value_type const & edge,
+ detail::tvec3<T> const & x
+ )
+ {
+ return detail::tvec3<T>(
+ x.x < edge ? T(0) : T(1),
+ x.y < edge ? T(0) : T(1),
+ x.z < edge ? T(0) : T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> step
+ (
+ typename detail::tvec4<T>::value_type const & edge,
+ detail::tvec4<T> const & x
+ )
+ {
+ return detail::tvec4<T>(
+ x.x < edge ? T(0) : T(1),
+ x.y < edge ? T(0) : T(1),
+ x.z < edge ? T(0) : T(1),
+ x.w < edge ? T(0) : T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> step
+ (
+ detail::tvec2<T> const & edge,
+ detail::tvec2<T> const & x
+ )
+ {
+ return detail::tvec2<T>(
+ x.x < edge.x ? T(0) : T(1),
+ x.y < edge.y ? T(0) : T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> step
+ (
+ detail::tvec3<T> const & edge,
+ detail::tvec3<T> const & x
+ )
+ {
+ return detail::tvec3<T>(
+ x.x < edge.x ? T(0) : T(1),
+ x.y < edge.y ? T(0) : T(1),
+ x.z < edge.z ? T(0) : T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> step
+ (
+ detail::tvec4<T> const & edge,
+ detail::tvec4<T> const & x
+ )
+ {
+ return detail::tvec4<T>(
+ x.x < edge.x ? T(0) : T(1),
+ x.y < edge.y ? T(0) : T(1),
+ x.z < edge.z ? T(0) : T(1),
+ x.w < edge.w ? T(0) : T(1));
+ }
+
+ // smoothstep
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType smoothstep
+ (
+ genType const & edge0,
+ genType const & edge1,
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'smoothstep' only accept floating-point inputs");
+
+ genType tmp = clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1));
+ return tmp * tmp * (genType(3) - genType(2) * tmp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> smoothstep
+ (
+ typename detail::tvec2<T>::value_type const & edge0,
+ typename detail::tvec2<T>::value_type const & edge1,
+ detail::tvec2<T> const & x
+ )
+ {
+ return detail::tvec2<T>(
+ smoothstep(edge0, edge1, x.x),
+ smoothstep(edge0, edge1, x.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> smoothstep
+ (
+ typename detail::tvec3<T>::value_type const & edge0,
+ typename detail::tvec3<T>::value_type const & edge1,
+ detail::tvec3<T> const & x
+ )
+ {
+ return detail::tvec3<T>(
+ smoothstep(edge0, edge1, x.x),
+ smoothstep(edge0, edge1, x.y),
+ smoothstep(edge0, edge1, x.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> smoothstep
+ (
+ typename detail::tvec4<T>::value_type const & edge0,
+ typename detail::tvec4<T>::value_type const & edge1,
+ detail::tvec4<T> const & x
+ )
+ {
+ return detail::tvec4<T>(
+ smoothstep(edge0, edge1, x.x),
+ smoothstep(edge0, edge1, x.y),
+ smoothstep(edge0, edge1, x.z),
+ smoothstep(edge0, edge1, x.w));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> smoothstep
+ (
+ detail::tvec2<T> const & edge0,
+ detail::tvec2<T> const & edge1,
+ detail::tvec2<T> const & x
+ )
+ {
+ return detail::tvec2<T>(
+ smoothstep(edge0.x, edge1.x, x.x),
+ smoothstep(edge0.y, edge1.y, x.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> smoothstep
+ (
+ detail::tvec3<T> const & edge0,
+ detail::tvec3<T> const & edge1,
+ detail::tvec3<T> const & x
+ )
+ {
+ return detail::tvec3<T>(
+ smoothstep(edge0.x, edge1.x, x.x),
+ smoothstep(edge0.y, edge1.y, x.y),
+ smoothstep(edge0.z, edge1.z, x.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> smoothstep
+ (
+ detail::tvec4<T> const & edge0,
+ detail::tvec4<T> const & edge1,
+ detail::tvec4<T> const & x
+ )
+ {
+ return detail::tvec4<T>(
+ smoothstep(edge0.x, edge1.x, x.x),
+ smoothstep(edge0.y, edge1.y, x.y),
+ smoothstep(edge0.z, edge1.z, x.z),
+ smoothstep(edge0.w, edge1.w, x.w));
+ }
+
+ // TODO: Not working on MinGW...
+ template <typename genType>
+ GLM_FUNC_QUALIFIER bool isnan(genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'isnan' only accept floating-point inputs");
+
+# if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_INTEL))
+ return _isnan(x) != 0;
+# elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG))
+# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
+ return _isnan(x) != 0;
+# else
+ return std::isnan(x);
+# endif
+# elif(GLM_COMPILER & GLM_COMPILER_CUDA)
+ return isnan(x) != 0;
+# else
+ return std::isnan(x);
+# endif
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec2<T>::bool_type isnan
+ (
+ detail::tvec2<T> const & x
+ )
+ {
+ return typename detail::tvec2<T>::bool_type(
+ isnan(x.x),
+ isnan(x.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec3<T>::bool_type isnan
+ (
+ detail::tvec3<T> const & x
+ )
+ {
+ return typename detail::tvec3<T>::bool_type(
+ isnan(x.x),
+ isnan(x.y),
+ isnan(x.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec4<T>::bool_type isnan
+ (
+ detail::tvec4<T> const & x
+ )
+ {
+ return typename detail::tvec4<T>::bool_type(
+ isnan(x.x),
+ isnan(x.y),
+ isnan(x.z),
+ isnan(x.w));
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER bool isinf(
+ genType const & x)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'isinf' only accept floating-point inputs");
+
+# if(GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC))
+ return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF;
+# elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG))
+# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
+ return _isinf(x) != 0;
+# else
+ return std::isinf(x);
+# 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;
+# else
+ return std::isinf(x);
+# endif
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec2<T>::bool_type isinf
+ (
+ detail::tvec2<T> const & x
+ )
+ {
+ return typename detail::tvec2<T>::bool_type(
+ isinf(x.x),
+ isinf(x.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec3<T>::bool_type isinf
+ (
+ detail::tvec3<T> const & x
+ )
+ {
+ return typename detail::tvec3<T>::bool_type(
+ isinf(x.x),
+ isinf(x.y),
+ isinf(x.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec4<T>::bool_type isinf
+ (
+ detail::tvec4<T> const & x
+ )
+ {
+ return typename detail::tvec4<T>::bool_type(
+ isinf(x.x),
+ isinf(x.y),
+ isinf(x.z),
+ isinf(x.w));
+ }
+
+ GLM_FUNC_QUALIFIER int floatBitsToInt(float const & value)
+ {
+ union
+ {
+ float f;
+ int i;
+ } fi;
+
+ fi.f = value;
+ return fi.i;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<int> floatBitsToInt
+ (
+ detail::tvec2<float> const & value
+ )
+ {
+ return detail::tvec2<int>(
+ floatBitsToInt(value.x),
+ floatBitsToInt(value.y));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec3<int> floatBitsToInt
+ (
+ detail::tvec3<float> const & value
+ )
+ {
+ return detail::tvec3<int>(
+ floatBitsToInt(value.x),
+ floatBitsToInt(value.y),
+ floatBitsToInt(value.z));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<int> floatBitsToInt
+ (
+ detail::tvec4<float> const & value
+ )
+ {
+ return detail::tvec4<int>(
+ floatBitsToInt(value.x),
+ floatBitsToInt(value.y),
+ floatBitsToInt(value.z),
+ floatBitsToInt(value.w));
+ }
+
+ GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & value)
+ {
+ union
+ {
+ float f;
+ uint u;
+ } fu;
+
+ fu.f = value;
+ return fu.u;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<uint> floatBitsToUint
+ (
+ detail::tvec2<float> const & value
+ )
+ {
+ return detail::tvec2<uint>(
+ floatBitsToUint(value.x),
+ floatBitsToUint(value.y));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec3<uint> floatBitsToUint
+ (
+ detail::tvec3<float> const & value
+ )
+ {
+ return detail::tvec3<uint>(
+ floatBitsToUint(value.x),
+ floatBitsToUint(value.y),
+ floatBitsToUint(value.z));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<uint> floatBitsToUint
+ (
+ detail::tvec4<float> const & value
+ )
+ {
+ return detail::tvec4<uint>(
+ floatBitsToUint(value.x),
+ floatBitsToUint(value.y),
+ floatBitsToUint(value.z),
+ floatBitsToUint(value.w));
+ }
+
+ GLM_FUNC_QUALIFIER float intBitsToFloat(int const & value)
+ {
+ union
+ {
+ float f;
+ int i;
+ } fi;
+
+ fi.i = value;
+ return fi.f;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<float> intBitsToFloat
+
+ (
+ detail::tvec2<int> const & value
+ )
+ {
+ return detail::tvec2<float>(
+ intBitsToFloat(value.x),
+ intBitsToFloat(value.y));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec3<float> intBitsToFloat
+ (
+ detail::tvec3<int> const & value
+ )
+ {
+ return detail::tvec3<float>(
+ intBitsToFloat(value.x),
+ intBitsToFloat(value.y),
+ intBitsToFloat(value.z));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<float> intBitsToFloat
+ (
+ detail::tvec4<int> const & value
+ )
+ {
+ return detail::tvec4<float>(
+ intBitsToFloat(value.x),
+ intBitsToFloat(value.y),
+ intBitsToFloat(value.z),
+ intBitsToFloat(value.w));
+ }
+
+ GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & value)
+ {
+ union
+ {
+ float f;
+ uint u;
+ } fu;
+
+ fu.u = value;
+ return fu.f;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<float> uintBitsToFloat
+ (
+ detail::tvec2<uint> const & value
+ )
+ {
+ return detail::tvec2<float>(
+ uintBitsToFloat(value.x),
+ uintBitsToFloat(value.y));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec3<float> uintBitsToFloat
+ (
+ detail::tvec3<uint> const & value
+ )
+ {
+ return detail::tvec3<float>(
+ uintBitsToFloat(value.x),
+ uintBitsToFloat(value.y),
+ uintBitsToFloat(value.z));
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<float> uintBitsToFloat
+ (
+ detail::tvec4<uint> const & value
+ )
+ {
+ return detail::tvec4<float>(
+ uintBitsToFloat(value.x),
+ uintBitsToFloat(value.y),
+ uintBitsToFloat(value.z),
+ uintBitsToFloat(value.w));
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType fma
+ (
+ genType const & a,
+ genType const & b,
+ genType const & c
+ )
+ {
+ return a * b + c;
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType frexp
+ (
+ genType const & x,
+ int & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> frexp
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<int> & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> frexp
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<int> & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> frexp
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<int> & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType ldexp
+ (
+ genType const & x,
+ int const & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> ldexp
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<int> const & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> ldexp
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<int> const & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> ldexp
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<int> const & exp
+ )
+ {
+ return std::frexp(x, exp);
+ }
+
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_exponential.hpp b/include/gal/opengl/glm/core/func_exponential.hpp
new file mode 100644
index 0000000..dc76fcb
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_exponential.hpp
@@ -0,0 +1,123 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_exponential.hpp
+/// @date 2008-08-08 / 2011-06-14
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_func_exponential
+#define glm_core_func_exponential GLM_VERSION
+
+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 x 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 genType>
+ GLM_FUNC_DECL genType pow(genType const & base, genType const & exponent);
+
+ /// Returns the natural exponentiation of x, i.e., e^x.
+ ///
+ /// @param x exp function is defined for input values of x 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 genType>
+ GLM_FUNC_DECL genType exp(genType const & x);
+
+ /// Returns the natural logarithm of x, i.e.,
+ /// returns the value y which satisfies the equation x = e^y.
+ /// Results are undefined if x <= 0.
+ ///
+ /// @param x log function is defined for input values of x 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 genType>
+ GLM_FUNC_DECL genType log(genType const & x);
+
+ /// Returns 2 raised to the x power.
+ ///
+ /// @param x exp2 function is defined for input values of x 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 genType>
+ GLM_FUNC_DECL genType exp2(genType const & x);
+
+ /// Returns the base 2 log of x, i.e., returns the value y,
+ /// which satisfies the equation x = 2 ^ y.
+ ///
+ /// @param x log2 function is defined for input values of x 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 genType>
+ GLM_FUNC_DECL genType log2(genType const & x);
+
+ /// Returns the positive square root of x.
+ ///
+ /// @param x sqrt function is defined for input values of x 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);
+
+ /// Returns the reciprocal of the positive square root of x.
+ ///
+ /// @param x inversesqrt function is defined for input values of x 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 genType>
+ GLM_FUNC_DECL genType inversesqrt(genType const & x);
+
+ /// @}
+}//namespace glm
+
+#include "func_exponential.inl"
+
+#endif//glm_core_func_exponential
diff --git a/include/gal/opengl/glm/core/func_exponential.inl b/include/gal/opengl/glm/core/func_exponential.inl
new file mode 100644
index 0000000..1b08786
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_exponential.inl
@@ -0,0 +1,156 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_exponential.inl
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ // pow
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType pow
+ (
+ genType const & x,
+ genType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'pow' only accept floating-point input");
+
+ return genType(::std::pow(x, y));
+ }
+
+ VECTORIZE_VEC_VEC(pow)
+
+ // exp
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType exp
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'exp' only accept floating-point input");
+
+ return genType(::std::exp(x));
+ }
+
+ VECTORIZE_VEC(exp)
+
+ // log
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType log
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'log' only accept floating-point input");
+
+ return genType(::std::log(x));
+ }
+
+ VECTORIZE_VEC(log)
+
+ //exp2, ln2 = 0.69314718055994530941723212145818f
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType exp2
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'exp2' only accept floating-point input");
+
+ return genType(::std::exp(genType(0.69314718055994530941723212145818) * x));
+ }
+
+ VECTORIZE_VEC(exp2)
+
+namespace _detail
+{
+ template <int _PATH = detail::float_or_int_value::GLM_ERROR>
+ struct _compute_log2
+ {
+ template <typename T>
+ T operator() (T const & Value) const;
+/*
+ {
+ GLM_STATIC_ASSERT(0, "'log2' parameter has an invalid template parameter type. GLM core features only supports floating-point types, include <glm/gtx/integer.hpp> for integer types support. Others types are not supported.");
+ return Value;
+ }
+*/
+ };
+
+ template <>
+ struct _compute_log2<detail::float_or_int_value::GLM_FLOAT>
+ {
+ template <typename T>
+ T operator() (T const & Value) const
+ {
+ return T(::std::log(Value)) / T(0.69314718055994530941723212145818);
+ }
+ };
+
+}//namespace _detail
+
+ // log2, ln2 = 0.69314718055994530941723212145818f
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType log2
+ (
+ genType const & x
+ )
+ {
+ assert(x > genType(0)); // log2 is only defined on the range (0, inf]
+ return _detail::_compute_log2<detail::float_or_int_trait<genType>::ID>()(x);
+ }
+
+ VECTORIZE_VEC(log2)
+
+ // sqrt
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType sqrt
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sqrt' only accept floating-point input");
+
+ return genType(::std::sqrt(x));
+ }
+
+ VECTORIZE_VEC(sqrt)
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType inversesqrt
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'inversesqrt' only accept floating-point input");
+ assert(x > genType(0));
+
+ return genType(1) / ::std::sqrt(x);
+ }
+
+ VECTORIZE_VEC(inversesqrt)
+
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_geometric.hpp b/include/gal/opengl/glm/core/func_geometric.hpp
new file mode 100644
index 0000000..c221084
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_geometric.hpp
@@ -0,0 +1,138 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_geometric.hpp
+/// @date 2008-08-03 / 2011-06-14
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_func_geometric
+#define glm_core_func_geometric GLM_VERSION
+
+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 genType>
+ GLM_FUNC_DECL typename genType::value_type length(
+ genType 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 genType>
+ GLM_FUNC_DECL typename genType::value_type distance(
+ genType const & p0,
+ genType 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 genType>
+ GLM_FUNC_DECL typename genType::value_type dot(
+ genType const & x,
+ genType 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 valType>
+ GLM_FUNC_DECL detail::tvec3<valType> cross(
+ detail::tvec3<valType> const & x,
+ detail::tvec3<valType> const & y);
+
+ /// Returns a vector in the same direction as x but with length of 1.
+ ///
+ /// @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 genType>
+ GLM_FUNC_DECL genType normalize(
+ genType 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 genType>
+ GLM_FUNC_DECL genType faceforward(
+ genType const & N,
+ genType const & I,
+ genType 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 genType>
+ GLM_FUNC_DECL genType refract(
+ genType const & I,
+ genType const & N,
+ typename genType::value_type const & eta);
+
+ /// @}
+}//namespace glm
+
+#include "func_geometric.inl"
+
+#endif//glm_core_func_geometric
diff --git a/include/gal/opengl/glm/core/func_geometric.inl b/include/gal/opengl/glm/core/func_geometric.inl
new file mode 100644
index 0000000..259a0ff
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_geometric.inl
@@ -0,0 +1,321 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_geometric.inl
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ // length
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType length
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'length' only accept floating-point inputs");
+
+ genType sqr = x * x;
+ return sqrt(sqr);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type length
+ (
+ detail::tvec2<T> const & v
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs");
+
+ typename detail::tvec2<T>::value_type sqr = v.x * v.x + v.y * v.y;
+ return sqrt(sqr);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec3<T>::value_type length
+ (
+ detail::tvec3<T> const & v
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs");
+
+ typename detail::tvec3<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z;
+ return sqrt(sqr);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec4<T>::value_type length
+ (
+ detail::tvec4<T> const & v
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs");
+
+ typename detail::tvec4<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
+ return sqrt(sqr);
+ }
+
+ // distance
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType distance
+ (
+ genType const & p0,
+ genType const & p1
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'distance' only accept floating-point inputs");
+
+ return length(p1 - p0);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type distance
+ (
+ detail::tvec2<T> const & p0,
+ detail::tvec2<T> const & p1
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs");
+
+ return length(p1 - p0);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec3<T>::value_type distance
+ (
+ detail::tvec3<T> const & p0,
+ detail::tvec3<T> const & p1
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs");
+
+ return length(p1 - p0);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec4<T>::value_type distance
+ (
+ detail::tvec4<T> const & p0,
+ detail::tvec4<T> const & p1
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs");
+
+ return length(p1 - p0);
+ }
+
+ // dot
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType dot
+ (
+ genType const & x,
+ genType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'dot' only accept floating-point inputs");
+
+ return x * y;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type dot
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs");
+
+ return x.x * y.x + x.y * y.y;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER T dot
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs");
+
+ return x.x * y.x + x.y * y.y + x.z * y.z;
+ }
+/* // SSE3
+ GLM_FUNC_QUALIFIER float dot(const tvec4<float>& x, const tvec4<float>& y)
+ {
+ float Result;
+ __asm
+ {
+ mov esi, x
+ mov edi, y
+ movaps xmm0, [esi]
+ mulps xmm0, [edi]
+ haddps( _xmm0, _xmm0 )
+ haddps( _xmm0, _xmm0 )
+ movss Result, xmm0
+ }
+ return Result;
+ }
+*/
+ template <typename T>
+ GLM_FUNC_QUALIFIER T dot
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs");
+
+ return x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w;
+ }
+
+ // cross
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> cross
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'cross' only accept floating-point inputs");
+
+ return detail::tvec3<T>(
+ x.y * y.z - y.y * x.z,
+ x.z * y.x - y.z * x.x,
+ x.x * y.y - y.x * x.y);
+ }
+
+ // normalize
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType normalize
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'normalize' only accept floating-point inputs");
+
+ return x < genType(0) ? genType(-1) : genType(1);
+ }
+
+ // According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefine and generate an error
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> normalize
+ (
+ detail::tvec2<T> const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs");
+
+ typename detail::tvec2<T>::value_type sqr = x.x * x.x + x.y * x.y;
+ return x * inversesqrt(sqr);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> normalize
+ (
+ detail::tvec3<T> const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs");
+
+ typename detail::tvec3<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z;
+ return x * inversesqrt(sqr);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> normalize
+ (
+ detail::tvec4<T> const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs");
+
+ typename detail::tvec4<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
+ return x * inversesqrt(sqr);
+ }
+
+ // faceforward
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType faceforward
+ (
+ genType const & N,
+ genType const & I,
+ genType const & Nref
+ )
+ {
+ return dot(Nref, I) < 0 ? N : -N;
+ }
+
+ // reflect
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType reflect
+ (
+ genType const & I,
+ genType const & N
+ )
+ {
+ return I - N * dot(N, I) * genType(2);
+ }
+
+ // refract
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType refract
+ (
+ genType const & I,
+ genType const & N,
+ genType const & eta
+ )
+ {
+ //It could be a vector
+ //GLM_STATIC_ASSERT(detail::type<genType>::is_float);
+
+ genType dotValue = dot(N, I);
+ genType k = genType(1) - eta * eta * (genType(1) - dotValue * dotValue);
+ if(k < genType(0))
+ return genType(0);
+ else
+ return eta * I - (eta * dotValue + sqrt(k)) * N;
+ }
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType refract
+ (
+ genType const & I,
+ genType const & N,
+ typename genType::value_type const & eta
+ )
+ {
+ //It could be a vector
+ //GLM_STATIC_ASSERT(detail::type<genType>::is_float);
+
+ typename genType::value_type dotValue = dot(N, I);
+ typename genType::value_type k = typename genType::value_type(1) - eta * eta * (typename genType::value_type(1) - dotValue * dotValue);
+ if(k < typename genType::value_type(0))
+ return genType(0);
+ else
+ return eta * I - (eta * dotValue + sqrt(k)) * N;
+ }
+
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_integer.hpp b/include/gal/opengl/glm/core/func_integer.hpp
new file mode 100644
index 0000000..df9a401
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_integer.hpp
@@ -0,0 +1,201 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_integer.hpp
+/// @date 2010-03-17 / 2011-06-18
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_func_integer
+#define glm_core_func_integer GLM_VERSION
+
+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 <typename genUType>
+ GLM_FUNC_DECL genUType uaddCarry(
+ genUType const & x,
+ genUType const & y,
+ genUType & 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 <typename genUType>
+ GLM_FUNC_DECL genUType usubBorrow(
+ genUType const & x,
+ genUType const & y,
+ genUType & 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 <typename genUType>
+ GLM_FUNC_DECL void umulExtended(
+ genUType const & x,
+ genUType const & y,
+ genUType & msb,
+ genUType & 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 <typename genIType>
+ GLM_FUNC_DECL void imulExtended(
+ genIType const & x,
+ genIType const & y,
+ genIType & msb,
+ genIType & 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 genIUType 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 genIUType>
+ GLM_FUNC_DECL genIUType bitfieldExtract(
+ genIUType const & Value,
+ int const & Offset,
+ int const & 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 genIUType 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 genIUType>
+ GLM_FUNC_DECL genIUType bitfieldInsert(
+ genIUType const & Base,
+ genIUType const & Insert,
+ int const & Offset,
+ int const & 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 genIUType 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 genIUType>
+ GLM_FUNC_DECL genIUType bitfieldReverse(genIUType const & Value);
+
+ /// Returns the number of bits set to 1 in the binary representation of value.
+ ///
+ /// @tparam genIUType 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>
+ ///
+ /// @todo Clarify the declaration to specify that scalars are suported.
+ template <typename T, template <typename> class genIUType>
+ GLM_FUNC_DECL typename genIUType<T>::signed_type bitCount(genIUType<T> const & Value);
+
+ /// 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 or vector 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>
+ ///
+ /// @todo Clarify the declaration to specify that scalars are suported.
+ template <typename T, template <typename> class genIUType>
+ GLM_FUNC_DECL typename genIUType<T>::signed_type findLSB(genIUType<T> const & Value);
+
+ /// 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 or vector 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>
+ ///
+ /// @todo Clarify the declaration to specify that scalars are suported.
+ template <typename T, template <typename> class genIUType>
+ GLM_FUNC_DECL typename genIUType<T>::signed_type findMSB(genIUType<T> const & Value);
+
+ /// @}
+}//namespace glm
+
+#include "func_integer.inl"
+
+#endif//glm_core_func_integer
+
diff --git a/include/gal/opengl/glm/core/func_integer.inl b/include/gal/opengl/glm/core/func_integer.inl
new file mode 100644
index 0000000..ad8b1fe
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_integer.inl
@@ -0,0 +1,648 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_integer.inl
+/// @date 2010-03-17 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#if(GLM_ARCH != GLM_ARCH_PURE)
+#if(GLM_COMPILER & GLM_COMPILER_VC)
+# include <intrin.h>
+# pragma intrinsic(_BitScanReverse)
+#endif//(GLM_COMPILER & GLM_COMPILER_VC)
+#endif//(GLM_ARCH != GLM_ARCH_PURE)
+
+namespace glm
+{
+ // uaddCarry
+ template <typename genUType>
+ GLM_FUNC_QUALIFIER genUType uaddCarry
+ (
+ genUType const & x,
+ genUType const & y,
+ genUType & Carry
+ )
+ {
+ detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y);
+ genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32)));
+ Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> uaddCarry
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ detail::tvec2<T> & Carry
+ )
+ {
+ return detail::tvec2<T>(
+ uaddCarry(x[0], y[0], Carry[0]),
+ uaddCarry(x[1], y[1], Carry[1]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> uaddCarry
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ detail::tvec3<T> & Carry
+ )
+ {
+ return detail::tvec3<T>(
+ uaddCarry(x[0], y[0], Carry[0]),
+ uaddCarry(x[1], y[1], Carry[1]),
+ uaddCarry(x[2], y[2], Carry[2]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> uaddCarry
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ detail::tvec4<T> & Carry
+ )
+ {
+ return detail::tvec4<T>(
+ uaddCarry(x[0], y[0], Carry[0]),
+ uaddCarry(x[1], y[1], Carry[1]),
+ uaddCarry(x[2], y[2], Carry[2]),
+ uaddCarry(x[3], y[3], Carry[3]));
+ }
+
+ // usubBorrow
+ template <typename genUType>
+ GLM_FUNC_QUALIFIER genUType usubBorrow
+ (
+ genUType const & x,
+ genUType const & y,
+ genUType & Borrow
+ )
+ {
+ Borrow = x >= y ? 0 : 1;
+ if(x > y)
+ return genUType(detail::highp_int_t(x) - detail::highp_int_t(y));
+ else
+ return genUType((detail::highp_int_t(1) << detail::highp_int_t(32)) + detail::highp_int_t(x) - detail::highp_int_t(y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> usubBorrow
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ detail::tvec2<T> & Borrow
+ )
+ {
+ return detail::tvec2<T>(
+ usubBorrow(x[0], y[0], Borrow[0]),
+ usubBorrow(x[1], y[1], Borrow[1]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> usubBorrow
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ detail::tvec3<T> & Borrow
+ )
+ {
+ return detail::tvec3<T>(
+ usubBorrow(x[0], y[0], Borrow[0]),
+ usubBorrow(x[1], y[1], Borrow[1]),
+ usubBorrow(x[2], y[2], Borrow[2]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> usubBorrow
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ detail::tvec4<T> & Borrow
+ )
+ {
+ return detail::tvec4<T>(
+ usubBorrow(x[0], y[0], Borrow[0]),
+ usubBorrow(x[1], y[1], Borrow[1]),
+ usubBorrow(x[2], y[2], Borrow[2]),
+ usubBorrow(x[3], y[3], Borrow[3]));
+ }
+
+ // umulExtended
+ template <typename genUType>
+ GLM_FUNC_QUALIFIER void umulExtended
+ (
+ genUType const & x,
+ genUType const & y,
+ genUType & msb,
+ genUType & lsb
+ )
+ {
+ detail::highp_uint_t ValueX64 = x;
+ detail::highp_uint_t ValueY64 = y;
+ detail::highp_uint_t Value64 = ValueX64 * ValueY64;
+ msb = *(genUType*)&genUType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1)));
+ lsb = *(genUType*)&genUType(Value64 >> detail::highp_uint_t(32));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> umulExtended
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ detail::tvec2<T> & msb,
+ detail::tvec2<T> & lsb
+ )
+ {
+ return detail::tvec2<T>(
+ umulExtended(x[0], y[0], msb, lsb),
+ umulExtended(x[1], y[1], msb, lsb));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> umulExtended
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ detail::tvec3<T> & msb,
+ detail::tvec3<T> & lsb
+ )
+ {
+ return detail::tvec3<T>(
+ umulExtended(x[0], y[0], msb, lsb),
+ umulExtended(x[1], y[1], msb, lsb),
+ umulExtended(x[2], y[2], msb, lsb));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> umulExtended
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ detail::tvec4<T> & msb,
+ detail::tvec4<T> & lsb
+ )
+ {
+ return detail::tvec4<T>(
+ umulExtended(x[0], y[0], msb, lsb),
+ umulExtended(x[1], y[1], msb, lsb),
+ umulExtended(x[2], y[2], msb, lsb),
+ umulExtended(x[3], y[3], msb, lsb));
+ }
+
+ // imulExtended
+ template <typename genIType>
+ GLM_FUNC_QUALIFIER void imulExtended
+ (
+ genIType const & x,
+ genIType const & y,
+ genIType & msb,
+ genIType & lsb
+ )
+ {
+ detail::highp_int_t ValueX64 = x;
+ detail::highp_int_t ValueY64 = y;
+ detail::highp_int_t Value64 = ValueX64 * ValueY64;
+ msb = *(genIType*)&genIType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1)));
+ lsb = *(genIType*)&genIType(Value64 >> detail::highp_uint_t(32));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> imulExtended
+ (
+ detail::tvec2<T> const & x,
+ detail::tvec2<T> const & y,
+ detail::tvec2<T> & msb,
+ detail::tvec2<T> & lsb
+ )
+ {
+ return detail::tvec2<T>(
+ imulExtended(x[0], y[0], msb, lsb),
+ imulExtended(x[1], y[1], msb, lsb));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> imulExtended
+ (
+ detail::tvec3<T> const & x,
+ detail::tvec3<T> const & y,
+ detail::tvec3<T> & msb,
+ detail::tvec3<T> & lsb
+ )
+ {
+ return detail::tvec3<T>(
+ imulExtended(x[0], y[0], msb, lsb),
+ imulExtended(x[1], y[1], msb, lsb),
+ imulExtended(x[2], y[2], msb, lsb));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> imulExtended
+ (
+ detail::tvec4<T> const & x,
+ detail::tvec4<T> const & y,
+ detail::tvec4<T> & msb,
+ detail::tvec4<T> & lsb
+ )
+ {
+ return detail::tvec4<T>(
+ imulExtended(x[0], y[0], msb, lsb),
+ imulExtended(x[1], y[1], msb, lsb),
+ imulExtended(x[2], y[2], msb, lsb),
+ imulExtended(x[3], y[3], msb, lsb));
+ }
+
+ // bitfieldExtract
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER genIUType bitfieldExtract
+ (
+ genIUType const & Value,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ int GenSize = int(sizeof(genIUType)) << int(3);
+
+ assert(Offset + Bits <= GenSize);
+
+ genIUType ShiftLeft = Bits ? Value << (GenSize - (Bits + Offset)) : genIUType(0);
+ genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Bits);
+
+ return ShiftBack;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> bitfieldExtract
+ (
+ detail::tvec2<T> const & Value,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec2<T>(
+ bitfieldExtract(Value[0], Offset, Bits),
+ bitfieldExtract(Value[1], Offset, Bits));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> bitfieldExtract
+ (
+ detail::tvec3<T> const & Value,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec3<T>(
+ bitfieldExtract(Value[0], Offset, Bits),
+ bitfieldExtract(Value[1], Offset, Bits),
+ bitfieldExtract(Value[2], Offset, Bits));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> bitfieldExtract
+ (
+ detail::tvec4<T> const & Value,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec4<T>(
+ bitfieldExtract(Value[0], Offset, Bits),
+ bitfieldExtract(Value[1], Offset, Bits),
+ bitfieldExtract(Value[2], Offset, Bits),
+ bitfieldExtract(Value[3], Offset, Bits));
+ }
+
+ // bitfieldInsert
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER genIUType bitfieldInsert
+ (
+ genIUType const & Base,
+ genIUType const & Insert,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitfieldInsert' only accept integer values");
+ assert(Offset + Bits <= sizeof(genIUType));
+
+ if(Bits == 0)
+ return Base;
+
+ genIUType Mask = 0;
+ for(int Bit = Offset; Bit < Offset + Bits; ++Bit)
+ Mask |= (1 << Bit);
+
+ return (Base & ~Mask) | (Insert & Mask);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<T> bitfieldInsert
+ (
+ detail::tvec2<T> const & Base,
+ detail::tvec2<T> const & Insert,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec2<T>(
+ bitfieldInsert(Base[0], Insert[0], Offset, Bits),
+ bitfieldInsert(Base[1], Insert[1], Offset, Bits));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<T> bitfieldInsert
+ (
+ detail::tvec3<T> const & Base,
+ detail::tvec3<T> const & Insert,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec3<T>(
+ bitfieldInsert(Base[0], Insert[0], Offset, Bits),
+ bitfieldInsert(Base[1], Insert[1], Offset, Bits),
+ bitfieldInsert(Base[2], Insert[2], Offset, Bits));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<T> bitfieldInsert
+ (
+ detail::tvec4<T> const & Base,
+ detail::tvec4<T> const & Insert,
+ int const & Offset,
+ int const & Bits
+ )
+ {
+ return detail::tvec4<T>(
+ bitfieldInsert(Base[0], Insert[0], Offset, Bits),
+ bitfieldInsert(Base[1], Insert[1], Offset, Bits),
+ bitfieldInsert(Base[2], Insert[2], Offset, Bits),
+ bitfieldInsert(Base[3], Insert[3], Offset, Bits));
+ }
+
+ // bitfieldReverse
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType const & Value)
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitfieldReverse' only accept integer values");
+
+ genIUType Out = 0;
+ std::size_t BitSize = sizeof(genIUType) * 8;
+ for(std::size_t i = 0; i < BitSize; ++i)
+ if(Value & (genIUType(1) << i))
+ Out |= genIUType(1) << (BitSize - 1 - i);
+ return Out;
+ }
+
+ VECTORIZE_VEC(bitfieldReverse)
+
+ // bitCount
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER int bitCount(genIUType const & Value)
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitCount' only accept integer values");
+
+ int Count = 0;
+ for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i)
+ {
+ if(Value & (1 << i))
+ ++Count;
+ }
+ return Count;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<int> bitCount
+ (
+ detail::tvec2<T> const & value
+ )
+ {
+ return detail::tvec2<int>(
+ bitCount(value[0]),
+ bitCount(value[1]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<int> bitCount
+ (
+ detail::tvec3<T> const & value
+ )
+ {
+ return detail::tvec3<int>(
+ bitCount(value[0]),
+ bitCount(value[1]),
+ bitCount(value[2]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<int> bitCount
+ (
+ detail::tvec4<T> const & value
+ )
+ {
+ return detail::tvec4<int>(
+ bitCount(value[0]),
+ bitCount(value[1]),
+ bitCount(value[2]),
+ bitCount(value[3]));
+ }
+
+ // findLSB
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER int findLSB
+ (
+ genIUType const & Value
+ )
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findLSB' only accept integer values");
+ if(Value == 0)
+ return -1;
+
+ genIUType Bit;
+ for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){}
+ return Bit;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<int> findLSB
+ (
+ detail::tvec2<T> const & value
+ )
+ {
+ return detail::tvec2<int>(
+ findLSB(value[0]),
+ findLSB(value[1]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<int> findLSB
+ (
+ detail::tvec3<T> const & value
+ )
+ {
+ return detail::tvec3<int>(
+ findLSB(value[0]),
+ findLSB(value[1]),
+ findLSB(value[2]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<int> findLSB
+ (
+ detail::tvec4<T> const & value
+ )
+ {
+ return detail::tvec4<int>(
+ findLSB(value[0]),
+ findLSB(value[1]),
+ findLSB(value[2]),
+ findLSB(value[3]));
+ }
+
+ // findMSB
+#if((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_VC))
+
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER int findMSB
+ (
+ genIUType const & Value
+ )
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values");
+ if(Value == 0)
+ return -1;
+
+ unsigned long Result(0);
+ _BitScanReverse(&Result, Value);
+ return int(Result);
+ }
+/*
+// __builtin_clz seems to be buggy as it crasks for some values, from 0x00200000 to 80000000
+#elif((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC40))
+
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER int findMSB
+ (
+ genIUType const & Value
+ )
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values");
+ if(Value == 0)
+ return -1;
+
+ // clz returns the number or trailing 0-bits; see
+ // http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Other-Builtins.html
+ //
+ // NoteBecause __builtin_clz only works for unsigned ints, this
+ // implementation will not work for 64-bit integers.
+ //
+ return 31 - __builtin_clzl(Value);
+ }
+*/
+#else
+
+/* SSE implementation idea
+
+ __m128i const Zero = _mm_set_epi32( 0, 0, 0, 0);
+ __m128i const One = _mm_set_epi32( 1, 1, 1, 1);
+ __m128i Bit = _mm_set_epi32(-1, -1, -1, -1);
+ __m128i Tmp = _mm_set_epi32(Value, Value, Value, Value);
+ __m128i Mmi = Zero;
+ for(int i = 0; i < 32; ++i)
+ {
+ __m128i Shilt = _mm_and_si128(_mm_cmpgt_epi32(Tmp, One), One);
+ Tmp = _mm_srai_epi32(Tmp, One);
+ Bit = _mm_add_epi32(Bit, _mm_and_si128(Shilt, i));
+ Mmi = _mm_and_si128(Mmi, One);
+ }
+ return Bit;
+
+*/
+
+ template <typename genIUType>
+ GLM_FUNC_QUALIFIER int findMSB
+ (
+ genIUType const & Value
+ )
+ {
+ GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values");
+
+ if(Value == genIUType(0) || Value == genIUType(-1))
+ return -1;
+ else if(Value > 0)
+ {
+ genIUType Bit = genIUType(-1);
+ for(genIUType tmp = Value; tmp > 0; tmp >>= 1, ++Bit){}
+ return Bit;
+ }
+ else //if(Value < 0)
+ {
+ int const BitCount(sizeof(genIUType) * 8);
+ int MostSignificantBit(-1);
+ for(int BitIndex(0); BitIndex < BitCount; ++BitIndex)
+ MostSignificantBit = (Value & (1 << BitIndex)) ? MostSignificantBit : BitIndex;
+ assert(MostSignificantBit >= 0);
+ return MostSignificantBit;
+ }
+ }
+#endif//(GLM_COMPILER)
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec2<int> findMSB
+ (
+ detail::tvec2<T> const & value
+ )
+ {
+ return detail::tvec2<int>(
+ findMSB(value[0]),
+ findMSB(value[1]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec3<int> findMSB
+ (
+ detail::tvec3<T> const & value
+ )
+ {
+ return detail::tvec3<int>(
+ findMSB(value[0]),
+ findMSB(value[1]),
+ findMSB(value[2]));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tvec4<int> findMSB
+ (
+ detail::tvec4<T> const & value
+ )
+ {
+ return detail::tvec4<int>(
+ findMSB(value[0]),
+ findMSB(value[1]),
+ findMSB(value[2]),
+ findMSB(value[3]));
+ }
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_matrix.hpp b/include/gal/opengl/glm/core/func_matrix.hpp
new file mode 100644
index 0000000..3c92cbb
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_matrix.hpp
@@ -0,0 +1,150 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_matrix.hpp
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GLM_CORE_func_matrix
+#define GLM_CORE_func_matrix GLM_VERSION
+
+namespace glm
+{
+ /// @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 matType>
+ GLM_FUNC_DECL matType matrixCompMult(
+ matType const & x,
+ matType 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>
+ ///
+ /// @todo Clarify the declaration to specify that matType doesn't have to be provided when used.
+ template <typename vecType, typename matType>
+ GLM_FUNC_DECL matType outerProduct(
+ vecType const & c,
+ vecType 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>
+ template <typename matType>
+ GLM_FUNC_DECL typename matType::transpose_type transpose(
+ matType const & x);
+
+ /// Return the determinant of a mat2 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 valType>
+ GLM_FUNC_DECL typename detail::tmat2x2<valType>::value_type determinant(
+ detail::tmat2x2<valType> const & m);
+
+ /// Return the determinant of a mat3 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 valType>
+ GLM_FUNC_DECL typename detail::tmat3x3<valType>::value_type determinant(
+ detail::tmat3x3<valType> const & m);
+
+ /// Return the determinant of a mat4 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 valType>
+ GLM_FUNC_DECL typename detail::tmat4x4<valType>::value_type determinant(
+ detail::tmat4x4<valType> const & m);
+
+ /// Return the inverse of a mat2 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 valType>
+ GLM_FUNC_DECL detail::tmat2x2<valType> inverse(
+ detail::tmat2x2<valType> const & m);
+
+ /// Return the inverse of a mat3 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 valType>
+ GLM_FUNC_DECL detail::tmat3x3<valType> inverse(
+ detail::tmat3x3<valType> const & m);
+
+ /// Return the inverse of a mat4 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 valType>
+ GLM_FUNC_DECL detail::tmat4x4<valType> inverse(
+ detail::tmat4x4<valType> const & m);
+
+ /// @}
+}//namespace glm
+
+#include "func_matrix.inl"
+
+#endif//GLM_CORE_func_matrix
diff --git a/include/gal/opengl/glm/core/func_matrix.inl b/include/gal/opengl/glm/core/func_matrix.inl
new file mode 100644
index 0000000..d89d5d4
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_matrix.inl
@@ -0,0 +1,582 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_matrix.inl
+/// @date 2008-03-08 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ // matrixCompMult
+ template <typename matType>
+ GLM_FUNC_QUALIFIER matType matrixCompMult
+ (
+ matType const & x,
+ matType const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<typename matType::value_type>::is_float, "'matrixCompMult' only accept floating-point inputs");
+
+ matType result(matType::null);
+ for(typename matType::size_type i = 0; i < matType::row_size(); ++i)
+ result[i] = x[i] * y[i];
+ return result;
+ }
+
+ // outerProduct
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x2<T> outerProduct
+ (
+ detail::tvec2<T> const & c,
+ detail::tvec2<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat2x2<T> m(detail::tmat2x2<T>::null);
+ m[0][0] = c[0] * r[0];
+ m[0][1] = c[1] * r[0];
+ m[1][0] = c[0] * r[1];
+ m[1][1] = c[1] * r[1];
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat3x3<T> outerProduct
+ (
+ detail::tvec3<T> const & c,
+ detail::tvec3<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat3x3<T> m(detail::tmat3x3<T>::null);
+ for(typename detail::tmat3x3<T>::size_type i(0); i < m.length(); ++i)
+ m[i] = c * r[i];
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat4x4<T> outerProduct
+ (
+ detail::tvec4<T> const & c,
+ detail::tvec4<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat4x4<T> m(detail::tmat4x4<T>::null);
+ for(typename detail::tmat4x4<T>::size_type i(0); i < m.length(); ++i)
+ m[i] = c * r[i];
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x3<T> outerProduct
+ (
+ detail::tvec3<T> const & c,
+ detail::tvec2<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat2x3<T> m(detail::tmat2x3<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[0][2] = c.z * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[1][2] = c.z * r.y;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat3x2<T> outerProduct
+ (
+ detail::tvec2<T> const & c,
+ detail::tvec3<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat3x2<T> m(detail::tmat3x2<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[2][0] = c.x * r.z;
+ m[2][1] = c.y * r.z;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x4<T> outerProduct
+ (
+ detail::tvec4<T> const & c,
+ detail::tvec2<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat2x4<T> m(detail::tmat2x4<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[0][2] = c.z * r.x;
+ m[0][3] = c.w * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[1][2] = c.z * r.y;
+ m[1][3] = c.w * r.y;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat4x2<T> outerProduct
+ (
+ detail::tvec2<T> const & c,
+ detail::tvec4<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat4x2<T> m(detail::tmat4x2<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[2][0] = c.x * r.z;
+ m[2][1] = c.y * r.z;
+ m[3][0] = c.x * r.w;
+ m[3][1] = c.y * r.w;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat3x4<T> outerProduct
+ (
+ detail::tvec4<T> const & c,
+ detail::tvec3<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat3x4<T> m(detail::tmat3x4<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[0][2] = c.z * r.x;
+ m[0][3] = c.w * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[1][2] = c.z * r.y;
+ m[1][3] = c.w * r.y;
+ m[2][0] = c.x * r.z;
+ m[2][1] = c.y * r.z;
+ m[2][2] = c.z * r.z;
+ m[2][3] = c.w * r.z;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat4x3<T> outerProduct
+ (
+ detail::tvec3<T> const & c,
+ detail::tvec4<T> const & r
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs");
+
+ detail::tmat4x3<T> m(detail::tmat4x3<T>::null);
+ m[0][0] = c.x * r.x;
+ m[0][1] = c.y * r.x;
+ m[0][2] = c.z * r.x;
+ m[1][0] = c.x * r.y;
+ m[1][1] = c.y * r.y;
+ m[1][2] = c.z * r.y;
+ m[2][0] = c.x * r.z;
+ m[2][1] = c.y * r.z;
+ m[2][2] = c.z * r.z;
+ m[3][0] = c.x * r.w;
+ m[3][1] = c.y * r.w;
+ m[3][2] = c.z * r.w;
+ return m;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x2<T> transpose
+ (
+ detail::tmat2x2<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat2x2<T> result(detail::tmat2x2<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat3x3<T> transpose
+ (
+ detail::tmat3x3<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat3x3<T> result(detail::tmat3x3<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat4x4<T> transpose
+ (
+ detail::tmat4x4<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat4x4<T> result(detail::tmat4x4<T>::null);
+ 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 <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x3<T> transpose
+ (
+ detail::tmat3x2<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat2x3<T> result(detail::tmat2x3<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat3x2<T> transpose
+ (
+ detail::tmat2x3<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat3x2<T> result(detail::tmat3x2<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat2x4<T> transpose
+ (
+ detail::tmat4x2<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat2x4<T> result(detail::tmat2x4<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat4x2<T> transpose
+ (
+ detail::tmat2x4<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat4x2<T> result(detail::tmat4x2<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat3x4<T> transpose
+ (
+ detail::tmat4x3<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat3x4<T> result(detail::tmat3x4<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER detail::tmat4x3<T> transpose
+ (
+ detail::tmat3x4<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs");
+
+ detail::tmat4x3<T> result(detail::tmat4x3<T>::null);
+ 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>
+ GLM_FUNC_QUALIFIER typename detail::tmat2x2<T>::value_type determinant
+ (
+ detail::tmat2x2<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs");
+
+ return m[0][0] * m[1][1] - m[1][0] * m[0][1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tmat3x3<T>::value_type determinant
+ (
+ detail::tmat3x3<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs");
+
+ return
+ + 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]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename detail::tmat4x4<T>::value_type determinant
+ (
+ detail::tmat4x4<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs");
+
+ 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];
+ T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ 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];
+
+ detail::tvec4<T> 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),
+ - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
+
+ return m[0][0] * DetCof[0]
+ + m[0][1] * DetCof[1]
+ + m[0][2] * DetCof[2]
+ + m[0][3] * DetCof[3];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat2x2<T> inverse
+ (
+ detail::tmat2x2<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs");
+
+ //valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];
+ T Determinant = determinant(m);
+
+ detail::tmat2x2<T> Inverse(
+ + m[1][1] / Determinant,
+ - m[0][1] / Determinant,
+ - m[1][0] / Determinant,
+ + m[0][0] / Determinant);
+
+ return Inverse;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat3x3<T> inverse
+ (
+ detail::tmat3x3<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs");
+
+ //valType Determinant = 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]);
+
+ T Determinant = determinant(m);
+
+ detail::tmat3x3<T> Inverse(detail::tmat3x3<T>::null);
+ Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
+ Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
+ Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
+ Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);
+ Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);
+ Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
+ Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
+ Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);
+ Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
+ Inverse /= Determinant;
+
+ return Inverse;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER detail::tmat4x4<T> inverse
+ (
+ detail::tmat4x4<T> const & m
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs");
+
+ 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];
+ T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
+
+ T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
+ T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
+
+ T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
+ T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
+
+ T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
+ T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
+
+ T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
+ T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
+
+ T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ 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];
+
+ detail::tvec4<T> const SignA(+1, -1, +1, -1);
+ detail::tvec4<T> const SignB(-1, +1, -1, +1);
+
+ detail::tvec4<T> Fac0(Coef00, Coef00, Coef02, Coef03);
+ detail::tvec4<T> Fac1(Coef04, Coef04, Coef06, Coef07);
+ detail::tvec4<T> Fac2(Coef08, Coef08, Coef10, Coef11);
+ detail::tvec4<T> Fac3(Coef12, Coef12, Coef14, Coef15);
+ detail::tvec4<T> Fac4(Coef16, Coef16, Coef18, Coef19);
+ detail::tvec4<T> Fac5(Coef20, Coef20, Coef22, Coef23);
+
+ detail::tvec4<T> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]);
+ detail::tvec4<T> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]);
+ detail::tvec4<T> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]);
+ detail::tvec4<T> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]);
+
+ detail::tvec4<T> Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2);
+ detail::tvec4<T> Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4);
+ detail::tvec4<T> Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5);
+ detail::tvec4<T> Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5);
+
+ detail::tmat4x4<T> Inverse(Inv0, Inv1, Inv2, Inv3);
+
+ detail::tvec4<T> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]);
+
+ T Determinant = glm::dot(m[0], Row0);
+
+ Inverse /= Determinant;
+
+ return Inverse;
+ }
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_noise.hpp b/include/gal/opengl/glm/core/func_noise.hpp
new file mode 100644
index 0000000..3e5f874
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_noise.hpp
@@ -0,0 +1,87 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_noise.hpp
+/// @date 2008-08-01 / 2011-06-18
+/// @author Christophe Riccio
+///
+/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a>
+///
+/// @defgroup core_func_noise Noise functions
+/// @ingroup core
+///
+/// Noise functions are stochastic functions that can be used to increase visual
+/// complexity. Values returned by the following noise functions give the
+/// appearance of randomness, but are not truly random.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_func_noise
+#define glm_core_func_noise GLM_VERSION
+
+namespace glm
+{
+ /// @addtogroup core_func_noise
+ /// @{
+
+ /// Returns a 1D noise value based on the input value x.
+ ///
+ /// @tparam genType Floating-point scalar or vector types.
+ ///
+ /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise1.xml">GLSL noise1 man page</a>
+ /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a>
+ template <typename genType>
+ GLM_FUNC_DECL typename genType::value_type noise1(genType const & x);
+
+ /// Returns a 2D noise value based on the input value x.
+ ///
+ /// @tparam genType Floating-point scalar or vector types.
+ ///
+ /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise2.xml">GLSL noise2 man page</a>
+ /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a>
+ template <typename genType>
+ GLM_FUNC_DECL detail::tvec2<typename genType::value_type> noise2(genType const & x);
+
+ /// Returns a 3D noise value based on the input value x.
+ ///
+ /// @tparam genType Floating-point scalar or vector types.
+ ///
+ /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise3.xml">GLSL noise3 man page</a>
+ /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a>
+ template <typename genType>
+ GLM_FUNC_DECL detail::tvec3<typename genType::value_type> noise3(genType const & x);
+
+ /// Returns a 4D noise value based on the input value x.
+ ///
+ /// @tparam genType Floating-point scalar or vector types.
+ ///
+ /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise4.xml">GLSL noise4 man page</a>
+ /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a>
+ template <typename genType>
+ GLM_FUNC_DECL detail::tvec4<typename genType::value_type> noise4(genType const & x);
+
+ /// @}
+}//namespace glm
+
+#include "func_noise.inl"
+
+#endif//glm_core_func_noise
diff --git a/include/gal/opengl/glm/core/func_noise.inl b/include/gal/opengl/glm/core/func_noise.inl
new file mode 100644
index 0000000..68a1933
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_noise.inl
@@ -0,0 +1,364 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_noise.inl
+/// @date 2008-08-01 / 2011-09-27
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER T noise1(T const & x)
+ {
+ return noise1(glm::detail::tvec2<T>(x, T(0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(T const & x)
+ {
+ return glm::detail::tvec2<T>(
+ noise1(x + T(0.0)),
+ noise1(x + T(1.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(T const & x)
+ {
+ return glm::detail::tvec3<T>(
+ noise1(x - T(1.0)),
+ noise1(x + T(0.0)),
+ noise1(x + T(1.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(T const & x)
+ {
+ return glm::detail::tvec4<T>(
+ noise1(x - T(1.0)),
+ noise1(x + T(0.0)),
+ noise1(x + T(1.0)),
+ noise1(x + T(2.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER T noise1(glm::detail::tvec2<T> const & v)
+ {
+ detail::tvec4<T> const C = detail::tvec4<T>(
+ 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
+ detail::tvec2<T> i = floor(v + dot(v, detail::tvec2<T>(C[1])));
+ detail::tvec2<T> x0 = v - i + dot(i, detail::tvec2<T>(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;
+ detail::tvec2<T> i1 = (x0.x > x0.y) ? detail::tvec2<T>(1, 0) : detail::tvec2<T>(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 ;
+ detail::tvec4<T> x12 = detail::tvec4<T>(x0.x, x0.y, x0.x, x0.y) + detail::tvec4<T>(C.x, C.x, C.z, C.z);
+ x12 = detail::tvec4<T>(detail::tvec2<T>(x12) - i1, x12.z, x12.w);
+
+ // Permutations
+ i = mod(i, T(289)); // Avoid truncation effects in permutation
+ detail::tvec3<T> p = permute(
+ permute(i.y + detail::tvec3<T>(T(0), i1.y, T(1)))
+ + i.x + detail::tvec3<T>(T(0), i1.x, T(1)));
+
+ detail::tvec3<T> m = max(T(0.5) - detail::tvec3<T>(
+ dot(x0, x0),
+ dot(detail::tvec2<T>(x12.x, x12.y), detail::tvec2<T>(x12.x, x12.y)),
+ dot(detail::tvec2<T>(x12.z, x12.w), detail::tvec2<T>(x12.z, x12.w))), T(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)
+
+ detail::tvec3<T> x = T(2) * fract(p * C.w) - T(1);
+ detail::tvec3<T> h = abs(x) - T(0.5);
+ detail::tvec3<T> ox = floor(x + T(0.5));
+ detail::tvec3<T> a0 = x - ox;
+
+ // Normalise gradients implicitly by scaling m
+ // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h );
+ m *= T(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h);
+
+ // Compute final noise value at P
+ detail::tvec3<T> 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;
+ g.z = a0.z * x12.z + h.z * x12.w;
+ return T(130) * dot(m, g);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER T noise1(detail::tvec3<T> const & v)
+ {
+ detail::tvec2<T> const C(1.0 / 6.0, 1.0 / 3.0);
+ detail::tvec4<T> const D(0.0, 0.5, 1.0, 2.0);
+
+ // First corner
+ detail::tvec3<T> i(floor(v + dot(v, detail::tvec3<T>(C.y))));
+ detail::tvec3<T> x0(v - i + dot(i, detail::tvec3<T>(C.x)));
+
+ // Other corners
+ detail::tvec3<T> g(step(detail::tvec3<T>(x0.y, x0.z, x0.x), x0));
+ detail::tvec3<T> l(T(1) - g);
+ detail::tvec3<T> i1(min(g, detail::tvec3<T>(l.z, l.x, l.y)));
+ detail::tvec3<T> i2(max(g, detail::tvec3<T>(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;
+ detail::tvec3<T> x1(x0 - i1 + C.x);
+ detail::tvec3<T> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y
+ detail::tvec3<T> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y
+
+ // Permutations
+ i = mod289(i);
+ detail::tvec4<T> p(permute(permute(permute(
+ i.z + detail::tvec4<T>(T(0), i1.z, i2.z, T(1))) +
+ i.y + detail::tvec4<T>(T(0), i1.y, i2.y, T(1))) +
+ i.x + detail::tvec4<T>(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_ = T(0.142857142857); // 1.0/7.0
+ detail::tvec3<T> ns(n_ * detail::tvec3<T>(D.w, D.y, D.z) - detail::tvec3<T>(D.x, D.z, D.x));
+
+ detail::tvec4<T> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7)
+
+ detail::tvec4<T> x_(floor(j * ns.z));
+ detail::tvec4<T> y_(floor(j - T(7) * x_)); // mod(j,N)
+
+ detail::tvec4<T> x(x_ * ns.x + ns.y);
+ detail::tvec4<T> y(y_ * ns.x + ns.y);
+ detail::tvec4<T> h(T(1) - abs(x) - abs(y));
+
+ detail::tvec4<T> b0(x.x, x.y, y.x, y.y);
+ detail::tvec4<T> 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;
+ detail::tvec4<T> s0(floor(b0) * T(2) + T(1));
+ detail::tvec4<T> s1(floor(b1) * T(2) + T(1));
+ detail::tvec4<T> sh(-step(h, detail::tvec4<T>(0.0)));
+
+ detail::tvec4<T> a0 = detail::tvec4<T>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T>(sh.x, sh.x, sh.y, sh.y);
+ detail::tvec4<T> a1 = detail::tvec4<T>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T>(sh.z, sh.z, sh.w, sh.w);
+
+ detail::tvec3<T> p0(a0.x, a0.y, h.x);
+ detail::tvec3<T> p1(a0.z, a0.w, h.y);
+ detail::tvec3<T> p2(a1.x, a1.y, h.z);
+ detail::tvec3<T> p3(a1.z, a1.w, h.w);
+
+ // Normalise gradients
+ detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(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
+ detail::tvec4<T> m = max(T(0.6) - detail::tvec4<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), T(0));
+ m = m * m;
+ return T(42) * dot(m * m, detail::tvec4<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER T noise1(detail::tvec4<T> const & v)
+ {
+ detail::tvec4<T> const C(
+ 0.138196601125011, // (5 - sqrt(5))/20 G4
+ 0.276393202250021, // 2 * G4
+ 0.414589803375032, // 3 * G4
+ -0.447213595499958); // -1 + 4 * G4
+
+ // (sqrt(5) - 1)/4 = F4, used once below
+ T const F4 = T(0.309016994374947451);
+
+ // First corner
+ detail::tvec4<T> i = floor(v + dot(v, vec4(F4)));
+ detail::tvec4<T> x0 = v - i + dot(i, vec4(C.x));
+
+ // Other corners
+
+ // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)
+ detail::tvec4<T> i0;
+ detail::tvec3<T> isX = step(detail::tvec3<T>(x0.y, x0.z, x0.w), detail::tvec3<T>(x0.x));
+ detail::tvec3<T> isYZ = step(detail::tvec3<T>(x0.z, x0.w, x0.w), detail::tvec3<T>(x0.y, x0.y, x0.z));
+ // i0.x = dot(isX, vec3(1.0));
+ //i0.x = isX.x + isX.y + isX.z;
+ //i0.yzw = T(1) - isX;
+ i0 = detail::tvec4<T>(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 - detail::tvec2<T>(isYZ.x, isYZ.y);
+ i0.z += T(1) - isYZ.x;
+ i0.w += T(1) - isYZ.y;
+ i0.z += isYZ.z;
+ i0.w += T(1) - isYZ.z;
+
+ // i0 now contains the unique values 0,1,2,3 in each channel
+ detail::tvec4<T> i3 = clamp(i0, 0.0, 1.0);
+ detail::tvec4<T> i2 = clamp(i0 - 1.0, 0.0, 1.0);
+ detail::tvec4<T> i1 = clamp(i0 - 2.0, 0.0, 1.0);
+
+ // 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
+ detail::tvec4<T> x1 = x0 - i1 + C.x;
+ detail::tvec4<T> x2 = x0 - i2 + C.y;
+ detail::tvec4<T> x3 = x0 - i3 + C.z;
+ detail::tvec4<T> x4 = x0 + C.w;
+
+ // Permutations
+ i = mod(i, T(289));
+ T j0 = permute(permute(permute(permute(i.w) + i.z) + i.y) + i.x);
+ detail::tvec4<T> j1 = permute(permute(permute(permute(
+ i.w + detail::tvec4<T>(i1.w, i2.w, i3.w, T(1)))
+ + i.z + detail::tvec4<T>(i1.z, i2.z, i3.z, T(1)))
+ + i.y + detail::tvec4<T>(i1.y, i2.y, i3.y, T(1)))
+ + i.x + detail::tvec4<T>(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.
+ detail::tvec4<T> ip = detail::tvec4<T>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0));
+
+ detail::tvec4<T> p0 = grad4(j0, ip);
+ detail::tvec4<T> p1 = grad4(j1.x, ip);
+ detail::tvec4<T> p2 = grad4(j1.y, ip);
+ detail::tvec4<T> p3 = grad4(j1.z, ip);
+ detail::tvec4<T> p4 = grad4(j1.w, ip);
+
+ // Normalise gradients
+ detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
+ p0 *= norm.x;
+ p1 *= norm.y;
+ p2 *= norm.z;
+ p3 *= norm.w;
+ p4 *= taylorInvSqrt(dot(p4, p4));
+
+ // Mix contributions from the five corners
+ detail::tvec3<T> m0 = max(T(0.6) - detail::tvec3<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), T(0));
+ detail::tvec2<T> m1 = max(T(0.6) - detail::tvec2<T>(dot(x3, x3), dot(x4, x4) ), T(0));
+ m0 = m0 * m0;
+ m1 = m1 * m1;
+ return T(49) *
+ (dot(m0 * m0, detail::tvec3<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) +
+ dot(m1 * m1, detail::tvec2<T>(dot(p3, x3), dot(p4, x4))));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec2<T> const & x)
+ {
+ return glm::detail::tvec2<T>(
+ noise1(x + glm::detail::tvec2<T>(0.0)),
+ noise1(glm::detail::tvec2<T>(0.0) - x));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec3<T> const & x)
+ {
+ return glm::detail::tvec2<T>(
+ noise1(x + glm::detail::tvec3<T>(0.0)),
+ noise1(glm::detail::tvec3<T>(0.0) - x));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec4<T> const & x)
+ {
+ return glm::detail::tvec2<T>(
+ noise1(x + glm::detail::tvec4<T>(0.0)),
+ noise1(glm::detail::tvec4<T>(0.0) - x));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec2<T> const & x)
+ {
+ return glm::detail::tvec3<T>(
+ noise1(x - glm::detail::tvec2<T>(1.0)),
+ noise1(x + glm::detail::tvec2<T>(0.0)),
+ noise1(x + glm::detail::tvec2<T>(1.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec3<T> const & x)
+ {
+ return glm::detail::tvec3<T>(
+ noise1(x - glm::detail::tvec3<T>(1.0)),
+ noise1(x + glm::detail::tvec3<T>(0.0)),
+ noise1(x + glm::detail::tvec3<T>(1.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec4<T> const & x)
+ {
+ return glm::detail::tvec3<T>(
+ noise1(x - glm::detail::tvec4<T>(1.0)),
+ noise1(x + glm::detail::tvec4<T>(0.0)),
+ noise1(x + glm::detail::tvec4<T>(1.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec2<T> const & x)
+ {
+ return glm::detail::tvec4<T>(
+ noise1(x - glm::detail::tvec2<T>(1.0)),
+ noise1(x + glm::detail::tvec2<T>(0.0)),
+ noise1(x + glm::detail::tvec2<T>(1.0)),
+ noise1(x + glm::detail::tvec2<T>(2.0)));
+ }
+
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec3<T> const & x)
+ {
+ return glm::detail::tvec4<T>(
+ noise1(x - glm::detail::tvec3<T>(1.0)),
+ noise1(x + glm::detail::tvec3<T>(0.0)),
+ noise1(x + glm::detail::tvec3<T>(1.0)),
+ noise1(x + glm::detail::tvec3<T>(2.0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec4<T> const & x)
+ {
+ return glm::detail::tvec4<T>(
+ noise1(x - glm::detail::tvec4<T>(1.0)),
+ noise1(x + glm::detail::tvec4<T>(0.0)),
+ noise1(x + glm::detail::tvec4<T>(1.0)),
+ noise1(x + glm::detail::tvec4<T>(2.0)));
+ }
+
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_packing.hpp b/include/gal/opengl/glm/core/func_packing.hpp
new file mode 100644
index 0000000..b4312e1
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_packing.hpp
@@ -0,0 +1,193 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_packing.hpp
+/// @date 2010-03-17 / 2011-06-15
+/// @author Christophe Riccio
+///
+/// @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>
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GLM_CORE_func_packing
+#define GLM_CORE_func_packing GLM_VERSION
+
+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 detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> 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 detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> 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 detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> 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 detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> 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 detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & 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 detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & 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 detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & 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 detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & 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(detail::tvec2<detail::uint32> 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 detail::tvec2<detail::uint32> unpackDouble2x32(double const & 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 const & v);
+
+ /// @}
+}//namespace glm
+
+#include "func_packing.inl"
+
+#endif//GLM_CORE_func_packing
+
diff --git a/include/gal/opengl/glm/core/func_packing.inl b/include/gal/opengl/glm/core/func_packing.inl
new file mode 100644
index 0000000..e10e161
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_packing.inl
@@ -0,0 +1,208 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_packing.inl
+/// @date 2010-03-17 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> const & v)
+ {
+ detail::uint16 A(detail::uint16(round(clamp(v.x, 0.0f, 1.0f) * 65535.0f)));
+ detail::uint16 B(detail::uint16(round(clamp(v.y, 0.0f, 1.0f) * 65535.0f)));
+ return detail::uint32((B << 16) | A);
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & p)
+ {
+ detail::uint32 Mask16((1 << 16) - 1);
+ detail::uint32 A((p >> 0) & Mask16);
+ detail::uint32 B((p >> 16) & Mask16);
+ return detail::tvec2<detail::float32>(
+ A * 1.0f / 65535.0f,
+ B * 1.0f / 65535.0f);
+ }
+
+ GLM_FUNC_QUALIFIER detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> const & v)
+ {
+ union iu
+ {
+ detail::int16 i;
+ detail::uint16 u;
+ } A, B;
+
+ detail::tvec2<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 32767.0f;
+ A.i = detail::int16(round(Unpack.x));
+ B.i = detail::int16(round(Unpack.y));
+ detail::uint32 Pack = (detail::uint32(B.u) << 16) | (detail::uint32(A.u) << 0);
+ return Pack;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & p)
+ {
+ union iu
+ {
+ detail::int16 i;
+ detail::uint16 u;
+ } A, B;
+
+ detail::uint32 Mask16((1 << 16) - 1);
+ A.u = detail::uint16((p >> 0) & Mask16);
+ B.u = detail::uint16((p >> 16) & Mask16);
+ detail::tvec2<detail::float32> Pack(A.i, B.i);
+
+ return clamp(Pack * 1.0f / 32767.0f, -1.0f, 1.0f);
+ }
+
+ GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> const & v)
+ {
+ detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f));
+ detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f));
+ detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f));
+ detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f));
+ return detail::uint32((D << 24) | (C << 16) | (B << 8) | A);
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & p)
+ {
+ detail::uint32 Mask8((1 << 8) - 1);
+ detail::uint32 A((p >> 0) & Mask8);
+ detail::uint32 B((p >> 8) & Mask8);
+ detail::uint32 C((p >> 16) & Mask8);
+ detail::uint32 D((p >> 24) & Mask8);
+ return detail::tvec4<detail::float32>(
+ A * 1.0f / 255.0f,
+ B * 1.0f / 255.0f,
+ C * 1.0f / 255.0f,
+ D * 1.0f / 255.0f);
+ }
+
+ GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> const & v)
+ {
+ union iu
+ {
+ detail::int8 i;
+ detail::uint8 u;
+ } A, B, C, D;
+
+ detail::tvec4<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 127.0f;
+ A.i = detail::int8(round(Unpack.x));
+ B.i = detail::int8(round(Unpack.y));
+ C.i = detail::int8(round(Unpack.z));
+ D.i = detail::int8(round(Unpack.w));
+ detail::uint32 Pack = (detail::uint32(D.u) << 24) | (detail::uint32(C.u) << 16) | (detail::uint32(B.u) << 8) | (detail::uint32(A.u) << 0);
+ return Pack;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & p)
+ {
+ union iu
+ {
+ detail::int8 i;
+ detail::uint8 u;
+ } A, B, C, D;
+
+ detail::uint32 Mask8((1 << 8) - 1);
+ A.u = detail::uint8((p >> 0) & Mask8);
+ B.u = detail::uint8((p >> 8) & Mask8);
+ C.u = detail::uint8((p >> 16) & Mask8);
+ D.u = detail::uint8((p >> 24) & Mask8);
+ detail::tvec4<detail::float32> Pack(A.i, B.i, C.i, D.i);
+
+ return clamp(Pack * 1.0f / 127.0f, -1.0f, 1.0f);
+ }
+
+ GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2<detail::uint32> const & v)
+ {
+ struct uint32_pair
+ {
+ detail::uint32 x;
+ detail::uint32 y;
+ };
+
+ union helper
+ {
+ uint32_pair input;
+ double output;
+ } Helper;
+
+ Helper.input.x = v.x;
+ Helper.input.y = v.y;
+
+ return Helper.output;
+ //return *(double*)&v;
+ }
+
+ GLM_FUNC_QUALIFIER detail::tvec2<uint> unpackDouble2x32(double const & v)
+ {
+ struct uint32_pair
+ {
+ detail::uint32 x;
+ detail::uint32 y;
+ };
+
+ union helper
+ {
+ double input;
+ uint32_pair output;
+ } Helper;
+
+ Helper.input = v;
+
+ return detail::tvec2<uint>(Helper.output.x, Helper.output.y);
+ }
+
+ GLM_FUNC_QUALIFIER uint packHalf2x16(detail::tvec2<float> const & v)
+ {
+ union helper
+ {
+ uint other;
+ struct
+ {
+ detail::hdata a, b;
+ } orig;
+ } Pack;
+
+ Pack.orig.a = detail::toFloat16(v.x);
+ Pack.orig.b = detail::toFloat16(v.y);
+ return Pack.other;
+ }
+
+ GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v)
+ {
+ union helper
+ {
+ uint other;
+ struct
+ {
+ detail::hdata a, b;
+ } orig;
+ } Unpack;
+ Unpack.other = v;
+
+ return vec2(detail::toFloat32(Unpack.orig.a), detail::toFloat32(Unpack.orig.b));
+ }
+}//namespace glm
+
diff --git a/include/gal/opengl/glm/core/func_trigonometric.hpp b/include/gal/opengl/glm/core/func_trigonometric.hpp
new file mode 100644
index 0000000..9954d9c
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_trigonometric.hpp
@@ -0,0 +1,203 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_trigonometric.hpp
+/// @date 2008-08-01 / 2011-06-15
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GLM_CORE_func_trigonometric
+#define GLM_CORE_func_trigonometric GLM_VERSION
+
+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 genType>
+ GLM_FUNC_DECL genType radians(genType 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 genType>
+ GLM_FUNC_DECL genType degrees(genType 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 genType>
+ GLM_FUNC_DECL genType sin(genType 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 genType>
+ GLM_FUNC_DECL genType cos(genType 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 genType>
+ GLM_FUNC_DECL genType tan(genType 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 genType>
+ GLM_FUNC_DECL genType asin(genType 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 genType>
+ GLM_FUNC_DECL genType acos(genType 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 genType>
+ GLM_FUNC_DECL genType atan(genType const & y, genType 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 genType>
+ GLM_FUNC_DECL genType atan(genType 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 genType>
+ GLM_FUNC_DECL genType sinh(genType 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 genType>
+ GLM_FUNC_DECL genType cosh(genType 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 genType>
+ GLM_FUNC_DECL genType tanh(genType 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 genType>
+ GLM_FUNC_DECL genType asinh(genType 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 genType>
+ GLM_FUNC_DECL genType acosh(genType 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 genType>
+ GLM_FUNC_DECL genType atanh(genType const & x);
+
+ /// @}
+}//namespace glm
+
+#include "func_trigonometric.inl"
+
+#endif//GLM_CORE_func_trigonometric
+
+
diff --git a/include/gal/opengl/glm/core/func_trigonometric.inl b/include/gal/opengl/glm/core/func_trigonometric.inl
new file mode 100644
index 0000000..bd59cd7
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_trigonometric.inl
@@ -0,0 +1,244 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_trigonometric.inl
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ // radians
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType radians
+ (
+ genType const & degrees
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'radians' only accept floating-point input");
+
+ genType const pi = genType(3.1415926535897932384626433832795);
+ return degrees * (pi / genType(180));
+ }
+
+ VECTORIZE_VEC(radians)
+
+ // degrees
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType degrees
+ (
+ genType const & radians
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'degrees' only accept floating-point input");
+
+ const genType pi = genType(3.1415926535897932384626433832795);
+ return radians * (genType(180) / pi);
+ }
+
+ VECTORIZE_VEC(degrees)
+
+ // sin
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType sin
+ (
+ genType const & angle
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sin' only accept floating-point input");
+
+ return genType(::std::sin(angle));
+ }
+
+ VECTORIZE_VEC(sin)
+
+ // cos
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType cos(genType const & angle)
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cos' only accept floating-point input");
+
+ return genType(::std::cos(angle));
+ }
+
+ VECTORIZE_VEC(cos)
+
+ // tan
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType tan
+ (
+ genType const & angle
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tan' only accept floating-point input");
+
+ return genType(::std::tan(angle));
+ }
+
+ VECTORIZE_VEC(tan)
+
+ // asin
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType asin
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asin' only accept floating-point input");
+
+ return genType(::std::asin(x));
+ }
+
+ VECTORIZE_VEC(asin)
+
+ // acos
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType acos
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acos' only accept floating-point input");
+
+ return genType(::std::acos(x));
+ }
+
+ VECTORIZE_VEC(acos)
+
+ // atan
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType atan
+ (
+ genType const & y,
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
+
+ return genType(::std::atan2(y, x));
+ }
+
+ VECTORIZE_VEC_VEC(atan)
+
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType atan
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
+
+ return genType(::std::atan(x));
+ }
+
+ VECTORIZE_VEC(atan)
+
+ // sinh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType sinh
+ (
+ genType const & angle
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sinh' only accept floating-point input");
+
+ return genType(std::sinh(angle));
+ }
+
+ VECTORIZE_VEC(sinh)
+
+ // cosh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType cosh
+ (
+ genType const & angle
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cosh' only accept floating-point input");
+
+ return genType(std::cosh(angle));
+ }
+
+ VECTORIZE_VEC(cosh)
+
+ // tanh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType tanh
+ (
+ genType const & angle
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tanh' only accept floating-point input");
+
+ return genType(std::tanh(angle));
+ }
+
+ VECTORIZE_VEC(tanh)
+
+ // asinh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType asinh
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asinh' only accept floating-point input");
+
+ return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x));
+ }
+
+ VECTORIZE_VEC(asinh)
+
+ // acosh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType acosh
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acosh' only accept floating-point input");
+
+ if(x < genType(1))
+ return genType(0);
+ return log(x + sqrt(x * x - genType(1)));
+ }
+
+ VECTORIZE_VEC(acosh)
+
+ // atanh
+ template <typename genType>
+ GLM_FUNC_QUALIFIER genType atanh
+ (
+ genType const & x
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atanh' only accept floating-point input");
+
+ if(abs(x) >= genType(1))
+ return 0;
+ return genType(0.5) * log((genType(1) + x) / (genType(1) - x));
+ }
+
+ VECTORIZE_VEC(atanh)
+
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/func_vector_relational.hpp b/include/gal/opengl/glm/core/func_vector_relational.hpp
new file mode 100644
index 0000000..4ffe14e
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_vector_relational.hpp
@@ -0,0 +1,138 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_vector_relational.hpp
+/// @date 2008-08-03 / 2011-06-15
+/// @author Christophe Riccio
+///
+/// @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.
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef GLM_CORE_func_vector_relational
+#define GLM_CORE_func_vector_relational GLM_VERSION
+
+#include "_detail.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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type lessThan(vecType const & x, vecType 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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type lessThanEqual(vecType const & x, vecType 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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type greaterThan(vecType const & x, vecType 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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type greaterThanEqual(vecType const & x, vecType 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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type equal(vecType const & x, vecType 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 vecType>
+ GLM_FUNC_DECL typename vecType::bool_type notEqual(vecType const & x, vecType 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 <template <typename> class vecType>
+ GLM_FUNC_DECL bool any(vecType<bool> 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 <template <typename> class vecType>
+ GLM_FUNC_DECL bool all(vecType<bool> 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 <template <typename> class vecType>
+ GLM_FUNC_DECL vecType<bool> not_(vecType<bool> const & v);
+
+ /// @}
+}//namespace glm
+
+#include "func_vector_relational.inl"
+
+#endif//GLM_CORE_func_vector_relational
diff --git a/include/gal/opengl/glm/core/func_vector_relational.inl b/include/gal/opengl/glm/core/func_vector_relational.inl
new file mode 100644
index 0000000..7fb4f43
--- /dev/null
+++ b/include/gal/opengl/glm/core/func_vector_relational.inl
@@ -0,0 +1,178 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/func_vector_relational.inl
+/// @date 2008-08-03 / 2011-09-09
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm
+{
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThan
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'lessThan', GLM vector types required");
+ GLM_STATIC_ASSERT(detail::is_bool<T>::_NO,
+ "Invalid template instantiation of 'lessThan', GLM vector types required floating-point or integer value types vectors");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] < y[i];
+
+ return Result;
+ }
+
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThanEqual
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'lessThanEqual', GLM vector types required");
+ GLM_STATIC_ASSERT(detail::is_bool<T>::_NO,
+ "Invalid template instantiation of 'lessThanEqual', GLM vector types required floating-point or integer value types vectors");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] <= y[i];
+ return Result;
+ }
+
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type greaterThan
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'greaterThan', GLM vector types required");
+ GLM_STATIC_ASSERT(detail::is_bool<T>::_NO,
+ "Invalid template instantiation of 'greaterThan', GLM vector types required floating-point or integer value types vectors");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] > y[i];
+ return Result;
+ }
+
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type greaterThanEqual
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'greaterThanEqual', GLM vector types required");
+ GLM_STATIC_ASSERT(detail::is_bool<T>::_NO,
+ "Invalid template instantiation of 'greaterThanEqual', GLM vector types required floating-point or integer value types vectors");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] >= y[i];
+ return Result;
+ }
+
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type equal
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'equal', GLM vector types required");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] == y[i];
+ return Result;
+ }
+
+ template <typename T, template <typename> class vecType>
+ GLM_FUNC_QUALIFIER typename vecType<T>::bool_type notEqual
+ (
+ vecType<T> const & x,
+ vecType<T> const & y
+ )
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES,
+ "Invalid template instantiation of 'notEqual', GLM vector types required");
+ assert(x.length() == y.length());
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i)
+ Result[i] = x[i] != y[i];
+ return Result;
+ }
+
+ template <template <typename> class vecType>
+ GLM_FUNC_QUALIFIER bool any(vecType<bool> const & v)
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES,
+ "Invalid template instantiation of 'any', GLM boolean vector types required");
+
+ bool Result = false;
+ for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i)
+ Result = Result || v[i];
+ return Result;
+ }
+
+ template <template <typename> class vecType>
+ GLM_FUNC_QUALIFIER bool all(vecType<bool> const & v)
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES,
+ "Invalid template instantiation of 'all', GLM boolean vector types required");
+
+ bool Result = true;
+ for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i)
+ Result = Result && v[i];
+ return Result;
+ }
+
+ template <template <typename> class vecType>
+ GLM_FUNC_QUALIFIER vecType<bool> not_(vecType<bool> const & v)
+ {
+ GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES,
+ "Invalid template instantiation of 'not_', GLM vector types required");
+
+ typename vecType<bool>::bool_type Result(vecType<bool>::null);
+ for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i)
+ Result[i] = !v[i];
+ return Result;
+ }
+}//namespace glm
+
diff --git a/include/gal/opengl/glm/core/hint.hpp b/include/gal/opengl/glm/core/hint.hpp
new file mode 100644
index 0000000..79433a1
--- /dev/null
+++ b/include/gal/opengl/glm/core/hint.hpp
@@ -0,0 +1,40 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/hint.hpp
+/// @date 2008-08-14 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type
+#define glm_core_type
+
+namespace glm
+{
+ // Use dont_care, nicest and fastest to optimize implementations.
+ class dont_care {};
+ class nicest {};
+ class fastest {};
+}//namespace glm
+
+#endif//glm_core_type
diff --git a/include/gal/opengl/glm/core/intrinsic_common.hpp b/include/gal/opengl/glm/core/intrinsic_common.hpp
new file mode 100644
index 0000000..a435522
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_common.hpp
@@ -0,0 +1,89 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_common.hpp
+/// @date 2009-05-11 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_detail_intrinsic_common
+#define glm_detail_intrinsic_common
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+namespace glm{
+namespace detail
+{
+ __m128 sse_abs_ps(__m128 x);
+
+ __m128 sse_sgn_ps(__m128 x);
+
+ //floor
+ __m128 sse_flr_ps(__m128 v);
+
+ //trunc
+ __m128 sse_trc_ps(__m128 v);
+
+ //round
+ __m128 sse_nd_ps(__m128 v);
+
+ //roundEven
+ __m128 sse_rde_ps(__m128 v);
+
+ __m128 sse_rnd_ps(__m128 x);
+
+ __m128 sse_ceil_ps(__m128 v);
+
+ __m128 sse_frc_ps(__m128 x);
+
+ __m128 sse_mod_ps(__m128 x, __m128 y);
+
+ __m128 sse_modf_ps(__m128 x, __m128i & i);
+
+ //GLM_FUNC_QUALIFIER __m128 sse_min_ps(__m128 x, __m128 y)
+
+ //GLM_FUNC_QUALIFIER __m128 sse_max_ps(__m128 x, __m128 y)
+
+ __m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal);
+
+ __m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a);
+
+ __m128 sse_stp_ps(__m128 edge, __m128 x);
+
+ __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x);
+
+ __m128 sse_nan_ps(__m128 x);
+
+ __m128 sse_inf_ps(__m128 x);
+
+}//namespace detail
+}//namespace glm
+
+#include "intrinsic_common.inl"
+
+#endif//GLM_ARCH
+#endif//glm_detail_intrinsic_common
diff --git a/include/gal/opengl/glm/core/intrinsic_common.inl b/include/gal/opengl/glm/core/intrinsic_common.inl
new file mode 100644
index 0000000..ba7ac94
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_common.inl
@@ -0,0 +1,313 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_common.inl
+/// @date 2009-05-08 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail{
+
+#if(GLM_COMPILER & GLM_COMPILER_VC)
+#pragma warning(push)
+#pragma warning(disable : 4510 4512 4610)
+#endif
+
+ union ieee754_QNAN
+ {
+ const float f;
+ struct i
+ {
+ const unsigned int mantissa:23, exp:8, sign:1;
+ };
+
+ ieee754_QNAN() : f(0.0)/*, mantissa(0x7FFFFF), exp(0xFF), sign(0x0)*/ {}
+ };
+
+#if(GLM_COMPILER & GLM_COMPILER_VC)
+#pragma warning(pop)
+#endif
+
+ static const __m128 GLM_VAR_USED zero = _mm_setzero_ps();
+ static const __m128 GLM_VAR_USED one = _mm_set_ps1(1.0f);
+ static const __m128 GLM_VAR_USED minus_one = _mm_set_ps1(-1.0f);
+ static const __m128 GLM_VAR_USED two = _mm_set_ps1(2.0f);
+ static const __m128 GLM_VAR_USED three = _mm_set_ps1(3.0f);
+ static const __m128 GLM_VAR_USED pi = _mm_set_ps1(3.1415926535897932384626433832795f);
+ static const __m128 GLM_VAR_USED hundred_eighty = _mm_set_ps1(180.f);
+ static const __m128 GLM_VAR_USED pi_over_hundred_eighty = _mm_set_ps1(0.017453292519943295769236907684886f);
+ static const __m128 GLM_VAR_USED hundred_eighty_over_pi = _mm_set_ps1(57.295779513082320876798154814105f);
+
+ static const ieee754_QNAN absMask;
+ static const __m128 GLM_VAR_USED abs4Mask = _mm_set_ps1(absMask.f);
+
+ static const __m128 GLM_VAR_USED _epi32_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(static_cast<int>(0x80000000)));
+ //static const __m128 GLM_VAR_USED _epi32_inv_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF));
+ //static const __m128 GLM_VAR_USED _epi32_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));
+ //static const __m128 GLM_VAR_USED _epi32_inv_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x807FFFFF));
+ //static const __m128 GLM_VAR_USED _epi32_min_norm_pos = _mm_castsi128_ps(_mm_set1_epi32(0x00800000));
+ static const __m128 GLM_VAR_USED _epi32_0 = _mm_set_ps1(0);
+ static const __m128 GLM_VAR_USED _epi32_1 = _mm_set_ps1(1);
+ static const __m128 GLM_VAR_USED _epi32_2 = _mm_set_ps1(2);
+ static const __m128 GLM_VAR_USED _epi32_3 = _mm_set_ps1(3);
+ static const __m128 GLM_VAR_USED _epi32_4 = _mm_set_ps1(4);
+ static const __m128 GLM_VAR_USED _epi32_5 = _mm_set_ps1(5);
+ static const __m128 GLM_VAR_USED _epi32_6 = _mm_set_ps1(6);
+ static const __m128 GLM_VAR_USED _epi32_7 = _mm_set_ps1(7);
+ static const __m128 GLM_VAR_USED _epi32_8 = _mm_set_ps1(8);
+ static const __m128 GLM_VAR_USED _epi32_9 = _mm_set_ps1(9);
+ static const __m128 GLM_VAR_USED _epi32_127 = _mm_set_ps1(127);
+ //static const __m128 GLM_VAR_USED _epi32_ninf = _mm_castsi128_ps(_mm_set1_epi32(0xFF800000));
+ //static const __m128 GLM_VAR_USED _epi32_pinf = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));
+
+ static const __m128 GLM_VAR_USED _ps_1_3 = _mm_set_ps1(0.33333333333333333333333333333333f);
+ static const __m128 GLM_VAR_USED _ps_0p5 = _mm_set_ps1(0.5f);
+ static const __m128 GLM_VAR_USED _ps_1 = _mm_set_ps1(1.0f);
+ static const __m128 GLM_VAR_USED _ps_m1 = _mm_set_ps1(-1.0f);
+ static const __m128 GLM_VAR_USED _ps_2 = _mm_set_ps1(2.0f);
+ static const __m128 GLM_VAR_USED _ps_3 = _mm_set_ps1(3.0f);
+ static const __m128 GLM_VAR_USED _ps_127 = _mm_set_ps1(127.0f);
+ static const __m128 GLM_VAR_USED _ps_255 = _mm_set_ps1(255.0f);
+ static const __m128 GLM_VAR_USED _ps_2pow23 = _mm_set_ps1(8388608.0f);
+
+ static const __m128 GLM_VAR_USED _ps_1_0_0_0 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
+ static const __m128 GLM_VAR_USED _ps_0_1_0_0 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f);
+ static const __m128 GLM_VAR_USED _ps_0_0_1_0 = _mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f);
+ static const __m128 GLM_VAR_USED _ps_0_0_0_1 = _mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f);
+
+ static const __m128 GLM_VAR_USED _ps_pi = _mm_set_ps1(3.1415926535897932384626433832795f);
+ static const __m128 GLM_VAR_USED _ps_pi2 = _mm_set_ps1(6.283185307179586476925286766560f);
+ static const __m128 GLM_VAR_USED _ps_2_pi = _mm_set_ps1(0.63661977236758134307553505349006f);
+ static const __m128 GLM_VAR_USED _ps_pi_2 = _mm_set_ps1(1.5707963267948966192313216916398f);
+ static const __m128 GLM_VAR_USED _ps_4_pi = _mm_set_ps1(1.2732395447351626861510701069801f);
+ static const __m128 GLM_VAR_USED _ps_pi_4 = _mm_set_ps1(0.78539816339744830961566084581988f);
+
+ static const __m128 GLM_VAR_USED _ps_sincos_p0 = _mm_set_ps1(0.15707963267948963959e1f);
+ static const __m128 GLM_VAR_USED _ps_sincos_p1 = _mm_set_ps1(-0.64596409750621907082e0f);
+ static const __m128 GLM_VAR_USED _ps_sincos_p2 = _mm_set_ps1(0.7969262624561800806e-1f);
+ static const __m128 GLM_VAR_USED _ps_sincos_p3 = _mm_set_ps1(-0.468175413106023168e-2f);
+ static const __m128 GLM_VAR_USED _ps_tan_p0 = _mm_set_ps1(-1.79565251976484877988e7f);
+ static const __m128 GLM_VAR_USED _ps_tan_p1 = _mm_set_ps1(1.15351664838587416140e6f);
+ static const __m128 GLM_VAR_USED _ps_tan_p2 = _mm_set_ps1(-1.30936939181383777646e4f);
+ static const __m128 GLM_VAR_USED _ps_tan_q0 = _mm_set_ps1(-5.38695755929454629881e7f);
+ static const __m128 GLM_VAR_USED _ps_tan_q1 = _mm_set_ps1(2.50083801823357915839e7f);
+ static const __m128 GLM_VAR_USED _ps_tan_q2 = _mm_set_ps1(-1.32089234440210967447e6f);
+ static const __m128 GLM_VAR_USED _ps_tan_q3 = _mm_set_ps1(1.36812963470692954678e4f);
+ static const __m128 GLM_VAR_USED _ps_tan_poleval = _mm_set_ps1(3.68935e19f);
+ static const __m128 GLM_VAR_USED _ps_atan_t0 = _mm_set_ps1(-0.91646118527267623468e-1f);
+ static const __m128 GLM_VAR_USED _ps_atan_t1 = _mm_set_ps1(-0.13956945682312098640e1f);
+ static const __m128 GLM_VAR_USED _ps_atan_t2 = _mm_set_ps1(-0.94393926122725531747e2f);
+ static const __m128 GLM_VAR_USED _ps_atan_t3 = _mm_set_ps1(0.12888383034157279340e2f);
+ static const __m128 GLM_VAR_USED _ps_atan_s0 = _mm_set_ps1(0.12797564625607904396e1f);
+ static const __m128 GLM_VAR_USED _ps_atan_s1 = _mm_set_ps1(0.21972168858277355914e1f);
+ static const __m128 GLM_VAR_USED _ps_atan_s2 = _mm_set_ps1(0.68193064729268275701e1f);
+ static const __m128 GLM_VAR_USED _ps_atan_s3 = _mm_set_ps1(0.28205206687035841409e2f);
+
+ static const __m128 GLM_VAR_USED _ps_exp_hi = _mm_set_ps1(88.3762626647949f);
+ static const __m128 GLM_VAR_USED _ps_exp_lo = _mm_set_ps1(-88.3762626647949f);
+ static const __m128 GLM_VAR_USED _ps_exp_rln2 = _mm_set_ps1(1.4426950408889634073599f);
+ static const __m128 GLM_VAR_USED _ps_exp_p0 = _mm_set_ps1(1.26177193074810590878e-4f);
+ static const __m128 GLM_VAR_USED _ps_exp_p1 = _mm_set_ps1(3.02994407707441961300e-2f);
+ static const __m128 GLM_VAR_USED _ps_exp_q0 = _mm_set_ps1(3.00198505138664455042e-6f);
+ static const __m128 GLM_VAR_USED _ps_exp_q1 = _mm_set_ps1(2.52448340349684104192e-3f);
+ static const __m128 GLM_VAR_USED _ps_exp_q2 = _mm_set_ps1(2.27265548208155028766e-1f);
+ static const __m128 GLM_VAR_USED _ps_exp_q3 = _mm_set_ps1(2.00000000000000000009e0f);
+ static const __m128 GLM_VAR_USED _ps_exp_c1 = _mm_set_ps1(6.93145751953125e-1f);
+ static const __m128 GLM_VAR_USED _ps_exp_c2 = _mm_set_ps1(1.42860682030941723212e-6f);
+ static const __m128 GLM_VAR_USED _ps_exp2_hi = _mm_set_ps1(127.4999961853f);
+ static const __m128 GLM_VAR_USED _ps_exp2_lo = _mm_set_ps1(-127.4999961853f);
+ static const __m128 GLM_VAR_USED _ps_exp2_p0 = _mm_set_ps1(2.30933477057345225087e-2f);
+ static const __m128 GLM_VAR_USED _ps_exp2_p1 = _mm_set_ps1(2.02020656693165307700e1f);
+ static const __m128 GLM_VAR_USED _ps_exp2_p2 = _mm_set_ps1(1.51390680115615096133e3f);
+ static const __m128 GLM_VAR_USED _ps_exp2_q0 = _mm_set_ps1(2.33184211722314911771e2f);
+ static const __m128 GLM_VAR_USED _ps_exp2_q1 = _mm_set_ps1(4.36821166879210612817e3f);
+ static const __m128 GLM_VAR_USED _ps_log_p0 = _mm_set_ps1(-7.89580278884799154124e-1f);
+ static const __m128 GLM_VAR_USED _ps_log_p1 = _mm_set_ps1(1.63866645699558079767e1f);
+ static const __m128 GLM_VAR_USED _ps_log_p2 = _mm_set_ps1(-6.41409952958715622951e1f);
+ static const __m128 GLM_VAR_USED _ps_log_q0 = _mm_set_ps1(-3.56722798256324312549e1f);
+ static const __m128 GLM_VAR_USED _ps_log_q1 = _mm_set_ps1(3.12093766372244180303e2f);
+ static const __m128 GLM_VAR_USED _ps_log_q2 = _mm_set_ps1(-7.69691943550460008604e2f);
+ static const __m128 GLM_VAR_USED _ps_log_c0 = _mm_set_ps1(0.693147180559945f);
+ static const __m128 GLM_VAR_USED _ps_log2_c0 = _mm_set_ps1(1.44269504088896340735992f);
+
+GLM_FUNC_QUALIFIER __m128 sse_abs_ps(__m128 x)
+{
+ return _mm_and_ps(glm::detail::abs4Mask, x);
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_sgn_ps(__m128 x)
+{
+ __m128 Neg = _mm_set1_ps(-1.0f);
+ __m128 Pos = _mm_set1_ps(1.0f);
+
+ __m128 Cmp0 = _mm_cmplt_ps(x, zero);
+ __m128 Cmp1 = _mm_cmpgt_ps(x, zero);
+
+ __m128 And0 = _mm_and_ps(Cmp0, Neg);
+ __m128 And1 = _mm_and_ps(Cmp1, Pos);
+
+ return _mm_or_ps(And0, And1);
+}
+
+//floor
+GLM_FUNC_QUALIFIER __m128 sse_flr_ps(__m128 x)
+{
+ __m128 rnd0 = sse_rnd_ps(x);
+ __m128 cmp0 = _mm_cmplt_ps(x, rnd0);
+ __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);
+ __m128 sub0 = _mm_sub_ps(rnd0, and0);
+ return sub0;
+}
+
+//trunc
+/*
+GLM_FUNC_QUALIFIER __m128 _mm_trc_ps(__m128 v)
+{
+ return __m128();
+}
+*/
+//round
+GLM_FUNC_QUALIFIER __m128 sse_rnd_ps(__m128 x)
+{
+ __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x);
+ __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23);
+ __m128 add0 = _mm_add_ps(x, or0);
+ __m128 sub0 = _mm_sub_ps(add0, or0);
+ return sub0;
+}
+
+//roundEven
+GLM_FUNC_QUALIFIER __m128 sse_rde_ps(__m128 x)
+{
+ __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x);
+ __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23);
+ __m128 add0 = _mm_add_ps(x, or0);
+ __m128 sub0 = _mm_sub_ps(add0, or0);
+ return sub0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_ceil_ps(__m128 x)
+{
+ __m128 rnd0 = sse_rnd_ps(x);
+ __m128 cmp0 = _mm_cmpgt_ps(x, rnd0);
+ __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);
+ __m128 add0 = _mm_add_ps(rnd0, and0);
+ return add0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_frc_ps(__m128 x)
+{
+ __m128 flr0 = sse_flr_ps(x);
+ __m128 sub0 = _mm_sub_ps(x, flr0);
+ return sub0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_mod_ps(__m128 x, __m128 y)
+{
+ __m128 div0 = _mm_div_ps(x, y);
+ __m128 flr0 = sse_flr_ps(div0);
+ __m128 mul0 = _mm_mul_ps(y, flr0);
+ __m128 sub0 = _mm_sub_ps(x, mul0);
+ return sub0;
+}
+
+/// TODO
+/*
+GLM_FUNC_QUALIFIER __m128 sse_modf_ps(__m128 x, __m128i & i)
+{
+ __m128 empty;
+ return empty;
+}
+*/
+
+//GLM_FUNC_QUALIFIER __m128 _mm_min_ps(__m128 x, __m128 y)
+
+//GLM_FUNC_QUALIFIER __m128 _mm_max_ps(__m128 x, __m128 y)
+
+GLM_FUNC_QUALIFIER __m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal)
+{
+ __m128 min0 = _mm_min_ps(v, maxVal);
+ __m128 max0 = _mm_max_ps(min0, minVal);
+ return max0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a)
+{
+ __m128 sub0 = _mm_sub_ps(glm::detail::one, a);
+ __m128 mul0 = _mm_mul_ps(v1, sub0);
+ __m128 mul1 = _mm_mul_ps(v2, a);
+ __m128 add0 = _mm_add_ps(mul0, mul1);
+ return add0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_stp_ps(__m128 edge, __m128 x)
+{
+ __m128 cmp = _mm_cmple_ps(x, edge);
+ if(_mm_movemask_ps(cmp) == 0)
+ return glm::detail::one;
+ else
+ return glm::detail::zero;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x)
+{
+ __m128 sub0 = _mm_sub_ps(x, edge0);
+ __m128 sub1 = _mm_sub_ps(edge1, edge0);
+ __m128 div0 = _mm_sub_ps(sub0, sub1);
+ __m128 clp0 = sse_clp_ps(div0, glm::detail::zero, glm::detail::one);
+ __m128 mul0 = _mm_mul_ps(glm::detail::two, clp0);
+ __m128 sub2 = _mm_sub_ps(glm::detail::three, mul0);
+ __m128 mul1 = _mm_mul_ps(clp0, clp0);
+ __m128 mul2 = _mm_mul_ps(mul1, sub2);
+ return mul2;
+}
+
+/// \todo
+//GLM_FUNC_QUALIFIER __m128 sse_nan_ps(__m128 x)
+//{
+// __m128 empty;
+// return empty;
+//}
+
+/// \todo
+//GLM_FUNC_QUALIFIER __m128 sse_inf_ps(__m128 x)
+//{
+// __m128 empty;
+// return empty;
+//}
+
+// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration
+// By Elan Ruskin, http://assemblyrequired.crashworks.org/
+GLM_FUNC_QUALIFIER __m128 sse_sqrt_wip_ss(__m128 const & x)
+{
+ __m128 recip = _mm_rsqrt_ss(x); // "estimate" opcode
+ const static __m128 three = {3, 3, 3, 3}; // aligned consts for fast load
+ const static __m128 half = {0.5,0.5,0.5,0.5};
+ __m128 halfrecip = _mm_mul_ss(half, recip);
+ __m128 threeminus_xrr = _mm_sub_ss(three, _mm_mul_ss(x, _mm_mul_ss (recip, recip)));
+ return _mm_mul_ss( halfrecip, threeminus_xrr);
+}
+
+}//namespace detail
+}//namespace glms
diff --git a/include/gal/opengl/glm/core/intrinsic_exponential.hpp b/include/gal/opengl/glm/core/intrinsic_exponential.hpp
new file mode 100644
index 0000000..785527a
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_exponential.hpp
@@ -0,0 +1,79 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_exponential.hpp
+/// @date 2009-05-11 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_detail_intrinsic_exponential
+#define glm_detail_intrinsic_exponential
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+namespace glm{
+namespace detail
+{
+/*
+GLM_FUNC_QUALIFIER __m128 sse_rsqrt_nr_ss(__m128 const x)
+{
+ __m128 recip = _mm_rsqrt_ss( x ); // "estimate" opcode
+ const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast load
+ const static __m128 half = { 0.5,0.5,0.5,0.5 };
+ __m128 halfrecip = _mm_mul_ss( half, recip );
+ __m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) );
+ return _mm_mul_ss( halfrecip, threeminus_xrr );
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_normalize_fast_ps( float * RESTRICT vOut, float * RESTRICT vIn )
+{
+ __m128 x = _mm_load_ss(&vIn[0]);
+ __m128 y = _mm_load_ss(&vIn[1]);
+ __m128 z = _mm_load_ss(&vIn[2]);
+
+ const __m128 l = // compute x*x + y*y + z*z
+ _mm_add_ss(
+ _mm_add_ss( _mm_mul_ss(x,x),
+ _mm_mul_ss(y,y)
+ ),
+ _mm_mul_ss( z, z )
+ );
+
+
+ const __m128 rsqt = _mm_rsqrt_nr_ss( l );
+ _mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) );
+ _mm_store_ss( &vOut[1] , _mm_mul_ss( rsqt, y ) );
+ _mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) );
+
+ return _mm_mul_ss( l , rsqt );
+}
+*/
+}//namespace detail
+}//namespace glm
+
+#endif//GLM_ARCH
+#endif//glm_detail_intrinsic_exponential
diff --git a/include/gal/opengl/glm/core/intrinsic_exponential.inl b/include/gal/opengl/glm/core/intrinsic_exponential.inl
new file mode 100644
index 0000000..8023e0b
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_exponential.inl
@@ -0,0 +1,27 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_exponential.inl
+/// @date 2011-06-15 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
diff --git a/include/gal/opengl/glm/core/intrinsic_geometric.hpp b/include/gal/opengl/glm/core/intrinsic_geometric.hpp
new file mode 100644
index 0000000..ff60c48
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_geometric.hpp
@@ -0,0 +1,76 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_geometric.hpp
+/// @date 2009-05-08 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_intrinsic_geometric
+#define glm_core_intrinsic_geometric
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+#include "intrinsic_common.hpp"
+
+namespace glm{
+namespace detail
+{
+ //length
+ __m128 sse_len_ps(__m128 x);
+
+ //distance
+ __m128 sse_dst_ps(__m128 p0, __m128 p1);
+
+ //dot
+ __m128 sse_dot_ps(__m128 v1, __m128 v2);
+
+ // SSE1
+ __m128 sse_dot_ss(__m128 v1, __m128 v2);
+
+ //cross
+ __m128 sse_xpd_ps(__m128 v1, __m128 v2);
+
+ //normalize
+ __m128 sse_nrm_ps(__m128 v);
+
+ //faceforward
+ __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref);
+
+ //reflect
+ __m128 sse_rfe_ps(__m128 I, __m128 N);
+
+ //refract
+ __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta);
+
+}//namespace detail
+}//namespace glm
+
+#include "intrinsic_geometric.inl"
+
+#endif//GLM_ARCH
+#endif//glm_core_intrinsic_geometric
diff --git a/include/gal/opengl/glm/core/intrinsic_geometric.inl b/include/gal/opengl/glm/core/intrinsic_geometric.inl
new file mode 100644
index 0000000..9411e90
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_geometric.inl
@@ -0,0 +1,146 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_geometric.inl
+/// @date 2009-05-08 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail{
+
+//length
+GLM_FUNC_QUALIFIER __m128 sse_len_ps(__m128 x)
+{
+ __m128 dot0 = sse_dot_ps(x, x);
+ __m128 sqt0 = _mm_sqrt_ps(dot0);
+ return sqt0;
+}
+
+//distance
+GLM_FUNC_QUALIFIER __m128 sse_dst_ps(__m128 p0, __m128 p1)
+{
+ __m128 sub0 = _mm_sub_ps(p0, p1);
+ __m128 len0 = sse_len_ps(sub0);
+ return len0;
+}
+
+//dot
+GLM_FUNC_QUALIFIER __m128 sse_dot_ps(__m128 v1, __m128 v2)
+{
+# if((GLM_ARCH & GLM_ARCH_SSE4) == GLM_ARCH_SSE4)
+ return _mm_dp_ps(v1, v2, 0xff);
+# else
+ __m128 mul0 = _mm_mul_ps(v1, v2);
+ __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));
+ __m128 add0 = _mm_add_ps(mul0, swp0);
+ __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));
+ __m128 add1 = _mm_add_ps(add0, swp1);
+ return add1;
+# endif
+}
+
+// SSE1
+GLM_FUNC_QUALIFIER __m128 sse_dot_ss(__m128 v1, __m128 v2)
+{
+ __m128 mul0 = _mm_mul_ps(v1, v2);
+ __m128 mov0 = _mm_movehl_ps(mul0, mul0);
+ __m128 add0 = _mm_add_ps(mov0, mul0);
+ __m128 swp1 = _mm_shuffle_ps(add0, add0, 1);
+ __m128 add1 = _mm_add_ss(add0, swp1);
+ return add1;
+}
+
+//cross
+GLM_FUNC_QUALIFIER __m128 sse_xpd_ps(__m128 v1, __m128 v2)
+{
+ __m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));
+ __m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));
+ __m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));
+ __m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));
+ __m128 mul0 = _mm_mul_ps(swp0, swp3);
+ __m128 mul1 = _mm_mul_ps(swp1, swp2);
+ __m128 sub0 = _mm_sub_ps(mul0, mul1);
+ return sub0;
+}
+
+//normalize
+GLM_FUNC_QUALIFIER __m128 sse_nrm_ps(__m128 v)
+{
+ __m128 dot0 = sse_dot_ps(v, v);
+ __m128 isr0 = _mm_rsqrt_ps(dot0);
+ __m128 mul0 = _mm_mul_ps(v, isr0);
+ return mul0;
+}
+
+//faceforward
+GLM_FUNC_QUALIFIER __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref)
+{
+ //__m128 dot0 = _mm_dot_ps(v, v);
+ //__m128 neg0 = _mm_neg_ps(N);
+ //__m128 sgn0 = _mm_sgn_ps(dot0);
+ //__m128 mix0 = _mm_mix_ps(N, neg0, sgn0);
+ //return mix0;
+
+ __m128 dot0 = sse_dot_ps(Nref, I);
+ __m128 sgn0 = sse_sgn_ps(dot0);
+ __m128 mul0 = _mm_mul_ps(sgn0, glm::detail::minus_one);
+ __m128 mul1 = _mm_mul_ps(N, mul0);
+ return mul1;
+}
+
+//reflect
+GLM_FUNC_QUALIFIER __m128 sse_rfe_ps(__m128 I, __m128 N)
+{
+ __m128 dot0 = sse_dot_ps(N, I);
+ __m128 mul0 = _mm_mul_ps(N, dot0);
+ __m128 mul1 = _mm_mul_ps(mul0, glm::detail::two);
+ __m128 sub0 = _mm_sub_ps(I, mul1);
+ return sub0;
+}
+
+//refract
+GLM_FUNC_QUALIFIER __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta)
+{
+ __m128 dot0 = sse_dot_ps(N, I);
+ __m128 mul0 = _mm_mul_ps(eta, eta);
+ __m128 mul1 = _mm_mul_ps(dot0, dot0);
+ __m128 sub0 = _mm_sub_ps(glm::detail::one, mul0);
+ __m128 sub1 = _mm_sub_ps(glm::detail::one, mul1);
+ __m128 mul2 = _mm_mul_ps(sub0, sub1);
+
+ if(_mm_movemask_ps(_mm_cmplt_ss(mul2, glm::detail::zero)) == 0)
+ return glm::detail::zero;
+
+ __m128 sqt0 = _mm_sqrt_ps(mul2);
+ __m128 mul3 = _mm_mul_ps(eta, dot0);
+ __m128 add0 = _mm_add_ps(mul3, sqt0);
+ __m128 mul4 = _mm_mul_ps(add0, N);
+ __m128 mul5 = _mm_mul_ps(eta, I);
+ __m128 sub2 = _mm_sub_ps(mul5, mul4);
+
+ return sub2;
+}
+
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/intrinsic_matrix.hpp b/include/gal/opengl/glm/core/intrinsic_matrix.hpp
new file mode 100644
index 0000000..b2f4767
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_matrix.hpp
@@ -0,0 +1,69 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_common.hpp
+/// @date 2009-06-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_detail_intrinsic_matrix
+#define glm_detail_intrinsic_matrix
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+#include "intrinsic_geometric.hpp"
+
+namespace glm{
+namespace detail
+{
+ void sse_add_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);
+
+ void sse_sub_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);
+
+ __m128 sse_mul_ps(__m128 m[4], __m128 v);
+
+ __m128 sse_mul_ps(__m128 v, __m128 m[4]);
+
+ void sse_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]);
+
+ void sse_transpose_ps(__m128 const in[4], __m128 out[4]);
+
+ void sse_inverse_ps(__m128 const in[4], __m128 out[4]);
+
+ void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4]);
+
+ __m128 sse_det_ps(__m128 const m[4]);
+
+ __m128 sse_slow_det_ps(__m128 const m[4]);
+
+}//namespace detail
+}//namespace glm
+
+#include "intrinsic_matrix.inl"
+
+#endif//GLM_ARCH
+#endif//glm_detail_intrinsic_matrix
diff --git a/include/gal/opengl/glm/core/intrinsic_matrix.inl b/include/gal/opengl/glm/core/intrinsic_matrix.inl
new file mode 100644
index 0000000..ec53f03
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_matrix.inl
@@ -0,0 +1,1070 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_common.inl
+/// @date 2009-06-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail{
+
+static const __m128 GLM_VAR_USED _m128_rad_ps = _mm_set_ps1(3.141592653589793238462643383279f / 180.f);
+static const __m128 GLM_VAR_USED _m128_deg_ps = _mm_set_ps1(180.f / 3.141592653589793238462643383279f);
+
+template <typename matType>
+GLM_FUNC_QUALIFIER matType sse_comp_mul_ps
+(
+ __m128 const in1[4],
+ __m128 const in2[4],
+ __m128 out[4]
+)
+{
+ out[0] = _mm_mul_ps(in1[0], in2[0]);
+ out[1] = _mm_mul_ps(in1[1], in2[1]);
+ out[2] = _mm_mul_ps(in1[2], in2[2]);
+ out[3] = _mm_mul_ps(in1[3], in2[3]);
+}
+
+GLM_FUNC_QUALIFIER void sse_add_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4])
+{
+ {
+ out[0] = _mm_add_ps(in1[0], in2[0]);
+ out[1] = _mm_add_ps(in1[1], in2[1]);
+ out[2] = _mm_add_ps(in1[2], in2[2]);
+ out[3] = _mm_add_ps(in1[3], in2[3]);
+ }
+}
+
+GLM_FUNC_QUALIFIER void sse_sub_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4])
+{
+ {
+ out[0] = _mm_sub_ps(in1[0], in2[0]);
+ out[1] = _mm_sub_ps(in1[1], in2[1]);
+ out[2] = _mm_sub_ps(in1[2], in2[2]);
+ out[3] = _mm_sub_ps(in1[3], in2[3]);
+ }
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 const m[4], __m128 v)
+{
+ __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 m0 = _mm_mul_ps(m[0], v0);
+ __m128 m1 = _mm_mul_ps(m[1], v1);
+ __m128 m2 = _mm_mul_ps(m[2], v2);
+ __m128 m3 = _mm_mul_ps(m[3], v3);
+
+ __m128 a0 = _mm_add_ps(m0, m1);
+ __m128 a1 = _mm_add_ps(m2, m3);
+ __m128 a2 = _mm_add_ps(a0, a1);
+
+ return a2;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 v, __m128 const m[4])
+{
+ __m128 i0 = m[0];
+ __m128 i1 = m[1];
+ __m128 i2 = m[2];
+ __m128 i3 = m[3];
+
+ __m128 m0 = _mm_mul_ps(v, i0);
+ __m128 m1 = _mm_mul_ps(v, i1);
+ __m128 m2 = _mm_mul_ps(v, i2);
+ __m128 m3 = _mm_mul_ps(v, i3);
+
+ __m128 u0 = _mm_unpacklo_ps(m0, m1);
+ __m128 u1 = _mm_unpackhi_ps(m0, m1);
+ __m128 a0 = _mm_add_ps(u0, u1);
+
+ __m128 u2 = _mm_unpacklo_ps(m2, m3);
+ __m128 u3 = _mm_unpackhi_ps(m2, m3);
+ __m128 a1 = _mm_add_ps(u2, u3);
+
+ __m128 f0 = _mm_movelh_ps(a0, a1);
+ __m128 f1 = _mm_movehl_ps(a1, a0);
+ __m128 f2 = _mm_add_ps(f0, f1);
+
+ return f2;
+}
+
+GLM_FUNC_QUALIFIER void sse_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4])
+{
+ {
+ __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 m0 = _mm_mul_ps(in1[0], e0);
+ __m128 m1 = _mm_mul_ps(in1[1], e1);
+ __m128 m2 = _mm_mul_ps(in1[2], e2);
+ __m128 m3 = _mm_mul_ps(in1[3], e3);
+
+ __m128 a0 = _mm_add_ps(m0, m1);
+ __m128 a1 = _mm_add_ps(m2, m3);
+ __m128 a2 = _mm_add_ps(a0, a1);
+
+ out[0] = a2;
+ }
+
+ {
+ __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 m0 = _mm_mul_ps(in1[0], e0);
+ __m128 m1 = _mm_mul_ps(in1[1], e1);
+ __m128 m2 = _mm_mul_ps(in1[2], e2);
+ __m128 m3 = _mm_mul_ps(in1[3], e3);
+
+ __m128 a0 = _mm_add_ps(m0, m1);
+ __m128 a1 = _mm_add_ps(m2, m3);
+ __m128 a2 = _mm_add_ps(a0, a1);
+
+ out[1] = a2;
+ }
+
+ {
+ __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 m0 = _mm_mul_ps(in1[0], e0);
+ __m128 m1 = _mm_mul_ps(in1[1], e1);
+ __m128 m2 = _mm_mul_ps(in1[2], e2);
+ __m128 m3 = _mm_mul_ps(in1[3], e3);
+
+ __m128 a0 = _mm_add_ps(m0, m1);
+ __m128 a1 = _mm_add_ps(m2, m3);
+ __m128 a2 = _mm_add_ps(a0, a1);
+
+ out[2] = a2;
+ }
+
+ {
+ //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3))
+ __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 m0 = _mm_mul_ps(in1[0], e0);
+ __m128 m1 = _mm_mul_ps(in1[1], e1);
+ __m128 m2 = _mm_mul_ps(in1[2], e2);
+ __m128 m3 = _mm_mul_ps(in1[3], e3);
+
+ __m128 a0 = _mm_add_ps(m0, m1);
+ __m128 a1 = _mm_add_ps(m2, m3);
+ __m128 a2 = _mm_add_ps(a0, a1);
+
+ out[3] = a2;
+ }
+}
+
+GLM_FUNC_QUALIFIER void sse_transpose_ps(__m128 const in[4], __m128 out[4])
+{
+ __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);
+ __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);
+ __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44);
+ __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE);
+
+ out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);
+ out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);
+ out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);
+ out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD);
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_slow_det_ps(__m128 const in[4])
+{
+ __m128 Fac0;
+ {
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
+ // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac0 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac1;
+ {
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
+ // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac1 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+
+ __m128 Fac2;
+ {
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
+ // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac2 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac3;
+ {
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
+ // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac3 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac4;
+ {
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
+ // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac4 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac5;
+ {
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
+ // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac5 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
+ __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
+
+ // m[1][0]
+ // m[0][0]
+ // m[0][0]
+ // m[0][0]
+ __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][1]
+ // m[0][1]
+ // m[0][1]
+ // m[0][1]
+ __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][2]
+ // m[0][2]
+ // m[0][2]
+ // m[0][2]
+ __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][3]
+ // m[0][3]
+ // m[0][3]
+ // m[0][3]
+ __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // col0
+ // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
+ // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
+ // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
+ // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
+ __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
+ __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
+ __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
+ __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
+ __m128 Add00 = _mm_add_ps(Sub00, Mul02);
+ __m128 Inv0 = _mm_mul_ps(SignB, Add00);
+
+ // col1
+ // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
+ // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
+ // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
+ // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
+ __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
+ __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
+ __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
+ __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
+ __m128 Add01 = _mm_add_ps(Sub01, Mul05);
+ __m128 Inv1 = _mm_mul_ps(SignA, Add01);
+
+ // col2
+ // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
+ // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
+ // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
+ // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
+ __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
+ __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
+ __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
+ __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
+ __m128 Add02 = _mm_add_ps(Sub02, Mul08);
+ __m128 Inv2 = _mm_mul_ps(SignB, Add02);
+
+ // col3
+ // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
+ // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
+ // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
+ // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
+ __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
+ __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
+ __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
+ __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
+ __m128 Add03 = _mm_add_ps(Sub03, Mul11);
+ __m128 Inv3 = _mm_mul_ps(SignA, Add03);
+
+ __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
+ __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]
+ // + m[0][3] * Inverse[3][0];
+ __m128 Det0 = sse_dot_ps(in[0], Row2);
+ return Det0;
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_detd_ps
+(
+ __m128 const m[4]
+)
+{
+ // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(
+
+ //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];
+ //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ //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];
+
+ // First 2 columns
+ __m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2)));
+ __m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3)));
+ __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);
+
+ // Second 2 columns
+ __m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3)));
+ __m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2)));
+ __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);
+
+ // Columns subtraction
+ __m128 SubE = _mm_sub_ps(MulA, MulB);
+
+ // Last 2 rows
+ __m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2)));
+ __m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0)));
+ __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);
+ __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);
+
+ //detail::tvec4<T> 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),
+ // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
+
+ __m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0)));
+ __m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1)));
+ __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);
+
+ __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));
+ __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1];
+ __m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2)));
+ __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);
+
+ __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);
+
+ __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));
+ __m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0)));
+ __m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3)));
+ __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);
+
+ __m128 AddRes = _mm_add_ps(SubRes, MulFacC);
+ __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));
+
+ //return m[0][0] * DetCof[0]
+ // + m[0][1] * DetCof[1]
+ // + m[0][2] * DetCof[2]
+ // + m[0][3] * DetCof[3];
+
+ return sse_dot_ps(m[0], DetCof);
+}
+
+GLM_FUNC_QUALIFIER __m128 sse_det_ps
+(
+ __m128 const m[4]
+)
+{
+ // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add)
+
+ //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];
+ //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ //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];
+
+ // First 2 columns
+ __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2));
+ __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3));
+ __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);
+
+ // Second 2 columns
+ __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3));
+ __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2));
+ __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);
+
+ // Columns subtraction
+ __m128 SubE = _mm_sub_ps(MulA, MulB);
+
+ // Last 2 rows
+ __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2));
+ __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0));
+ __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);
+ __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);
+
+ //detail::tvec4<T> 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),
+ // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
+
+ __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0));
+ __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1));
+ __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);
+
+ __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));
+ __m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1];
+ __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2));
+ __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);
+
+ __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);
+
+ __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));
+ __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0));
+ __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3));
+ __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);
+
+ __m128 AddRes = _mm_add_ps(SubRes, MulFacC);
+ __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));
+
+ //return m[0][0] * DetCof[0]
+ // + m[0][1] * DetCof[1]
+ // + m[0][2] * DetCof[2]
+ // + m[0][3] * DetCof[3];
+
+ return sse_dot_ps(m[0], DetCof);
+}
+
+GLM_FUNC_QUALIFIER void sse_inverse_ps(__m128 const in[4], __m128 out[4])
+{
+ __m128 Fac0;
+ {
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
+ // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac0 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac1;
+ {
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
+ // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac1 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+
+ __m128 Fac2;
+ {
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
+ // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac2 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac3;
+ {
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
+ // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac3 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac4;
+ {
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
+ // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac4 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac5;
+ {
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
+ // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac5 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
+ __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
+
+ // m[1][0]
+ // m[0][0]
+ // m[0][0]
+ // m[0][0]
+ __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][1]
+ // m[0][1]
+ // m[0][1]
+ // m[0][1]
+ __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][2]
+ // m[0][2]
+ // m[0][2]
+ // m[0][2]
+ __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][3]
+ // m[0][3]
+ // m[0][3]
+ // m[0][3]
+ __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // col0
+ // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
+ // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
+ // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
+ // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
+ __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
+ __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
+ __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
+ __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
+ __m128 Add00 = _mm_add_ps(Sub00, Mul02);
+ __m128 Inv0 = _mm_mul_ps(SignB, Add00);
+
+ // col1
+ // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
+ // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
+ // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
+ // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
+ __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
+ __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
+ __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
+ __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
+ __m128 Add01 = _mm_add_ps(Sub01, Mul05);
+ __m128 Inv1 = _mm_mul_ps(SignA, Add01);
+
+ // col2
+ // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
+ // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
+ // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
+ // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
+ __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
+ __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
+ __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
+ __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
+ __m128 Add02 = _mm_add_ps(Sub02, Mul08);
+ __m128 Inv2 = _mm_mul_ps(SignB, Add02);
+
+ // col3
+ // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
+ // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
+ // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
+ // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
+ __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
+ __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
+ __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
+ __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
+ __m128 Add03 = _mm_add_ps(Sub03, Mul11);
+ __m128 Inv3 = _mm_mul_ps(SignA, Add03);
+
+ __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
+ __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]
+ // + m[0][3] * Inverse[3][0];
+ __m128 Det0 = sse_dot_ps(in[0], Row2);
+ __m128 Rcp0 = _mm_div_ps(one, Det0);
+ //__m128 Rcp0 = _mm_rcp_ps(Det0);
+
+ // Inverse /= Determinant;
+ out[0] = _mm_mul_ps(Inv0, Rcp0);
+ out[1] = _mm_mul_ps(Inv1, Rcp0);
+ out[2] = _mm_mul_ps(Inv2, Rcp0);
+ out[3] = _mm_mul_ps(Inv3, Rcp0);
+}
+
+GLM_FUNC_QUALIFIER void sse_inverse_fast_ps(__m128 const in[4], __m128 out[4])
+{
+ __m128 Fac0;
+ {
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
+ // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
+ // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac0 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac1;
+ {
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
+ // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
+ // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac1 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+
+ __m128 Fac2;
+ {
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
+ // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
+ // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac2 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac3;
+ {
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
+ // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
+ // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac3 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac4;
+ {
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
+ // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
+ // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac4 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 Fac5;
+ {
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
+ // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
+ // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
+
+ __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
+
+ __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
+ __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
+
+ __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
+ __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
+ Fac5 = _mm_sub_ps(Mul00, Mul01);
+ }
+
+ __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
+ __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
+
+ // m[1][0]
+ // m[0][0]
+ // m[0][0]
+ // m[0][0]
+ __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][1]
+ // m[0][1]
+ // m[0][1]
+ // m[0][1]
+ __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][2]
+ // m[0][2]
+ // m[0][2]
+ // m[0][2]
+ __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // m[1][3]
+ // m[0][3]
+ // m[0][3]
+ // m[0][3]
+ __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
+ __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
+
+ // col0
+ // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
+ // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
+ // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
+ // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
+ __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
+ __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
+ __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
+ __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
+ __m128 Add00 = _mm_add_ps(Sub00, Mul02);
+ __m128 Inv0 = _mm_mul_ps(SignB, Add00);
+
+ // col1
+ // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
+ // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
+ // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
+ // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
+ __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
+ __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
+ __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
+ __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
+ __m128 Add01 = _mm_add_ps(Sub01, Mul05);
+ __m128 Inv1 = _mm_mul_ps(SignA, Add01);
+
+ // col2
+ // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
+ // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
+ // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
+ // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
+ __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
+ __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
+ __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
+ __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
+ __m128 Add02 = _mm_add_ps(Sub02, Mul08);
+ __m128 Inv2 = _mm_mul_ps(SignB, Add02);
+
+ // col3
+ // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
+ // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
+ // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
+ // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
+ __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
+ __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
+ __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
+ __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
+ __m128 Add03 = _mm_add_ps(Sub03, Mul11);
+ __m128 Inv3 = _mm_mul_ps(SignA, Add03);
+
+ __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
+ __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]
+ // + m[0][3] * Inverse[3][0];
+ __m128 Det0 = sse_dot_ps(in[0], Row2);
+ __m128 Rcp0 = _mm_rcp_ps(Det0);
+ //__m128 Rcp0 = _mm_div_ps(one, Det0);
+ // Inverse /= Determinant;
+ out[0] = _mm_mul_ps(Inv0, Rcp0);
+ out[1] = _mm_mul_ps(Inv1, Rcp0);
+ out[2] = _mm_mul_ps(Inv2, Rcp0);
+ out[3] = _mm_mul_ps(Inv3, Rcp0);
+}
+/*
+GLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4])
+{
+ float a = glm::radians(Angle);
+ float c = cos(a);
+ float s = sin(a);
+
+ glm::vec4 AxisA(v[0], v[1], v[2], float(0));
+ __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);
+ __m128 AxisC = detail::sse_nrm_ps(AxisB);
+
+ __m128 Cos0 = _mm_set_ss(c);
+ __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 Sin0 = _mm_set_ss(s);
+ __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0));
+
+ // detail::tvec3<valType> 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];
+ __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0));
+ __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC);
+ __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0));
+ __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0);
+ __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f);
+ __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3));
+ __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2);
+ __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3);
+
+ //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
+ //Rotate[1][1] = c + temp[1] * axis[1];
+ //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
+ __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1));
+ __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC);
+ __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1));
+ __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0);
+ __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f);
+ __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2));
+ __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2);
+ __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3);
+
+ //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
+ //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
+ //Rotate[2][2] = c + temp[2] * axis[2];
+ __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2));
+ __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC);
+ __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1));
+ __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0);
+ __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f);
+ __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1));
+ __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2);
+ __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3);
+
+ __m128 Result[4];
+ Result[0] = TmpA4;
+ Result[1] = TmpB4;
+ Result[2] = TmpC4;
+ Result[3] = _mm_set_ps(1, 0, 0, 0);
+
+ //detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::null);
+ //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;
+ sse_mul_ps(in, Result, out);
+}
+*/
+GLM_FUNC_QUALIFIER void sse_outer_ps(__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)));
+ out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2)));
+ out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3)));
+}
+
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp b/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp
new file mode 100644
index 0000000..b7d298b
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp
@@ -0,0 +1,48 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_trigonometric.hpp
+/// @date 2009-06-09 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_detail_intrinsic_trigonometric
+#define glm_detail_intrinsic_trigonometric
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+namespace glm{
+namespace detail
+{
+
+}//namespace detail
+}//namespace glm
+
+#include "intrinsic_trigonometric.inl"
+
+#endif//GLM_ARCH
+#endif//glm_detail_intrinsic_trigonometric
diff --git a/include/gal/opengl/glm/core/intrinsic_trigonometric.inl b/include/gal/opengl/glm/core/intrinsic_trigonometric.inl
new file mode 100644
index 0000000..93343bc
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_trigonometric.inl
@@ -0,0 +1,27 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_trigonometric.inl
+/// @date 2011-06-15 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
diff --git a/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp b/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp
new file mode 100644
index 0000000..c9ec82e
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp
@@ -0,0 +1,48 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_vector_relational.hpp
+/// @date 2009-06-09 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_detail_intrinsic_vector_relational
+#define glm_detail_intrinsic_vector_relational
+
+#include "setup.hpp"
+
+#if(!(GLM_ARCH & GLM_ARCH_SSE2))
+# error "SSE2 instructions not supported or enabled"
+#else
+
+namespace glm{
+namespace detail
+{
+
+}//namespace detail
+}//namespace glm
+
+#include "intrinsic_vector_relational.inl"
+
+#endif//GLM_ARCH
+#endif//glm_detail_intrinsic_vector_relational
diff --git a/include/gal/opengl/glm/core/intrinsic_vector_relational.inl b/include/gal/opengl/glm/core/intrinsic_vector_relational.inl
new file mode 100644
index 0000000..8068832
--- /dev/null
+++ b/include/gal/opengl/glm/core/intrinsic_vector_relational.inl
@@ -0,0 +1,366 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/intrinsic_vector_relational.inl
+/// @date 2009-06-09 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+//
+//// lessThan
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type lessThan
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec2<bool>::bool_type(x.x < y.x, x.y < y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type lessThan
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec3<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type lessThan
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec4<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);
+//}
+//
+//// lessThanEqual
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type lessThanEqual
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec2<bool>::bool_type(x.x <= y.x, x.y <= y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type lessThanEqual
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec3<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type lessThanEqual
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec4<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);
+//}
+//
+//// greaterThan
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type greaterThan
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec2<bool>::bool_type(x.x > y.x, x.y > y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type greaterThan
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec3<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type greaterThan
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec4<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);
+//}
+//
+//// greaterThanEqual
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type greaterThanEqual
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec2<bool>::bool_type(x.x >= y.x, x.y >= y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type greaterThanEqual
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec3<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type greaterThanEqual
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint);
+//
+// return typename detail::tvec4<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);
+//}
+//
+//// equal
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type equal
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec2<valType>::bool_type(x.x == y.x, x.y == y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type equal
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec3<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type equal
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec4<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);
+//}
+//
+//// notEqual
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type notEqual
+//(
+// detail::tvec2<valType> const & x,
+// detail::tvec2<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec2<valType>::bool_type(x.x != y.x, x.y != y.y);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type notEqual
+//(
+// detail::tvec3<valType> const & x,
+// detail::tvec3<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec3<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z);
+//}
+//
+//template <typename valType>
+//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type notEqual
+//(
+// detail::tvec4<valType> const & x,
+// detail::tvec4<valType> const & y
+//)
+//{
+// GLM_STATIC_ASSERT(
+// detail::type<valType>::is_float ||
+// detail::type<valType>::is_int ||
+// detail::type<valType>::is_uint ||
+// detail::type<valType>::is_bool);
+//
+// return typename detail::tvec4<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
+//}
+//
+//// any
+//GLM_FUNC_QUALIFIER bool any(detail::tvec2<bool> const & x)
+//{
+// return x.x || x.y;
+//}
+//
+//GLM_FUNC_QUALIFIER bool any(detail::tvec3<bool> const & x)
+//{
+// return x.x || x.y || x.z;
+//}
+//
+//GLM_FUNC_QUALIFIER bool any(detail::tvec4<bool> const & x)
+//{
+// return x.x || x.y || x.z || x.w;
+//}
+//
+//// all
+//GLM_FUNC_QUALIFIER bool all(const detail::tvec2<bool>& x)
+//{
+// return x.x && x.y;
+//}
+//
+//GLM_FUNC_QUALIFIER bool all(const detail::tvec3<bool>& x)
+//{
+// return x.x && x.y && x.z;
+//}
+//
+//GLM_FUNC_QUALIFIER bool all(const detail::tvec4<bool>& x)
+//{
+// return x.x && x.y && x.z && x.w;
+//}
+//
+//// not
+//GLM_FUNC_QUALIFIER detail::tvec2<bool>::bool_type not_
+//(
+// detail::tvec2<bool> const & v
+//)
+//{
+// return detail::tvec2<bool>::bool_type(!v.x, !v.y);
+//}
+//
+//GLM_FUNC_QUALIFIER detail::tvec3<bool>::bool_type not_
+//(
+// detail::tvec3<bool> const & v
+//)
+//{
+// return detail::tvec3<bool>::bool_type(!v.x, !v.y, !v.z);
+//}
+//
+//GLM_FUNC_QUALIFIER detail::tvec4<bool>::bool_type not_
+//(
+// detail::tvec4<bool> const & v
+//)
+//{
+// return detail::tvec4<bool>::bool_type(!v.x, !v.y, !v.z, !v.w);
+//} \ No newline at end of file
diff --git a/include/gal/opengl/glm/core/setup.hpp b/include/gal/opengl/glm/core/setup.hpp
new file mode 100644
index 0000000..95020ea
--- /dev/null
+++ b/include/gal/opengl/glm/core/setup.hpp
@@ -0,0 +1,694 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/setup.hpp
+/// @date 2006-11-13 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_setup
+#define glm_setup
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Version
+
+#define GLM_VERSION 94
+#define GLM_VERSION_MAJOR 0
+#define GLM_VERSION_MINOR 9
+#define GLM_VERSION_PATCH 4
+#define GLM_VERSION_REVISION 7
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Platform
+
+#define GLM_PLATFORM_UNKNOWN 0x00000000
+#define GLM_PLATFORM_WINDOWS 0x00010000
+#define GLM_PLATFORM_LINUX 0x00020000
+#define GLM_PLATFORM_APPLE 0x00040000
+//#define GLM_PLATFORM_IOS 0x00080000
+#define GLM_PLATFORM_ANDROID 0x00100000
+#define GLM_PLATFORM_CHROME_NACL 0x00200000
+#define GLM_PLATFORM_UNIX 0x00400000
+#define GLM_PLATFORM_QNXNTO 0x00800000
+#define GLM_PLATFORM_WINCE 0x01000000
+
+#ifdef GLM_FORCE_PLATFORM_UNKNOWN
+# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN
+#elif defined(__QNXNTO__)
+# define GLM_PLATFORM GLM_PLATFORM_QNXNTO
+#elif defined(__APPLE__)
+# define GLM_PLATFORM GLM_PLATFORM_APPLE
+#elif defined(WINCE)
+# define GLM_PLATFORM GLM_PLATFORM_WINCE
+#elif defined(_WIN32)
+# define GLM_PLATFORM GLM_PLATFORM_WINDOWS
+#elif defined(__native_client__)
+# define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL
+#elif defined(__ANDROID__)
+# define GLM_PLATFORM GLM_PLATFORM_ANDROID
+#elif defined(__linux)
+# define GLM_PLATFORM GLM_PLATFORM_LINUX
+#elif defined(__unix)
+# define GLM_PLATFORM GLM_PLATFORM_UNIX
+#else
+# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN
+#endif//
+
+// Report platform detection
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_PLATFORM_DISPLAYED))
+# define GLM_MESSAGE_PLATFORM_DISPLAYED
+# if(GLM_PLATFORM & GLM_PLATFORM_QNXNTO)
+# pragma message("GLM: QNX platform detected")
+//# elif(GLM_PLATFORM & GLM_PLATFORM_IOS)
+//# pragma message("GLM: iOS platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_APPLE)
+# pragma message("GLM: Apple platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_WINCE)
+# pragma message("GLM: WinCE platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS)
+# pragma message("GLM: Windows platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL)
+# pragma message("GLM: Native Client detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
+# pragma message("GLM: Android platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_LINUX)
+# pragma message("GLM: Linux platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_UNIX)
+# pragma message("GLM: UNIX platform detected")
+# elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN)
+# pragma message("GLM: platform unknown")
+# else
+# pragma message("GLM: platform not detected")
+# endif
+#endif//GLM_MESSAGE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Compiler
+
+// User defines: GLM_FORCE_COMPILER_UNKNOWN
+// TODO ? __llvm__
+
+#define GLM_COMPILER_UNKNOWN 0x00000000
+
+// Intel
+#define GLM_COMPILER_INTEL 0x00100000
+#define GLM_COMPILER_INTEL9 0x00100010
+#define GLM_COMPILER_INTEL10_0 0x00100020
+#define GLM_COMPILER_INTEL10_1 0x00100030
+#define GLM_COMPILER_INTEL11_0 0x00100040
+#define GLM_COMPILER_INTEL11_1 0x00100050
+#define GLM_COMPILER_INTEL12_0 0x00100060
+#define GLM_COMPILER_INTEL12_1 0x00100070
+#define GLM_COMPILER_INTEL13_0 0x00100080
+
+// Visual C++ defines
+#define GLM_COMPILER_VC 0x01000000
+#define GLM_COMPILER_VC2 0x01000010
+#define GLM_COMPILER_VC4 0x01000020
+#define GLM_COMPILER_VC5 0x01000030
+#define GLM_COMPILER_VC6 0x01000040
+#define GLM_COMPILER_VC2002 0x01000050
+#define GLM_COMPILER_VC2003 0x01000060
+#define GLM_COMPILER_VC2005 0x01000070
+#define GLM_COMPILER_VC2008 0x01000080
+#define GLM_COMPILER_VC2010 0x01000090
+#define GLM_COMPILER_VC2012 0x010000A0
+#define GLM_COMPILER_VC2013 0x010000B0
+
+// GCC defines
+#define GLM_COMPILER_GCC 0x02000000
+#define GLM_COMPILER_GCC_LLVM 0x02000001
+#define GLM_COMPILER_GCC_CLANG 0x02000002
+#define GLM_COMPILER_GCC30 0x02000010
+#define GLM_COMPILER_GCC31 0x02000020
+#define GLM_COMPILER_GCC32 0x02000030
+#define GLM_COMPILER_GCC33 0x02000040
+#define GLM_COMPILER_GCC34 0x02000050
+#define GLM_COMPILER_GCC35 0x02000060
+#define GLM_COMPILER_GCC40 0x02000070
+#define GLM_COMPILER_GCC41 0x02000080
+#define GLM_COMPILER_GCC42 0x02000090
+#define GLM_COMPILER_GCC43 0x020000A0
+#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
+
+// G++ command line to display defined
+// echo "" | g++ -E -dM -x c++ - | sort
+
+// Borland C++ defines. How to identify BC?
+#define GLM_COMPILER_BC 0x04000000
+#define GLM_COMPILER_BCB4 0x04000100
+#define GLM_COMPILER_BCB5 0x04000200
+#define GLM_COMPILER_BCB6 0x04000300
+//#define GLM_COMPILER_BCBX 0x04000400 // What's the version value?
+#define GLM_COMPILER_BCB2009 0x04000500
+
+// CodeWarrior
+#define GLM_COMPILER_CODEWARRIOR 0x08000000
+
+// CUDA
+#define GLM_COMPILER_CUDA 0x10000000
+#define GLM_COMPILER_CUDA30 0x10000010
+#define GLM_COMPILER_CUDA31 0x10000020
+#define GLM_COMPILER_CUDA32 0x10000030
+#define GLM_COMPILER_CUDA40 0x10000040
+#define GLM_COMPILER_CUDA41 0x10000050
+#define GLM_COMPILER_CUDA42 0x10000060
+
+// Clang
+#define GLM_COMPILER_CLANG 0x20000000
+#define GLM_COMPILER_CLANG26 0x20000010
+#define GLM_COMPILER_CLANG27 0x20000020
+#define GLM_COMPILER_CLANG28 0x20000030
+#define GLM_COMPILER_CLANG29 0x20000040
+#define GLM_COMPILER_CLANG30 0x20000050
+#define GLM_COMPILER_CLANG31 0x20000060
+#define GLM_COMPILER_CLANG32 0x20000070
+#define GLM_COMPILER_CLANG33 0x20000080
+#define GLM_COMPILER_CLANG40 0x20000090
+#define GLM_COMPILER_CLANG41 0x200000A0
+#define GLM_COMPILER_CLANG42 0x200000B0
+#define GLM_COMPILER_CLANG43 0x200000C0
+
+// LLVM GCC
+#define GLM_COMPILER_LLVM_GCC 0x40000000
+
+// Build model
+#define GLM_MODEL_32 0x00000010
+#define GLM_MODEL_64 0x00000020
+
+// Force generic C++ compiler
+#ifdef GLM_FORCE_COMPILER_UNKNOWN
+# define GLM_COMPILER GLM_COMPILER_UNKNOWN
+
+#elif defined(__INTEL_COMPILER)
+# if __INTEL_COMPILER == 900
+# define GLM_COMPILER GLM_COMPILER_INTEL9
+# elif __INTEL_COMPILER == 1000
+# define GLM_COMPILER GLM_COMPILER_INTEL10_0
+# elif __INTEL_COMPILER == 1010
+# define GLM_COMPILER GLM_COMPILER_INTEL10_1
+# elif __INTEL_COMPILER == 1100
+# define GLM_COMPILER GLM_COMPILER_INTEL11_0
+# elif __INTEL_COMPILER == 1110
+# define GLM_COMPILER GLM_COMPILER_INTEL11_1
+# elif __INTEL_COMPILER == 1200
+# define GLM_COMPILER GLM_COMPILER_INTEL12_0
+# elif __INTEL_COMPILER == 1210
+# define GLM_COMPILER GLM_COMPILER_INTEL12_1
+# elif __INTEL_COMPILER >= 1300
+# define GLM_COMPILER GLM_COMPILER_INTEL13_0
+# else
+# define GLM_COMPILER GLM_COMPILER_INTEL
+# endif
+
+// CUDA
+#elif defined(__CUDACC__)
+# if CUDA_VERSION < 3000
+# error "GLM requires CUDA 3.0 or higher"
+# else
+# define GLM_COMPILER GLM_COMPILER_CUDA
+# endif
+
+// Visual C++
+#elif defined(_MSC_VER)
+# if _MSC_VER < 1400
+# error "GLM requires Visual C++ 2005 or higher"
+# elif _MSC_VER == 1400
+# define GLM_COMPILER GLM_COMPILER_VC2005
+# elif _MSC_VER == 1500
+# define GLM_COMPILER GLM_COMPILER_VC2008
+# elif _MSC_VER == 1600
+# define GLM_COMPILER GLM_COMPILER_VC2010
+# elif _MSC_VER == 1700
+# define GLM_COMPILER GLM_COMPILER_VC2012
+# elif _MSC_VER >= 1800
+# define GLM_COMPILER GLM_COMPILER_VC2013
+# else//_MSC_VER
+# define GLM_COMPILER GLM_COMPILER_VC
+# endif//_MSC_VER
+
+// Clang
+#elif defined(__clang__)
+# if (__clang_major__ <= 1) || ((__clang_major__ == 2) && (__clang_minor__ < 6))
+# error "GLM requires Clang 2.6 or higher"
+# elif(__clang_major__ == 2) && (__clang_minor__ == 6)
+# define GLM_COMPILER GLM_COMPILER_CLANG26
+# elif(__clang_major__ == 2) && (__clang_minor__ == 7)
+# define GLM_COMPILER GLM_COMPILER_CLANG27
+# elif(__clang_major__ == 2) && (__clang_minor__ == 8)
+# define GLM_COMPILER GLM_COMPILER_CLANG28
+# elif(__clang_major__ == 2) && (__clang_minor__ == 9)
+# define GLM_COMPILER GLM_COMPILER_CLANG29
+# elif(__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
+# elif(__clang_major__ == 4) && (__clang_minor__ == 0)
+# define GLM_COMPILER GLM_COMPILER_CLANG40
+# elif(__clang_major__ == 4) && (__clang_minor__ == 1)
+# define GLM_COMPILER GLM_COMPILER_CLANG41
+# elif(__clang_major__ == 4) && (__clang_minor__ == 2)
+# define GLM_COMPILER GLM_COMPILER_CLANG42
+# elif(__clang_major__ == 4) && (__clang_minor__ >= 3)
+# define GLM_COMPILER GLM_COMPILER_CLANG43
+# elif(__clang_major__ > 4)
+# define GLM_COMPILER GLM_COMPILER_CLANG43
+# else
+# define GLM_COMPILER GLM_COMPILER_CLANG
+# endif
+
+// G++
+#elif(defined(__GNUC__) || defined(__MINGW32__))// || defined(__llvm__) || defined(__clang__)
+# if (__GNUC__ == 3) && (__GNUC_MINOR__ == 2)
+# define GLM_COMPILER GLM_COMPILER_GCC32
+# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 3)
+# define GLM_COMPILER GLM_COMPILER_GCC33
+# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 4)
+# define GLM_COMPILER GLM_COMPILER_GCC34
+# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 5)
+# define GLM_COMPILER GLM_COMPILER_GCC35
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 0)
+# define GLM_COMPILER (GLM_COMPILER_GCC40)
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 1)
+# define GLM_COMPILER (GLM_COMPILER_GCC41)
+# elif (__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)
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6)
+# define GLM_COMPILER (GLM_COMPILER_GCC46)
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7)
+# define GLM_COMPILER (GLM_COMPILER_GCC47)
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)
+# define GLM_COMPILER (GLM_COMPILER_GCC48)
+# elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)
+# define GLM_COMPILER (GLM_COMPILER_GCC49)
+# elif (__GNUC__ > 4 )
+# define GLM_COMPILER (GLM_COMPILER_GCC49)
+# else
+# define GLM_COMPILER (GLM_COMPILER_GCC)
+# endif
+
+// Borland C++
+#elif defined(_BORLANDC_)
+# define GLM_COMPILER GLM_COMPILER_BC
+
+// Codewarrior
+#elif defined(__MWERKS__)
+# define GLM_COMPILER GLM_COMPILER_CODEWARRIOR
+
+#else
+# define GLM_COMPILER GLM_COMPILER_UNKNOWN
+#endif
+
+#ifndef GLM_COMPILER
+#error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message."
+#endif//GLM_COMPILER
+
+// Report compiler detection
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPILER_DISPLAYED))
+# define GLM_MESSAGE_COMPILER_DISPLAYED
+# if(GLM_COMPILER & GLM_COMPILER_CUDA)
+# pragma message("GLM: CUDA compiler detected")
+# elif(GLM_COMPILER & GLM_COMPILER_VC)
+# pragma message("GLM: Visual C++ compiler detected")
+# elif(GLM_COMPILER & GLM_COMPILER_CLANG)
+# pragma message("GLM: Clang compiler detected")
+# elif(GLM_COMPILER & GLM_COMPILER_LLVM_GCC)
+# pragma message("GLM: LLVM GCC compiler detected")
+# elif(GLM_COMPILER & GLM_COMPILER_GCC)
+# if(GLM_COMPILER == GLM_COMPILER_GCC_LLVM)
+# pragma message("GLM: LLVM GCC compiler detected")
+# elif(GLM_COMPILER == GLM_COMPILER_GCC_CLANG)
+# pragma message("GLM: CLANG compiler detected")
+# else
+# pragma message("GLM: GCC compiler detected")
+# endif
+# elif(GLM_COMPILER & GLM_COMPILER_BC)
+# pragma message("GLM: Borland compiler detected but not supported")
+# elif(GLM_COMPILER & GLM_COMPILER_CODEWARRIOR)
+# pragma message("GLM: Codewarrior compiler detected but not supported")
+# else
+# pragma message("GLM: Compiler not detected")
+# endif
+#endif//GLM_MESSAGE
+
+/////////////////
+// Build model //
+
+#if(defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__))
+# define GLM_MODEL GLM_MODEL_64
+#elif(defined(__i386__) || defined(__ppc__))
+# define GLM_MODEL GLM_MODEL_32
+#else
+# define GLM_MODEL GLM_MODEL_32
+#endif//
+
+#if(!defined(GLM_MODEL) && GLM_COMPILER != 0)
+# error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message."
+#endif//GLM_MODEL
+
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_MODEL_DISPLAYED))
+# define GLM_MESSAGE_MODEL_DISPLAYED
+# if(GLM_MODEL == GLM_MODEL_64)
+# pragma message("GLM: 64 bits model")
+# elif(GLM_MODEL == GLM_MODEL_32)
+# pragma message("GLM: 32 bits model")
+# endif//GLM_MODEL
+#endif//GLM_MESSAGE
+
+/////////////////
+// C++ Version //
+
+// User defines: GLM_FORCE_CXX98
+
+#define GLM_LANG_CXX (0 << 0)
+#define GLM_LANG_CXX98 ((1 << 1) | GLM_LANG_CXX)
+#define GLM_LANG_CXX03 ((1 << 2) | GLM_LANG_CXX98)
+#define GLM_LANG_CXX0X ((1 << 3) | GLM_LANG_CXX03)
+#define GLM_LANG_CXX11 ((1 << 4) | GLM_LANG_CXX0X)
+#define GLM_LANG_CXXMS (1 << 5)
+#define GLM_LANG_CXXGNU (1 << 6)
+
+#if(defined(GLM_FORCE_CXX11))
+# define GLM_LANG GLM_LANG_CXX11
+#elif(defined(GLM_FORCE_CXX03))
+# define GLM_LANG GLM_LANG_CXX03
+#elif(defined(GLM_FORCE_CXX98))
+# define GLM_LANG GLM_LANG_CXX98
+#else
+# if(__cplusplus >= 201103L)
+# define GLM_LANG GLM_LANG_CXX11
+# elif((GLM_COMPILER & GLM_COMPILER_CLANG) == GLM_COMPILER_CLANG)
+# if(GLM_PLATFORM == GLM_PLATFORM_APPLE)
+# define GLM_DETAIL_MAJOR 1
+# else
+# define GLM_DETAIL_MAJOR 0
+# endif
+# if(__clang_major__ < (2 + GLM_DETAIL_MAJOR))
+# define GLM_LANG GLM_LANG_CXX
+# elif(__has_feature(cxx_auto_type))
+# define GLM_LANG GLM_LANG_CXX0X
+# else
+# define GLM_LANG GLM_LANG_CXX98
+# endif
+# elif((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC)
+# if defined(__GXX_EXPERIMENTAL_CXX0X__)
+# define GLM_LANG GLM_LANG_CXX0X
+# else
+# define GLM_LANG GLM_LANG_CXX98
+# endif
+# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && defined(_MSC_EXTENSIONS))
+# define GLM_LANG GLM_LANG_CXXMS
+# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && !defined(_MSC_EXTENSIONS))
+# if(GLM_COMPILER >= GLM_COMPILER_VC2010)
+# define GLM_LANG GLM_LANG_CXX0X
+# else
+# define GLM_LANG GLM_LANG_CXX98
+# endif
+# elif(__cplusplus >= 199711L)
+# define GLM_LANG GLM_LANG_CXX98
+# else
+# define GLM_LANG GLM_LANG_CXX
+# endif
+#endif
+
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_LANG_DISPLAYED))
+# define GLM_MESSAGE_LANG_DISPLAYED
+# if(GLM_LANG == GLM_LANG_CXX98)
+# pragma message("GLM: C++98")
+# elif(GLM_LANG == GLM_LANG_CXX03)
+# pragma message("GLM: C++03")
+# elif(GLM_LANG == GLM_LANG_CXX0X)
+# pragma message("GLM: C++0x")
+# elif(GLM_LANG == GLM_LANG_CXX11)
+# pragma message("GLM: C++11")
+# elif(GLM_LANG == GLM_LANG_CXXGNU)
+# pragma message("GLM: C++ with GNU language extensions")
+# elif(GLM_LANG == GLM_LANG_CXXMS)
+# pragma message("GLM: C++ with VC language extensions")
+# else
+# pragma message("GLM: C++ language undetected")
+# endif//GLM_MODEL
+#endif//GLM_MESSAGE
+
+/////////////////
+// Platform
+
+// User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_AVX
+
+#define GLM_ARCH_PURE 0x0000
+#define GLM_ARCH_SSE2 0x0001
+#define GLM_ARCH_SSE3 0x0002// | GLM_ARCH_SSE2
+#define GLM_ARCH_SSE4 0x0004// | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
+#define GLM_ARCH_AVX 0x0008// | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
+#define GLM_ARCH_AVX2 0x0010// | GLM_ARCH_AVX | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
+
+#if(defined(GLM_FORCE_PURE))
+# define GLM_ARCH GLM_ARCH_PURE
+#elif(defined(GLM_FORCE_AVX2))
+# define GLM_ARCH (GLM_ARCH_AVX2 | GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+#elif(defined(GLM_FORCE_AVX))
+# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+#elif(defined(GLM_FORCE_SSE4))
+# define GLM_ARCH (GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+#elif(defined(GLM_FORCE_SSE3))
+# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+#elif(defined(GLM_FORCE_SSE2))
+# define GLM_ARCH (GLM_ARCH_SSE2)
+#elif((GLM_COMPILER & GLM_COMPILER_VC) && (defined(_M_IX86) || defined(_M_X64)))
+# if(GLM_PLATFORM == GLM_PLATFORM_WINCE)
+# define GLM_ARCH GLM_ARCH_PURE
+# elif(defined(_M_CEE_PURE))
+# define GLM_ARCH GLM_ARCH_PURE
+/* TODO: Explore auto detection of instruction set support
+# elif(defined(_M_IX86_FP))
+# if(_M_IX86_FP >= 3)
+# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+# elif(_M_IX86_FP >= 2)
+# define GLM_ARCH (GLM_ARCH_SSE2)
+# else
+# define GLM_ARCH GLM_ARCH_PURE
+# endif
+*/
+# elif(GLM_COMPILER >= GLM_COMPILER_VC2012)
+# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+# elif(GLM_COMPILER >= GLM_COMPILER_VC2010)
+# if(_MSC_FULL_VER >= 160031118) //160031118: VC2010 SP1 beta full version
+# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)//GLM_ARCH_AVX (Require SP1)
+# else
+# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+# endif
+# elif(GLM_COMPILER >= GLM_COMPILER_VC2008)
+# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2)
+# elif(GLM_COMPILER >= GLM_COMPILER_VC2005)
+# define GLM_ARCH GLM_ARCH_SSE2
+# else
+# define GLM_ARCH GLM_ARCH_PURE
+# endif
+#elif((GLM_PLATFORM & GLM_PLATFORM_APPLE) && (GLM_COMPILER & GLM_COMPILER_GCC))
+# define GLM_ARCH GLM_ARCH_PURE
+#elif(((GLM_COMPILER & GLM_COMPILER_GCC) && (defined(__i386__) || defined(__x86_64__))) || (GLM_COMPILER & GLM_COMPILER_LLVM_GCC))
+# define GLM_ARCH (GLM_ARCH_PURE \
+| (defined(__AVX2__) ? GLM_ARCH_AVX2 : 0) \
+| (defined(__AVX__) ? GLM_ARCH_AVX : 0) \
+| (defined(__SSE4__) ? GLM_ARCH_SSE4 : 0) \
+| (defined(__SSE3__) ? GLM_ARCH_SSE3 : 0) \
+| (defined(__SSE2__) ? GLM_ARCH_SSE2 : 0))
+#else
+# define GLM_ARCH GLM_ARCH_PURE
+#endif
+
+// With MinGW-W64, including intrinsic headers before intrin.h will produce some errors. The problem is
+// that windows.h (and maybe other headers) will silently include intrin.h, which of course causes problems.
+// To fix, we just explicitly include intrin.h here.
+#if defined(__MINGW32__) && (GLM_ARCH != GLM_ARCH_PURE)
+# include <intrin.h>
+#endif
+
+//#if(GLM_ARCH != GLM_ARCH_PURE)
+#if(GLM_ARCH & GLM_ARCH_AVX2)
+# include <immintrin.h>
+#endif//GLM_ARCH
+#if(GLM_ARCH & GLM_ARCH_AVX)
+# include <immintrin.h>
+#endif//GLM_ARCH
+#if(GLM_ARCH & GLM_ARCH_SSE4)
+# include <smmintrin.h>
+#endif//GLM_ARCH
+#if(GLM_ARCH & GLM_ARCH_SSE3)
+# include <pmmintrin.h>
+#endif//GLM_ARCH
+#if(GLM_ARCH & GLM_ARCH_SSE2)
+# include <emmintrin.h>
+#endif//GLM_ARCH
+//#endif//(GLM_ARCH != GLM_ARCH_PURE)
+
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_ARCH_DISPLAYED))
+# define GLM_MESSAGE_ARCH_DISPLAYED
+# if(GLM_ARCH == GLM_ARCH_PURE)
+# pragma message("GLM: Platform independent")
+# elif(GLM_ARCH & GLM_ARCH_SSE2)
+# pragma message("GLM: SSE2 instruction set")
+# elif(GLM_ARCH & GLM_ARCH_SSE3)
+# pragma message("GLM: SSE3 instruction set")
+# elif(GLM_ARCH & GLM_ARCH_SSE4)
+# pragma message("GLM: SSE4 instruction set")
+# elif(GLM_ARCH & GLM_ARCH_AVX)
+# pragma message("GLM: AVX instruction set")
+# elif(GLM_ARCH & GLM_ARCH_AVX2)
+# pragma message("GLM: AVX2 instruction set")
+# endif//GLM_ARCH
+#endif//GLM_MESSAGE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Support check macros
+
+#define GLM_SUPPORT_ANONYMOUS_UNION() \
+ ((GLM_LANG & GLM_LANG_CXX98) == GLM_LANG_CXX98)
+
+//#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() <backslash>
+// (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS) || ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_LANG == GLM_LANG_CXX0X)))
+
+#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() \
+ (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && ((GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS)) || ((GLM_LANG == GLM_LANG_CXX0X) == GLM_LANG_CXX0X))
+
+#define GLM_SUPPORT_SWIZZLE_OPERATOR() \
+ (/*defined(GLM_SWIZZLE) && */GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE())
+
+#define GLM_SUPPORT_SWIZZLE_FUNCTION() defined(GLM_SWIZZLE)
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Components
+
+//#define GLM_FORCE_ONLY_XYZW
+#define GLM_COMPONENT_ONLY_XYZW 0 // To disable multiple vector component names access.
+#define GLM_COMPONENT_CXX98 1 //
+#define GLM_COMPONENT_CXX11 2 // To use anonymous union to provide multiple component names access for class valType. Visual C++ only.
+
+#if(GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() && !defined(GLM_FORCE_ONLY_XYZW))
+# define GLM_COMPONENT GLM_COMPONENT_CXX11
+#elif(GLM_SUPPORT_ANONYMOUS_UNION() && !defined(GLM_FORCE_ONLY_XYZW))
+# define GLM_COMPONENT GLM_COMPONENT_CXX98
+#else
+# define GLM_COMPONENT GLM_COMPONENT_ONLY_XYZW
+#endif
+
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPONENT_DISPLAYED))
+# define GLM_MESSAGE_COMPONENT_DISPLAYED
+# if(GLM_COMPONENT == GLM_COMPONENT_CXX98)
+# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names except of half based vector types")
+# elif(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
+# pragma message("GLM: x,y,z,w component names for all vector types")
+# elif(GLM_COMPONENT == GLM_COMPONENT_CXX11)
+# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names for all vector types")
+# else
+# error "GLM: GLM_COMPONENT value unknown"
+# endif//GLM_MESSAGE_COMPONENT_DISPLAYED
+#endif//GLM_MESSAGE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Radians
+
+//#define GLM_FORCE_RADIANS
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Static assert
+
+#if(GLM_LANG == GLM_LANG_CXX0X)
+# 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
+# define GLM_STATIC_ASSERT(x, message)
+# define GLM_STATIC_ASSERT_NULL
+#endif//GLM_LANG
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Qualifiers
+
+// User defines: GLM_FORCE_INLINE GLM_FORCE_CUDA
+
+#if(defined(GLM_FORCE_CUDA) || (GLM_COMPILER & GLM_COMPILER_CUDA))
+# define GLM_CUDA_FUNC_DEF __device__ __host__
+# define GLM_CUDA_FUNC_DECL __device__ __host__
+#else
+# define GLM_CUDA_FUNC_DEF
+# define GLM_CUDA_FUNC_DECL
+#endif
+
+#if GLM_COMPILER & GLM_COMPILER_GCC
+# define GLM_VAR_USED __attribute__ ((unused))
+#else
+# define GLM_VAR_USED
+#endif
+
+#if(defined(GLM_FORCE_INLINE))
+# if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005))
+# define GLM_INLINE __forceinline
+# elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC34))
+# define GLM_INLINE __attribute__((always_inline))
+# elif(GLM_COMPILER & GLM_COMPILER_CLANG)
+# define GLM_INLINE __attribute__((always_inline))
+# else
+# define GLM_INLINE inline
+# endif//GLM_COMPILER
+#else
+# define GLM_INLINE inline
+#endif//defined(GLM_FORCE_INLINE)
+
+#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL
+#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Swizzle operators
+
+// User defines: GLM_SWIZZLE
+
+#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED))
+# define GLM_MESSAGE_SWIZZLE_DISPLAYED
+# if(GLM_SUPPORT_SWIZZLE_OPERATOR())
+# pragma message("GLM: Swizzling operators enabled")
+# elif(GLM_SUPPORT_SWIZZLE_FUNCTION())
+# pragma message("GLM: Swizzling operators supported through swizzling functions")
+# else
+# pragma message("GLM: Swizzling operators disabled")
+# endif
+#endif//GLM_MESSAGE
+
+#endif//glm_setup
diff --git a/include/gal/opengl/glm/core/type.hpp b/include/gal/opengl/glm/core/type.hpp
new file mode 100644
index 0000000..6361e2e
--- /dev/null
+++ b/include/gal/opengl/glm/core/type.hpp
@@ -0,0 +1,341 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type.hpp
+/// @date 2008-01-08 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type
+#define glm_core_type
+
+#include "type_half.hpp"
+#include "type_float.hpp"
+#include "type_int.hpp"
+
+#include "type_gentype.hpp"
+
+#include "type_vec1.hpp"
+#include "type_vec2.hpp"
+#include "type_vec3.hpp"
+#include "type_vec4.hpp"
+
+#include "type_mat2x2.hpp"
+#include "type_mat2x3.hpp"
+#include "type_mat2x4.hpp"
+#include "type_mat3x2.hpp"
+#include "type_mat3x3.hpp"
+#include "type_mat3x4.hpp"
+#include "type_mat4x2.hpp"
+#include "type_mat4x3.hpp"
+#include "type_mat4x4.hpp"
+
+namespace glm
+{
+ /// @addtogroup core_types
+ /// @{
+
+ //////////////////////////
+ // Float definition
+
+#if(defined(GLM_PRECISION_HIGHP_FLOAT))
+ typedef highp_vec2 vec2;
+ typedef highp_vec3 vec3;
+ typedef highp_vec4 vec4;
+ typedef highp_mat2x2 mat2x2;
+ typedef highp_mat2x3 mat2x3;
+ typedef highp_mat2x4 mat2x4;
+ typedef highp_mat3x2 mat3x2;
+ typedef highp_mat3x3 mat3x3;
+ typedef highp_mat3x4 mat3x4;
+ typedef highp_mat4x2 mat4x2;
+ typedef highp_mat4x3 mat4x3;
+ typedef highp_mat4x4 mat4x4;
+#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))
+ typedef mediump_vec2 vec2;
+ typedef mediump_vec3 vec3;
+ typedef mediump_vec4 vec4;
+ typedef mediump_mat2x2 mat2x2;
+ typedef mediump_mat2x3 mat2x3;
+ typedef mediump_mat2x4 mat2x4;
+ typedef mediump_mat3x2 mat3x2;
+ typedef mediump_mat3x3 mat3x3;
+ typedef mediump_mat3x4 mat3x4;
+ typedef mediump_mat4x2 mat4x2;
+ typedef mediump_mat4x3 mat4x3;
+ typedef mediump_mat4x4 mat4x4;
+#elif(defined(GLM_PRECISION_LOWP_FLOAT))
+ typedef lowp_vec2 vec2;
+ typedef lowp_vec3 vec3;
+ typedef lowp_vec4 vec4;
+ typedef lowp_mat2x2 mat2x2;
+ typedef lowp_mat2x3 mat2x3;
+ typedef lowp_mat2x4 mat2x4;
+ typedef lowp_mat3x2 mat3x2;
+ typedef lowp_mat3x3 mat3x3;
+ typedef lowp_mat3x4 mat3x4;
+ typedef lowp_mat4x2 mat4x2;
+ typedef lowp_mat4x3 mat4x3;
+ typedef lowp_mat4x4 mat4x4;
+#else
+ /// 2 components vector 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.5 Vectors</a>
+ typedef mediump_vec2 vec2;
+
+ //! 3 components vector 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.5 Vectors</a>
+ typedef mediump_vec3 vec3;
+
+ //! 4 components vector 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.5 Vectors</a>
+ typedef mediump_vec4 vec4;
+
+ //! 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 mediump_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 mediump_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 mediump_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 mediump_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 mediump_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 mediump_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 mediump_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 mediump_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 mediump_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;
+
+ //////////////////////////
+ // Signed integer definition
+
+#if(defined(GLM_PRECISION_HIGHP_INT))
+ typedef highp_ivec2 ivec2;
+ typedef highp_ivec3 ivec3;
+ typedef highp_ivec4 ivec4;
+#elif(defined(GLM_PRECISION_MEDIUMP_INT))
+ typedef mediump_ivec2 ivec2;
+ typedef mediump_ivec3 ivec3;
+ typedef mediump_ivec4 ivec4;
+#elif(defined(GLM_PRECISION_LOWP_INT))
+ typedef lowp_ivec2 ivec2;
+ typedef lowp_ivec3 ivec3;
+ typedef lowp_ivec4 ivec4;
+#else
+ //! 2 components vector of 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>
+ typedef mediump_ivec2 ivec2;
+
+ //! 3 components vector of 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>
+ typedef mediump_ivec3 ivec3;
+
+ //! 4 components vector of 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>
+ typedef mediump_ivec4 ivec4;
+#endif//GLM_PRECISION
+
+ //////////////////////////
+ // Unsigned integer definition
+
+#if(defined(GLM_PRECISION_HIGHP_UINT))
+ typedef highp_uvec2 uvec2;
+ typedef highp_uvec3 uvec3;
+ typedef highp_uvec4 uvec4;
+#elif(defined(GLM_PRECISION_MEDIUMP_UINT))
+ typedef mediump_uvec2 uvec2;
+ typedef mediump_uvec3 uvec3;
+ typedef mediump_uvec4 uvec4;
+#elif(defined(GLM_PRECISION_LOWP_UINT))
+ typedef lowp_uvec2 uvec2;
+ typedef lowp_uvec3 uvec3;
+ typedef lowp_uvec4 uvec4;
+#else
+ //! 2 components vector of 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>
+ typedef mediump_uvec2 uvec2;
+
+ //! 3 components vector of 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>
+ typedef mediump_uvec3 uvec3;
+
+ //! 4 components vector of 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>
+ typedef mediump_uvec4 uvec4;
+#endif//GLM_PRECISION
+
+ //////////////////////////
+ // Boolean definition
+
+ //! 2 components vector of boolean.
+ ///
+ /// @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 detail::tvec2<bool> bvec2;
+
+ //! 3 components vector of boolean.
+ ///
+ /// @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 detail::tvec3<bool> bvec3;
+
+ //! 4 components vector of boolean.
+ ///
+ /// @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 detail::tvec4<bool> bvec4;
+
+ //////////////////////////
+ // Double definition
+
+ //! Vector of 2 double-precision 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 detail::tvec2<double> dvec2;
+
+ //! Vector of 3 double-precision 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 detail::tvec3<double> dvec3;
+
+ //! Vector of 4 double-precision 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 detail::tvec4<double> dvec4;
+
+ //! 2 * 2 matrix of double-precision 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 detail::tmat2x2<double> dmat2;
+
+ //! 3 * 3 matrix of double-precision 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 detail::tmat3x3<double> dmat3;
+
+ //! 4 * 4 matrix of double-precision 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 detail::tmat4x4<double> dmat4;
+
+ //! 2 * 2 matrix of double-precision 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 detail::tmat2x2<double> dmat2x2;
+
+ //! 2 * 3 matrix of double-precision 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 detail::tmat2x3<double> dmat2x3;
+
+ //! 2 * 4 matrix of double-precision 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 detail::tmat2x4<double> dmat2x4;
+
+ //! 3 * 2 matrix of double-precision 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 detail::tmat3x2<double> dmat3x2;
+
+ //! 3 * 3 matrix of double-precision 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 detail::tmat3x3<double> dmat3x3;
+
+ //! 3 * 4 matrix of double-precision 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 detail::tmat3x4<double> dmat3x4;
+
+ //! 4 * 2 matrix of double-precision 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 detail::tmat4x2<double> dmat4x2;
+
+ //! 4 * 3 matrix of double-precision 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 detail::tmat4x3<double> dmat4x3;
+
+ //! 4 * 4 matrix of double-precision 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 detail::tmat4x4<double> dmat4x4;
+
+ /// @}
+}//namespace glm
+
+#endif//glm_core_type
diff --git a/include/gal/opengl/glm/core/type_float.hpp b/include/gal/opengl/glm/core/type_float.hpp
new file mode 100644
index 0000000..095812c
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_float.hpp
@@ -0,0 +1,84 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_float.hpp
+/// @date 2008-08-22 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_float
+#define glm_core_type_float
+
+#include "type_half.hpp"
+#include "setup.hpp"
+
+namespace glm
+{
+#ifdef GLM_USE_HALF_SCALAR
+ typedef detail::half lowp_float_t;
+#else//GLM_USE_HALF_SCALAR
+ typedef float lowp_float_t;
+#endif//GLM_USE_HALF_SCALAR
+ typedef float mediump_float_t;
+ typedef double highp_float_t;
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// Low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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.
+ ///
+ /// @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.
+ ///
+ /// @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;
+
+#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
+ typedef mediump_float float_t;
+#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
+ typedef highp_float float_t;
+#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))
+ typedef mediump_float float_t;
+#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT))
+ typedef lowp_float float_t;
+#else
+# error "GLM error: multiple default precision requested for floating-point types"
+#endif
+
+ /// @}
+}//namespace glm
+
+#endif//glm_core_type_float
diff --git a/include/gal/opengl/glm/core/type_gentype.hpp b/include/gal/opengl/glm/core/type_gentype.hpp
new file mode 100644
index 0000000..c79152a
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_gentype.hpp
@@ -0,0 +1,169 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_gentype.hpp
+/// @date 2008-10-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_gentype
+#define glm_core_type_gentype
+
+#include "type_size.hpp"
+
+namespace glm
+{
+ enum profile
+ {
+ nice,
+ fast,
+ simd
+ };
+
+namespace detail
+{
+ template
+ <
+ typename VALTYPE,
+ template <typename> class TYPE
+ >
+ struct genType
+ {
+ public:
+ enum ctor{null};
+
+ typedef VALTYPE value_type;
+ typedef VALTYPE & value_reference;
+ typedef VALTYPE * value_pointer;
+ typedef VALTYPE const * value_const_pointer;
+ typedef TYPE<bool> bool_type;
+
+ 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;
+
+ //////////////////////////////////////
+ // Address (Implementation details)
+
+ value_const_pointer value_address() const{return value_pointer(this);}
+ value_pointer value_address(){return value_pointer(this);}
+
+ //protected:
+ // enum kind
+ // {
+ // GEN_TYPE,
+ // VEC_TYPE,
+ // MAT_TYPE
+ // };
+
+ // typedef typename TYPE::kind kind;
+ };
+
+ template
+ <
+ 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>
+ class base
+ {
+ public:
+ //////////////////////////////////////
+ // Traits
+
+ typedef sizeType size_type;
+ typedef valTypeT value_type;
+
+ typedef base<value_type, colT, rowT> class_type;
+
+ typedef base<bool, colT, rowT> bool_type;
+ typedef base<value_type, rowT, 1> col_type;
+ typedef base<value_type, colT, 1> row_type;
+ typedef base<value_type, rowT, colT> transpose_type;
+
+ static size_type col_size();
+ static size_type row_size();
+ static size_type value_size();
+ static bool is_scalar();
+ static bool is_vector();
+ static bool is_matrix();
+
+ private:
+ // Data
+ col_type value[colT];
+
+ public:
+ //////////////////////////////////////
+ // Constructors
+ base();
+ base(class_type const & m);
+
+ explicit base(value_type 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);
+
+ //////////////////////////////////////
+ // Accesses
+ col_type& operator[](size_type i);
+ col_type const & operator[](size_type i) const;
+
+ //////////////////////////////////////
+ // Unary updatable operators
+ class_type& operator= (class_type const & x);
+ class_type& operator+= (value_type const & x);
+ class_type& operator+= (class_type const & x);
+ class_type& operator-= (value_type const & x);
+ class_type& operator-= (class_type const & x);
+ class_type& operator*= (value_type const & x);
+ class_type& operator*= (class_type const & x);
+ class_type& operator/= (value_type const & x);
+ class_type& operator/= (class_type const & x);
+ class_type& operator++ ();
+ class_type& operator-- ();
+ };
+*/
+ }//namespace detail
+}//namespace glm
+
+//#include "type_gentype.inl"
+
+#endif//glm_core_type_gentype
diff --git a/include/gal/opengl/glm/core/type_gentype.inl b/include/gal/opengl/glm/core/type_gentype.inl
new file mode 100644
index 0000000..2ca7496
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_gentype.inl
@@ -0,0 +1,366 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_gentype.inl
+/// @date 2008-10-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail{
+
+/////////////////////////////////
+// Static functions
+
+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>
+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>
+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>
+bool base<vT, cT, rT, pT>::is_scalar()
+{
+ return rT == 1 && cT == 1;
+}
+
+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>
+bool base<vT, cT, rT, pT>::is_matrix()
+{
+ return rT != 1;
+}
+
+/////////////////////////////////
+// Constructor
+
+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>
+base<vT, cT, rT, pT>::base
+(
+ typename base<vT, cT, rT, pT>::class_type const & m
+)
+{
+ for
+ (
+ typename genType<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
+ i < base<vT, cT, rT, pT>::col_size();
+ ++i
+ )
+ {
+ this->value[i] = m[i];
+ }
+}
+
+template <typename vT, uint cT, uint rT, profile pT>
+base<vT, cT, rT, pT>::base
+(
+ typename base<vT, cT, rT, pT>::value_type const & x
+)
+{
+ if(rT == 1) // vector
+ {
+ for
+ (
+ typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
+ i < base<vT, cT, rT, pT>::col_size();
+ ++i
+ )
+ {
+ this->value[i][rT] = x;
+ }
+ }
+ else // matrix
+ {
+ memset(&this->value, 0, cT * rT * sizeof(vT));
+
+ typename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT;
+
+ for
+ (
+ typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
+ i < stop;
+ ++i
+ )
+ {
+ this->value[i][i] = x;
+ }
+ }
+}
+
+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
+)
+{
+ memcpy(&this->value, &x.value, cT * rT * sizeof(vT));
+}
+
+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
+)
+{
+ for
+ (
+ typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
+ i < base<vT, cT, rT, pT>::col_size();
+ ++i
+ )
+ {
+ this->value[i] = x[i];
+ }
+}
+
+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
+)
+{
+ for
+ (
+ typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
+ i < base<vT, cT, rT, pT>::col_size();
+ ++i
+ )
+ {
+ this->value[i] = base<vT, cT, rT, pT>(m[i]);
+ }
+}
+
+//////////////////////////////////////
+// Accesses
+
+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
+)
+{
+ 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[]
+(
+ typename base<vT, cT, rT, pT>::size_type i
+) const
+{
+ return this->value[i];
+}
+
+//////////////////////////////////////
+// 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=
+(
+ 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+=
+(
+ typename base<vT, cT, rT, pT>::value_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] += x;
+
+ 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+=
+(
+ typename base<vT, cT, rT, pT>::class_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] += x[j][i];
+
+ 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-=
+(
+ typename base<vT, cT, rT, pT>::value_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] -= x;
+
+ 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-=
+(
+ typename base<vT, cT, rT, pT>::class_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] -= x[j][i];
+
+ 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*=
+(
+ typename base<vT, cT, rT, pT>::value_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] *= x;
+
+ 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*=
+(
+ typename base<vT, cT, rT, pT>::class_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] *= x[j][i];
+
+ 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/=
+(
+ typename base<vT, cT, rT, pT>::value_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] /= x;
+
+ 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/=
+(
+ typename base<vT, cT, rT, pT>::class_type const & x
+)
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ this->value[j][i] /= x[j][i];
+
+ 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++ ()
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ ++this->value[j][i];
+
+ 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-- ()
+{
+ typename base<vT, cT, rT, pT>::size_type stop_col = col_size();
+ typename base<vT, cT, rT, pT>::size_type stop_row = row_size();
+
+ for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
+ for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
+ --this->value[j][i];
+
+ return *this;
+}
+
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_half.hpp b/include/gal/opengl/glm/core/type_half.hpp
new file mode 100644
index 0000000..5f14fbd
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_half.hpp
@@ -0,0 +1,118 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_half.hpp
+/// @date 2008-08-17 / 2011-09-20
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_half
+#define glm_core_type_half
+
+#include <cstdlib>
+
+namespace glm{
+namespace detail
+{
+ typedef short hdata;
+
+ GLM_FUNC_DECL float toFloat32(hdata value);
+ GLM_FUNC_DECL hdata toFloat16(float const & value);
+
+ class half
+ {
+ public:
+ // Constructors
+ GLM_FUNC_DECL half();
+ GLM_FUNC_DECL half(half const & s);
+
+ template <typename U>
+ GLM_FUNC_DECL explicit half(U const & s);
+
+ // Cast
+ //template <typename U>
+ //GLM_FUNC_DECL operator U() const;
+ GLM_FUNC_DECL operator float() const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL half& operator= (half const & s);
+ GLM_FUNC_DECL half& operator+=(half const & s);
+ GLM_FUNC_DECL half& operator-=(half const & s);
+ GLM_FUNC_DECL half& operator*=(half const & s);
+ GLM_FUNC_DECL half& operator/=(half const & s);
+ GLM_FUNC_DECL half& operator++();
+ GLM_FUNC_DECL half& operator--();
+
+ GLM_FUNC_DECL float toFloat() const{return toFloat32(data);}
+
+ GLM_FUNC_DECL hdata _data() const{return data;}
+
+ private:
+ hdata data;
+ };
+
+ GLM_FUNC_DECL half operator+ (half const & s1, half const & s2);
+
+ GLM_FUNC_DECL half operator- (half const & s1, half const & s2);
+
+ GLM_FUNC_DECL half operator* (half const & s1, half const & s2);
+
+ GLM_FUNC_DECL half operator/ (half const & s1, half const & s2);
+
+ // Unary constant operators
+ GLM_FUNC_DECL half operator- (half const & s);
+
+ GLM_FUNC_DECL half operator-- (half const & s, int);
+
+ GLM_FUNC_DECL half operator++ (half const & s, int);
+
+ GLM_FUNC_DECL bool operator==(
+ detail::half const & x,
+ detail::half const & y);
+
+ GLM_FUNC_DECL bool operator!=(
+ detail::half const & x,
+ detail::half const & y);
+
+ GLM_FUNC_DECL bool operator<(
+ detail::half const & x,
+ detail::half const & y);
+
+ GLM_FUNC_DECL bool operator<=(
+ detail::half const & x,
+ detail::half const & y);
+
+ GLM_FUNC_DECL bool operator>(
+ detail::half const & x,
+ detail::half const & y);
+
+ GLM_FUNC_DECL bool operator>=(
+ detail::half const & x,
+ detail::half const & y);
+
+}//namespace detail
+}//namespace glm
+
+#include "type_half.inl"
+
+#endif//glm_core_type_half
diff --git a/include/gal/opengl/glm/core/type_half.inl b/include/gal/opengl/glm/core/type_half.inl
new file mode 100644
index 0000000..9cd72b3
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_half.inl
@@ -0,0 +1,421 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+///
+/// This half implementation is based on OpenEXR which is Copyright (c) 2002,
+/// Industrial Light & Magic, a division of Lucas Digital Ltd. LLC
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_half.inl
+/// @date 2008-08-17 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "_detail.hpp"
+
+namespace glm{
+namespace detail
+{
+ GLM_FUNC_QUALIFIER float overflow()
+ {
+ volatile float f = 1e10;
+
+ for(int i = 0; i < 10; ++i)
+ f *= f; // this will overflow before
+ // the for­loop terminates
+ return f;
+ }
+
+ GLM_FUNC_QUALIFIER float toFloat32(hdata value)
+ {
+ int s = (value >> 15) & 0x00000001;
+ int e = (value >> 10) & 0x0000001f;
+ int m = value & 0x000003ff;
+
+ if(e == 0)
+ {
+ if(m == 0)
+ {
+ //
+ // Plus or minus zero
+ //
+
+ detail::uif result;
+ result.i = (unsigned int)(s << 31);
+ return result.f;
+ }
+ else
+ {
+ //
+ // Denormalized number -- renormalize it
+ //
+
+ while(!(m & 0x00000400))
+ {
+ m <<= 1;
+ e -= 1;
+ }
+
+ e += 1;
+ m &= ~0x00000400;
+ }
+ }
+ else if(e == 31)
+ {
+ if(m == 0)
+ {
+ //
+ // Positive or negative infinity
+ //
+
+ uif result;
+ result.i = (unsigned int)((s << 31) | 0x7f800000);
+ return result.f;
+ }
+ else
+ {
+ //
+ // Nan -- preserve sign and significand bits
+ //
+
+ uif result;
+ result.i = (unsigned int)((s << 31) | 0x7f800000 | (m << 13));
+ return result.f;
+ }
+ }
+
+ //
+ // Normalized number
+ //
+
+ e = e + (127 - 15);
+ m = m << 13;
+
+ //
+ // Assemble s, e and m.
+ //
+
+ uif Result;
+ Result.i = (unsigned int)((s << 31) | (e << 23) | m);
+ return Result.f;
+ }
+
+ GLM_FUNC_QUALIFIER hdata toFloat16(float const & f)
+ {
+ uif Entry;
+ Entry.f = f;
+ int i = (int)Entry.i;
+
+ //
+ // Our floating point number, f, is represented by the bit
+ // pattern in integer i. Disassemble that bit pattern into
+ // the sign, s, the exponent, e, and the significand, m.
+ // Shift s into the position where it will go in in the
+ // resulting half number.
+ // Adjust e, accounting for the different exponent bias
+ // of float and half (127 versus 15).
+ //
+
+ int s = (i >> 16) & 0x00008000;
+ int e = ((i >> 23) & 0x000000ff) - (127 - 15);
+ int m = i & 0x007fffff;
+
+ //
+ // Now reassemble s, e and m into a half:
+ //
+
+ if(e <= 0)
+ {
+ if(e < -10)
+ {
+ //
+ // E is less than -10. The absolute value of f is
+ // less than half_MIN (f may be a small normalized
+ // float, a denormalized float or a zero).
+ //
+ // We convert f to a half zero.
+ //
+
+ return hdata(s);
+ }
+
+ //
+ // E is between -10 and 0. F is a normalized float,
+ // whose magnitude is less than __half_NRM_MIN.
+ //
+ // We convert f to a denormalized half.
+ //
+
+ m = (m | 0x00800000) >> (1 - e);
+
+ //
+ // Round to nearest, round "0.5" up.
+ //
+ // Rounding may cause the significand to overflow and make
+ // 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)
+ m += 0x00002000;
+
+ //
+ // Assemble the half from s, e (zero) and m.
+ //
+
+ return hdata(s | (m >> 13));
+ }
+ else if(e == 0xff - (127 - 15))
+ {
+ if(m == 0)
+ {
+ //
+ // F is an infinity; convert f to a half
+ // infinity with the same sign as f.
+ //
+
+ return hdata(s | 0x7c00);
+ }
+ else
+ {
+ //
+ // 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
+ // into an infinity, so we have to set at least one
+ // bit in the significand.
+ //
+
+ m >>= 13;
+
+ return hdata(s | 0x7c00 | m | (m == 0));
+ }
+ }
+ else
+ {
+ //
+ // E is greater than zero. F is a normalized float.
+ // We try to convert f to a normalized half.
+ //
+
+ //
+ // Round to nearest, round "0.5" up
+ //
+
+ if(m & 0x00001000)
+ {
+ m += 0x00002000;
+
+ if(m & 0x00800000)
+ {
+ m = 0; // overflow in significand,
+ e += 1; // adjust exponent
+ }
+ }
+
+ //
+ // Handle exponent overflow
+ //
+
+ if (e > 30)
+ {
+ overflow(); // Cause a hardware floating point overflow;
+
+ return hdata(s | 0x7c00);
+ // if this returns, the half becomes an
+ } // infinity with the same sign as f.
+
+ //
+ // Assemble the half from s, e and m.
+ //
+
+ return hdata(s | (e << 10) | (m >> 13));
+ }
+ }
+
+ GLM_FUNC_QUALIFIER half::half() :
+ data(0)
+ {}
+
+ GLM_FUNC_QUALIFIER half::half(half const & s) :
+ data(s.data)
+ {}
+
+ template <typename U>
+ GLM_FUNC_QUALIFIER half::half(U const & s) :
+ data(toFloat16(float(s)))
+ {}
+/*
+ template <typename U>
+ GLM_FUNC_QUALIFIER half::operator U() const
+ {
+ return static_cast<U>(toFloat32(this->data));
+ }
+*/
+
+ GLM_FUNC_QUALIFIER half::operator float() const
+ {
+ return toFloat32(this->data);
+ }
+
+ // Unary updatable operators
+ GLM_FUNC_QUALIFIER half& half::operator= (half const & s)
+ {
+ data = s.data;
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator+=(half const & s)
+ {
+ data = toFloat16(toFloat32(data) + toFloat32(s.data));
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator-=(half const & s)
+ {
+ data = toFloat16(toFloat32(data) - toFloat32(s.data));
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator*=(half const & s)
+ {
+ data = toFloat16(toFloat32(data) * toFloat32(s.data));
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator/=(half const & s)
+ {
+ data = toFloat16(toFloat32(data) / toFloat32(s.data));
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator++()
+ {
+ float Casted = toFloat32(data);
+ this->data = toFloat16(++Casted);
+ return *this;
+ }
+
+ GLM_FUNC_QUALIFIER half& half::operator--()
+ {
+ float Casted = toFloat32(data);
+ this->data = toFloat16(--Casted);
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Binary arithmetic operators
+
+ GLM_FUNC_QUALIFIER detail::half operator+ (detail::half const & s1, detail::half const & s2)
+ {
+ return detail::half(float(s1) + float(s2));
+ }
+
+ GLM_FUNC_QUALIFIER detail::half operator- (detail::half const & s1, detail::half const & s2)
+ {
+ return detail::half(float(s1) - float(s2));
+ }
+
+ GLM_FUNC_QUALIFIER detail::half operator* (detail::half const & s1, detail::half const & s2)
+ {
+ return detail::half(float(s1) * float(s2));
+ }
+
+ GLM_FUNC_QUALIFIER detail::half operator/ (detail::half const & s1, detail::half const & s2)
+ {
+ return detail::half(float(s1) / float(s2));
+ }
+
+ // Unary constant operators
+ GLM_FUNC_QUALIFIER detail::half operator- (detail::half const & s)
+ {
+ return detail::half(-float(s));
+ }
+
+ GLM_FUNC_QUALIFIER detail::half operator-- (detail::half const & s, int)
+ {
+ return detail::half(float(s) - 1.0f);
+ }
+
+ GLM_FUNC_QUALIFIER detail::half operator++ (detail::half const & s, int)
+ {
+ return detail::half(float(s) + 1.0f);
+ }
+
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return x._data() == y._data();
+ }
+
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return x._data() != y._data();
+ }
+
+ GLM_FUNC_QUALIFIER bool operator<
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return float(x) < float(y);
+ }
+
+ GLM_FUNC_QUALIFIER bool operator<=
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return float(x) <= float(y);
+ }
+
+ GLM_FUNC_QUALIFIER bool operator>
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return float(x) > float(y);
+ }
+
+ GLM_FUNC_QUALIFIER bool operator>=
+ (
+ detail::half const & x,
+ detail::half const & y
+ )
+ {
+ return float(x) >= float(y);
+ }
+
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/type_int.hpp b/include/gal/opengl/glm/core/type_int.hpp
new file mode 100644
index 0000000..c7de0c5
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_int.hpp
@@ -0,0 +1,142 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_int.hpp
+/// @date 2008-08-22 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_int
+#define glm_core_type_int
+
+#include "setup.hpp"
+#include "_detail.hpp"
+
+namespace glm{
+namespace detail
+{
+ typedef signed short lowp_int_t;
+ typedef signed int mediump_int_t;
+ typedef sint64 highp_int_t;
+
+ typedef unsigned short lowp_uint_t;
+ typedef unsigned int mediump_uint_t;
+ typedef uint64 highp_uint_t;
+
+ GLM_DETAIL_IS_INT(signed char);
+ GLM_DETAIL_IS_INT(signed short);
+ GLM_DETAIL_IS_INT(signed int);
+ GLM_DETAIL_IS_INT(signed long);
+
+ GLM_DETAIL_IS_UINT(unsigned char);
+ GLM_DETAIL_IS_UINT(unsigned short);
+ GLM_DETAIL_IS_UINT(unsigned int);
+ GLM_DETAIL_IS_UINT(unsigned long);
+
+#if(GLM_LANG >= GLM_LANG_CXX0X)
+ GLM_DETAIL_IS_INT(signed long long);
+ GLM_DETAIL_IS_UINT(unsigned long long);
+#else
+ GLM_DETAIL_IS_INT(highp_int_t);
+ GLM_DETAIL_IS_UINT(highp_uint_t);
+#endif
+}//namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// Low precision signed integer.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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.
+ ///
+ /// @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.
+ ///
+ /// @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.
+ ///
+ /// @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.
+ ///
+ /// @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.
+ ///
+ /// @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;
+
+#if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
+ typedef mediump_int int_t;
+#elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
+ typedef highp_int int_t;
+#elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
+ typedef mediump_int int_t;
+#elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT))
+ typedef lowp_int int_t;
+#else
+# error "GLM error: multiple default precision requested for signed interger types"
+#endif
+
+#if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
+ typedef mediump_uint uint_t;
+#elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
+ typedef highp_uint uint_t;
+#elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
+ typedef mediump_uint uint_t;
+#elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT))
+ typedef lowp_uint uint_t;
+#else
+# error "GLM error: multiple default precision requested for unsigned interger types"
+#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 uint_t uint;
+
+ /// @}
+}//namespace glm
+
+#endif//glm_core_type_int
diff --git a/include/gal/opengl/glm/core/type_mat.hpp b/include/gal/opengl/glm/core/type_mat.hpp
new file mode 100644
index 0000000..1520ad5
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat.hpp
@@ -0,0 +1,41 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat.hpp
+/// @date 2010-01-26 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat
+#define glm_core_type_mat
+
+#include "type_gentype.hpp"
+
+namespace glm{
+namespace detail
+{
+
+}//namespace detail
+}//namespace glm
+
+#endif//glm_core_type_mat
diff --git a/include/gal/opengl/glm/core/type_mat.inl b/include/gal/opengl/glm/core/type_mat.inl
new file mode 100644
index 0000000..477d17e
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat.inl
@@ -0,0 +1,27 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat.inl
+/// @date 2011-06-15 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
diff --git a/include/gal/opengl/glm/core/type_mat2x2.hpp b/include/gal/opengl/glm/core/type_mat2x2.hpp
new file mode 100644
index 0000000..432a6b9
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x2.hpp
@@ -0,0 +1,314 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x2.hpp
+/// @date 2005-01-27 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat2x2
+#define glm_core_type_mat2x2
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat2x2
+ {
+ // Implementation detail
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec2<T> col_type;
+ typedef tvec2<T> row_type;
+ typedef tmat2x2<T> type;
+ typedef tmat2x2<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ public:
+ // Implementation detail
+ GLM_FUNC_DECL tmat2x2<T> _inverse() const;
+
+ private:
+ //////////////////////////////////////
+ // Implementation detail
+ col_type value[2];
+
+ public:
+ //////////////////////////////////////
+ // Constructors
+ GLM_FUNC_DECL tmat2x2();
+ GLM_FUNC_DECL tmat2x2(
+ tmat2x2 const & m);
+
+ GLM_FUNC_DECL explicit tmat2x2(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat2x2(
+ value_type const & x);
+ GLM_FUNC_DECL explicit tmat2x2(
+ value_type const & x1, value_type const & y1,
+ value_type const & x2, value_type const & y2);
+ GLM_FUNC_DECL explicit tmat2x2(
+ col_type const & v1,
+ col_type const & v2);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x2(
+ U const & x);
+
+ template <typename U, typename V, typename M, typename N>
+ GLM_FUNC_DECL explicit tmat2x2(
+ U const & x1, V const & y1,
+ M const & x2, N const & y2);
+
+ template <typename U, typename V>
+ GLM_FUNC_DECL explicit tmat2x2(
+ tvec2<U> const & v1,
+ tvec2<V> const & v2);
+
+ //////////////////////////////////////
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x2(tmat2x2<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat2x2(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x2(tmat4x3<T> const & x);
+
+ //////////////////////////////////////
+ // Accesses
+
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat2x2<T> & operator=(tmat2x2<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator=(tmat2x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator+=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator+=(tmat2x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator-=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator-=(tmat2x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator*=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator*=(tmat2x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator/=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T> & operator/=(tmat2x2<U> const & m);
+ GLM_FUNC_DECL tmat2x2<T> & operator++();
+ GLM_FUNC_DECL tmat2x2<T> & operator--();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator+ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator- (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator- (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator- (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator* (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator* (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x2<T>::col_type operator* (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x2<T>::row_type operator* (
+ typename tmat2x2<T>::col_type const & v,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator* (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator* (
+ tmat2x2<T> const & m1,
+ tmat3x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator* (
+ tmat2x2<T> const & m1,
+ tmat4x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator/ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator/ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x2<T>::col_type operator/ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x2<T>::row_type operator/ (
+ typename tmat2x2<T>::col_type const & v,
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator/ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> const operator- (
+ tmat2x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> const operator-- (
+ tmat2x2<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> const operator++ (
+ tmat2x2<T> const & m,
+ int);
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 2 columns of 2 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<lowp_float> lowp_mat2;
+
+ /// 2 columns of 2 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<mediump_float> mediump_mat2;
+
+ /// 2 columns of 2 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<highp_float> highp_mat2;
+
+ /// 2 columns of 2 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<lowp_float> lowp_mat2x2;
+
+ /// 2 columns of 2 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<mediump_float> mediump_mat2x2;
+
+ /// 2 columns of 2 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x2<highp_float> highp_mat2x2;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat2x2.inl"
+#endif
+
+#endif //glm_core_type_mat2x2
diff --git a/include/gal/opengl/glm/core/type_mat2x2.inl b/include/gal/opengl/glm/core/type_mat2x2.inl
new file mode 100644
index 0000000..9d6e191
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x2.inl
@@ -0,0 +1,688 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x2.inl
+/// @date 2005-01-16 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x2<T>::size_type tmat2x2<T>::length() const
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::size_type tmat2x2<T>::col_size()
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::size_type tmat2x2<T>::row_size()
+ {
+ return 2;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type &
+ tmat2x2<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type const &
+ tmat2x2<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2()
+ {
+ this->value[0] = col_type(1, 0);
+ this->value[1] = col_type(0, 1);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero);
+ this->value[1] = col_type(Zero, s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ value_type const & x0, value_type const & y0,
+ value_type const & x1, value_type const & y1
+ )
+ {
+ this->value[0] = col_type(x0, y0);
+ this->value[1] = col_type(x1, y1);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ col_type const & v0,
+ col_type const & v1
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat2x2<T>::tmat2x2
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec2<T>(value_type(s), Zero);
+ this->value[1] = tvec2<T>(Zero, value_type(s));
+ }
+
+ template <typename T>
+ template <typename X1, typename Y1, typename X2, typename Y2>
+ GLM_FUNC_DECL tmat2x2<T>::tmat2x2
+ (
+ X1 const & x1, Y1 const & y1,
+ X2 const & x2, Y2 const & y2
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1));
+ this->value[1] = col_type(value_type(x2), value_type(y2));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2>
+ GLM_FUNC_DECL tmat2x2<T>::tmat2x2
+ (
+ tvec2<V1> const & v1,
+ tvec2<V2> const & v2
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ }
+
+ //////////////////////////////////////////////////////////////
+ // mat2x2 matrix conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> tmat2x2<T>::_inverse() const
+ {
+ typename tmat2x2<T>::value_type Determinant = this->value[0][0] * this->value[1][1] - this->value[1][0] * this->value[0][1];
+
+ tmat2x2<T> Inverse(
+ + this->value[1][1] / Determinant,
+ - this->value[0][1] / Determinant,
+ - this->value[1][0] / Determinant,
+ + this->value[0][0] / Determinant);
+ return Inverse;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // mat2x2 operators
+
+ // This function shouldn't required but it seems that VC7.1 have an optimisation bug if this operator wasn't declared
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator=
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator=
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator+=
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-=
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator*=
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ return (*this = *this * m);
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator/=
+ (
+ tmat2x2<U> const & m
+ )
+ {
+ return (*this = *this / m);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator+
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s
+ )
+ {
+ return tmat2x2<T>(
+ m[0] + s,
+ m[1] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator+
+ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m
+ )
+ {
+ return tmat2x2<T>(
+ m[0] + s,
+ m[1] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator+
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return tmat2x2<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator-
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s
+ )
+ {
+ return tmat2x2<T>(
+ m[0] - s,
+ m[1] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator-
+ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m
+ )
+ {
+ return tmat2x2<T>(
+ s - m[0],
+ s - m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator-
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return tmat2x2<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator*
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s
+ )
+ {
+ return tmat2x2<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator*
+ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m
+ )
+ {
+ return tmat2x2<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type operator*
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::row_type const & v
+ )
+ {
+ return detail::tvec2<T>(
+ m[0][0] * v.x + m[1][0] * v.y,
+ m[0][1] * v.x + m[1][1] * v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::row_type operator*
+ (
+ typename tmat2x2<T>::col_type const & v,
+ tmat2x2<T> const & m
+ )
+ {
+ return detail::tvec2<T>(
+ v.x * m[0][0] + v.y * m[0][1],
+ v.x * m[1][0] + v.y * m[1][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator*
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return tmat2x2<T>(
+ 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator*
+ (
+ tmat2x2<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return tmat3x2<T>(
+ 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],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator*
+ (
+ tmat2x2<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return tmat4x2<T>(
+ 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],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
+ m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator/
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::value_type const & s
+ )
+ {
+ return tmat2x2<T>(
+ m[0] / s,
+ m[1] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator/
+ (
+ typename tmat2x2<T>::value_type const & s,
+ tmat2x2<T> const & m
+ )
+ {
+ return tmat2x2<T>(
+ s / m[0],
+ s / m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type operator/
+ (
+ tmat2x2<T> const & m,
+ typename tmat2x2<T>::row_type & v
+ )
+ {
+ return m._inverse() * v;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x2<T>::row_type operator/
+ (
+ typename tmat2x2<T>::col_type const & v,
+ tmat2x2<T> const & m
+ )
+ {
+ return v * m._inverse();
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator/
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return m1 * m2._inverse();
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> const operator-
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ return tmat2x2<T>(
+ -m[0],
+ -m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> const operator++
+ (
+ tmat2x2<T> const & m,
+ int
+ )
+ {
+ return tmat2x2<T>(
+ m[0] + T(1),
+ m[1] + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x2<T> const operator--
+ (
+ tmat2x2<T> const & m,
+ int
+ )
+ {
+ return tmat2x2<T>(
+ m[0] - T(1),
+ m[1] - T(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat2x2<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]);
+ }
+
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat2x3.hpp b/include/gal/opengl/glm/core/type_mat2x3.hpp
new file mode 100644
index 0000000..14f1548
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x3.hpp
@@ -0,0 +1,258 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x3.hpp
+/// @date 2006-10-01 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat2x3
+#define glm_core_type_mat2x3
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat2x3
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec3<T> col_type;
+ typedef tvec2<T> row_type;
+ typedef tmat2x3<T> type;
+ typedef tmat3x2<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[2];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat2x3();
+ GLM_FUNC_DECL tmat2x3(tmat2x3 const & m);
+
+ GLM_FUNC_DECL explicit tmat2x3(
+ ctor);
+ GLM_FUNC_DECL explicit tmat2x3(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tmat2x3(
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1);
+ GLM_FUNC_DECL explicit tmat2x3(
+ col_type const & v0,
+ col_type const & v1);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x3(
+ U const & x);
+
+ template <typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2>
+ GLM_FUNC_DECL explicit tmat2x3(
+ X1 const & x1, Y1 const & y1, Z1 const & z1,
+ X2 const & x2, Y2 const & y2, Z2 const & z2);
+
+ template <typename U, typename V>
+ GLM_FUNC_DECL explicit tmat2x3(
+ tvec3<U> const & v1,
+ tvec3<V> const & v2);
+
+ //////////////////////////////////////
+ // Matrix conversion
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x3(tmat2x3<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat2x3(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x3(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat2x3<T> & operator= (tmat2x3<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator= (tmat2x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator+= (tmat2x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator-= (tmat2x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator*= (tmat2x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T> & operator/= (U s);
+
+ GLM_FUNC_DECL tmat2x3<T> & operator++ ();
+ GLM_FUNC_DECL tmat2x3<T> & operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator+ (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator- (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator- (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ typename tmat2x3<T>::value_type const & s,
+ tmat2x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x3<T>::col_type operator* (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x3<T>::row_type operator* (
+ typename tmat2x3<T>::col_type const & v,
+ tmat2x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ tmat2x3<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator* (
+ tmat2x3<T> const & m1,
+ tmat3x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator* (
+ tmat2x3<T> const & m1,
+ tmat4x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator/ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator/ (
+ typename tmat2x3<T>::value_type const & s,
+ tmat2x3<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> const operator- (
+ tmat2x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> const operator-- (
+ tmat2x3<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> const operator++ (
+ tmat2x3<T> const & m,
+ int);
+
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 2 columns of 3 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x3<lowp_float> lowp_mat2x3;
+
+ /// 2 columns of 3 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x3<mediump_float> mediump_mat2x3;
+
+ /// 2 columns of 3 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x3<highp_float> highp_mat2x3;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat2x3.inl"
+#endif
+
+#endif //glm_core_type_mat2x3
diff --git a/include/gal/opengl/glm/core/type_mat2x3.inl b/include/gal/opengl/glm/core/type_mat2x3.inl
new file mode 100644
index 0000000..b77f4fa
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x3.inl
@@ -0,0 +1,633 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x3.inl
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x3<T>::size_type tmat2x3<T>::length() const
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::col_size()
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::row_size()
+ {
+ return 2;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type &
+ tmat2x3<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type const &
+ tmat2x3<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3()
+ {
+ this->value[0] = col_type(T(1), T(0), T(0));
+ this->value[1] = col_type(T(0), T(1), T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ value_type const & s
+ )
+ {
+ this->value[0] = col_type(s, T(0), T(0));
+ this->value[1] = col_type(T(0), s, T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0);
+ this->value[1] = col_type(x1, y1, z1);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ col_type const & v0,
+ col_type const & v1
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat2x3<T>::tmat2x3
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec3<T>(value_type(s), Zero, Zero);
+ this->value[1] = tvec3<T>(Zero, value_type(s), Zero);
+ }
+
+ template <typename T>
+ template <
+ typename X1, typename Y1, typename Z1,
+ typename X2, typename Y2, typename Z2>
+ GLM_FUNC_DECL tmat2x3<T>::tmat2x3
+ (
+ X1 const & x1, Y1 const & y1, Z1 const & z1,
+ X2 const & x2, Y2 const & y2, Z2 const & z2
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2>
+ GLM_FUNC_DECL tmat2x3<T>::tmat2x3
+ (
+ tvec3<V1> const & v1,
+ tvec3<V2> const & v2
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ }
+
+ //////////////////////////////////////
+ // Matrix conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat2x3<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator=
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator=
+ (
+ tmat2x3<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator+=
+ (
+ tmat2x3<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-=
+ (
+ tmat2x3<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator*=
+ (
+ tmat2x3<U> const & m
+ )
+ {
+ return (*this = tmat2x3<U>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator+
+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s
+ )
+ {
+ return tmat2x3<T>(
+ m[0] + s,
+ m[1] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator+
+ (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return tmat2x3<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator-
+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s
+ )
+ {
+ return tmat2x3<T>(
+ m[0] - s,
+ m[1] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator-
+ (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return tmat2x3<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator*
+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s
+ )
+ {
+ return tmat2x3<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator*
+ (
+ typename tmat2x3<T>::value_type const & s,
+ tmat2x3<T> const & m
+ )
+ {
+ return tmat2x3<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type operator*
+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::row_type const & v)
+ {
+ return typename tmat2x3<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat2x3<T>::row_type operator*
+ (
+ typename tmat2x3<T>::col_type const & v,
+ tmat2x3<T> const & m)
+ {
+ return typename tmat2x3<T>::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>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator*
+ (
+ tmat2x3<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return tmat2x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator*
+ (
+ tmat2x3<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ typename tmat2x3<T>::value_type SrcA00 = m1[0][0];
+ typename tmat2x3<T>::value_type SrcA01 = m1[0][1];
+ typename tmat2x3<T>::value_type SrcA02 = m1[0][2];
+ typename tmat2x3<T>::value_type SrcA10 = m1[1][0];
+ typename tmat2x3<T>::value_type SrcA11 = m1[1][1];
+ typename tmat2x3<T>::value_type SrcA12 = m1[1][2];
+
+ typename tmat2x3<T>::value_type SrcB00 = m2[0][0];
+ typename tmat2x3<T>::value_type SrcB01 = m2[0][1];
+ typename tmat2x3<T>::value_type SrcB10 = m2[1][0];
+ typename tmat2x3<T>::value_type SrcB11 = m2[1][1];
+ typename tmat2x3<T>::value_type SrcB20 = m2[2][0];
+ typename tmat2x3<T>::value_type SrcB21 = m2[2][1];
+
+ tmat3x3<T> Result(tmat3x3<T>::null);
+ Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
+ Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
+ Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;
+ Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;
+ Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;
+ Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;
+ Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;
+ Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator*
+ (
+ tmat2x3<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return tmat4x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
+ m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1],
+ m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator/
+ (
+ tmat2x3<T> const & m,
+ typename tmat2x3<T>::value_type const & s
+ )
+ {
+ return tmat2x3<T>(
+ m[0] / s,
+ m[1] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator/
+ (
+ typename tmat2x3<T>::value_type const & s,
+ tmat2x3<T> const & m
+ )
+ {
+ return tmat2x3<T>(
+ s / m[0],
+ s / m[1]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> const operator-
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ return tmat2x3<T>(
+ -m[0],
+ -m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> const operator++
+ (
+ tmat2x3<T> const & m,
+ int
+ )
+ {
+ return tmat2x3<T>(
+ m[0] + typename tmat2x3<T>::value_type(1),
+ m[1] + typename tmat2x3<T>::value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> const operator--
+ (
+ tmat2x3<T> const & m,
+ int
+ )
+ {
+ return tmat2x3<T>(
+ m[0] - typename tmat2x3<T>::value_type(1),
+ m[1] - typename tmat2x3<T>::value_type(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat2x3<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]);
+ }
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat2x4.hpp b/include/gal/opengl/glm/core/type_mat2x4.hpp
new file mode 100644
index 0000000..c335700
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x4.hpp
@@ -0,0 +1,260 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x4.hpp
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat2x4
+#define glm_core_type_mat2x4
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat2x4
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec4<T> col_type;
+ typedef tvec2<T> row_type;
+ typedef tmat2x4<T> type;
+ typedef tmat4x2<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[2];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat2x4();
+ GLM_FUNC_DECL tmat2x4(tmat2x4 const & m);
+
+ GLM_FUNC_DECL explicit tmat2x4(
+ ctor);
+ GLM_FUNC_DECL explicit tmat2x4(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tmat2x4(
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1);
+ GLM_FUNC_DECL explicit tmat2x4(
+ col_type const & v0,
+ col_type const & v1);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x4(
+ U const & x);
+
+ template <
+ typename X1, typename Y1, typename Z1, typename W1,
+ typename X2, typename Y2, typename Z2, typename W2>
+ GLM_FUNC_DECL explicit tmat2x4(
+ X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1,
+ X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2);
+
+ template <typename U, typename V>
+ GLM_FUNC_DECL explicit tmat2x4(
+ tvec4<U> const & v1,
+ tvec4<V> const & v2);
+
+ //////////////////////////////////////
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat2x4(tmat2x4<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat2x4(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat2x4(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat2x4<T>& operator= (tmat2x4<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator= (tmat2x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator+= (tmat2x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator-= (tmat2x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator*= (tmat2x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>& operator/= (U s);
+
+ GLM_FUNC_DECL tmat2x4<T>& operator++ ();
+ GLM_FUNC_DECL tmat2x4<T>& operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator+ (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator- (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator- (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator* (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator* (
+ typename tmat2x4<T>::value_type const & s,
+ tmat2x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x4<T>::col_type operator* (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat2x4<T>::row_type operator* (
+ typename tmat2x4<T>::col_type const & v,
+ tmat2x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator* (
+ tmat2x4<T> const & m1,
+ tmat4x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator* (
+ tmat2x4<T> const & m1,
+ tmat2x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator* (
+ tmat2x4<T> const & m1,
+ tmat3x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator/ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator/ (
+ typename tmat2x4<T>::value_type const & s,
+ tmat2x4<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> const operator- (
+ tmat2x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> const operator-- (
+ tmat2x4<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> const operator++ (
+ tmat2x4<T> const & m,
+ int);
+
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 2 columns of 4 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x4<lowp_float> lowp_mat2x4;
+
+ /// 2 columns of 4 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x4<mediump_float> mediump_mat2x4;
+
+ /// 2 columns of 4 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat2x4<highp_float> highp_mat2x4;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat2x4.inl"
+#endif
+
+#endif //glm_core_type_mat2x4
diff --git a/include/gal/opengl/glm/core/type_mat2x4.inl b/include/gal/opengl/glm/core/type_mat2x4.inl
new file mode 100644
index 0000000..598bddc
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat2x4.inl
@@ -0,0 +1,652 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat2x4.inl
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x4<T>::size_type tmat2x4<T>::length() const
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::size_type tmat2x4<T>::col_size()
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::size_type tmat2x4<T>::row_size()
+ {
+ return 2;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type &
+ tmat2x4<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type const &
+ tmat2x4<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4()
+ {
+ value_type const Zero(0);
+ value_type const One(1);
+ this->value[0] = col_type(One, Zero, Zero, Zero);
+ this->value[1] = col_type(Zero, One, Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero, Zero, Zero);
+ this->value[1] = col_type(Zero, s, Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0, w0);
+ this->value[1] = col_type(x1, y1, z1, w1);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ col_type const & v0,
+ col_type const & v1
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat2x4<T>::tmat2x4
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero);
+ this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero);
+ }
+
+ template <typename T>
+ template <
+ typename X1, typename Y1, typename Z1, typename W1,
+ typename X2, typename Y2, typename Z2, typename W2>
+ GLM_FUNC_DECL tmat2x4<T>::tmat2x4
+ (
+ X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1,
+ X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2>
+ GLM_FUNC_DECL tmat2x4<T>::tmat2x4
+ (
+ tvec4<V1> const & v1,
+ tvec4<V2> const & v2
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ }
+
+ //////////////////////////////////////
+ // Matrix conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat2x4<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(T(0)));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(T(0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator=
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator=
+ (
+ tmat2x4<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator+=
+ (
+ tmat2x4<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-=
+ (
+ tmat2x4<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator*=
+ (
+ tmat2x4<U> const & m
+ )
+ {
+ return (*this = tmat2x4<T>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat2x4<T> & tmat2x4<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator+
+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s
+ )
+ {
+ return tmat2x4<T>(
+ m[0] + s,
+ m[1] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator+
+ (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return tmat2x4<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator-
+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s
+ )
+ {
+ return tmat2x4<T>(
+ m[0] - s,
+ m[1] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator-
+ (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return tmat2x4<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator*
+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s
+ )
+ {
+ return tmat2x4<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator*
+ (
+ typename tmat2x4<T>::value_type const & s,
+ tmat2x4<T> const & m
+ )
+ {
+ return tmat2x4<T>(
+ m[0] * s,
+ m[1] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type operator*
+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::row_type const & v
+ )
+ {
+ return typename tmat2x4<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat2x4<T>::row_type operator*
+ (
+ typename tmat2x4<T>::col_type const & v,
+ tmat2x4<T> const & m
+ )
+ {
+ return typename tmat2x4<T>::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>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator*
+ (
+ tmat2x4<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ typename tmat2x4<T>::value_type SrcA00 = m1[0][0];
+ typename tmat2x4<T>::value_type SrcA01 = m1[0][1];
+ typename tmat2x4<T>::value_type SrcA02 = m1[0][2];
+ typename tmat2x4<T>::value_type SrcA03 = m1[0][3];
+ typename tmat2x4<T>::value_type SrcA10 = m1[1][0];
+ typename tmat2x4<T>::value_type SrcA11 = m1[1][1];
+ typename tmat2x4<T>::value_type SrcA12 = m1[1][2];
+ typename tmat2x4<T>::value_type SrcA13 = m1[1][3];
+
+ typename tmat2x4<T>::value_type SrcB00 = m2[0][0];
+ typename tmat2x4<T>::value_type SrcB01 = m2[0][1];
+ typename tmat2x4<T>::value_type SrcB10 = m2[1][0];
+ typename tmat2x4<T>::value_type SrcB11 = m2[1][1];
+ typename tmat2x4<T>::value_type SrcB20 = m2[2][0];
+ typename tmat2x4<T>::value_type SrcB21 = m2[2][1];
+ typename tmat2x4<T>::value_type SrcB30 = m2[3][0];
+ typename tmat2x4<T>::value_type SrcB31 = m2[3][1];
+
+ tmat4x4<T> Result(tmat4x4<T>::null);
+ Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
+ Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
+ Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;
+ Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01;
+ Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;
+ Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;
+ Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11;
+ Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;
+ Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;
+ Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;
+ Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21;
+ Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31;
+ Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31;
+ Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31;
+ Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator*
+ (
+ tmat2x4<T> const & m1,
+ tmat2x2<T> const & m2
+ )
+ {
+ return tmat2x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * 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],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+ m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator*
+ (
+ tmat2x4<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return tmat3x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * 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],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+ m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],
+ m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator/
+ (
+ tmat2x4<T> const & m,
+ typename tmat2x4<T>::value_type const & s
+ )
+ {
+ return tmat2x4<T>(
+ m[0] / s,
+ m[1] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator/
+ (
+ typename tmat2x4<T>::value_type const & s,
+ tmat2x4<T> const & m
+ )
+ {
+ return tmat2x4<T>(
+ s / m[0],
+ s / m[1]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> const operator-
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ return tmat2x4<T>(
+ -m[0],
+ -m[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> const operator++
+ (
+ tmat2x4<T> const & m,
+ int
+ )
+ {
+ return tmat2x4<T>(
+ m[0] + typename tmat2x4<T>::value_type(1),
+ m[1] + typename tmat2x4<T>::value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> const operator--
+ (
+ tmat2x4<T> const & m,
+ int
+ )
+ {
+ return tmat2x4<T>(
+ m[0] - typename tmat2x4<T>::value_type(1),
+ m[1] - typename tmat2x4<T>::value_type(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat2x4<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]);
+ }
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat3x2.hpp b/include/gal/opengl/glm/core/type_mat3x2.hpp
new file mode 100644
index 0000000..06a3228
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x2.hpp
@@ -0,0 +1,265 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x2.hpp
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat3x2
+#define glm_core_type_mat3x2
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat3x2
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec2<T> col_type;
+ typedef tvec3<T> row_type;
+ typedef tmat3x2<T> type;
+ typedef tmat2x3<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[3];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat3x2();
+ GLM_FUNC_DECL tmat3x2(tmat3x2 const & m);
+
+ GLM_FUNC_DECL explicit tmat3x2(
+ ctor);
+ GLM_FUNC_DECL explicit tmat3x2(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tmat3x2(
+ value_type const & x0, value_type const & y0,
+ value_type const & x1, value_type const & y1,
+ value_type const & x2, value_type const & y2);
+ GLM_FUNC_DECL explicit tmat3x2(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x2(
+ U const & x);
+
+ template
+ <
+ typename X1, typename Y1,
+ typename X2, typename Y2,
+ typename X3, typename Y3
+ >
+ GLM_FUNC_DECL explicit tmat3x2(
+ X1 const & x1, Y1 const & y1,
+ X2 const & x2, Y2 const & y2,
+ X3 const & x3, Y3 const & y3);
+
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL explicit tmat3x2(
+ tvec2<V1> const & v1,
+ tvec2<V2> const & v2,
+ tvec2<V3> const & v3);
+
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x2(tmat3x2<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat3x2(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x2(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat3x2<T> & operator= (tmat3x2<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator= (tmat3x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator+= (tmat3x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator-= (tmat3x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator*= (tmat3x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T> & operator/= (U s);
+
+ GLM_FUNC_DECL tmat3x2<T> & operator++ ();
+ GLM_FUNC_DECL tmat3x2<T> & operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator+ (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator- (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator- (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator* (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator* (
+ typename tmat3x2<T>::value_type const & s,
+ tmat3x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x2<T>::col_type operator* (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x2<T>::row_type operator* (
+ typename tmat3x2<T>::col_type const & v,
+ tmat3x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x2<T> operator* (
+ tmat3x2<T> const & m1,
+ tmat2x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator* (
+ tmat3x2<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator* (
+ tmat3x2<T> const & m1,
+ tmat4x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator/ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator/ (
+ typename tmat3x2<T>::value_type const & s,
+ tmat3x2<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> const operator- (
+ tmat3x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> const operator-- (
+ tmat3x2<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> const operator++ (
+ tmat3x2<T> const & m,
+ int);
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 3 columns of 2 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x2<lowp_float> lowp_mat3x2;
+
+ /// 3 columns of 2 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x2<mediump_float> mediump_mat3x2;
+
+ /// 3 columns of 2 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x2<highp_float> highp_mat3x2;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat3x2.inl"
+#endif
+
+#endif //glm_core_type_mat3x2
diff --git a/include/gal/opengl/glm/core/type_mat3x2.inl b/include/gal/opengl/glm/core/type_mat3x2.inl
new file mode 100644
index 0000000..7d7e16e
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x2.inl
@@ -0,0 +1,670 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x2.inl
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x2<T>::size_type tmat3x2<T>::length() const
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::size_type tmat3x2<T>::col_size()
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::size_type tmat3x2<T>::row_size()
+ {
+ return 3;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type &
+ tmat3x2<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type const &
+ tmat3x2<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2()
+ {
+ this->value[0] = col_type(1, 0);
+ this->value[1] = col_type(0, 1);
+ this->value[2] = col_type(0, 0);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ value_type const & s
+ )
+ {
+ this->value[0] = col_type(s, 0);
+ this->value[1] = col_type(0, s);
+ this->value[2] = col_type(0, 0);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ value_type const & x0, value_type const & y0,
+ value_type const & x1, value_type const & y1,
+ value_type const & x2, value_type const & y2
+ )
+ {
+ this->value[0] = col_type(x0, y0);
+ this->value[1] = col_type(x1, y1);
+ this->value[2] = col_type(x2, y2);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat3x2<T>::tmat3x2
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec2<T>(value_type(s), Zero);
+ this->value[1] = tvec2<T>(Zero, value_type(s));
+ this->value[2] = tvec2<T>(Zero);
+ }
+
+ template <typename T>
+ template <
+ typename X1, typename Y1,
+ typename X2, typename Y2,
+ typename X3, typename Y3>
+ GLM_FUNC_DECL tmat3x2<T>::tmat3x2
+ (
+ X1 const & x1, Y1 const & y1,
+ X2 const & x2, Y2 const & y2,
+ X3 const & x3, Y3 const & y3
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1));
+ this->value[1] = col_type(value_type(x2), value_type(y2));
+ this->value[2] = col_type(value_type(x3), value_type(y3));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL tmat3x2<T>::tmat3x2
+ (
+ tvec2<V1> const & v1,
+ tvec2<V2> const & v2,
+ tvec2<V3> const & v3
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ }
+
+ //////////////////////////////////////////////////////////////
+ // mat3x2 matrix conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat3x2<U> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = col_type(T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat3x3<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat4x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat2x3<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat2x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat3x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator=
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator=
+ (
+ tmat3x2<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator+=
+ (
+ tmat3x2<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-=
+ (
+ tmat3x2<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator*=
+ (
+ tmat3x2<U> const & m
+ )
+ {
+ return (*this = tmat3x2<T>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x2<T> & tmat3x2<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator+
+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s
+ )
+ {
+ return tmat3x2<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator+
+ (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return tmat3x2<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator-
+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s
+ )
+ {
+ return tmat3x2<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator-
+ (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return tmat3x2<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator*
+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s
+ )
+ {
+ return tmat3x2<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator*
+ (
+ typename tmat3x2<T>::value_type const & s,
+ tmat3x2<T> const & m
+ )
+ {
+ return tmat3x2<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type operator*
+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::row_type const & v)
+ {
+ return typename tmat3x2<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat3x2<T>::row_type operator*
+ (
+ typename tmat3x2<T>::col_type const & v,
+ tmat3x2<T> const & m)
+ {
+ return typename tmat3x2<T>::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>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator*
+ (
+ tmat3x2<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ const T SrcA00 = m1[0][0];
+ const T SrcA01 = m1[0][1];
+ const T SrcA10 = m1[1][0];
+ const T SrcA11 = m1[1][1];
+ const T SrcA20 = m1[2][0];
+ const T SrcA21 = m1[2][1];
+
+ const T SrcB00 = m2[0][0];
+ const T SrcB01 = m2[0][1];
+ const T SrcB02 = m2[0][2];
+ const T SrcB10 = m2[1][0];
+ const T SrcB11 = m2[1][1];
+ const T SrcB12 = m2[1][2];
+
+ tmat2x2<T> Result(tmat2x2<T>::null);
+ 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;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator*
+ (
+ tmat3x2<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return tmat3x2<T>(
+ 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator*
+ (
+ tmat3x2<T> const & m1,
+ tmat4x3<T> const & m2
+ )
+ {
+ return tmat4x2<T>(
+ 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],
+ m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator/
+ (
+ tmat3x2<T> const & m,
+ typename tmat3x2<T>::value_type const & s
+ )
+ {
+ return tmat3x2<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator/
+ (
+ typename tmat3x2<T>::value_type const & s,
+ tmat3x2<T> const & m
+ )
+ {
+ return tmat3x2<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> const operator-
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ return tmat3x2<T>(
+ -m[0],
+ -m[1],
+ -m[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> const operator++
+ (
+ tmat3x2<T> const & m,
+ int
+ )
+ {
+ typename tmat3x2<T>::value_type One(1);
+ return tmat3x2<T>(
+ m[0] + One,
+ m[1] + One,
+ m[2] + One);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> const operator--
+ (
+ tmat3x2<T> const & m,
+ int
+ )
+ {
+ typename tmat3x2<T>::value_type One(1);
+ return tmat3x2<T>(
+ m[0] - One,
+ m[1] - One,
+ m[2] - One);
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat3x2<T> const & m1,
+ tmat3x2<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);
+ }
+
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat3x3.hpp b/include/gal/opengl/glm/core/type_mat3x3.hpp
new file mode 100644
index 0000000..b2122d8
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x3.hpp
@@ -0,0 +1,318 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x3.hpp
+/// @date 2005-01-27 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat3x3
+#define glm_core_type_mat3x3
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat3x3
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec3<T> col_type;
+ typedef tvec3<T> row_type;
+ typedef tmat3x3<T> type;
+ typedef tmat3x3<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ public:
+ /// Implementation detail
+ /// @cond DETAIL
+ GLM_FUNC_DECL tmat3x3<T> _inverse() const;
+ /// @endcond
+
+ private:
+ // Data
+ col_type value[3];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat3x3();
+ GLM_FUNC_DECL tmat3x3(tmat3x3 const & m);
+
+ GLM_FUNC_DECL explicit tmat3x3(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat3x3(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tmat3x3(
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1,
+ value_type const & x2, value_type const & y2, value_type const & z2);
+ GLM_FUNC_DECL explicit tmat3x3(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x3(
+ U const & x);
+
+ template
+ <
+ typename X1, typename Y1, typename Z1,
+ typename X2, typename Y2, typename Z2,
+ typename X3, typename Y3, typename Z3
+ >
+ GLM_FUNC_DECL explicit tmat3x3(
+ 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);
+
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL explicit tmat3x3(
+ tvec3<V1> const & v1,
+ tvec3<V2> const & v2,
+ tvec3<V3> const & v3);
+
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x3(tmat3x3<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat3x3(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x3(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat3x3<T>& operator= (tmat3x3<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator= (tmat3x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator+= (tmat3x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator-= (tmat3x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator*= (tmat3x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator/= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>& operator/= (tmat3x3<U> const & m);
+ GLM_FUNC_DECL tmat3x3<T>& operator++ ();
+ GLM_FUNC_DECL tmat3x3<T>& operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator+ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator- (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator- (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator- (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator* (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator* (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x3<T>::col_type operator* (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x3<T>::row_type operator* (
+ typename tmat3x3<T>::col_type const & v,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator* (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ tmat3x3<T> const & m1,
+ tmat2x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator* (
+ tmat3x3<T> const & m1,
+ tmat4x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator/ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator/ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x3<T>::col_type operator/ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x3<T>::row_type operator/ (
+ typename tmat3x3<T>::col_type const & v,
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator/ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> const operator- (
+ tmat3x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> const operator-- (
+ tmat3x3<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> const operator++ (
+ tmat3x3<T> const & m,
+ int);
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 3 columns of 3 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<lowp_float> lowp_mat3;
+
+ /// 3 columns of 3 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<mediump_float> mediump_mat3;
+
+ /// 3 columns of 3 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<highp_float> highp_mat3;
+
+ /// 3 columns of 3 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<lowp_float> lowp_mat3x3;
+
+ /// 3 columns of 3 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<mediump_float> mediump_mat3x3;
+
+ /// 3 columns of 3 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x3<highp_float> highp_mat3x3;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat3x3.inl"
+#endif
+
+#endif //glm_core_type_mat3x3
diff --git a/include/gal/opengl/glm/core/type_mat3x3.inl b/include/gal/opengl/glm/core/type_mat3x3.inl
new file mode 100644
index 0000000..73731e9
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x3.inl
@@ -0,0 +1,800 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x3.inl
+/// @date 2005-01-27 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x3<T>::size_type tmat3x3<T>::length() const
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::size_type tmat3x3<T>::col_size()
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::size_type tmat3x3<T>::row_size()
+ {
+ return 3;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type &
+ tmat3x3<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type const &
+ tmat3x3<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3()
+ {
+ value_type const Zero(0);
+ value_type const One(1);
+ this->value[0] = col_type(One, Zero, Zero);
+ this->value[1] = col_type(Zero, One, Zero);
+ this->value[2] = col_type(Zero, Zero, One);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero, Zero);
+ this->value[1] = col_type(Zero, s, Zero);
+ this->value[2] = col_type(Zero, Zero, s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1,
+ value_type const & x2, value_type const & y2, value_type const & z2
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0);
+ this->value[1] = col_type(x1, y1, z1);
+ this->value[2] = col_type(x2, y2, z2);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat3x3<T>::tmat3x3
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec3<T>(value_type(s), Zero, Zero);
+ this->value[1] = tvec3<T>(Zero, value_type(s), Zero);
+ this->value[2] = tvec3<T>(Zero, Zero, value_type(s));
+ }
+
+ template <typename T>
+ template <
+ typename X1, typename Y1, typename Z1,
+ typename X2, typename Y2, typename Z2,
+ typename X3, typename Y3, typename Z3>
+ GLM_FUNC_DECL tmat3x3<T>::tmat3x3
+ (
+ 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
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2));
+ this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL tmat3x3<T>::tmat3x3
+ (
+ tvec3<V1> const & v1,
+ tvec3<V2> const & v2,
+ tvec3<V3> const & v3
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat3x3<U> 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>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat4x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat3x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator=
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator=
+ (
+ tmat3x3<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator+=
+ (
+ tmat3x3<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-=
+ (
+ tmat3x3<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator*=
+ (
+ tmat3x3<U> const & m
+ )
+ {
+ return (*this = *this * m);
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator/=
+ (
+ tmat3x3<U> const & m
+ )
+ {
+ return (*this = *this / m);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> tmat3x3<T>::_inverse() const
+ {
+ T S00 = value[0][0];
+ T S01 = value[0][1];
+ T S02 = value[0][2];
+
+ T S10 = value[1][0];
+ T S11 = value[1][1];
+ T S12 = value[1][2];
+
+ T S20 = value[2][0];
+ T S21 = value[2][1];
+ T S22 = value[2][2];
+/*
+ tmat3x3<T> Inverse(
+ + (S11 * S22 - S21 * S12),
+ - (S10 * S22 - S20 * S12),
+ + (S10 * S21 - S20 * S11),
+ - (S01 * S22 - S21 * S02),
+ + (S00 * S22 - S20 * S02),
+ - (S00 * S21 - S20 * S01),
+ + (S01 * S12 - S11 * S02),
+ - (S00 * S12 - S10 * S02),
+ + (S00 * S11 - S10 * S01));
+*/
+ tmat3x3<T> Inverse(
+ S11 * S22 - S21 * S12,
+ S12 * S20 - S22 * S10,
+ S10 * S21 - S20 * S11,
+ S02 * S21 - S01 * S22,
+ S00 * S22 - S02 * S20,
+ S01 * S20 - S00 * S21,
+ S12 * S01 - S11 * S02,
+ S10 * S02 - S12 * S00,
+ S11 * S00 - S10 * S01);
+
+ T Determinant = S00 * (S11 * S22 - S21 * S12)
+ - S10 * (S01 * S22 - S21 * S02)
+ + S20 * (S01 * S12 - S11 * S02);
+
+ Inverse /= Determinant;
+ return Inverse;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator+
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s
+ )
+ {
+ return tmat3x3<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator+
+ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m
+ )
+ {
+ return tmat3x3<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator+
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return tmat3x3<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator-
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s
+ )
+ {
+ return tmat3x3<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator-
+ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m
+ )
+ {
+ return tmat3x3<T>(
+ s - m[0],
+ s - m[1],
+ s - m[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator-
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return tmat3x3<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator*
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s
+ )
+ {
+ return tmat3x3<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator*
+ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m
+ )
+ {
+ return tmat3x3<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type operator*
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::row_type const & v
+ )
+ {
+ return typename tmat3x3<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::row_type operator*
+ (
+ typename tmat3x3<T>::col_type const & v,
+ tmat3x3<T> const & m
+ )
+ {
+ return typename tmat3x3<T>::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>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator*
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ typename tmat3x3<T>::value_type const SrcA00 = m1[0][0];
+ typename tmat3x3<T>::value_type const SrcA01 = m1[0][1];
+ typename tmat3x3<T>::value_type const SrcA02 = m1[0][2];
+ typename tmat3x3<T>::value_type const SrcA10 = m1[1][0];
+ typename tmat3x3<T>::value_type const SrcA11 = m1[1][1];
+ typename tmat3x3<T>::value_type const SrcA12 = m1[1][2];
+ typename tmat3x3<T>::value_type const SrcA20 = m1[2][0];
+ typename tmat3x3<T>::value_type const SrcA21 = m1[2][1];
+ typename tmat3x3<T>::value_type const SrcA22 = m1[2][2];
+
+ typename tmat3x3<T>::value_type const SrcB00 = m2[0][0];
+ typename tmat3x3<T>::value_type const SrcB01 = m2[0][1];
+ typename tmat3x3<T>::value_type const SrcB02 = m2[0][2];
+ typename tmat3x3<T>::value_type const SrcB10 = m2[1][0];
+ typename tmat3x3<T>::value_type const SrcB11 = m2[1][1];
+ typename tmat3x3<T>::value_type const SrcB12 = m2[1][2];
+ typename tmat3x3<T>::value_type const SrcB20 = m2[2][0];
+ typename tmat3x3<T>::value_type const SrcB21 = m2[2][1];
+ typename tmat3x3<T>::value_type const SrcB22 = m2[2][2];
+
+ tmat3x3<T> Result(tmat3x3<T>::null);
+ 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;
+ Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
+ Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;
+ Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;
+ Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;
+ Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator*
+ (
+ tmat3x3<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return tmat2x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator*
+ (
+ tmat3x3<T> const & m1,
+ tmat4x3<T> const & m2
+ )
+ {
+ return tmat4x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],
+ m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2],
+ m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator/
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::value_type const & s
+ )
+ {
+ return tmat3x3<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator/
+ (
+ typename tmat3x3<T>::value_type const & s,
+ tmat3x3<T> const & m
+ )
+ {
+ return tmat3x3<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type operator/
+ (
+ tmat3x3<T> const & m,
+ typename tmat3x3<T>::row_type const & v
+ )
+ {
+ return m._inverse() * v;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x3<T>::row_type operator/
+ (
+ typename tmat3x3<T>::col_type const & v,
+ tmat3x3<T> const & m
+ )
+ {
+ return v * m._inverse();
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator/
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return m1 * m2._inverse();
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> const operator-
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ return tmat3x3<T>(
+ -m[0],
+ -m[1],
+ -m[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> const operator++
+ (
+ tmat3x3<T> const & m,
+ int
+ )
+ {
+ return tmat3x3<T>(
+ m[0] + T(1),
+ m[1] + T(1),
+ m[2] + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x3<T> const operator--
+ (
+ tmat3x3<T> const & m,
+ int
+ )
+ {
+ return tmat3x3<T>(
+ m[0] - T(1),
+ m[1] - T(1),
+ m[2] - T(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat3x3<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);
+ }
+
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat3x4.hpp b/include/gal/opengl/glm/core/type_mat3x4.hpp
new file mode 100644
index 0000000..8fe3106
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x4.hpp
@@ -0,0 +1,266 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x4.hpp
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat3x4
+#define glm_core_type_mat3x4
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat3x4
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec4<T> col_type;
+ typedef tvec3<T> row_type;
+ typedef tmat3x4<T> type;
+ typedef tmat4x3<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[3];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat3x4();
+ GLM_FUNC_DECL tmat3x4(tmat3x4 const & m);
+
+ GLM_FUNC_DECL explicit tmat3x4(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat3x4(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tmat3x4(
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
+ value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2);
+ GLM_FUNC_DECL explicit tmat3x4(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x4(
+ U const & x);
+
+ 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_DECL explicit tmat3x4(
+ 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);
+
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL explicit tmat3x4(
+ tvec4<V1> const & v1,
+ tvec4<V2> const & v2,
+ tvec4<V3> const & v3);
+
+ // Matrix conversion
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat3x4(tmat3x4<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat3x4(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat3x4(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat3x4<T> & operator= (tmat3x4<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator= (tmat3x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator+= (tmat3x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator-= (tmat3x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator*= (tmat3x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T> & operator/= (U s);
+
+ GLM_FUNC_DECL tmat3x4<T> & operator++ ();
+ GLM_FUNC_DECL tmat3x4<T> & operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator+ (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator- (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator- (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator* (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator* (
+ typename tmat3x4<T>::value_type const & s,
+ tmat3x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x4<T>::col_type operator* (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat3x4<T>::row_type operator* (
+ typename tmat3x4<T>::col_type const & v,
+ tmat3x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator* (
+ tmat3x4<T> const & m1,
+ tmat4x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator* (
+ tmat3x4<T> const & m1,
+ tmat2x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator* (
+ tmat3x4<T> const & m1,
+ tmat3x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator/ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator/ (
+ typename tmat3x4<T>::value_type const & s,
+ tmat3x4<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> const operator- (
+ tmat3x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> const operator-- (
+ tmat3x4<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> const operator++ (
+ tmat3x4<T> const & m,
+ int);
+
+}//namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 3 columns of 4 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x4<lowp_float> lowp_mat3x4;
+
+ /// 3 columns of 4 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x4<mediump_float> mediump_mat3x4;
+
+ /// 3 columns of 4 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat3x4<highp_float> highp_mat3x4;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat3x4.inl"
+#endif
+
+#endif //glm_core_type_mat3x4
diff --git a/include/gal/opengl/glm/core/type_mat3x4.inl b/include/gal/opengl/glm/core/type_mat3x4.inl
new file mode 100644
index 0000000..be613d0
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat3x4.inl
@@ -0,0 +1,700 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat3x4.inl
+/// @date 2006-08-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x4<T>::size_type tmat3x4<T>::length() const
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::size_type tmat3x4<T>::col_size()
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::size_type tmat3x4<T>::row_size()
+ {
+ return 3;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type &
+ tmat3x4<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type const &
+ tmat3x4<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4()
+ {
+ 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);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero, Zero, Zero);
+ this->value[1] = col_type(Zero, s, Zero, Zero);
+ this->value[2] = col_type(Zero, Zero, s, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
+ value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0, w0);
+ this->value[1] = col_type(x1, y1, z1, w1);
+ this->value[2] = col_type(x2, y2, z2, w2);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat3x4<T>::tmat3x4
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero);
+ this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero);
+ this->value[2] = tvec4<T>(Zero, Zero, value_type(s), Zero);
+ }
+
+ template <typename T>
+ 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_DECL tmat3x4<T>::tmat3x4
+ (
+ 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
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2));
+ this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3), value_type(w3));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3>
+ GLM_FUNC_DECL tmat3x4<T>::tmat3x4
+ (
+ tvec4<V1> const & v1,
+ tvec4<V2> const & v2,
+ tvec4<V3> const & v3
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ }
+
+ // Conversion
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat3x4<U> 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>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ this->value[2] = col_type(T(0), T(0), T(1), T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ this->value[2] = col_type(m[2], T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat4x4<T> 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>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ this->value[2] = col_type(T(0), T(0), T(1), T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ this->value[2] = col_type(m[2], T(0), T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(T(0), T(0), T(1), T(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(T(0)));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(T(0)));
+ this->value[2] = col_type(m[2], detail::tvec2<T>(T(1), T(0)));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ this->value[2] = col_type(m[2], T(0));
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator=
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator=
+ (
+ tmat3x4<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator+=
+ (
+ tmat3x4<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-=
+ (
+ tmat3x4<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator*=
+ (
+ tmat3x4<U> const & m
+ )
+ {
+ return (*this = tmat3x4<T>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat3x4<T> & tmat3x4<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator+
+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s
+ )
+ {
+ return tmat3x4<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator+
+ (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return tmat3x4<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator-
+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s
+ )
+ {
+ return tmat3x4<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator-
+ (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return tmat3x4<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator*
+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s
+ )
+ {
+ return tmat3x4<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator*
+ (
+ typename tmat3x4<T>::value_type const & s,
+ tmat3x4<T> const & m
+ )
+ {
+ return tmat3x4<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type operator*
+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::row_type const & v
+ )
+ {
+ return typename tmat3x4<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat3x4<T>::row_type operator*
+ (
+ typename tmat3x4<T>::col_type const & v,
+ tmat3x4<T> const & m
+ )
+ {
+ return typename tmat3x4<T>::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>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator*
+ (
+ tmat3x4<T> const & m1,
+ tmat4x3<T> const & m2
+ )
+ {
+ const T SrcA00 = m1[0][0];
+ const T SrcA01 = m1[0][1];
+ const T SrcA02 = m1[0][2];
+ const T SrcA03 = m1[0][3];
+ const T SrcA10 = m1[1][0];
+ const T SrcA11 = m1[1][1];
+ const T SrcA12 = m1[1][2];
+ const T SrcA13 = m1[1][3];
+ const T SrcA20 = m1[2][0];
+ const T SrcA21 = m1[2][1];
+ const T SrcA22 = m1[2][2];
+ const T SrcA23 = m1[2][3];
+
+ const T SrcB00 = m2[0][0];
+ const T SrcB01 = m2[0][1];
+ const T SrcB02 = m2[0][2];
+ const T SrcB10 = m2[1][0];
+ const T SrcB11 = m2[1][1];
+ const T SrcB12 = m2[1][2];
+ const T SrcB20 = m2[2][0];
+ const T SrcB21 = m2[2][1];
+ const T SrcB22 = m2[2][2];
+ const T SrcB30 = m2[3][0];
+ const T SrcB31 = m2[3][1];
+ const T SrcB32 = m2[3][2];
+
+ tmat4x4<T> Result(tmat4x4<T>::null);
+ 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;
+ Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02;
+ Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
+ Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;
+ Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12;
+ Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;
+ Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;
+ Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;
+ Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22;
+ Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32;
+ Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32;
+ Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32;
+ Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator*
+ (
+ tmat3x4<T> const & m1,
+ tmat2x3<T> const & m2
+ )
+ {
+ return tmat2x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+ m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator*
+ (
+ tmat3x4<T> const & m1,
+ tmat3x3<T> const & m2
+ )
+ {
+ return tmat3x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+ m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],
+ m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator/
+ (
+ tmat3x4<T> const & m,
+ typename tmat3x4<T>::value_type const & s
+ )
+ {
+ return tmat3x4<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator/
+ (
+ typename tmat3x4<T>::value_type const & s,
+ tmat3x4<T> const & m
+ )
+ {
+ return tmat3x4<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> const operator-
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ return tmat3x4<T>(
+ -m[0],
+ -m[1],
+ -m[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> const operator++
+ (
+ tmat3x4<T> const & m,
+ int
+ )
+ {
+ return tmat3x4<T>(
+ m[0] + T(1),
+ m[1] + T(1),
+ m[2] + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x4<T> const operator--
+ (
+ tmat3x4<T> const & m,
+ int
+ )
+ {
+ return tmat3x4<T>(
+ m[0] - T(1),
+ m[1] - T(1),
+ m[2] - T(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat3x4<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);
+ }
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat4x2.hpp b/include/gal/opengl/glm/core/type_mat4x2.hpp
new file mode 100644
index 0000000..3bc6cc0
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x2.hpp
@@ -0,0 +1,270 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x2.hpp
+/// @date 2006-10-01 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat4x2
+#define glm_core_type_mat4x2
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat4x2
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec2<T> col_type;
+ typedef tvec4<T> row_type;
+ typedef tmat4x2<T> type;
+ typedef tmat2x4<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[4];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat4x2();
+ GLM_FUNC_DECL tmat4x2(tmat4x2 const & m);
+
+ GLM_FUNC_DECL explicit tmat4x2(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat4x2(
+ value_type const & x);
+ GLM_FUNC_DECL explicit tmat4x2(
+ value_type const & x0, value_type const & y0,
+ value_type const & x1, value_type const & y1,
+ value_type const & x2, value_type const & y2,
+ value_type const & x3, value_type const & y3);
+ GLM_FUNC_DECL explicit tmat4x2(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x2(
+ U const & x);
+
+ template
+ <
+ typename X1, typename Y1,
+ typename X2, typename Y2,
+ typename X3, typename Y3,
+ typename X4, typename Y4
+ >
+ GLM_FUNC_DECL explicit tmat4x2(
+ X1 const & x1, Y1 const & y1,
+ X2 const & x2, Y2 const & y2,
+ X3 const & x3, Y3 const & y3,
+ X4 const & x4, Y4 const & y4);
+
+ template <typename V1, typename V2, typename V3, typename V4>
+ GLM_FUNC_DECL explicit tmat4x2(
+ tvec2<V1> const & v1,
+ tvec2<V2> const & v2,
+ tvec2<V3> const & v3,
+ tvec2<V4> const & v4);
+
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x2(tmat4x2<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat4x2(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat4x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x2(tmat3x4<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat4x2<T>& operator= (tmat4x2<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator= (tmat4x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator+= (tmat4x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator-= (tmat4x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator*= (tmat4x2<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>& operator/= (U s);
+
+ GLM_FUNC_DECL tmat4x2<T>& operator++ ();
+ GLM_FUNC_DECL tmat4x2<T>& operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator+ (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator- (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator- (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator* (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator* (
+ typename tmat4x2<T>::value_type const & s,
+ tmat4x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x2<T>::col_type operator* (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x2<T>::row_type operator* (
+ typename tmat4x2<T>::col_type const & v,
+ tmat4x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x2<T> operator* (
+ tmat4x2<T> const & m1,
+ tmat3x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator* (
+ tmat4x2<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ tmat4x3<T> const & m1,
+ tmat2x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator/ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> operator/ (
+ typename tmat4x2<T>::value_type const & s,
+ tmat4x2<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> const operator- (
+ tmat4x2<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> const operator-- (
+ tmat4x2<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x2<T> const operator++ (
+ tmat4x2<T> const & m,
+ int);
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 4 columns of 2 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x2<lowp_float> lowp_mat4x2;
+
+ /// 4 columns of 2 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x2<mediump_float> mediump_mat4x2;
+
+ /// 4 columns of 2 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x2<highp_float> highp_mat4x2;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat4x2.inl"
+#endif
+
+#endif //glm_core_type_mat4x2
diff --git a/include/gal/opengl/glm/core/type_mat4x2.inl b/include/gal/opengl/glm/core/type_mat4x2.inl
new file mode 100644
index 0000000..3f65e63
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x2.inl
@@ -0,0 +1,716 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x2.inl
+/// @date 2006-10-01 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x2<T>::size_type tmat4x2<T>::length() const
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::col_size()
+ {
+ return 2;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::row_size()
+ {
+ return 4;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type &
+ tmat4x2<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type const &
+ tmat4x2<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2()
+ {
+ value_type const Zero(0);
+ value_type const One(1);
+ this->value[0] = col_type(One, Zero);
+ this->value[1] = col_type(Zero, One);
+ this->value[2] = col_type(Zero, Zero);
+ this->value[3] = col_type(Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ this->value[3] = m.value[3];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero);
+ this->value[1] = col_type(Zero, s);
+ this->value[2] = col_type(Zero, Zero);
+ this->value[3] = col_type(Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ value_type const & x0, value_type const & y0,
+ value_type const & x1, value_type const & y1,
+ value_type const & x2, value_type const & y2,
+ value_type const & x3, value_type const & y3
+ )
+ {
+ this->value[0] = col_type(x0, y0);
+ this->value[1] = col_type(x1, y1);
+ this->value[2] = col_type(x2, y2);
+ this->value[3] = col_type(x3, y3);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ this->value[3] = v3;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat4x2<T>::tmat4x2
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec2<T>(value_type(s), Zero);
+ this->value[1] = tvec2<T>(Zero, value_type(s));
+ this->value[2] = tvec2<T>(Zero, Zero);
+ this->value[3] = tvec2<T>(Zero, Zero);
+ }
+
+ template <typename T>
+ template <
+ typename X1, typename Y1,
+ typename X2, typename Y2,
+ typename X3, typename Y3,
+ typename X4, typename Y4>
+ GLM_FUNC_DECL tmat4x2<T>::tmat4x2
+ (
+ X1 const & x1, Y1 const & y1,
+ X2 const & x2, Y2 const & y2,
+ X3 const & x3, Y3 const & y3,
+ X4 const & x4, Y4 const & y4
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1));
+ this->value[1] = col_type(value_type(x2), value_type(y2));
+ this->value[2] = col_type(value_type(x3), value_type(y3));
+ this->value[3] = col_type(value_type(x4), value_type(y4));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3, typename V4>
+ GLM_FUNC_DECL tmat4x2<T>::tmat4x2
+ (
+ tvec2<V1> const & v1,
+ tvec2<V2> const & v2,
+ tvec2<V3> const & v3,
+ tvec2<V4> const & v4
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ this->value[3] = col_type(v4);
+ }
+
+ // Conversion
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat4x2<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(value_type(0));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(value_type(0));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(value_type(0));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(value_type(0));
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator=
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator=
+ (
+ tmat4x2<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ this->value[3] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+=
+ (
+ tmat4x2<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ this->value[3] += m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ this->value[3] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-=
+ (
+ tmat4x2<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ this->value[3] -= m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ this->value[3] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*=
+ (
+ tmat4x2<U> const & m
+ )
+ {
+ return (*this = tmat4x2<T>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ this->value[3] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ ++this->value[3];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ --this->value[3];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator+
+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s
+ )
+ {
+ return tmat4x2<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s,
+ m[3] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator+
+ (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return tmat4x2<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2],
+ m1[3] + m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator-
+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s
+ )
+ {
+ return tmat4x2<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s,
+ m[3] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator-
+ (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return tmat4x2<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2],
+ m1[3] - m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator*
+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s
+ )
+ {
+ return tmat4x2<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator*
+ (
+ typename tmat4x2<T>::value_type const & s,
+ tmat4x2<T> const & m
+ )
+ {
+ return tmat4x2<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type operator*
+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::row_type const & v)
+ {
+ return typename tmat4x2<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat4x2<T>::row_type operator*
+ (
+ typename tmat4x2<T>::col_type const & v,
+ tmat4x2<T> const & m)
+ {
+ return typename tmat4x2<T>::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>
+ GLM_FUNC_QUALIFIER tmat2x2<T> operator*
+ (
+ tmat4x2<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ T const SrcA00 = m1[0][0];
+ T const SrcA01 = m1[0][1];
+ T const SrcA10 = m1[1][0];
+ T const SrcA11 = m1[1][1];
+ T const SrcA20 = m1[2][0];
+ T const SrcA21 = m1[2][1];
+ T const SrcA30 = m1[3][0];
+ T const SrcA31 = m1[3][1];
+
+ T const SrcB00 = m2[0][0];
+ T const SrcB01 = m2[0][1];
+ T const SrcB02 = m2[0][2];
+ T const SrcB03 = m2[0][3];
+ T const SrcB10 = m2[1][0];
+ T const SrcB11 = m2[1][1];
+ T const SrcB12 = m2[1][2];
+ T const SrcB13 = m2[1][3];
+
+ tmat2x2<T> Result(tmat2x2<T>::null);
+ 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;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat3x2<T> operator*
+ (
+ tmat4x2<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return tmat3x2<T>(
+ 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator*
+ (
+ tmat4x2<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return tmat4x2<T>(
+ 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator/
+ (
+ tmat4x2<T> const & m,
+ typename tmat4x2<T>::value_type const & s
+ )
+ {
+ return tmat4x2<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s,
+ m[3] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> operator/
+ (
+ typename tmat4x2<T>::value_type const & s,
+ tmat4x2<T> const & m
+ )
+ {
+ return tmat4x2<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2],
+ s / m[3]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> const operator-
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ return tmat4x2<T>(
+ -m[0],
+ -m[1],
+ -m[2],
+ -m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> const operator++
+ (
+ tmat4x2<T> const & m,
+ int
+ )
+ {
+ return tmat4x2<T>(
+ m[0] + typename tmat4x2<T>::value_type(1),
+ m[1] + typename tmat4x2<T>::value_type(1),
+ m[2] + typename tmat4x2<T>::value_type(1),
+ m[3] + typename tmat4x2<T>::value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x2<T> const operator--
+ (
+ tmat4x2<T> const & m,
+ int
+ )
+ {
+ return tmat4x2<T>(
+ m[0] - typename tmat4x2<T>::value_type(1),
+ m[1] - typename tmat4x2<T>::value_type(1),
+ m[2] - typename tmat4x2<T>::value_type(1),
+ m[3] - typename tmat4x2<T>::value_type(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat4x2<T> const & m1,
+ tmat4x2<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);
+ }
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_mat4x3.hpp b/include/gal/opengl/glm/core/type_mat4x3.hpp
new file mode 100644
index 0000000..8465a83
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x3.hpp
@@ -0,0 +1,268 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x3.hpp
+/// @date 2006-08-04 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat4x3
+#define glm_core_type_mat4x3
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat4x3
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec3<T> col_type;
+ typedef tvec4<T> row_type;
+ typedef tmat4x3<T> type;
+ typedef tmat3x4<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ private:
+ // Data
+ col_type value[4];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat4x3();
+ GLM_FUNC_DECL tmat4x3(tmat4x3 const & m);
+
+ GLM_FUNC_DECL explicit tmat4x3(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat4x3(
+ value_type const & x);
+ GLM_FUNC_DECL explicit tmat4x3(
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1,
+ value_type const & x2, value_type const & y2, value_type const & z2,
+ value_type const & x3, value_type const & y3, value_type const & z3);
+ GLM_FUNC_DECL explicit tmat4x3(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x3(
+ U const & x);
+
+ 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 explicit 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 explicit tmat4x3(
+ tvec3<V1> const & v1,
+ tvec3<V2> const & v2,
+ tvec3<V3> const & v3,
+ tvec3<V4> const & v4);
+
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x3(tmat4x3<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat4x3(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat4x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x3(tmat3x4<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat4x3<T> & operator= (tmat4x3<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator= (tmat4x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator+= (tmat4x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator-= (tmat4x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator*= (tmat4x3<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T> & operator/= (U s);
+
+ GLM_FUNC_DECL tmat4x3<T> & operator++ ();
+ GLM_FUNC_DECL tmat4x3<T> & operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator+ (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator+ (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator- (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator- (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator* (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator* (
+ typename tmat4x3<T>::value_type const & s,
+ tmat4x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x3<T>::col_type operator* (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x3<T>::row_type operator* (
+ typename tmat4x3<T>::col_type const & v,
+ tmat4x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x3<T> operator* (
+ tmat4x3<T> const & m1,
+ tmat2x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x3<T> operator* (
+ tmat4x3<T> const & m1,
+ tmat3x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator* (
+ tmat4x3<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator/ (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> operator/ (
+ typename tmat4x3<T>::value_type const & s,
+ tmat4x3<T> const & m);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> const operator- (
+ tmat4x3<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> const operator-- (
+ tmat4x3<T> const & m,
+ int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x3<T> const operator++ (
+ tmat4x3<T> const & m,
+ int);
+}//namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 4 columns of 3 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x3<lowp_float> lowp_mat4x3;
+
+ /// 4 columns of 3 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x3<mediump_float> mediump_mat4x3;
+
+ /// 4 columns of 3 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x3<highp_float> highp_mat4x3;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat4x3.inl"
+#endif //GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_mat4x3
diff --git a/include/gal/opengl/glm/core/type_mat4x3.inl b/include/gal/opengl/glm/core/type_mat4x3.inl
new file mode 100644
index 0000000..75307a5
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x3.inl
@@ -0,0 +1,725 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x3.inl
+/// @date 2006-04-17 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x3<T>::size_type tmat4x3<T>::length() const
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::size_type tmat4x3<T>::col_size()
+ {
+ return 3;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::size_type tmat4x3<T>::row_size()
+ {
+ return 4;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type &
+ tmat4x3<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type const &
+ tmat4x3<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3()
+ {
+ value_type const Zero(0);
+ value_type const One(1);
+ this->value[0] = col_type(One, Zero, Zero);
+ this->value[1] = col_type(Zero, One, Zero);
+ this->value[2] = col_type(Zero, Zero, One);
+ this->value[3] = col_type(Zero, Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ this->value[3] = m.value[3];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero, Zero);
+ this->value[1] = col_type(Zero, s, Zero);
+ this->value[2] = col_type(Zero, Zero, s);
+ this->value[3] = col_type(Zero, Zero, Zero);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0,
+ value_type const & x1, value_type const & y1, value_type const & z1,
+ value_type const & x2, value_type const & y2, value_type const & z2,
+ value_type const & x3, value_type const & y3, value_type const & z3
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0);
+ this->value[1] = col_type(x1, y1, z1);
+ this->value[2] = col_type(x2, y2, z2);
+ this->value[3] = col_type(x3, y3, z3);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ this->value[3] = v3;
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat4x3<T>::tmat4x3
+ (
+ U const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = tvec3<T>(value_type(s), Zero, Zero);
+ this->value[1] = tvec3<T>(Zero, value_type(s), Zero);
+ this->value[2] = tvec3<T>(Zero, Zero, value_type(s));
+ this->value[3] = tvec3<T>(Zero, Zero, Zero);
+ }
+
+ template <typename T>
+ 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<T>::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
+ )
+ {
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2));
+ this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3));
+ this->value[3] = col_type(value_type(x4), value_type(y4), value_type(z4));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3, typename V4>
+ GLM_FUNC_DECL tmat4x3<T>::tmat4x3
+ (
+ tvec3<V1> const & v1,
+ tvec3<V2> const & v2,
+ tvec3<V3> const & v3,
+ tvec3<V4> const & v4
+ )
+ {
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ this->value[3] = col_type(v4);
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Matrix conversions
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat4x3<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(1));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(value_type(0), value_type(0), value_type(1));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(1));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(value_type(0), value_type(0), value_type(1));
+ this->value[3] = col_type(value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(1));
+ this->value[3] = col_type(m[3], value_type(0));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(value_type(0));
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Unary updatable operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T>& tmat4x3<T>::operator=
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T>& tmat4x3<T>::operator=
+ (
+ tmat4x3<U> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ this->value[3] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator+=
+ (
+ tmat4x3<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ this->value[3] += m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ this->value[3] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-=
+ (
+ tmat4x3<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ this->value[3] -= m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ this->value[3] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator*=
+ (
+ tmat4x3<U> const & m
+ )
+ {
+ return (*this = tmat4x3<T>(*this * m));
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ this->value[3] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ ++this->value[3];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ --this->value[3];
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Binary operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator+ (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s)
+ {
+ return tmat4x3<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s,
+ m[3] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator+ (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2)
+ {
+ return tmat4x3<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2],
+ m1[3] + m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator- (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s)
+ {
+ return tmat4x3<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s,
+ m[3] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator- (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2)
+ {
+ return tmat4x3<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2],
+ m1[3] - m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator* (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s)
+ {
+ return tmat4x3<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator* (
+ typename tmat4x3<T>::value_type const & s,
+ tmat4x3<T> const & m)
+ {
+ return tmat4x3<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type operator*
+ (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::row_type const & v)
+ {
+ return typename tmat4x3<T>::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>
+ GLM_FUNC_QUALIFIER typename tmat4x3<T>::row_type operator*
+ (
+ typename tmat4x3<T>::col_type const & v,
+ tmat4x3<T> const & m)
+ {
+ return typename tmat4x3<T>::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>
+ GLM_FUNC_QUALIFIER tmat2x3<T> operator*
+ (
+ tmat4x3<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return tmat2x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat3x3<T> operator*
+ (
+ tmat4x3<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ T const SrcA00 = m1[0][0];
+ T const SrcA01 = m1[0][1];
+ T const SrcA02 = m1[0][2];
+ T const SrcA10 = m1[1][0];
+ T const SrcA11 = m1[1][1];
+ T const SrcA12 = m1[1][2];
+ T const SrcA20 = m1[2][0];
+ T const SrcA21 = m1[2][1];
+ T const SrcA22 = m1[2][2];
+ T const SrcA30 = m1[3][0];
+ T const SrcA31 = m1[3][1];
+ T const SrcA32 = m1[3][2];
+
+ T const SrcB00 = m2[0][0];
+ T const SrcB01 = m2[0][1];
+ T const SrcB02 = m2[0][2];
+ T const SrcB03 = m2[0][3];
+ T const SrcB10 = m2[1][0];
+ T const SrcB11 = m2[1][1];
+ T const SrcB12 = m2[1][2];
+ T const SrcB13 = m2[1][3];
+ T const SrcB20 = m2[2][0];
+ T const SrcB21 = m2[2][1];
+ T const SrcB22 = m2[2][2];
+ T const SrcB23 = m2[2][3];
+
+ tmat3x3<T> Result(tmat3x3<T>::null);
+ 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;
+ Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;
+ Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;
+ Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13;
+ Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23;
+ Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23;
+ Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23;
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator*
+ (
+ tmat4x3<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return tmat4x3<T>(
+ 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],
+ m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],
+ m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],
+ m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator/
+ (
+ tmat4x3<T> const & m,
+ typename tmat4x3<T>::value_type const & s
+ )
+ {
+ return tmat4x3<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s,
+ m[3] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> operator/
+ (
+ typename tmat4x3<T>::value_type const & s,
+ tmat4x3<T> const & m
+ )
+ {
+ return tmat4x3<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2],
+ s / m[3]);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> const operator-
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ return tmat4x3<T>(
+ -m[0],
+ -m[1],
+ -m[2],
+ -m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> const operator++
+ (
+ tmat4x3<T> const & m,
+ int
+ )
+ {
+ return tmat4x3<T>(
+ m[0] + T(1),
+ m[1] + T(1),
+ m[2] + T(1),
+ m[3] + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x3<T> const operator--
+ (
+ tmat4x3<T> const & m,
+ int
+ )
+ {
+ return tmat4x3<T>(
+ m[0] - T(1),
+ m[1] - T(1),
+ m[2] - T(1),
+ m[3] - T(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat4x3<T> const & m1,
+ tmat4x3<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);
+ }
+} //namespace detail
+} //namespace glm
+
diff --git a/include/gal/opengl/glm/core/type_mat4x4.hpp b/include/gal/opengl/glm/core/type_mat4x4.hpp
new file mode 100644
index 0000000..85696b9
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x4.hpp
@@ -0,0 +1,320 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x4.hpp
+/// @date 2005-01-27 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_mat4x4
+#define glm_core_type_mat4x4
+
+#include "type_mat.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+ template <typename T> struct tmat2x2;
+ template <typename T> struct tmat2x3;
+ template <typename T> struct tmat2x4;
+ template <typename T> struct tmat3x2;
+ template <typename T> struct tmat3x3;
+ template <typename T> struct tmat3x4;
+ template <typename T> struct tmat4x2;
+ template <typename T> struct tmat4x3;
+ template <typename T> struct tmat4x4;
+
+ template <typename T>
+ struct tmat4x4
+ {
+ enum ctor{null};
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec4<T> col_type;
+ typedef tvec4<T> row_type;
+ typedef tmat4x4<T> type;
+ typedef tmat4x4<T> transpose_type;
+
+ static GLM_FUNC_DECL size_type col_size();
+ static GLM_FUNC_DECL size_type row_size();
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ public:
+ /// Implementation detail
+ /// @cond DETAIL
+ GLM_FUNC_DECL tmat4x4<T> _inverse() const;
+ /// @endcond
+
+ private:
+ // Data
+ col_type value[4];
+
+ public:
+ // Constructors
+ GLM_FUNC_DECL tmat4x4();
+ GLM_FUNC_DECL tmat4x4(tmat4x4 const & m);
+
+ GLM_FUNC_DECL explicit tmat4x4(
+ ctor Null);
+ GLM_FUNC_DECL explicit tmat4x4(
+ value_type const & x);
+ GLM_FUNC_DECL explicit tmat4x4(
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
+ value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2,
+ value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3);
+ GLM_FUNC_DECL explicit tmat4x4(
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3);
+
+ //////////////////////////////////////
+ // Conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x4(
+ U const & x);
+
+ 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 explicit 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 explicit tmat4x4(
+ tvec4<V1> const & v1,
+ tvec4<V2> const & v2,
+ tvec4<V3> const & v3,
+ tvec4<V4> const & v4);
+
+ // Matrix conversions
+ template <typename U>
+ GLM_FUNC_DECL explicit tmat4x4(tmat4x4<U> const & m);
+
+ GLM_FUNC_DECL explicit tmat4x4(tmat2x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat3x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat2x3<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat3x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat2x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat4x2<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat3x4<T> const & x);
+ GLM_FUNC_DECL explicit tmat4x4(tmat4x3<T> const & x);
+
+ // Accesses
+ GLM_FUNC_DECL col_type & operator[](size_type i);
+ GLM_FUNC_DECL col_type const & operator[](size_type i) const;
+
+ // Unary updatable operators
+ GLM_FUNC_DECL tmat4x4<T> & operator= (tmat4x4<T> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator= (tmat4x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator+= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator+= (tmat4x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator-= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator-= (tmat4x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator*= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator*= (tmat4x4<U> const & m);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator/= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T> & operator/= (tmat4x4<U> const & m);
+ GLM_FUNC_DECL tmat4x4<T> & operator++ ();
+ GLM_FUNC_DECL tmat4x4<T> & operator-- ();
+ };
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator+ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator- (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator- (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator- (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator* (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator* (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x4<T>::col_type operator* (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x4<T>::row_type operator* (
+ typename tmat4x4<T>::col_type const & v,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat2x4<T> operator* (
+ tmat4x4<T> const & m1,
+ tmat2x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat3x4<T> operator* (
+ tmat4x4<T> const & m1,
+ tmat3x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator* (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator/ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator/ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x4<T>::col_type operator/ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::row_type const & v);
+
+ template <typename T>
+ GLM_FUNC_DECL typename tmat4x4<T>::row_type operator/ (
+ typename tmat4x4<T>::col_type & v,
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> operator/ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2);
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> const operator- (
+ tmat4x4<T> const & m);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> const operator-- (
+ tmat4x4<T> const & m, int);
+
+ template <typename T>
+ GLM_FUNC_DECL tmat4x4<T> const operator++ (
+ tmat4x4<T> const & m, int);
+
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 4 columns of 4 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<lowp_float> lowp_mat4;
+
+ /// 4 columns of 4 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<mediump_float> mediump_mat4;
+
+ /// 4 columns of 4 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<highp_float> highp_mat4;
+
+ /// 4 columns of 4 components matrix of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<lowp_float> lowp_mat4x4;
+
+ /// 4 columns of 4 components matrix of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<mediump_float> mediump_mat4x4;
+
+ /// 4 columns of 4 components matrix of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tmat4x4<highp_float> highp_mat4x4;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_mat4x4.inl"
+#endif//GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_mat4x4
diff --git a/include/gal/opengl/glm/core/type_mat4x4.inl b/include/gal/opengl/glm/core/type_mat4x4.inl
new file mode 100644
index 0000000..29f80d8
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_mat4x4.inl
@@ -0,0 +1,893 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_mat4x4.inl
+/// @date 2005-01-27 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x4<T>::size_type tmat4x4<T>::length() const
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::size_type tmat4x4<T>::col_size()
+ {
+ return 4;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::size_type tmat4x4<T>::row_size()
+ {
+ return 4;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type &
+ tmat4x4<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type const &
+ tmat4x4<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return this->value[i];
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4()
+ {
+ value_type Zero(0);
+ value_type One(1);
+ this->value[0] = col_type(One, Zero, Zero, Zero);
+ this->value[1] = col_type(Zero, One, Zero, Zero);
+ this->value[2] = col_type(Zero, Zero, One, Zero);
+ this->value[3] = col_type(Zero, Zero, Zero, One);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ this->value[0] = m.value[0];
+ this->value[1] = m.value[1];
+ this->value[2] = m.value[2];
+ this->value[3] = m.value[3];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ value_type const & s
+ )
+ {
+ value_type const Zero(0);
+ this->value[0] = col_type(s, Zero, Zero, Zero);
+ this->value[1] = col_type(Zero, s, Zero, Zero);
+ this->value[2] = col_type(Zero, Zero, s, Zero);
+ this->value[3] = col_type(Zero, Zero, Zero, s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
+ value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
+ value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2,
+ value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3
+ )
+ {
+ this->value[0] = col_type(x0, y0, z0, w0);
+ this->value[1] = col_type(x1, y1, z1, w1);
+ this->value[2] = col_type(x2, y2, z2, w2);
+ this->value[3] = col_type(x3, y3, z3, w3);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ col_type const & v0,
+ col_type const & v1,
+ col_type const & v2,
+ col_type const & v3
+ )
+ {
+ this->value[0] = v0;
+ this->value[1] = v1;
+ this->value[2] = v2;
+ this->value[3] = v3;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ this->value[0] = col_type(m[0]);
+ this->value[1] = col_type(m[1]);
+ this->value[2] = col_type(m[2]);
+ this->value[3] = col_type(m[3]);
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_DECL tmat4x4<T>::tmat4x4
+ (
+ U const & s
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<U>::is_float || std::numeric_limits<U>::is_integer, "*mat4x4 constructor only takes float and integer types");
+
+ value_type const Zero(0);
+ this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero);
+ this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero);
+ this->value[2] = tvec4<T>(Zero, Zero, value_type(s), Zero);
+ this->value[3] = tvec4<T>(Zero, Zero, Zero, value_type(s));
+ }
+
+ template <typename T>
+ 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<T>::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
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<X1>::is_float || std::numeric_limits<X1>::is_integer, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Y1>::is_float || std::numeric_limits<Y1>::is_integer, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Z1>::is_float || std::numeric_limits<Z1>::is_integer, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<W1>::is_float || std::numeric_limits<W1>::is_integer, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid.");
+
+ GLM_STATIC_ASSERT(detail::type<X2>::is_float || std::numeric_limits<X2>::is_integer, "*mat4x4 constructor only takes float and integer types, 5th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Y2>::is_float || std::numeric_limits<Y2>::is_integer, "*mat4x4 constructor only takes float and integer types, 6th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Z2>::is_float || std::numeric_limits<Z2>::is_integer, "*mat4x4 constructor only takes float and integer types, 7th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<W2>::is_float || std::numeric_limits<W2>::is_integer, "*mat4x4 constructor only takes float and integer types, 8th parameter type invalid.");
+
+ GLM_STATIC_ASSERT(detail::type<X3>::is_float || std::numeric_limits<X3>::is_integer, "*mat4x4 constructor only takes float and integer types, 9th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Y3>::is_float || std::numeric_limits<Y3>::is_integer, "*mat4x4 constructor only takes float and integer types, 10th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Z3>::is_float || std::numeric_limits<Z3>::is_integer, "*mat4x4 constructor only takes float and integer types, 11th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<W3>::is_float || std::numeric_limits<W3>::is_integer, "*mat4x4 constructor only takes float and integer types, 12th parameter type invalid.");
+
+ GLM_STATIC_ASSERT(detail::type<X4>::is_float || std::numeric_limits<X4>::is_integer, "*mat4x4 constructor only takes float and integer types, 13th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Y4>::is_float || std::numeric_limits<Y4>::is_integer, "*mat4x4 constructor only takes float and integer types, 14th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<Z4>::is_float || std::numeric_limits<Z4>::is_integer, "*mat4x4 constructor only takes float and integer types, 15th parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<W4>::is_float || std::numeric_limits<W4>::is_integer, "*mat4x4 constructor only takes float and integer types, 16th parameter type invalid.");
+
+ this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1));
+ this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2));
+ this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3), value_type(w3));
+ this->value[3] = col_type(value_type(x4), value_type(y4), value_type(z4), value_type(w4));
+ }
+
+ template <typename T>
+ template <typename V1, typename V2, typename V3, typename V4>
+ GLM_FUNC_DECL tmat4x4<T>::tmat4x4
+ (
+ tvec4<V1> const & v1,
+ tvec4<V2> const & v2,
+ tvec4<V3> const & v3,
+ tvec4<V4> const & v4
+ )
+ {
+ GLM_STATIC_ASSERT(detail::type<V1>::is_float || std::numeric_limits<V1>::is_integer, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<V2>::is_float || std::numeric_limits<V2>::is_integer, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<V3>::is_float || std::numeric_limits<V3>::is_integer, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid.");
+ GLM_STATIC_ASSERT(detail::type<V4>::is_float || std::numeric_limits<V4>::is_integer, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid.");
+
+ this->value[0] = col_type(v1);
+ this->value[1] = col_type(v2);
+ this->value[2] = col_type(v3);
+ this->value[3] = col_type(v4);
+ }
+
+ //////////////////////////////////////
+ // Matrix convertion constructors
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat2x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ this->value[2] = col_type(value_type(0));
+ this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat3x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(m[2], value_type(0));
+ this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat2x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], value_type(0));
+ this->value[1] = col_type(m[1], value_type(0));
+ this->value[2] = col_type(value_type(0));
+ this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat3x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ this->value[2] = col_type(m[2], detail::tvec2<T>(0));
+ this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat2x4<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = col_type(T(0));
+ this->value[3] = col_type(T(0), T(0), T(0), T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat4x2<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], detail::tvec2<T>(0));
+ this->value[1] = col_type(m[1], detail::tvec2<T>(0));
+ this->value[2] = col_type(T(0));
+ this->value[3] = col_type(T(0), T(0), T(0), T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat3x4<T> const & m
+ )
+ {
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = col_type(T(0), T(0), T(0), T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4
+ (
+ tmat4x3<T> const & m
+ )
+ {
+ this->value[0] = col_type(m[0], T(0));
+ this->value[1] = col_type(m[1], T(0));
+ this->value[2] = col_type(m[2], T(0));
+ this->value[3] = col_type(m[3], T(1));
+ }
+
+ //////////////////////////////////////////////////////////////
+ // Operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator=
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ //memcpy could be faster
+ //memcpy(&this->value, &m.value, 16 * sizeof(valType));
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator=
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ //memcpy could be faster
+ //memcpy(&this->value, &m.value, 16 * sizeof(valType));
+ this->value[0] = m[0];
+ this->value[1] = m[1];
+ this->value[2] = m[2];
+ this->value[3] = m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator+= (U s)
+ {
+ this->value[0] += s;
+ this->value[1] += s;
+ this->value[2] += s;
+ this->value[3] += s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator+=
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ this->value[0] += m[0];
+ this->value[1] += m[1];
+ this->value[2] += m[2];
+ this->value[3] += m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-= (U s)
+ {
+ this->value[0] -= s;
+ this->value[1] -= s;
+ this->value[2] -= s;
+ this->value[3] -= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-=
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ this->value[0] -= m[0];
+ this->value[1] -= m[1];
+ this->value[2] -= m[2];
+ this->value[3] -= m[3];
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator*= (U s)
+ {
+ this->value[0] *= s;
+ this->value[1] *= s;
+ this->value[2] *= s;
+ this->value[3] *= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator*=
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ return (*this = *this * m);
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator/= (U s)
+ {
+ this->value[0] /= s;
+ this->value[1] /= s;
+ this->value[2] /= s;
+ this->value[3] /= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator/=
+ (
+ tmat4x4<U> const & m
+ )
+ {
+ return (*this = *this / m);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator++ ()
+ {
+ ++this->value[0];
+ ++this->value[1];
+ ++this->value[2];
+ ++this->value[3];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-- ()
+ {
+ --this->value[0];
+ --this->value[1];
+ --this->value[2];
+ --this->value[3];
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> tmat4x4<T>::_inverse() const
+ {
+ // Calculate all mat2 determinants
+ value_type SubFactor00 = this->value[2][2] * this->value[3][3] - this->value[3][2] * this->value[2][3];
+ value_type SubFactor01 = this->value[2][1] * this->value[3][3] - this->value[3][1] * this->value[2][3];
+ value_type SubFactor02 = this->value[2][1] * this->value[3][2] - this->value[3][1] * this->value[2][2];
+ value_type SubFactor03 = this->value[2][0] * this->value[3][3] - this->value[3][0] * this->value[2][3];
+ value_type SubFactor04 = this->value[2][0] * this->value[3][2] - this->value[3][0] * this->value[2][2];
+ value_type SubFactor05 = this->value[2][0] * this->value[3][1] - this->value[3][0] * this->value[2][1];
+ value_type SubFactor06 = this->value[1][2] * this->value[3][3] - this->value[3][2] * this->value[1][3];
+ value_type SubFactor07 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3];
+ value_type SubFactor08 = this->value[1][1] * this->value[3][2] - this->value[3][1] * this->value[1][2];
+ value_type SubFactor09 = this->value[1][0] * this->value[3][3] - this->value[3][0] * this->value[1][3];
+ value_type SubFactor10 = this->value[1][0] * this->value[3][2] - this->value[3][0] * this->value[1][2];
+ value_type SubFactor11 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3];
+ value_type SubFactor12 = this->value[1][0] * this->value[3][1] - this->value[3][0] * this->value[1][1];
+ value_type SubFactor13 = this->value[1][2] * this->value[2][3] - this->value[2][2] * this->value[1][3];
+ value_type SubFactor14 = this->value[1][1] * this->value[2][3] - this->value[2][1] * this->value[1][3];
+ value_type SubFactor15 = this->value[1][1] * this->value[2][2] - this->value[2][1] * this->value[1][2];
+ value_type SubFactor16 = this->value[1][0] * this->value[2][3] - this->value[2][0] * this->value[1][3];
+ value_type SubFactor17 = this->value[1][0] * this->value[2][2] - this->value[2][0] * this->value[1][2];
+ value_type SubFactor18 = this->value[1][0] * this->value[2][1] - this->value[2][0] * this->value[1][1];
+/*
+ tmat4x4<T> Inverse(
+ + (this->value[1][1] * SubFactor00 - this->value[1][2] * SubFactor01 + this->value[1][3] * SubFactor02),
+ - (this->value[1][0] * SubFactor00 - this->value[1][2] * SubFactor03 + this->value[1][3] * SubFactor04),
+ + (this->value[1][0] * SubFactor01 - this->value[1][1] * SubFactor03 + this->value[1][3] * SubFactor05),
+ - (this->value[1][0] * SubFactor02 - this->value[1][1] * SubFactor04 + this->value[1][2] * SubFactor05),
+
+ - (this->value[0][1] * SubFactor00 - this->value[0][2] * SubFactor01 + this->value[0][3] * SubFactor02),
+ + (this->value[0][0] * SubFactor00 - this->value[0][2] * SubFactor03 + this->value[0][3] * SubFactor04),
+ - (this->value[0][0] * SubFactor01 - this->value[0][1] * SubFactor03 + this->value[0][3] * SubFactor05),
+ + (this->value[0][0] * SubFactor02 - this->value[0][1] * SubFactor04 + this->value[0][2] * SubFactor05),
+
+ + (this->value[0][1] * SubFactor06 - this->value[0][2] * SubFactor07 + this->value[0][3] * SubFactor08),
+ - (this->value[0][0] * SubFactor06 - this->value[0][2] * SubFactor09 + this->value[0][3] * SubFactor10),
+ + (this->value[0][0] * SubFactor11 - this->value[0][1] * SubFactor09 + this->value[0][3] * SubFactor12),
+ - (this->value[0][0] * SubFactor08 - this->value[0][1] * SubFactor10 + this->value[0][2] * SubFactor12),
+
+ - (this->value[0][1] * SubFactor13 - this->value[0][2] * SubFactor14 + this->value[0][3] * SubFactor15),
+ + (this->value[0][0] * SubFactor13 - this->value[0][2] * SubFactor16 + this->value[0][3] * SubFactor17),
+ - (this->value[0][0] * SubFactor14 - this->value[0][1] * SubFactor16 + this->value[0][3] * SubFactor18),
+ + (this->value[0][0] * SubFactor15 - this->value[0][1] * SubFactor17 + this->value[0][2] * SubFactor18));
+*/
+ tmat4x4<T> Inverse(
+ + this->value[1][1] * SubFactor00 - this->value[1][2] * SubFactor01 + this->value[1][3] * SubFactor02,
+ - this->value[1][0] * SubFactor00 + this->value[1][2] * SubFactor03 - this->value[1][3] * SubFactor04,
+ + this->value[1][0] * SubFactor01 - this->value[1][1] * SubFactor03 + this->value[1][3] * SubFactor05,
+ - this->value[1][0] * SubFactor02 + this->value[1][1] * SubFactor04 - this->value[1][2] * SubFactor05,
+
+ - this->value[0][1] * SubFactor00 + this->value[0][2] * SubFactor01 - this->value[0][3] * SubFactor02,
+ + this->value[0][0] * SubFactor00 - this->value[0][2] * SubFactor03 + this->value[0][3] * SubFactor04,
+ - this->value[0][0] * SubFactor01 + this->value[0][1] * SubFactor03 - this->value[0][3] * SubFactor05,
+ + this->value[0][0] * SubFactor02 - this->value[0][1] * SubFactor04 + this->value[0][2] * SubFactor05,
+
+ + this->value[0][1] * SubFactor06 - this->value[0][2] * SubFactor07 + this->value[0][3] * SubFactor08,
+ - this->value[0][0] * SubFactor06 + this->value[0][2] * SubFactor09 - this->value[0][3] * SubFactor10,
+ + this->value[0][0] * SubFactor11 - this->value[0][1] * SubFactor09 + this->value[0][3] * SubFactor12,
+ - this->value[0][0] * SubFactor08 + this->value[0][1] * SubFactor10 - this->value[0][2] * SubFactor12,
+
+ - this->value[0][1] * SubFactor13 + this->value[0][2] * SubFactor14 - this->value[0][3] * SubFactor15,
+ + this->value[0][0] * SubFactor13 - this->value[0][2] * SubFactor16 + this->value[0][3] * SubFactor17,
+ - this->value[0][0] * SubFactor14 + this->value[0][1] * SubFactor16 - this->value[0][3] * SubFactor18,
+ + this->value[0][0] * SubFactor15 - this->value[0][1] * SubFactor17 + this->value[0][2] * SubFactor18);
+
+ value_type Determinant =
+ + this->value[0][0] * Inverse[0][0]
+ + this->value[0][1] * Inverse[1][0]
+ + this->value[0][2] * Inverse[2][0]
+ + this->value[0][3] * Inverse[3][0];
+
+ Inverse /= Determinant;
+ return Inverse;
+ }
+
+ // Binary operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator+
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s
+ )
+ {
+ return tmat4x4<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s,
+ m[3] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator+
+ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m
+ )
+ {
+ return tmat4x4<T>(
+ m[0] + s,
+ m[1] + s,
+ m[2] + s,
+ m[3] + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator+
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return tmat4x4<T>(
+ m1[0] + m2[0],
+ m1[1] + m2[1],
+ m1[2] + m2[2],
+ m1[3] + m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator-
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s
+ )
+ {
+ return tmat4x4<T>(
+ m[0] - s,
+ m[1] - s,
+ m[2] - s,
+ m[3] - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator-
+ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m
+ )
+ {
+ return tmat4x4<T>(
+ s - m[0],
+ s - m[1],
+ s - m[2],
+ s - m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator-
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return tmat4x4<T>(
+ m1[0] - m2[0],
+ m1[1] - m2[1],
+ m1[2] - m2[2],
+ m1[3] - m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator*
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s
+ )
+ {
+ return tmat4x4<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator*
+ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m
+ )
+ {
+ return tmat4x4<T>(
+ m[0] * s,
+ m[1] * s,
+ m[2] * s,
+ m[3] * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type operator*
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::row_type const & v
+ )
+ {
+ return typename tmat4x4<T>::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,
+ m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z + m[3][3] * v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::row_type operator*
+ (
+ typename tmat4x4<T>::col_type const & v,
+ tmat4x4<T> const & m
+ )
+ {
+ return typename tmat4x4<T>::row_type(
+ m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,
+ m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
+ m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
+ m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat2x4<T> operator*
+ (
+ tmat4x4<T> const & m1,
+ tmat2x4<T> const & m2
+ )
+ {
+ return tmat2x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat3x4<T> operator*
+ (
+ tmat4x4<T> const & m1,
+ tmat3x4<T> const & m2
+ )
+ {
+ return tmat3x4<T>(
+ 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],
+ m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * 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],
+ m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+ m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+ m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3],
+ m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+ m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+ m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],
+ 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>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator*
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ typename tmat4x4<T>::col_type const SrcA0 = m1[0];
+ typename tmat4x4<T>::col_type const SrcA1 = m1[1];
+ typename tmat4x4<T>::col_type const SrcA2 = m1[2];
+ typename tmat4x4<T>::col_type const SrcA3 = m1[3];
+
+ typename tmat4x4<T>::col_type const SrcB0 = m2[0];
+ typename tmat4x4<T>::col_type const SrcB1 = m2[1];
+ typename tmat4x4<T>::col_type const SrcB2 = m2[2];
+ typename tmat4x4<T>::col_type const SrcB3 = m2[3];
+
+ tmat4x4<T> Result(tmat4x4<T>::null);
+ 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];
+ Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3];
+ return Result;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator/
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::value_type const & s
+ )
+ {
+ return tmat4x4<T>(
+ m[0] / s,
+ m[1] / s,
+ m[2] / s,
+ m[3] / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator/
+ (
+ typename tmat4x4<T>::value_type const & s,
+ tmat4x4<T> const & m
+ )
+ {
+ return tmat4x4<T>(
+ s / m[0],
+ s / m[1],
+ s / m[2],
+ s / m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type operator/
+ (
+ tmat4x4<T> const & m,
+ typename tmat4x4<T>::row_type const & v
+ )
+ {
+ return m._inverse() * v;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tmat4x4<T>::row_type operator/
+ (
+ typename tmat4x4<T>::col_type const & v,
+ tmat4x4<T> const & m
+ )
+ {
+ return v * m._inverse();
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> operator/
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return m1 * m2._inverse();
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> const operator-
+ (
+ tmat4x4<T> const & m
+ )
+ {
+ return tmat4x4<T>(
+ -m[0],
+ -m[1],
+ -m[2],
+ -m[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> const operator++
+ (
+ tmat4x4<T> const & m,
+ int
+ )
+ {
+ return tmat4x4<T>(
+ m[0] + typename tmat4x4<T>::value_type(1),
+ m[1] + typename tmat4x4<T>::value_type(1),
+ m[2] + typename tmat4x4<T>::value_type(1),
+ m[3] + typename tmat4x4<T>::value_type(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tmat4x4<T> const operator--
+ (
+ tmat4x4<T> const & m,
+ int
+ )
+ {
+ return tmat4x4<T>(
+ m[0] - typename tmat4x4<T>::value_type(1),
+ m[1] - typename tmat4x4<T>::value_type(1),
+ m[2] - typename tmat4x4<T>::value_type(1),
+ m[3] - typename tmat4x4<T>::value_type(1));
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tmat4x4<T> const & m1,
+ tmat4x4<T> const & m2
+ )
+ {
+ return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);
+ }
+
+} //namespace detail
+} //namespace glm
diff --git a/include/gal/opengl/glm/core/type_size.hpp b/include/gal/opengl/glm/core/type_size.hpp
new file mode 100644
index 0000000..b7a7c31
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_size.hpp
@@ -0,0 +1,43 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_size.hpp
+/// @date 2008-10-05 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_size
+#define glm_core_type_size
+
+#include <cstdlib>
+
+namespace glm{
+namespace detail
+{
+ //typedef std::size_t size_t;
+ typedef int sizeType;
+
+}//namespace detail
+}//namespace glm
+
+#endif//glm_core_type_size
diff --git a/include/gal/opengl/glm/core/type_vec.hpp b/include/gal/opengl/glm/core/type_vec.hpp
new file mode 100644
index 0000000..60e2b70
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec.hpp
@@ -0,0 +1,41 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec.hpp
+/// @date 2010-01-26 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_vec
+#define glm_core_type_vec
+
+#include "type_gentype.hpp"
+
+namespace glm{
+namespace detail
+{
+
+}//namespace detail
+}//namespace glm
+
+#endif//glm_core_type_vec
diff --git a/include/gal/opengl/glm/core/type_vec.inl b/include/gal/opengl/glm/core/type_vec.inl
new file mode 100644
index 0000000..ef3f8f4
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec.inl
@@ -0,0 +1,27 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec.inl
+/// @date 2011-06-15 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
diff --git a/include/gal/opengl/glm/core/type_vec1.hpp b/include/gal/opengl/glm/core/type_vec1.hpp
new file mode 100644
index 0000000..395cc78
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec1.hpp
@@ -0,0 +1,212 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec1.hpp
+/// @date 2008-08-25 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_gentype1
+#define glm_core_type_gentype1
+
+#include "type_vec.hpp"
+#include "type_float.hpp"
+#include "type_int.hpp"
+#include "type_size.hpp"
+#include "_swizzle.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tref1;
+ template <typename T> struct tref2;
+ template <typename T> struct tref3;
+ template <typename T> struct tref4;
+ template <typename T> struct tvec1;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+
+ template <typename T>
+ struct tvec1
+ {
+ enum ctor{null};
+
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec1<T> type;
+ typedef tvec1<bool> bool_type;
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ //////////////////////////////////////
+ // Data
+
+# if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
+ value_type x;
+# else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES)
+ union {value_type x, r, s;};
+# endif//GLM_COMPONENT
+
+ //////////////////////////////////////
+ // Accesses
+
+ GLM_FUNC_DECL value_type & operator[](size_type i);
+ GLM_FUNC_DECL value_type const & operator[](size_type i) const;
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ GLM_FUNC_DECL tvec1();
+ GLM_FUNC_DECL tvec1(tvec1<T> const & v);
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ GLM_FUNC_DECL explicit tvec1(
+ ctor);
+ GLM_FUNC_DECL explicit tvec1(
+ value_type const & s);
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ GLM_FUNC_DECL tvec1(tref1<T> const & r);
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec1(U const & s);
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec1(tvec2<U> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec1(tvec3<U> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec1(tvec4<U> const & v);
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ GLM_FUNC_DECL tvec1<T> & operator= (tvec1<T> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator= (tvec1<U> const & v);
+
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator+=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator+=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator-=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator-=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator*=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator*=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator/=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator/=(tvec1<U> const & v);
+ GLM_FUNC_DECL tvec1<T> & operator++();
+ GLM_FUNC_DECL tvec1<T> & operator--();
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator%=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator%=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator&=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator&=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator|=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator|=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator^=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator^=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator<<=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator<<=(tvec1<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator>>=(U const & s);
+ template <typename U>
+ GLM_FUNC_DECL tvec1<T> & operator>>=(tvec1<U> const & v);
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ GLM_FUNC_DECL value_type swizzle(comp X) const;
+ GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
+ GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
+ GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
+ GLM_FUNC_DECL tref1<T> swizzle(comp X);
+ };
+
+ template <typename T>
+ struct tref1
+ {
+ GLM_FUNC_DECL tref1(T & x);
+ GLM_FUNC_DECL tref1(tref1<T> const & r);
+ GLM_FUNC_DECL tref1(tvec1<T> const & v);
+
+ GLM_FUNC_DECL tref1<T> & operator= (tref1<T> const & r);
+ GLM_FUNC_DECL tref1<T> & operator= (tvec1<T> const & v);
+
+ T& x;
+ };
+
+ GLM_DETAIL_IS_VECTOR(tvec1);
+
+ typedef detail::tvec1<highp_float> highp_vec1_t;
+ typedef detail::tvec1<mediump_float> mediump_vec1_t;
+ typedef detail::tvec1<lowp_float> lowp_vec1_t;
+ typedef detail::tvec1<highp_int> highp_ivec1_t;
+ typedef detail::tvec1<mediump_int> mediump_ivec1_t;
+ typedef detail::tvec1<lowp_int> lowp_ivec1_t;
+ typedef detail::tvec1<highp_uint> highp_uvec1_t;
+ typedef detail::tvec1<mediump_uint> mediump_uvec1_t;
+ typedef detail::tvec1<lowp_uint> lowp_uvec1_t;
+
+}//namespace detail
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_vec1.inl"
+#endif//GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_gentype1
diff --git a/include/gal/opengl/glm/core/type_vec1.inl b/include/gal/opengl/glm/core/type_vec1.inl
new file mode 100644
index 0000000..6b12e03
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec1.inl
@@ -0,0 +1,928 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec1.inl
+/// @date 2008-08-25 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec1<T>::size_type tvec1<T>::length() const
+ {
+ return 1;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec1<T>::value_type & tvec1<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec1<T>::value_type const & tvec1<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1() :
+ x(value_type(0))
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ tvec1<T> const & v
+ ) :
+ x(v.x)
+ {}
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ value_type const & s
+ ) :
+ x(s)
+ {}
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ tref1<T> const & r
+ ) :
+ x(r.x)
+ {}
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ U const & s
+ ) :
+ x(value_type(s))
+ {}
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ tvec2<U> const & v
+ ) :
+ x(value_type(v.x))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ tvec3<U> const & v
+ ) :
+ x(value_type(v.x))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T>::tvec1
+ (
+ tvec4<U> const & v
+ ) :
+ x(value_type(v.x))
+ {}
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator=
+ (
+ tvec1<T> const & v
+ )
+ {
+ this->x = v.x;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x = T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator+=
+ (
+ U const & s
+ )
+ {
+ this->x += T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator+=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x += T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator-=
+ (
+ U const & s
+ )
+ {
+ this->x -= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator-=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x -= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator*=
+ (
+ U const & s
+ )
+ {
+ this->x *= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator*=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x *= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator/=
+ (
+ U const & s
+ )
+ {
+ this->x /= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator/=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x /= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator++()
+ {
+ ++this->x;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator--()
+ {
+ --this->x;
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return (v1.x == v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return (v1.x != v2.x);
+ }
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator%=
+ (
+ U const & s
+ )
+ {
+ this->x %= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator%=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x %= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator&=
+ (
+ U const & s
+ )
+ {
+ this->x &= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator&=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x &= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator|=
+ (
+ U const & s
+ )
+ {
+ this->x |= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator|=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x |= U(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator^=
+ (
+ U const & s
+ )
+ {
+ this->x ^= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator^=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x ^= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator<<=
+ (
+ U const & s
+ )
+ {
+ this->x <<= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator<<=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x <<= T(v.x);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator>>=
+ (
+ U const & s
+ )
+ {
+ this->x >>= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator>>=
+ (
+ tvec1<U> const & v
+ )
+ {
+ this->x >>= T(v.x);
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER T
+ tvec1<T>::swizzle(comp x) const
+ {
+ return (*this)[x];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>
+ tvec1<T>::swizzle
+ (
+ comp x,
+ comp y
+ ) const
+ {
+ return tvec2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>
+ tvec1<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ ) const
+ {
+ return tvec3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>
+ tvec1<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z,
+ comp w
+ ) const
+ {
+ return tvec4<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z],
+ (*this)[w]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T>
+ tvec1<T>::swizzle
+ (
+ comp x
+ )
+ {
+ return tref1<T>(
+ (*this)[x]);
+ }
+
+ //////////////////////////////////////
+ // Binary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator+
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator+
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s + v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator+
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x + v2.x);
+ }
+
+ //operator-
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator-
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator-
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s - v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator-
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x - v2.x);
+ }
+
+ //operator*
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator*
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator*
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s * v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator*
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x * v2.x);
+ }
+
+ //operator/
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator/
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator/
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s / v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator/
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x / v2.x);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator-
+ (
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ -v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator++
+ (
+ tvec1<T> const & v,
+ int
+ )
+ {
+ return tvec1<T>(
+ v.x + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator--
+ (
+ tvec1<T> const & v,
+ int
+ )
+ {
+ return tvec1<T>(
+ v.x - T(1));
+ }
+
+ //////////////////////////////////////
+ // Binary bit operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator%
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x % s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator%
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s % v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator%
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x % v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator&
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x & s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator&
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s & v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator&
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x & v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator|
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x | s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator|
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s | v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator|
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x | v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator^
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x ^ s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator^
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s ^ v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator^
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x ^ v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator<<
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x << s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator<<
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s << v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator<<
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x << v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator>>
+ (
+ tvec1<T> const & v,
+ typename tvec1<T>::value_type const & s
+ )
+ {
+ return tvec1<T>(
+ v.x >> s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator>>
+ (
+ typename tvec1<T>::value_type const & s,
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ s >> v.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator>>
+ (
+ tvec1<T> const & v1,
+ tvec1<T> const & v2
+ )
+ {
+ return tvec1<T>(
+ v1.x >> v2.x);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec1<T> operator~
+ (
+ tvec1<T> const & v
+ )
+ {
+ return tvec1<T>(
+ ~v.x);
+ }
+
+ //////////////////////////////////////
+ // tref definition
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T>::tref1
+ (
+ T & x
+ ) :
+ x(x)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T>::tref1
+ (
+ tref1<T> const & r
+ ) :
+ x(r.x)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T>::tref1
+ (
+ tvec1<T> const & v
+ ) :
+ x(v.x)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T> & tref1<T>::operator=
+ (
+ tref1<T> const & r
+ )
+ {
+ x = r.x;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref1<T> & tref1<T>::operator=
+ (
+ tvec1<T> const & v
+ )
+ {
+ x = v.x;
+ return *this;
+ }
+
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/type_vec2.hpp b/include/gal/opengl/glm/core/type_vec2.hpp
new file mode 100644
index 0000000..a858198
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec2.hpp
@@ -0,0 +1,317 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec2.hpp
+/// @date 2008-08-18 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_gentype2
+#define glm_core_type_gentype2
+
+#include "type_vec.hpp"
+#include "type_float.hpp"
+#include "type_int.hpp"
+#include "type_size.hpp"
+#include "_swizzle.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tref2;
+ template <typename T> struct tref3;
+ template <typename T> struct tref4;
+ template <typename T> struct tvec3;
+ template <typename T> struct tvec4;
+
+ template <typename T>
+ struct tvec2
+ {
+ enum ctor{null};
+
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec2<T> type;
+ typedef tvec2<bool> bool_type;
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ //////////////////////////////////////
+ // Data
+
+# if(GLM_COMPONENT == GLM_COMPONENT_CXX11)
+ union
+ {
+ struct{value_type x, y;};
+ struct{value_type r, g;};
+ struct{value_type s, t;};
+
+# if(defined(GLM_SWIZZLE))
+ _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y)
+ _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g)
+ _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t)
+ _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y)
+ _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g)
+ _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t)
+ _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y)
+ _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g)
+ _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t)
+# endif//(defined(GLM_SWIZZLE))
+ };
+# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98)
+ union {value_type x, r, s;};
+ union {value_type y, g, t;};
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF_FROM_VEC2(value_type, detail::tvec2, detail::tref2)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC2(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4)
+# endif//(defined(GLM_SWIZZLE))
+# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
+ value_type x, y;
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(value_type, detail::tvec2, detail::tref2, x, y)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4, x, y)
+# endif//(defined(GLM_SWIZZLE))
+# endif//GLM_COMPONENT
+
+ //////////////////////////////////////
+ // Accesses
+
+ GLM_FUNC_DECL value_type & operator[](size_type i);
+ GLM_FUNC_DECL value_type const & operator[](size_type i) const;
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ GLM_FUNC_DECL tvec2();
+ GLM_FUNC_DECL tvec2(tvec2<T> const & v);
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ GLM_FUNC_DECL explicit tvec2(
+ ctor);
+ GLM_FUNC_DECL explicit tvec2(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tvec2(
+ value_type const & s1,
+ value_type const & s2);
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ GLM_FUNC_DECL tvec2(tref2<T> const & r);
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec2(const glm::detail::swizzle<2,T,tvec2<T>,E0,E1,-1,-2>& that)
+ {
+ *this = that();
+ }
+
+ //////////////////////////////////////
+ // Convertion constructors
+
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec2(
+ U const & x);
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U, typename V>
+ GLM_FUNC_DECL explicit tvec2(
+ U const & x,
+ V const & y);
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec2(tvec2<U> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec2(tvec3<U> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec2(tvec4<U> const & v);
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ GLM_FUNC_DECL tvec2<T> & operator= (tvec2<T> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator= (tvec2<U> const & v);
+
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator+=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator+=(tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator-=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator-=(tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator*=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator*=(tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator/=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator/=(tvec2<U> const & v);
+ GLM_FUNC_DECL tvec2<T> & operator++();
+ GLM_FUNC_DECL tvec2<T> & operator--();
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator%= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator%= (tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator&= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator&= (tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator|= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator|= (tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator^= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator^= (tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator<<=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator<<=(tvec2<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator>>=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec2<T> & operator>>=(tvec2<U> const & v);
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ GLM_FUNC_DECL value_type swizzle(comp X) const;
+ GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
+ GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
+ GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
+ GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
+ };
+
+ template <typename T>
+ struct tref2
+ {
+ GLM_FUNC_DECL tref2(T & x, T & y);
+ GLM_FUNC_DECL tref2(tref2<T> const & r);
+ GLM_FUNC_DECL explicit tref2(tvec2<T> const & v);
+
+ GLM_FUNC_DECL tref2<T> & operator= (tref2<T> const & r);
+ GLM_FUNC_DECL tref2<T> & operator= (tvec2<T> const & v);
+
+ GLM_FUNC_DECL tvec2<T> operator() ();
+
+ T & x;
+ T & y;
+ };
+
+ GLM_DETAIL_IS_VECTOR(tvec2);
+
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 2 components vector of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<highp_float> highp_vec2;
+
+ /// 2 components vector of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<mediump_float> mediump_vec2;
+
+ /// 2 components vector of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<lowp_float> lowp_vec2;
+
+ /// 2 components vector of high precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<highp_int> highp_ivec2;
+
+ /// 2 components vector of medium precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<mediump_int> mediump_ivec2;
+
+ /// 2 components vector of low precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<lowp_int> lowp_ivec2;
+
+ /// 2 components vector of high precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<highp_uint> highp_uvec2;
+
+ /// 2 components vector of medium precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<mediump_uint> mediump_uvec2;
+
+ /// 2 components vector of low precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec2<lowp_uint> lowp_uvec2;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_vec2.inl"
+#endif//GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_gentype2
diff --git a/include/gal/opengl/glm/core/type_vec2.inl b/include/gal/opengl/glm/core/type_vec2.inl
new file mode 100644
index 0000000..32e4f9f
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec2.inl
@@ -0,0 +1,998 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_tvec2.inl
+/// @date 2008-08-18 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec2<T>::size_type tvec2<T>::length() const
+ {
+ return 2;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec2<T>::value_type &
+ tvec2<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec2<T>::value_type const &
+ tvec2<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2() :
+ x(value_type(0)),
+ y(value_type(0))
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ tvec2<T> const & v
+ ) :
+ x(v.x),
+ y(v.y)
+ {}
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ value_type const & s
+ ) :
+ x(s),
+ y(s)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ value_type const & s1,
+ value_type const & s2
+ ) :
+ x(s1),
+ y(s2)
+ {}
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ tref2<T> const & r
+ ) :
+ x(r.x),
+ y(r.y)
+ {}
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ U const & x
+ ) :
+ x(value_type(x)),
+ y(value_type(x))
+ {}
+
+ template <typename T>
+ template <typename U, typename V>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ U const & a,
+ V const & b
+ ) :
+ x(value_type(a)),
+ y(value_type(b))
+ {}
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ tvec2<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ tvec3<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T>::tvec2
+ (
+ tvec4<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y))
+ {}
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator=
+ (
+ tvec2<T> const & v
+ )
+ {
+ this->x = v.x;
+ this->y = v.y;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x = T(v.x);
+ this->y = T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator+=(U s)
+ {
+ this->x += T(s);
+ this->y += T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator+=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x += T(v.x);
+ this->y += T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator-=(U s)
+ {
+ this->x -= T(s);
+ this->y -= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator-=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x -= T(v.x);
+ this->y -= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator*=(U s)
+ {
+ this->x *= T(s);
+ this->y *= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator*=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x *= T(v.x);
+ this->y *= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator/=(U s)
+ {
+ this->x /= T(s);
+ this->y /= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator/=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x /= T(v.x);
+ this->y /= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator++()
+ {
+ ++this->x;
+ ++this->y;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator--()
+ {
+ --this->x;
+ --this->y;
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return (v1.x == v2.x) && (v1.y == v2.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return (v1.x != v2.x) || (v1.y != v2.y);
+ }
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator%=(U s)
+ {
+ this->x %= T(s);
+ this->y %= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator%=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x %= T(v.x);
+ this->y %= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator&=(U s)
+ {
+ this->x &= T(s);
+ this->y &= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator&=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x &= T(v.x);
+ this->y &= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator|=(U s)
+ {
+ this->x |= T(s);
+ this->y |= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator|=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x |= T(v.x);
+ this->y |= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator^=(U s)
+ {
+ this->x ^= T(s);
+ this->y ^= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator^=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x ^= T(v.x);
+ this->y ^= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator<<=(U s)
+ {
+ this->x <<= T(s);
+ this->y <<= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator<<=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x <<= T(v.x);
+ this->y <<= T(v.y);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator>>=(U s)
+ {
+ this->x >>= T(s);
+ this->y >>= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator>>=
+ (
+ tvec2<U> const & v
+ )
+ {
+ this->x >>= T(v.x);
+ this->y >>= T(v.y);
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec2<T>::value_type tvec2<T>::swizzle
+ (
+ comp x
+ ) const
+ {
+ return (*this)[x];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> tvec2<T>::swizzle
+ (
+ comp x,
+ comp y
+ ) const
+ {
+ return tvec2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> tvec2<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ ) const
+ {
+ return tvec3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> tvec2<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z,
+ comp w
+ ) const
+ {
+ return tvec4<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z],
+ (*this)[w]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref2<T> tvec2<T>::swizzle
+ (
+ comp x,
+ comp y
+ )
+ {
+ return tref2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ //////////////////////////////////////
+ // Binary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator+
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x + T(s),
+ v.y + T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator+
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) + v.x,
+ T(s) + v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator+
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x + T(v2.x),
+ v1.y + T(v2.y));
+ }
+
+ //operator-
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator-
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x - T(s),
+ v.y - T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator-
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) - v.x,
+ T(s) - v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator-
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x - T(v2.x),
+ v1.y - T(v2.y));
+ }
+
+ //operator*
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator*
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x * T(s),
+ v.y * T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator*
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) * v.x,
+ T(s) * v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator*
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x * T(v2.x),
+ v1.y * T(v2.y));
+ }
+
+ //operator/
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator/
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x / T(s),
+ v.y / T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator/
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) / v.x,
+ T(s) / v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator/
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x / T(v2.x),
+ v1.y / T(v2.y));
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator-
+ (
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ -v.x,
+ -v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator++
+ (
+ tvec2<T> const & v,
+ int
+ )
+ {
+ return tvec2<T>(
+ v.x + T(1),
+ v.y + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator--
+ (
+ tvec2<T> const & v,
+ int
+ )
+ {
+ return tvec2<T>(
+ v.x - T(1),
+ v.y - T(1));
+ }
+
+ //////////////////////////////////////
+ // Binary bit operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator%
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x % T(s),
+ v.y % T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator%
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) % v.x,
+ T(s) % v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator%
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x % T(v2.x),
+ v1.y % T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator&
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x & T(s),
+ v.y & T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator&
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) & v.x,
+ T(s) & v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator&
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x & T(v2.x),
+ v1.y & T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator|
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x | T(s),
+ v.y | T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator|
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) | v.x,
+ T(s) | v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator|
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x | T(v2.x),
+ v1.y | T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator^
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x ^ T(s),
+ v.y ^ T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator^
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) ^ v.x,
+ T(s) ^ v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator^
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x ^ T(v2.x),
+ v1.y ^ T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator<<
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x << T(s),
+ v.y << T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator<<
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ s << T(v.x),
+ s << T(v.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator<<
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x << T(v2.x),
+ v1.y << T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator>>
+ (
+ tvec2<T> const & v,
+ T const & s
+ )
+ {
+ return tvec2<T>(
+ v.x >> T(s),
+ v.y >> T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator>>
+ (
+ T const & s,
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ T(s) >> v.x,
+ T(s) >> v.y);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator>>
+ (
+ tvec2<T> const & v1,
+ tvec2<T> const & v2
+ )
+ {
+ return tvec2<T>(
+ v1.x >> T(v2.x),
+ v1.y >> T(v2.y));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> operator~
+ (
+ tvec2<T> const & v
+ )
+ {
+ return tvec2<T>(
+ ~v.x,
+ ~v.y);
+ }
+
+ //////////////////////////////////////
+ // tref definition
+
+ template <typename T>
+ tref2<T>::tref2
+ (
+ T & x,
+ T & y
+ ) :
+ x(x),
+ y(y)
+ {}
+
+ template <typename T>
+ tref2<T>::tref2
+ (
+ tref2<T> const & r
+ ) :
+ x(r.x),
+ y(r.y)
+ {}
+
+ template <typename T>
+ tref2<T>::tref2
+ (
+ tvec2<T> const & v
+ ) :
+ x(v.x),
+ y(v.y)
+ {}
+
+ template <typename T>
+ tref2<T>& tref2<T>::operator=
+ (
+ tref2<T> const & r
+ )
+ {
+ x = r.x;
+ y = r.y;
+ return *this;
+ }
+
+ template <typename T>
+ tref2<T>& tref2<T>::operator=
+ (
+ tvec2<T> const & v
+ )
+ {
+ x = v.x;
+ y = v.y;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> tref2<T>::operator() ()
+ {
+ return tvec2<T>(this->x, this->y);
+ }
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/type_vec3.hpp b/include/gal/opengl/glm/core/type_vec3.hpp
new file mode 100644
index 0000000..ea265ca
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec3.hpp
@@ -0,0 +1,342 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec3.hpp
+/// @date 2008-08-22 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_gentype3
+#define glm_core_type_gentype3
+
+#include "type_vec.hpp"
+#include "type_float.hpp"
+#include "type_int.hpp"
+#include "type_size.hpp"
+#include "_swizzle.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tref2;
+ template <typename T> struct tref3;
+ template <typename T> struct tref4;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec4;
+
+ template <typename T>
+ struct tvec3
+ {
+ enum ctor{null};
+
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec3<T> type;
+ typedef tvec3<bool> bool_type;
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ //////////////////////////////////////
+ // Data
+
+# if(GLM_COMPONENT == GLM_COMPONENT_CXX11)
+ union
+ {
+ struct{value_type x, y, z;};
+ struct{value_type r, g, b;};
+ struct{value_type s, t, p;};
+
+# if(defined(GLM_SWIZZLE))
+ _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y, z)
+ _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g, b)
+ _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t, p)
+ _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y, z)
+ _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g, b)
+ _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t, p)
+ _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y, z)
+ _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g, b)
+ _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t, p)
+# endif//(defined(GLM_SWIZZLE))
+ };
+# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98)
+ union {value_type x, r, s;};
+ union {value_type y, g, t;};
+ union {value_type z, b, p;};
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, detail::tvec3, detail::tref2, detail::tref3)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4)
+# endif//(defined(GLM_SWIZZLE))
+# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
+ value_type x, y, z;
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, detail::tvec3, detail::tref2, detail::tref3, x, y, z)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4, x, y, z)
+# endif//(defined(GLM_SWIZZLE))
+# endif//GLM_COMPONENT
+
+ //////////////////////////////////////
+ // Accesses
+
+ GLM_FUNC_DECL value_type & operator[](size_type i);
+ GLM_FUNC_DECL value_type const & operator[](size_type i) const;
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ GLM_FUNC_DECL tvec3();
+ GLM_FUNC_DECL tvec3(tvec3<T> const & v);
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ GLM_FUNC_DECL explicit tvec3(
+ ctor);
+ GLM_FUNC_DECL explicit tvec3(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tvec3(
+ value_type const & s1,
+ value_type const & s2,
+ value_type const & s3);
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec3(
+ U const & x);
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U, typename V, typename W>
+ GLM_FUNC_DECL explicit tvec3(
+ U const & x,
+ V const & y,
+ W const & z);
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ //! 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 explicit tvec3(tvec2<A> const & v, B const & s);
+ //! 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 explicit tvec3(A const & s, tvec2<B> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec3(tvec3<U> const & v);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec3(tvec4<U> const & v);
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ GLM_FUNC_DECL tvec3(tref3<T> const & r);
+
+ template <typename A, typename B>
+ GLM_FUNC_DECL explicit tvec3(tref2<A> const & v, B const & s);
+
+ template <typename A, typename B>
+ GLM_FUNC_DECL explicit tvec3(A const & s, tref2<B> const & v);
+
+ template <int E0, int E1, int E2>
+ GLM_FUNC_DECL tvec3(glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & that)
+ {
+ *this = that();
+ }
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec3(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & s)
+ {
+ *this = tvec3<T>(v(), s);
+ }
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec3(T const & s, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v)
+ {
+ *this = tvec3<T>(s, v());
+ }
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ GLM_FUNC_DECL tvec3<T> & operator= (tvec3<T> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator= (tvec3<U> const & v);
+
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator+=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator+=(tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator-=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator-=(tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator*=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator*=(tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator/=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator/=(tvec3<U> const & v);
+ GLM_FUNC_DECL tvec3<T> & operator++();
+ GLM_FUNC_DECL tvec3<T> & operator--();
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator%= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator%= (tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator&= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator&= (tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator|= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator|= (tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator^= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator^= (tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator<<=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator<<=(tvec3<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator>>=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec3<T> & operator>>=(tvec3<U> const & v);
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ GLM_FUNC_DECL value_type swizzle(comp X) const;
+ GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
+ GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
+ GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
+ GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
+ GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z);
+ };
+
+ template <typename T>
+ struct tref3
+ {
+ GLM_FUNC_DECL tref3(T & x, T & y, T & z);
+ GLM_FUNC_DECL tref3(tref3<T> const & r);
+ GLM_FUNC_DECL explicit tref3(tvec3<T> const & v);
+
+ GLM_FUNC_DECL tref3<T> & operator= (tref3<T> const & r);
+ GLM_FUNC_DECL tref3<T> & operator= (tvec3<T> const & v);
+
+ GLM_FUNC_DECL tvec3<T> operator() ();
+
+ T & x;
+ T & y;
+ T & z;
+ };
+
+ GLM_DETAIL_IS_VECTOR(tvec3);
+} //namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 3 components vector of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<highp_float> highp_vec3;
+
+ /// 3 components vector of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<mediump_float> mediump_vec3;
+
+ /// 3 components vector of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<lowp_float> lowp_vec3;
+
+ /// 3 components vector of high precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<highp_int> highp_ivec3;
+
+ /// 3 components vector of medium precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<mediump_int> mediump_ivec3;
+
+ /// 3 components vector of low precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<lowp_int> lowp_ivec3;
+
+ /// 3 components vector of high precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<highp_uint> highp_uvec3;
+
+ /// 3 components vector of medium precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<mediump_uint> mediump_uvec3;
+
+ /// 3 components vector of low precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec3<lowp_uint> lowp_uvec3;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_vec3.inl"
+#endif//GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_gentype3
diff --git a/include/gal/opengl/glm/core/type_vec3.inl b/include/gal/opengl/glm/core/type_vec3.inl
new file mode 100644
index 0000000..2279abf
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec3.inl
@@ -0,0 +1,1122 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_tvec3.inl
+/// @date 2008-08-22 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec3<T>::size_type tvec3<T>::length() const
+ {
+ return 3;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec3<T>::value_type &
+ tvec3<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec3<T>::value_type const &
+ tvec3<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3() :
+ x(value_type(0)),
+ y(value_type(0)),
+ z(value_type(0))
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tvec3<T> const & v
+ ) :
+ x(v.x),
+ y(v.y),
+ z(v.z)
+ {}
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ value_type const & s
+ ) :
+ x(s),
+ y(s),
+ z(s)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ value_type const & s0,
+ value_type const & s1,
+ value_type const & s2
+ ) :
+ x(s0),
+ y(s1),
+ z(s2)
+ {}
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tref3<T> const & r
+ ) :
+ x(r.x),
+ y(r.y),
+ z(r.z)
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tref2<A> const & v,
+ B const & s
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(s))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ A const & s,
+ tref2<B> const & v
+ ) :
+ x(value_type(s)),
+ y(value_type(v.x)),
+ z(value_type(v.y))
+ {}
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ U const & s
+ ) :
+ x(value_type(s)),
+ y(value_type(s)),
+ z(value_type(s))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ A const & x,
+ B const & y,
+ C const & z
+ ) :
+ x(value_type(x)),
+ y(value_type(y)),
+ z(value_type(z))
+ {}
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tvec2<A> const & v,
+ B const & s
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(s))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ A const & s,
+ tvec2<B> const & v
+ ) :
+ x(value_type(s)),
+ y(value_type(v.x)),
+ z(value_type(v.y))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tvec3<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(v.z))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T>::tvec3
+ (
+ tvec4<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(v.z))
+ {}
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T>& tvec3<T>::operator=
+ (
+ tvec3<T> const & v
+ )
+ {
+ this->x = v.x;
+ this->y = v.y;
+ this->z = v.z;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T>& tvec3<T>::operator=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x = T(v.x);
+ this->y = T(v.y);
+ this->z = T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator+=(U s)
+ {
+ this->x += T(s);
+ this->y += T(s);
+ this->z += T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator+=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x += T(v.x);
+ this->y += T(v.y);
+ this->z += T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator-=(U s)
+ {
+ this->x -= T(s);
+ this->y -= T(s);
+ this->z -= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator-=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x -= T(v.x);
+ this->y -= T(v.y);
+ this->z -= T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator*=(U s)
+ {
+ this->x *= T(s);
+ this->y *= T(s);
+ this->z *= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator*=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x *= T(v.x);
+ this->y *= T(v.y);
+ this->z *= T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator/=(U s)
+ {
+ this->x /= T(s);
+ this->y /= T(s);
+ this->z /= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator/=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x /= T(v.x);
+ this->y /= T(v.y);
+ this->z /= T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator++()
+ {
+ ++this->x;
+ ++this->y;
+ ++this->z;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator--()
+ {
+ --this->x;
+ --this->y;
+ --this->z;
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z);
+ }
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator%=(U s)
+ {
+ this->x %= s;
+ this->y %= s;
+ this->z %= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator%=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x %= v.x;
+ this->y %= v.y;
+ this->z %= v.z;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator&=(U s)
+ {
+ this->x &= s;
+ this->y &= s;
+ this->z &= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator&=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x &= v.x;
+ this->y &= v.y;
+ this->z &= v.z;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator|=(U s)
+ {
+ this->x |= s;
+ this->y |= s;
+ this->z |= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator|=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x |= v.x;
+ this->y |= v.y;
+ this->z |= v.z;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator^=(U s)
+ {
+ this->x ^= s;
+ this->y ^= s;
+ this->z ^= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator^=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x ^= v.x;
+ this->y ^= v.y;
+ this->z ^= v.z;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator<<=(U s)
+ {
+ this->x <<= s;
+ this->y <<= s;
+ this->z <<= s;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator<<=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x <<= T(v.x);
+ this->y <<= T(v.y);
+ this->z <<= T(v.z);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator>>=(U s)
+ {
+ this->x >>= T(s);
+ this->y >>= T(s);
+ this->z >>= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator>>=
+ (
+ tvec3<U> const & v
+ )
+ {
+ this->x >>= T(v.x);
+ this->y >>= T(v.y);
+ this->z >>= T(v.z);
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec3<T>::value_type
+ tvec3<T>::swizzle
+ (
+ comp x
+ ) const
+ {
+ return (*this)[x];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> tvec3<T>::swizzle
+ (
+ comp x,
+ comp y
+ ) const
+ {
+ return tvec2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> tvec3<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ ) const
+ {
+ return tvec3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> tvec3<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z,
+ comp w
+ ) const
+ {
+ return tvec4<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z],
+ (*this)[w]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref2<T> tvec3<T>::swizzle
+ (
+ comp x,
+ comp y
+ )
+ {
+ return tref2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T> tvec3<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ )
+ {
+ return tref3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ //////////////////////////////////////
+ // Binary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator+
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x + T(s),
+ v.y + T(s),
+ v.z + T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator+
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) + v.x,
+ T(s) + v.y,
+ T(s) + v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator+
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x + T(v2.x),
+ v1.y + T(v2.y),
+ v1.z + T(v2.z));
+ }
+
+ //operator-
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator-
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x - T(s),
+ v.y - T(s),
+ v.z - T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator-
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) - v.x,
+ T(s) - v.y,
+ T(s) - v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator-
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x - T(v2.x),
+ v1.y - T(v2.y),
+ v1.z - T(v2.z));
+ }
+
+ //operator*
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator*
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x * T(s),
+ v.y * T(s),
+ v.z * T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator*
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) * v.x,
+ T(s) * v.y,
+ T(s) * v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator*
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x * T(v2.x),
+ v1.y * T(v2.y),
+ v1.z * T(v2.z));
+ }
+
+ //operator/
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator/
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x / T(s),
+ v.y / T(s),
+ v.z / T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator/
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) / v.x,
+ T(s) / v.y,
+ T(s) / v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator/
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x / T(v2.x),
+ v1.y / T(v2.y),
+ v1.z / T(v2.z));
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator-
+ (
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ -v.x,
+ -v.y,
+ -v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator++
+ (
+ tvec3<T> const & v,
+ int
+ )
+ {
+ return tvec3<T>(
+ v.x + T(1),
+ v.y + T(1),
+ v.z + T(1));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator--
+ (
+ tvec3<T> const & v,
+ int
+ )
+ {
+ return tvec3<T>(
+ v.x - T(1),
+ v.y - T(1),
+ v.z - T(1));
+ }
+
+ //////////////////////////////////////
+ // Binary bit operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator%
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x % T(s),
+ v.y % T(s),
+ v.z % T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator%
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) % v.x,
+ T(s) % v.y,
+ T(s) % v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator%
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x % T(v2.x),
+ v1.y % T(v2.y),
+ v1.z % T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator&
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x & T(s),
+ v.y & T(s),
+ v.z & T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator&
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) & v.x,
+ T(s) & v.y,
+ T(s) & v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator&
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x & T(v2.x),
+ v1.y & T(v2.y),
+ v1.z & T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator|
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x | T(s),
+ v.y | T(s),
+ v.z | T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator|
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) | v.x,
+ T(s) | v.y,
+ T(s) | v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator|
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x | T(v2.x),
+ v1.y | T(v2.y),
+ v1.z | T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator^
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x ^ T(s),
+ v.y ^ T(s),
+ v.z ^ T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator^
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) ^ v.x,
+ T(s) ^ v.y,
+ T(s) ^ v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator^
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x ^ T(v2.x),
+ v1.y ^ T(v2.y),
+ v1.z ^ T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator<<
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x << T(s),
+ v.y << T(s),
+ v.z << T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator<<
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ T(s) << v.x,
+ T(s) << v.y,
+ T(s) << v.z);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator<<
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x << T(v2.x),
+ v1.y << T(v2.y),
+ v1.z << T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator>>
+ (
+ tvec3<T> const & v,
+ T const & s
+ )
+ {
+ return tvec3<T>(
+ v.x >> T(s),
+ v.y >> T(s),
+ v.z >> T(s));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator>>
+ (
+ T const & s,
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ s >> T(v.x),
+ s >> T(v.y),
+ s >> T(v.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator>>
+ (
+ tvec3<T> const & v1,
+ tvec3<T> const & v2
+ )
+ {
+ return tvec3<T>(
+ v1.x >> T(v2.x),
+ v1.y >> T(v2.y),
+ v1.z >> T(v2.z));
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> operator~
+ (
+ tvec3<T> const & v
+ )
+ {
+ return tvec3<T>(
+ ~v.x,
+ ~v.y,
+ ~v.z);
+ }
+
+ //////////////////////////////////////
+ // tref definition
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T>::tref3(T & x, T & y, T & z) :
+ x(x),
+ y(y),
+ z(z)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T>::tref3
+ (
+ tref3<T> const & r
+ ) :
+ x(r.x),
+ y(r.y),
+ z(r.z)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T>::tref3
+ (
+ tvec3<T> const & v
+ ) :
+ x(v.x),
+ y(v.y),
+ z(v.z)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T> & tref3<T>::operator=
+ (
+ tref3<T> const & r
+ )
+ {
+ x = r.x;
+ y = r.y;
+ z = r.z;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T> & tref3<T>::operator=
+ (
+ tvec3<T> const & v
+ )
+ {
+ x = v.x;
+ y = v.y;
+ z = v.z;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> tref3<T>::operator() ()
+ {
+ return tvec3<T>(this->x, this->y, this->z);
+ }
+
+}//namespace detail
+}//namespace glm
diff --git a/include/gal/opengl/glm/core/type_vec4.hpp b/include/gal/opengl/glm/core/type_vec4.hpp
new file mode 100644
index 0000000..d1e1b71
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec4.hpp
@@ -0,0 +1,399 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_vec4.hpp
+/// @date 2008-08-22 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef glm_core_type_gentype4
+#define glm_core_type_gentype4
+
+#include "type_vec.hpp"
+#include "type_float.hpp"
+#include "type_int.hpp"
+#include "type_size.hpp"
+#include "_swizzle.hpp"
+
+namespace glm{
+namespace detail
+{
+ template <typename T> struct tref2;
+ template <typename T> struct tref3;
+ template <typename T> struct tref4;
+ template <typename T> struct tvec2;
+ template <typename T> struct tvec3;
+
+ template <typename T>
+ struct tvec4
+ {
+ enum ctor{null};
+
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef tvec4<T> type;
+ typedef tvec4<bool> bool_type;
+
+ GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const;
+
+ //////////////////////////////////////
+ // Data
+
+# if(GLM_COMPONENT == GLM_COMPONENT_CXX11)
+ union
+ {
+ struct{value_type x, y, z, w;};
+ struct{value_type r, g, b, a;};
+ struct{value_type s, t, p, q;};
+
+# if(defined(GLM_SWIZZLE))
+ _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y, z, w)
+ _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g, b, a)
+ _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t, p, q)
+ _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y, z, w)
+ _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g, b, a)
+ _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t, p, q)
+ _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y, z, w)
+ _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g, b, a)
+ _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t, p, q)
+# endif//(defined(GLM_SWIZZLE))
+ };
+# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98)
+ union {value_type x, r, s;};
+ union {value_type y, g, t;};
+ union {value_type z, b, p;};
+ union {value_type w, a, q;};
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, detail::tvec4, detail::tref2, detail::tref3, detail::tref4)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, detail::tvec4, detail::tvec2, detail::tvec3, detail::tvec4)
+# endif//(defined(GLM_SWIZZLE))
+# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
+ value_type x, y, z, w;
+
+# if(defined(GLM_SWIZZLE))
+ // Defines all he swizzle operator as functions
+ GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, detail::tvec4, detail::tref2, detail::tref3, detail::tref4, x, y, z, w)
+ GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, detail::tvec4, detail::tvec2, detail::tvec3, detail::tvec4, x, y, z, w)
+# endif//(defined(GLM_SWIZZLE))
+# endif//GLM_COMPONENT
+
+ //////////////////////////////////////
+ // Accesses
+
+ GLM_FUNC_DECL value_type & operator[](size_type i);
+ GLM_FUNC_DECL value_type const & operator[](size_type i) const;
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ GLM_FUNC_DECL tvec4();
+ GLM_FUNC_DECL tvec4(type const & v);
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ GLM_FUNC_DECL explicit tvec4(
+ ctor);
+ GLM_FUNC_DECL explicit tvec4(
+ value_type const & s);
+ GLM_FUNC_DECL explicit tvec4(
+ value_type const & s0,
+ value_type const & s1,
+ value_type const & s2,
+ value_type const & s3);
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec4(
+ U const & x);
+ //! 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 explicit tvec4(
+ A const & x,
+ B const & y,
+ C const & z,
+ D const & w);
+
+ //////////////////////////////////////
+ // Convertion 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>
+ GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2);
+ //! 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 explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2);
+ //! 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 explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v);
+ //! 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 explicit tvec4(tvec3<A> const & v, B const & s);
+ //! 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 explicit tvec4(A const & s, tvec3<B> const & v);
+ //! 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 explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2);
+ //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+ template <typename U>
+ GLM_FUNC_DECL explicit tvec4(tvec4<U> const & v);
+
+ template <int E0, int E1, int E2, int E3>
+ GLM_FUNC_DECL tvec4(glm::detail::swizzle<4, T, tvec4<T>, E0, E1, E2, E3> const & that)
+ {
+ *this = that();
+ }
+
+ template <int E0, int E1, int F0, int F1>
+ GLM_FUNC_DECL tvec4(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, glm::detail::swizzle<2, T, tvec2<T>, F0, F1, -1, -2> const & u)
+ {
+ *this = tvec4<T>(v(), u());
+ }
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec4(T const & x, T const & y, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v)
+ {
+ *this = tvec4<T>(x, y, v());
+ }
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec4(T const & x, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & w)
+ {
+ *this = tvec4<T>(x, v(), w);
+ }
+
+ template <int E0, int E1>
+ GLM_FUNC_DECL tvec4(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & z, T const & w)
+ {
+ *this = tvec4<T>(v(), z, w);
+ }
+
+ template <int E0, int E1, int E2>
+ GLM_FUNC_DECL tvec4(glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & v, T const & w)
+ {
+ *this = tvec4<T>(v(), w);
+ }
+
+ template <int E0, int E1, int E2>
+ GLM_FUNC_DECL tvec4(T const & x, glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & v)
+ {
+ *this = tvec4<T>(x, v());
+ }
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ GLM_FUNC_DECL tvec4(tref4<T> const & r);
+
+ //! 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 explicit tvec4(tref2<A> const & v, B const & s1, C const & s2);
+ //! 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 explicit tvec4(A const & s1, tref2<B> const & v, C const & s2);
+ //! 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 explicit tvec4(A const & s1, B const & s2, tref2<C> const & v);
+ //! 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 explicit tvec4(tref3<A> const & v, B const & s);
+ //! 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 explicit tvec4(A const & s, tref3<B> const & v);
+ //! 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 explicit tvec4(tref2<A> const & v1, tref2<B> 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 explicit tvec4(tvec2<A> const & v1, tref2<B> 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 explicit tvec4(tref2<A> const & v1, tvec2<B> const & v2);
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ GLM_FUNC_DECL tvec4<T> & operator= (tvec4<T> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator= (tvec4<U> const & v);
+
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator+=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator+=(tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator-=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator-=(tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator*=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator*=(tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator/=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator/=(tvec4<U> const & v);
+ GLM_FUNC_DECL tvec4<T> & operator++();
+ GLM_FUNC_DECL tvec4<T> & operator--();
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator%= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator%= (tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator&= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator&= (tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator|= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator|= (tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator^= (U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator^= (tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator<<=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator<<=(tvec4<U> const & v);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator>>=(U s);
+ template <typename U>
+ GLM_FUNC_DECL tvec4<T> & operator>>=(tvec4<U> const & v);
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ GLM_FUNC_DECL value_type swizzle(comp X) const;
+ GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
+ GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
+ GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
+ GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
+ GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z);
+ GLM_FUNC_DECL tref4<T> swizzle(comp X, comp Y, comp Z, comp W);
+ };
+
+ template <typename T>
+ struct tref4
+ {
+ GLM_FUNC_DECL tref4(T & x, T & y, T & z, T & w);
+ GLM_FUNC_DECL tref4(tref4<T> const & r);
+ GLM_FUNC_DECL explicit tref4(tvec4<T> const & v);
+
+ GLM_FUNC_DECL tref4<T> & operator= (tref4<T> const & r);
+ GLM_FUNC_DECL tref4<T> & operator= (tvec4<T> const & v);
+
+ GLM_FUNC_DECL tvec4<T> operator() ();
+
+ T & x;
+ T & y;
+ T & z;
+ T & w;
+ };
+
+ GLM_DETAIL_IS_VECTOR(tvec4);
+}//namespace detail
+
+ /// @addtogroup core_precision
+ /// @{
+
+ /// 4 components vector of high precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<highp_float> highp_vec4;
+
+ /// 4 components vector of medium precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<mediump_float> mediump_vec4;
+
+ /// 4 components vector of low precision floating-point numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<lowp_float> lowp_vec4;
+
+ /// 4 components vector of high precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<highp_int> highp_ivec4;
+
+ /// 4 components vector of medium precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<mediump_int> mediump_ivec4;
+
+ /// 4 components vector of low precision signed integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<lowp_int> lowp_ivec4;
+
+ /// 4 components vector of high precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<highp_uint> highp_uvec4;
+
+ /// 4 components vector of medium precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<mediump_uint> mediump_uvec4;
+
+ /// 4 components vector of low precision unsigned integer numbers.
+ /// There is no guarantee on the actual precision.
+ ///
+ /// @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 detail::tvec4<lowp_uint> lowp_uvec4;
+
+ /// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "type_vec4.inl"
+#endif//GLM_EXTERNAL_TEMPLATE
+
+#endif//glm_core_type_gentype4
diff --git a/include/gal/opengl/glm/core/type_vec4.inl b/include/gal/opengl/glm/core/type_vec4.inl
new file mode 100644
index 0000000..7f98c1b
--- /dev/null
+++ b/include/gal/opengl/glm/core/type_vec4.inl
@@ -0,0 +1,1348 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref core
+/// @file glm/core/type_tvec4.inl
+/// @date 2008-08-23 / 2011-06-15
+/// @author Christophe Riccio
+///////////////////////////////////////////////////////////////////////////////////
+
+namespace glm{
+namespace detail
+{
+ template <typename T>
+ GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec4<T>::size_type tvec4<T>::length() const
+ {
+ return 4;
+ }
+
+ //////////////////////////////////////
+ // Accesses
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec4<T>::value_type &
+ tvec4<T>::operator[]
+ (
+ size_type i
+ )
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec4<T>::value_type const &
+ tvec4<T>::operator[]
+ (
+ size_type i
+ ) const
+ {
+ assert(i < this->length());
+ return (&x)[i];
+ }
+
+ //////////////////////////////////////
+ // Implicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4() :
+ x(value_type(0)),
+ y(value_type(0)),
+ z(value_type(0)),
+ w(value_type(0))
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ ctor
+ )
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ type const & v
+ ) :
+ x(v.x),
+ y(v.y),
+ z(v.z),
+ w(v.w)
+ {}
+
+ //////////////////////////////////////
+ // Explicit basic constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ value_type const & s
+ ) :
+ x(s),
+ y(s),
+ z(s),
+ w(s)
+ {}
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ value_type const & s1,
+ value_type const & s2,
+ value_type const & s3,
+ value_type const & s4
+ ) :
+ x(s1),
+ y(s2),
+ z(s3),
+ w(s4)
+ {}
+
+ //////////////////////////////////////
+ // Swizzle constructors
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tref4<T> const & r
+ ) :
+ x(r.x),
+ y(r.y),
+ z(r.z),
+ w(r.w)
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tref2<A> const & v,
+ B const & s1,
+ C const & s2
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(s1)),
+ w(value_type(s2))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s1,
+ tref2<B> const & v,
+ C const & s2
+ ) :
+ x(value_type(s1)),
+ y(value_type(v.x)),
+ z(value_type(v.y)),
+ w(value_type(s2))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s1,
+ B const & s2,
+ tref2<C> const & v
+ ) :
+ x(value_type(s1)),
+ y(value_type(s2)),
+ z(value_type(v.x)),
+ w(value_type(v.y))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tref3<A> const & v,
+ B const & s
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(v.z)),
+ w(value_type(s))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s,
+ tref3<B> const & v
+ ) :
+ x(value_type(s)),
+ y(value_type(v.x)),
+ z(value_type(v.y)),
+ w(value_type(v.z))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tref2<A> const & v1,
+ tref2<B> const & v2
+ ) :
+ x(value_type(v1.x)),
+ y(value_type(v1.y)),
+ z(value_type(v2.x)),
+ w(value_type(v2.y))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tvec2<A> const & v1,
+ tref2<B> const & v2
+ ) :
+ x(value_type(v1.x)),
+ y(value_type(v1.y)),
+ z(value_type(v2.x)),
+ w(value_type(v2.y))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tref2<A> const & v1,
+ tvec2<B> const & v2
+ ) :
+ x(value_type(v1.x)),
+ y(value_type(v1.y)),
+ z(value_type(v2.x)),
+ w(value_type(v2.y))
+ {}
+
+ //////////////////////////////////////
+ // Convertion scalar constructors
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ U const & x
+ ) :
+ x(value_type(x)),
+ y(value_type(x)),
+ z(value_type(x)),
+ w(value_type(x))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C, typename D>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & x,
+ B const & y,
+ C const & z,
+ D const & w
+ ) :
+ x(value_type(x)),
+ y(value_type(y)),
+ z(value_type(z)),
+ w(value_type(w))
+ {}
+
+ //////////////////////////////////////
+ // Convertion vector constructors
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tvec2<A> const & v,
+ B const & s1,
+ C const & s2
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(s1)),
+ w(value_type(s2))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s1,
+ tvec2<B> const & v,
+ C const & s2
+ ) :
+ x(value_type(s1)),
+ y(value_type(v.x)),
+ z(value_type(v.y)),
+ w(value_type(s2))
+ {}
+
+ template <typename T>
+ template <typename A, typename B, typename C>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s1,
+ B const & s2,
+ tvec2<C> const & v
+ ) :
+ x(value_type(s1)),
+ y(value_type(s2)),
+ z(value_type(v.x)),
+ w(value_type(v.y))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tvec3<A> const & v,
+ B const & s
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(v.z)),
+ w(value_type(s))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ A const & s,
+ tvec3<B> const & v
+ ) :
+ x(value_type(s)),
+ y(value_type(v.x)),
+ z(value_type(v.y)),
+ w(value_type(v.z))
+ {}
+
+ template <typename T>
+ template <typename A, typename B>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tvec2<A> const & v1,
+ tvec2<B> const & v2
+ ) :
+ x(value_type(v1.x)),
+ y(value_type(v1.y)),
+ z(value_type(v2.x)),
+ w(value_type(v2.y))
+ {}
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T>::tvec4
+ (
+ tvec4<U> const & v
+ ) :
+ x(value_type(v.x)),
+ y(value_type(v.y)),
+ z(value_type(v.z)),
+ w(value_type(v.w))
+ {}
+
+ //////////////////////////////////////
+ // Unary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator=
+ (
+ tvec4<T> const & v
+ )
+ {
+ this->x = v.x;
+ this->y = v.y;
+ this->z = v.z;
+ this->w = v.w;
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x = T(v.x);
+ this->y = T(v.y);
+ this->z = T(v.z);
+ this->w = T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator+= (U s)
+ {
+ this->x += T(s);
+ this->y += T(s);
+ this->z += T(s);
+ this->w += T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator+=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x += T(v.x);
+ this->y += T(v.y);
+ this->z += T(v.z);
+ this->w += T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator-= (U s)
+ {
+ this->x -= T(s);
+ this->y -= T(s);
+ this->z -= T(s);
+ this->w -= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator-=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x -= T(v.x);
+ this->y -= T(v.y);
+ this->z -= T(v.z);
+ this->w -= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator*= (U s)
+ {
+ this->x *= T(s);
+ this->y *= T(s);
+ this->z *= T(s);
+ this->w *= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator*=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x *= T(v.x);
+ this->y *= T(v.y);
+ this->z *= T(v.z);
+ this->w *= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator/= (U s)
+ {
+ this->x /= T(s);
+ this->y /= T(s);
+ this->z /= T(s);
+ this->w /= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator/=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x /= T(v.x);
+ this->y /= T(v.y);
+ this->z /= T(v.z);
+ this->w /= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator++()
+ {
+ ++this->x;
+ ++this->y;
+ ++this->z;
+ ++this->w;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator--()
+ {
+ --this->x;
+ --this->y;
+ --this->z;
+ --this->w;
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Unary bit operators
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator%= (U s)
+ {
+ this->x %= T(s);
+ this->y %= T(s);
+ this->z %= T(s);
+ this->w %= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator%=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x %= T(v.x);
+ this->y %= T(v.y);
+ this->z %= T(v.z);
+ this->w %= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator&= (U s)
+ {
+ this->x &= T(s);
+ this->y &= T(s);
+ this->z &= T(s);
+ this->w &= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator&=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x &= T(v.x);
+ this->y &= T(v.y);
+ this->z &= T(v.z);
+ this->w &= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator|= (U s)
+ {
+ this->x |= T(s);
+ this->y |= T(s);
+ this->z |= T(s);
+ this->w |= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator|=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x |= T(v.x);
+ this->y |= T(v.y);
+ this->z |= T(v.z);
+ this->w |= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator^= (U s)
+ {
+ this->x ^= T(s);
+ this->y ^= T(s);
+ this->z ^= T(s);
+ this->w ^= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator^=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x ^= T(v.x);
+ this->y ^= T(v.y);
+ this->z ^= T(v.z);
+ this->w ^= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator<<= (U s)
+ {
+ this->x <<= T(s);
+ this->y <<= T(s);
+ this->z <<= T(s);
+ this->w <<= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator<<=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x <<= T(v.x);
+ this->y <<= T(v.y);
+ this->z <<= T(v.z);
+ this->w <<= T(v.w);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator>>= (U s)
+ {
+ this->x >>= T(s);
+ this->y >>= T(s);
+ this->z >>= T(s);
+ this->w >>= T(s);
+ return *this;
+ }
+
+ template <typename T>
+ template <typename U>
+ GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator>>=
+ (
+ tvec4<U> const & v
+ )
+ {
+ this->x >>= T(v.x);
+ this->y >>= T(v.y);
+ this->z >>= T(v.z);
+ this->w >>= T(v.w);
+ return *this;
+ }
+
+ //////////////////////////////////////
+ // Swizzle operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER typename tvec4<T>::value_type
+ tvec4<T>::swizzle
+ (
+ comp x
+ ) const
+ {
+ return (*this)[x];
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec2<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y
+ ) const
+ {
+ return tvec2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec3<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ ) const
+ {
+ return tvec3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z,
+ comp w
+ ) const
+ {
+ return tvec4<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z],
+ (*this)[w]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref2<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y
+ )
+ {
+ return tref2<T>(
+ (*this)[x],
+ (*this)[y]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref3<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z
+ )
+ {
+ return tref3<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z]);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tref4<T> tvec4<T>::swizzle
+ (
+ comp x,
+ comp y,
+ comp z,
+ comp w
+ )
+ {
+ return tref4<T>(
+ (*this)[x],
+ (*this)[y],
+ (*this)[z],
+ (*this)[w]);
+ }
+
+ //////////////////////////////////////
+ // Binary arithmetic operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator+
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x + s,
+ v.y + s,
+ v.z + s,
+ v.w + s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator+
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s + v.x,
+ s + v.y,
+ s + v.z,
+ s + v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator+
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x + v2.x,
+ v1.y + v2.y,
+ v1.z + v2.z,
+ v1.w + v2.w);
+ }
+
+ //operator-
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator-
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x - s,
+ v.y - s,
+ v.z - s,
+ v.w - s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator-
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s - v.x,
+ s - v.y,
+ s - v.z,
+ s - v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator-
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x - v2.x,
+ v1.y - v2.y,
+ v1.z - v2.z,
+ v1.w - v2.w);
+ }
+
+ //operator*
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator*
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x * s,
+ v.y * s,
+ v.z * s,
+ v.w * s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator*
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s * v.x,
+ s * v.y,
+ s * v.z,
+ s * v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator*
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x * v2.x,
+ v1.y * v2.y,
+ v1.z * v2.z,
+ v1.w * v2.w);
+ }
+
+ //operator/
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator/
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x / s,
+ v.y / s,
+ v.z / s,
+ v.w / s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator/
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s / v.x,
+ s / v.y,
+ s / v.z,
+ s / v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator/
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x / v2.x,
+ v1.y / v2.y,
+ v1.z / v2.z,
+ v1.w / v2.w);
+ }
+
+ // Unary constant operators
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator-
+ (
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ -v.x,
+ -v.y,
+ -v.z,
+ -v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator++
+ (
+ tvec4<T> const & v,
+ int
+ )
+ {
+ typename tvec4<T>::value_type One(1);
+ return tvec4<T>(
+ v.x + One,
+ v.y + One,
+ v.z + One,
+ v.w + One);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator--
+ (
+ tvec4<T> const & v,
+ int
+ )
+ {
+ typename tvec4<T>::value_type One(1);
+ return tvec4<T>(
+ v.x - One,
+ v.y - One,
+ v.z - One,
+ v.w - One);
+ }
+
+ //////////////////////////////////////
+ // Boolean operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator==
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z) && (v1.w == v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER bool operator!=
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z) || (v1.w != v2.w);
+ }
+
+ //////////////////////////////////////
+ // Binary bit operators
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator%
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x % s,
+ v.y % s,
+ v.z % s,
+ v.w % s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator%
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s % v.x,
+ s % v.y,
+ s % v.z,
+ s % v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator%
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x % v2.x,
+ v1.y % v2.y,
+ v1.z % v2.z,
+ v1.w % v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator&
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x & s,
+ v.y & s,
+ v.z & s,
+ v.w & s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator&
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s & v.x,
+ s & v.y,
+ s & v.z,
+ s & v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator&
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x & v2.x,
+ v1.y & v2.y,
+ v1.z & v2.z,
+ v1.w & v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator|
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x | s,
+ v.y | s,
+ v.z | s,
+ v.w | s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator|
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s | v.x,
+ s | v.y,
+ s | v.z,
+ s | v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator|
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x | v2.x,
+ v1.y | v2.y,
+ v1.z | v2.z,
+ v1.w | v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator^
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x ^ s,
+ v.y ^ s,
+ v.z ^ s,
+ v.w ^ s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator^
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s ^ v.x,
+ s ^ v.y,
+ s ^ v.z,
+ s ^ v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator^
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x ^ v2.x,
+ v1.y ^ v2.y,
+ v1.z ^ v2.z,
+ v1.w ^ v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator<<
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x << s,
+ v.y << s,
+ v.z << s,
+ v.w << s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator<<
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s << v.x,
+ s << v.y,
+ s << v.z,
+ s << v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator<<
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x << v2.x,
+ v1.y << v2.y,
+ v1.z << v2.z,
+ v1.w << v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator>>
+ (
+ tvec4<T> const & v,
+ typename tvec4<T>::value_type const & s
+ )
+ {
+ return tvec4<T>(
+ v.x >> s,
+ v.y >> s,
+ v.z >> s,
+ v.w >> s);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator>>
+ (
+ typename tvec4<T>::value_type const & s,
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ s >> v.x,
+ s >> v.y,
+ s >> v.z,
+ s >> v.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator>>
+ (
+ tvec4<T> const & v1,
+ tvec4<T> const & v2
+ )
+ {
+ return tvec4<T>(
+ v1.x >> v2.x,
+ v1.y >> v2.y,
+ v1.z >> v2.z,
+ v1.w >> v2.w);
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> operator~
+ (
+ tvec4<T> const & v
+ )
+ {
+ return tvec4<T>(
+ ~v.x,
+ ~v.y,
+ ~v.z,
+ ~v.w);
+ }
+
+ //////////////////////////////////////
+ // tref definition
+
+ template <typename T>
+ tref4<T>::tref4
+ (
+ T & x,
+ T & y,
+ T & z,
+ T & w
+ ) :
+ x(x),
+ y(y),
+ z(z),
+ w(w)
+ {}
+
+ template <typename T>
+ tref4<T>::tref4
+ (
+ tref4<T> const & r
+ ) :
+ x(r.x),
+ y(r.y),
+ z(r.z),
+ w(r.w)
+ {}
+
+ template <typename T>
+ tref4<T>::tref4
+ (
+ tvec4<T> const & v
+ ) :
+ x(v.x),
+ y(v.y),
+ z(v.z),
+ w(v.w)
+ {}
+
+ template <typename T>
+ tref4<T>& tref4<T>::operator=
+ (
+ tref4<T> const & r
+ )
+ {
+ x = r.x;
+ y = r.y;
+ z = r.z;
+ w = r.w;
+ return *this;
+ }
+
+ template <typename T>
+ tref4<T>& tref4<T>::operator=
+ (
+ tvec4<T> const & v
+ )
+ {
+ x = v.x;
+ y = v.y;
+ z = v.z;
+ w = v.w;
+ return *this;
+ }
+
+ template <typename T>
+ GLM_FUNC_QUALIFIER tvec4<T> tref4<T>::operator() ()
+ {
+ return tvec4<T>(this->x, this->y, this->z, this->w);
+ }
+
+}//namespace detail
+}//namespace glm