From 866db89305146414e9f59de6e72ea4d5a8e262be Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Thu, 16 Dec 2010 02:16:58 +0000 Subject: [PATCH] Updated swizzle implementation --- glm/gtx/simd_vec4.hpp | 23 +++++++++++------------ glm/gtx/simd_vec4.inl | 22 ++++++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/glm/gtx/simd_vec4.hpp b/glm/gtx/simd_vec4.hpp index f8cf2d63..0c2ac4ce 100644 --- a/glm/gtx/simd_vec4.hpp +++ b/glm/gtx/simd_vec4.hpp @@ -59,11 +59,6 @@ namespace glm float const & z, float const & w); - //////////////////////////////////////// - //// Swizzle constructors - - //fvec4SIMD(ref4 const & r); - //////////////////////////////////////// //// Convertion vector constructors @@ -95,12 +90,16 @@ namespace glm ////////////////////////////////////// // Swizzle operators - //float swizzle(comp X) const; - //vec2 const swizzle(comp X, comp Y) const; - //vec3 const swizzle(comp X, comp Y, comp Z) const; - //fvec4SIMD const swizzle(comp X, comp Y, comp Z, comp W) const; - //fvec4SIMD const swizzle(int X, int Y, int Z, int W) const; - //ref4 swizzle(comp X, comp Y, comp Z, comp W); + template + fvec4SIMD& swizzle(); + template + fvec4SIMD swizzle() const; + template + fvec4SIMD swizzle() const; + template + fvec4SIMD swizzle() const; + template + fvec4SIMD swizzle() const; }; }//namespace detail @@ -109,7 +108,7 @@ namespace glm //! GLM_GTX_simd_vec4 extension: SIMD implementation of vec4 type. namespace simd_vec4 { - typedef detail::fvec4SIMD vec4SIMD; + typedef detail::fvec4SIMD simd_vec4; }//namespace simd_vec4 }//namespace gtx diff --git a/glm/gtx/simd_vec4.inl b/glm/gtx/simd_vec4.inl index 2aff9c97..c463f4a4 100644 --- a/glm/gtx/simd_vec4.inl +++ b/glm/gtx/simd_vec4.inl @@ -11,8 +11,6 @@ namespace glm { namespace detail { - //__m128 fvec4SIMD::one = _mm_set_ps1(1.f); - ////////////////////////////////////// // Implicit basic constructors @@ -155,13 +153,21 @@ namespace glm ////////////////////////////////////// // Swizzle operators - //inline fvec4SIMD const fvec4SIMD::swizzle(int d, int c, int b, int a) const - //{ - // int const Mask = ((d << 6) | (c << 4) | (b << 2) | (a << 0)); + template + inline fvec4SIMD fvec4SIMD::swizzle() const + { + int const Mask = ((int(d) << 6) | (int(c) << 4) | (int(b) << 2) | (int(a) << 0)); - // __m128 Data = _mm_shuffle_ps(this->Data, this->Data, Mask); - // return fvec4SIMD(Data); - //} + __m128 Data = _mm_shuffle_ps(this->Data, this->Data, Mask); + return fvec4SIMD(Data); + } + + template + inline fvec4SIMD& fvec4SIMD::swizzle() + { + this->Data = _mm_shuffle_ps(this->Data, this->Data, (((int(d) << 6) | (int(c) << 4) | (int(b) << 2) | (int(a) << 0)))); + return *this; + } // operator+ inline fvec4SIMD operator+ (fvec4SIMD const & v, float s)