diff --git a/CMakeLists.txt b/CMakeLists.txt index e5f3c7be..35ea2cc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) #add_definitions(-S) #add_definitions(-s) add_definitions(-msse2) + add_definitions(-std=c++0x ) #add_definitions(-m32) #add_definitions(-mfpmath=387) #add_definitions(-ffast-math) diff --git a/glm/core/_swizzle.hpp b/glm/core/_swizzle.hpp index aaf18caa..331fdcc3 100644 --- a/glm/core/_swizzle.hpp +++ b/glm/core/_swizzle.hpp @@ -48,520 +48,790 @@ namespace glm }; }//namespace glm - namespace glm{ namespace detail { + //! Internal class for implementing swizzle operators + template + struct _swizzle_base0 + { + typedef T value_type; + + protected: + value_type& elem (size_t i) { return (reinterpret_cast(_buffer))[i]; } + const value_type& elem (size_t i) const { return (reinterpret_cast(_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 + struct _swizzle_base1 : public _swizzle_base0 + { + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + V operator ()() const { return V(this->elem(E0), this->elem(E1)); } + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2)); } + }; + + template + struct _swizzle_base1 : public _swizzle_base0 + { + 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: - Type = type of scalar values (e.g. float, double) - Class = class the swizzle is applies to (e.g. vector3f) - N = number of components in the vector (e.g. 3) - E0...3 = what index the n-th element of this swizzle refers to + ValueType = type of scalar values (e.g. float, double) + VecType = class the swizzle is applies to (e.g. tvec3) + 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 - struct swizzle_base + template + struct _swizzle_base2 : public _swizzle_base1 { - swizzle_base& operator= (const Class& that) - { - static const int offset_dst[4] = { E0, E1, E2, E3 }; + typedef VecType vec_type; + typedef ValueType value_type; - Type t[N]; - for (int i = 0; i < N; ++i) - t[i] = that[i]; - for (int i = 0; i < N; ++i) - elem(offset_dst[i]) = t[i]; + _swizzle_base2& operator= (const ValueType& t) + { + for (int i = 0; i < N; ++i) + (*this)[i] = t; + return *this; + } - return *this; - } + _swizzle_base2& operator= (const VecType& that) + { + struct op { + void operator() (value_type& e, value_type& t) { e = t; } + }; + _apply_op(that, op()); + return *this; + } - swizzle_base& operator= (const Type& t) - { - static const int offset_dst[4] = { E0, E1, E2, E3 }; + void operator -= (const VecType& that) + { + struct op { + void operator() (value_type& e, value_type& t) { e -= t; } + }; + _apply_op(that, op()); + } - for (int i = 0; i < N; ++i) - elem(offset_dst[i]) = t; + void operator += (const VecType& that) + { + struct op { + void operator() (value_type& e, value_type& t) { e += t; } + }; + _apply_op(that, op()); + } - return *this; - } + void operator *= (const VecType& that) + { + struct op { + void operator() (value_type& e, value_type& t) { e *= t; } + }; + _apply_op(that, op()); + } - protected: - Type& elem (size_t i) { return (reinterpret_cast(_buffer))[i]; } + void operator /= (const VecType& that) + { + struct op { + void operator() (value_type& e, value_type& t) { e /= t; } + }; + _apply_op(that, op()); + } - // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. - // Otherwise, a vec4 containg all swizzles might end up with 1000s of - // constructor calls - char _buffer[sizeof(Type) * N]; + value_type& operator[] (size_t i) + { + static const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + value_type operator[] (size_t i) const + { + static const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + protected: + template + 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] ); + } }; - template - struct swizzle_base - { - struct Stub {}; - swizzle_base& operator= (const Stub& that) {} - - protected: - Type& elem (size_t i) { return (reinterpret_cast(_buffer))[i]; } - char _buffer[sizeof(Type) * N]; - }; + //! Specialization for swizzles containing duplicate elements. These cannot be modified. + template + struct _swizzle_base2 : public _swizzle_base1 + { + typedef VecType vec_type; + typedef ValueType value_type; - //! Internal class for implementing swizzle operators - template - struct swizzle2 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1)); } - }; + struct Stub {}; + _swizzle_base2& operator= (const Stub& that) {} - //! Internal class for implementing swizzle operators - template - struct swizzle2_3 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2)); } - }; + value_type operator[] (size_t i) const + { + static const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + }; - //! Internal class for implementing swizzle operators - template - struct swizzle2_4 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } - }; + template + struct swizzle : public _swizzle_base2 + { + typedef _swizzle_base2 base_type; - //! Internal class for implementing swizzle operators - template - struct swizzle3 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2)); } - }; + using base_type::operator=; - //! Internal class for implementing swizzle operators - template - struct swizzle3_2 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1)); } - }; + operator VecType () const { return (*this)(); } + }; - //! Internal class for implementing swizzle operators - template - struct swizzle3_4 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } - }; +// +// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros +// +#define _GLM_SWIZZLE_TEMPLATE1 template +#define _GLM_SWIZZLE_TEMPLATE2 template +#define _GLM_SWIZZLE_TYPE1 glm::detail::swizzle +#define _GLM_SWIZZLE_TYPE2 glm::detail::swizzle - //! Internal class for implementing swizzle operators - template - struct swizzle4 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } - }; +// +// Wrapper for a binary operator (e.g. u.yy + v.zy) +// +#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + _GLM_SWIZZLE_TEMPLATE2 \ + V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return a() OPERAND b(); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const V& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + V operator OPERAND ( const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } - //! Internal class for implementing swizzle operators - template - struct swizzle4_2 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1)); } - }; +// +// 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 \ + V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + 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 \ + typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a) \ + { \ + return FUNCTION(a()); \ + } - //! Internal class for implementing swizzle operators - template - struct swizzle4_3 : public swizzle_base - { - using swizzle_base::operator=; - operator P () { return P(this->elem(E0), this->elem(E1), this->elem(E2)); } - }; +// +// Macro for wrapping a function taking two vector arguments (e.g. dot()). +// +#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE2 \ + typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + { \ + return FUNCTION(a(), b); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + 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 \ + 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 \ + 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 \ + 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 \ + 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::swizzle2 E0 ## E0; }; \ - struct { glm::detail::swizzle2 E0 ## E1; }; \ - struct { glm::detail::swizzle2 E1 ## E0; }; \ - struct { glm::detail::swizzle2 E1 ## 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::swizzle2_3 E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_3 E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_3 E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_3 E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle2_3 E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_3 E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_3 E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_3 E1 ## E1 ## E1; }; - - -#define _GLM_SWIZZLE3_3_MEMBERS(T,P,E0,E1,E2) \ - struct { glm::detail::swizzle3 E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3 E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3 E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3 E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3 E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3 E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3 E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3 E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3 E0 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle3 E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3 E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3 E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3 E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3 E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3 E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3 E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3 E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3 E1 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle3 E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3 E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3 E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3 E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3 E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3 E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3 E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3 E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3 E2 ## E2 ## E2; }; - -#define _GLM_SWIZZLE3_2_MEMBERS(T,P2,E0,E1,E2) \ - struct { glm::detail::swizzle3_2 E0 ## E0; }; \ - struct { glm::detail::swizzle3_2 E0 ## E1; }; \ - struct { glm::detail::swizzle3_2 E0 ## E2; }; \ - struct { glm::detail::swizzle3_2 E1 ## E0; }; \ - struct { glm::detail::swizzle3_2 E1 ## E1; }; \ - struct { glm::detail::swizzle3_2 E1 ## E2; }; \ - struct { glm::detail::swizzle3_2 E2 ## E0; }; \ - struct { glm::detail::swizzle3_2 E2 ## E1; }; \ - struct { glm::detail::swizzle3_2 E2 ## E2; }; - -#define _GLM_SWIZZLE3_4_MEMBERS(T,P2,E0,E1,E2) \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E0 ## E2 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E1 ## E2 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle3_4 E2 ## E2 ## E2 ## E2; }; \ - + 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::swizzle2_4 E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_4 E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_4 E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_4 E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle2_4 E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_4 E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_4 E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_4 E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle2_4 E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_4 E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_4 E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_4 E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle2_4 E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle2_4 E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle2_4 E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle2_4 E1 ## E1 ## E1 ## 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::swizzle4_2 E0 ## E0; }; \ - struct { glm::detail::swizzle4_2 E0 ## E1; }; \ - struct { glm::detail::swizzle4_2 E0 ## E2; }; \ - struct { glm::detail::swizzle4_2 E0 ## E3; }; \ - struct { glm::detail::swizzle4_2 E1 ## E0; }; \ - struct { glm::detail::swizzle4_2 E1 ## E1; }; \ - struct { glm::detail::swizzle4_2 E1 ## E2; }; \ - struct { glm::detail::swizzle4_2 E1 ## E3; }; \ - struct { glm::detail::swizzle4_2 E2 ## E0; }; \ - struct { glm::detail::swizzle4_2 E2 ## E1; }; \ - struct { glm::detail::swizzle4_2 E2 ## E2; }; \ - struct { glm::detail::swizzle4_2 E2 ## E3; }; \ - struct { glm::detail::swizzle4_2 E3 ## E0; }; \ - struct { glm::detail::swizzle4_2 E3 ## E1; }; \ - struct { glm::detail::swizzle4_2 E3 ## E2; }; \ - struct { glm::detail::swizzle4_2 E3 ## 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::swizzle4_3 E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4_3 E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4_3 E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4_3 E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle4_3 E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4_3 E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4_3 E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4_3 E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle4_3 E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4_3 E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4_3 E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle4_3 E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle4_3 E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle4_3 E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle4_3 E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle4_3 E0 ## E3 ## E3; }; \ - \ - struct { glm::detail::swizzle4_3 E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4_3 E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4_3 E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4_3 E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle4_3 E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4_3 E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4_3 E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4_3 E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle4_3 E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4_3 E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4_3 E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle4_3 E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle4_3 E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle4_3 E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle4_3 E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle4_3 E1 ## E3 ## E3; }; \ - \ - struct { glm::detail::swizzle4_3 E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4_3 E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4_3 E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4_3 E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle4_3 E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4_3 E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4_3 E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4_3 E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle4_3 E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4_3 E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4_3 E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle4_3 E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle4_3 E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle4_3 E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle4_3 E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle4_3 E2 ## E3 ## E3; }; \ - \ - struct { glm::detail::swizzle4_3 E3 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4_3 E3 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4_3 E3 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4_3 E3 ## E0 ## E3; }; \ - struct { glm::detail::swizzle4_3 E3 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4_3 E3 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4_3 E3 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4_3 E3 ## E1 ## E3; }; \ - struct { glm::detail::swizzle4_3 E3 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4_3 E3 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4_3 E3 ## E2 ## E2; }; \ - struct { glm::detail::swizzle4_3 E3 ## E2 ## E3; }; \ - struct { glm::detail::swizzle4_3 E3 ## E3 ## E0; }; \ - struct { glm::detail::swizzle4_3 E3 ## E3 ## E1; }; \ - struct { glm::detail::swizzle4_3 E3 ## E3 ## E2; }; \ - struct { glm::detail::swizzle4_3 E3 ## E3 ## 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::swizzle4 E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E0 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E1 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E0 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E0 ## E2 ## E2 ## E2; }; \ - \ - \ - struct { glm::detail::swizzle4 E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E0 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E1 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E1 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E1 ## E2 ## E2 ## E2; }; \ - \ - \ - struct { glm::detail::swizzle4 E2 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E0 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E2 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E1 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E2 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E2 ## E2 ## E2 ## E2; }; \ - \ - \ - struct { glm::detail::swizzle4 E3 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E0 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E3 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E1 ## E2 ## E2; }; \ - \ - struct { glm::detail::swizzle4 E3 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle4 E3 ## E2 ## E2 ## E2; }; - - - - + 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,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; }; #if(defined(GLM_SWIZZLE_XYZW) || defined(GLM_SWIZZLE)) diff --git a/glm/core/func_geometric.inl b/glm/core/func_geometric.inl index f83b590c..26a6b64e 100644 --- a/glm/core/func_geometric.inl +++ b/glm/core/func_geometric.inl @@ -132,6 +132,7 @@ namespace glm ( genType const & x, genType const & y + ) { GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); diff --git a/glm/core/type_vec2.hpp b/glm/core/type_vec2.hpp index 85613ae0..0f29b538 100644 --- a/glm/core/type_vec2.hpp +++ b/glm/core/type_vec2.hpp @@ -114,6 +114,12 @@ namespace detail tvec2(tref2 const & r); + template + GLM_FUNC_DECL tvec2(const glm::detail::swizzle<2,T,tvec2,E0,E1,-1,-2>& that) + { + *this = that(); + } + ////////////////////////////////////// // Convertion constructors diff --git a/glm/core/type_vec3.hpp b/glm/core/type_vec3.hpp index e85c5007..95626cb8 100644 --- a/glm/core/type_vec3.hpp +++ b/glm/core/type_vec3.hpp @@ -64,7 +64,7 @@ namespace detail # if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) value_type x, y, z; -# elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT) +# elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT || GLM_LANG == GLM_LANG_CXX0X) union { _GLM_SWIZZLE3_2_MEMBERS(value_type,glm::detail::tvec2,x,y,z) @@ -80,7 +80,7 @@ namespace detail struct{value_type r, g, b;}; struct{value_type s, t, p;}; struct{value_type x, y, z;}; - }; + }; # else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES) union {value_type x, r, s;}; union {value_type y, g, t;}; @@ -152,6 +152,12 @@ namespace detail template GLM_FUNC_DECL explicit tvec3(A const & s, tref2 const & v); + template + GLM_FUNC_DECL tvec3(glm::detail::swizzle<3, T, tvec3, E0, E1, E2, -1> const & that) + { + *this = that(); + } + ////////////////////////////////////// // Unary arithmetic operators diff --git a/glm/core/type_vec4.hpp b/glm/core/type_vec4.hpp index 68414008..9b47383d 100644 --- a/glm/core/type_vec4.hpp +++ b/glm/core/type_vec4.hpp @@ -153,6 +153,12 @@ namespace detail template GLM_FUNC_DECL explicit tvec4(tvec4 const & v); + template + GLM_FUNC_DECL tvec4(glm::detail::swizzle<4, T, tvec4, E0, E1, E2, E3> const & that) + { + *this = that(); + } + ////////////////////////////////////// // Swizzle constructors diff --git a/test/core/core_type_vec3.cpp b/test/core/core_type_vec3.cpp index 3157bd46..2afe97d4 100644 --- a/test/core/core_type_vec3.cpp +++ b/test/core/core_type_vec3.cpp @@ -247,30 +247,20 @@ int test_vec3_swizzle3_3() glm::vec3 v(1, 2, 3); glm::vec3 u; - u.xyz = v.xyz; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + u = v; Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; - u = v.xyz; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; - u = v.zyx; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - u.zyx = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + u = v.xyz; Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + u = v.zyx; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + u.zyx = v; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - u = v.rgb; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; - u = v.bgr; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - u.bgr = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + u = v.rgb; Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + u = v.bgr; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + u.bgr = v; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - u = v.stp; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; - u = v.pts; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - u.pts = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; - + u = v.stp; Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + u = v.pts; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + u.pts = v; Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + return Error; } @@ -284,34 +274,111 @@ int test_vec3_swizzle_half() glm::hvec3 v(a1, b1, c1); glm::hvec3 u; - float c = v.x; - float d = v.y; u = v; - float a = u.x; - float b = u.y; - Error += (u.x == glm::half(1.0f) && u.y == glm::half(2.0f) && u.z == glm::half(3.0f)) ? 0 : 1; + Error += (u.x.toFloat() == 1.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 3.0f) ? 0 : 1; - /*u = v.xyz; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + u = v.xyz; + Error += (u.x.toFloat() == 1.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 3.0f) ? 0 : 1; u = v.zyx; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; u.zyx = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; u = v.rgb; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + Error += (u.x.toFloat() == 1.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 3.0f) ? 0 : 1; u = v.bgr; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; u.bgr = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; u = v.stp; - Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1; + Error += (u.x.toFloat() == 1.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 3.0f) ? 0 : 1; u = v.pts; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1; + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; u.pts = v; - Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;*/ + Error += (u.x.toFloat() == 3.0f && u.y.toFloat() == 2.0f && u.z.toFloat() == 1.0f) ? 0 : 1; + + return Error; +} + +int test_vec3_swizzle_operators() +{ + int Error = 0; + + glm::vec3 q, u, v; + + u = glm::vec3(1, 2, 3); + v = glm::vec3(10, 20, 30); + + // Swizzle, swizzle binary operators + q = u.xyz + v.xyz; Error += (q == (u + v)) ? 0 : 1; + q = (u.zyx + v.zyx).zyx; Error += (q == (u + v)) ? 0 : 1; + q = (u.xyz - v.xyz); Error += (q == (u - v)) ? 0 : 1; + q = (u.xyz * v.xyz); Error += (q == (u * v)) ? 0 : 1; + q = (u.xxx * v.xxx); Error += (q == glm::vec3(u.x * v.x)) ? 0 : 1; + q = (u.xyz / v.xyz); Error += (q == (u / v)) ? 0 : 1; + + // vec, swizzle binary operators + q = u + v.xyz; Error += (q == (u + v)) ? 0 : 1; + q = (u - v.xyz); Error += (q == (u - v)) ? 0 : 1; + q = (u * v.xyz); Error += (q == (u * v)) ? 0 : 1; + q = (u * v.xxx); Error += (q == v.x * u) ? 0 : 1; + q = (u / v.xyz); Error += (q == (u / v)) ? 0 : 1; + + // swizzle,vec binary operators + q = u.xyz + v; Error += (q == (u + v)) ? 0 : 1; + q = (u.xyz - v); Error += (q == (u - v)) ? 0 : 1; + q = (u.xyz * v); Error += (q == (u * v)) ? 0 : 1; + q = (u.xxx * v); Error += (q == u.x * v) ? 0 : 1; + q = (u.xyz / v); Error += (q == (u / v)) ? 0 : 1; + + // Compile errors + //q = (u.yz * v.xyz); + //q = (u * v.xy); + + return Error; +} + +int test_vec3_swizzle_functions() +{ + int Error = 0; + + // + // NOTE: template functions cannot pick up the implicit conversion from + // a swizzle to the unswizzled type, therefore the operator() must be + // used. E.g.: + // + // glm::dot(u.xy, v.xy); <--- Compile error + // glm::dot(u.xy(), v.xy()); <--- Compiles correctly + // + + float r; + + // vec2 + glm::vec2 a(1, 2); + glm::vec2 b(10, 20); + r = glm::dot(a, b); Error += (int(r) == 50) ? 0 : 1; + r = glm::dot(a.xy(), b.xy()); Error += (int(r) == 50) ? 0 : 1; + r = glm::dot(a.xy(), b.yy()); Error += (int(r) == 60) ? 0 : 1; + + // vec3 + glm::vec3 q, u, v; + u = glm::vec3(1, 2, 3); + v = glm::vec3(10, 20, 30); + r = glm::dot(u, v); Error += (int(r) == 140) ? 0 : 1; + r = glm::dot(u.xyz(), v.zyz()); Error += (int(r) == 160) ? 0 : 1; + r = glm::dot(u, v.zyx()); Error += (int(r) == 100) ? 0 : 1; + r = glm::dot(u.xyz(), v); Error += (int(r) == 140) ? 0 : 1; + r = glm::dot(u.xy(), v.xy()); Error += (int(r) == 50) ? 0 : 1; + + // vec4 + glm::vec4 s, t; + s = glm::vec4(1, 2, 3, 4); + t = glm::vec4(10, 20, 30, 40); + r = glm::dot(s, t); Error += (int(r) == 300) ? 0 : 1; + r = glm::dot(s.xyzw(), t.xyzw()); Error += (int(r) == 300) ? 0 : 1; + r = glm::dot(s.xyz(), t.xyz()); Error += (int(r) == 140) ? 0 : 1; return Error; } @@ -354,6 +421,8 @@ int main() Error += test_vec3_swizzle3_3(); Error += test_vec3_swizzle_half(); Error += test_vec3_swizzle_partial(); + Error += test_vec3_swizzle_operators(); + Error += test_vec3_swizzle_functions(); return Error; } diff --git a/test/glm.cppcheck b/test/glm.cppcheck new file mode 100644 index 00000000..6ce27f27 --- /dev/null +++ b/test/glm.cppcheck @@ -0,0 +1,10 @@ + + + + + + + + + +