From fe9a5562c1701cde5abfc2cfc8e1148039cbcdc2 Mon Sep 17 00:00:00 2001 From: athile Date: Wed, 21 Sep 2011 12:42:35 -0400 Subject: [PATCH] Binary operators for swizzle/vec combinations --- glm/core/_swizzle.hpp | 42 +++++++++++++++++++++++------------- test/core/core_type_vec3.cpp | 24 ++++++++++++++++++++- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/glm/core/_swizzle.hpp b/glm/core/_swizzle.hpp index fd27d8c1..17118f95 100644 --- a/glm/core/_swizzle.hpp +++ b/glm/core/_swizzle.hpp @@ -196,23 +196,35 @@ namespace detail operator P () { return cast(); } }; - - - template - typename P operator+ ( - const glm::detail::swizzle_base& a, - const glm::detail::swizzle_base& b) - { - return static_cast(a).cast() + static_cast(b).cast(); +#define _GLM_SWIZZLE_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)\ + template \ + typename P operator OPERAND ( \ + const glm::detail::swizzle_base& a, \ + const glm::detail::swizzle_base& b) \ + { \ + return static_cast(a).cast() OPERAND static_cast(b).cast(); \ + } \ + \ + template \ + typename P operator OPERAND ( \ + const glm::detail::swizzle_base& a, \ + const typename P& b) \ + { \ + return static_cast(a).cast() OPERAND b; \ + } \ + \ + template \ + typename P operator OPERAND ( \ + const typename P& a, \ + const glm::detail::swizzle_base& b) \ + { \ + return a OPERAND static_cast(b).cast(); \ } - template - typename P operator- ( - const glm::detail::swizzle_base& a, - const glm::detail::swizzle_base& b) - { - return static_cast(a).cast() - static_cast(b).cast(); - } + _GLM_SWIZZLE_BINARY_OPERATOR_IMPLEMENTATION(+) + _GLM_SWIZZLE_BINARY_OPERATOR_IMPLEMENTATION(-) + _GLM_SWIZZLE_BINARY_OPERATOR_IMPLEMENTATION(*) + _GLM_SWIZZLE_BINARY_OPERATOR_IMPLEMENTATION(/) }//namespace detail }//namespace glm diff --git a/test/core/core_type_vec3.cpp b/test/core/core_type_vec3.cpp index fe94a735..e13c26ba 100644 --- a/test/core/core_type_vec3.cpp +++ b/test/core/core_type_vec3.cpp @@ -167,10 +167,32 @@ int test_vec3_swizzle_operators() 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; }