diff --git a/glm/detail/type_vec4.inl b/glm/detail/type_vec4.inl index 261162a6..ea11c7df 100644 --- a/glm/detail/type_vec4.inl +++ b/glm/detail/type_vec4.inl @@ -41,6 +41,33 @@ namespace detail return tvec4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); } }; + + template + struct compute_vec4_sub + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + return tvec4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); + } + }; + + template + struct compute_vec4_mul + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + return tvec4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); + } + }; + + template + struct compute_vec4_div + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + return tvec4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); + } + }; }//namespace detail // -- Implicit basic constructors -- @@ -264,10 +291,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator+=(U scalar) { - this->x += static_cast(scalar); - this->y += static_cast(scalar); - this->z += static_cast(scalar); - this->w += static_cast(scalar); + *this = detail::compute_vec4_add::call(*this, tvec4(scalar)); return *this; } @@ -275,11 +299,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator+=(tvec1 const & v) { - T const scalar = static_cast(v.x); - this->x += scalar; - this->y += scalar; - this->z += scalar; - this->w += scalar; + *this = detail::compute_vec4_add::call(*this, tvec4(v.x)); return *this; } @@ -295,10 +315,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator-=(U scalar) { - this->x -= static_cast(scalar); - this->y -= static_cast(scalar); - this->z -= static_cast(scalar); - this->w -= static_cast(scalar); + *this = detail::compute_vec4_sub::call(*this, tvec4(scalar)); return *this; } @@ -306,11 +323,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator-=(tvec1 const & v) { - T const scalar = static_cast(v.x); - this->x -= scalar; - this->y -= scalar; - this->z -= scalar; - this->w -= scalar; + *this = detail::compute_vec4_sub::call(*this, tvec4(v)); return *this; } @@ -318,21 +331,15 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator-=(tvec4 const & v) { - this->x -= static_cast(v.x); - this->y -= static_cast(v.y); - this->z -= static_cast(v.z); - this->w -= static_cast(v.w); + *this = detail::compute_vec4_sub::call(*this, tvec4(v)); return *this; } template template - GLM_FUNC_QUALIFIER tvec4 & tvec4::operator*=(U v) + GLM_FUNC_QUALIFIER tvec4 & tvec4::operator*=(U scalar) { - this->x *= static_cast(v); - this->y *= static_cast(v); - this->z *= static_cast(v); - this->w *= static_cast(v); + *this = detail::compute_vec4_mul::call(*this, tvec4(scalar)); return *this; } @@ -340,10 +347,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator*=(tvec1 const & v) { - this->x *= static_cast(v.x); - this->y *= static_cast(v.x); - this->z *= static_cast(v.x); - this->w *= static_cast(v.x); + *this = detail::compute_vec4_mul::call(*this, tvec4(v)); return *this; } @@ -351,21 +355,15 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator*=(tvec4 const & v) { - this->x *= static_cast(v.x); - this->y *= static_cast(v.y); - this->z *= static_cast(v.z); - this->w *= static_cast(v.w); + *this = detail::compute_vec4_mul::call(*this, tvec4(v)); return *this; } template template - GLM_FUNC_QUALIFIER tvec4 & tvec4::operator/=(U v) + GLM_FUNC_QUALIFIER tvec4 & tvec4::operator/=(U scalar) { - this->x /= static_cast(v); - this->y /= static_cast(v); - this->z /= static_cast(v); - this->w /= static_cast(v); + *this = detail::compute_vec4_div::call(*this, tvec4(scalar)); return *this; } @@ -373,10 +371,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator/=(tvec1 const & v) { - this->x /= static_cast(v.x); - this->y /= static_cast(v.x); - this->z /= static_cast(v.x); - this->w /= static_cast(v.x); + *this = detail::compute_vec4_div::call(*this, tvec4(v)); return *this; } @@ -384,10 +379,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 & tvec4::operator/=(tvec4 const & v) { - this->x /= static_cast(v.x); - this->y /= static_cast(v.y); - this->z /= static_cast(v.z); - this->w /= static_cast(v.w); + *this = detail::compute_vec4_div::call(*this, tvec4(v)); return *this; } @@ -640,11 +632,7 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 operator-(tvec4 const & v) { - return tvec4( - -v.x, - -v.y, - -v.z, - -v.w); + return tvec4(0) -= v; } // -- Binary arithmetic operators -- @@ -742,51 +730,31 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 operator/(tvec4 const & v, T scalar) { - return tvec4( - v.x / scalar, - v.y / scalar, - v.z / scalar, - v.w / scalar); + return tvec4(v) /= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator/(tvec4 const & v1, tvec1 const & v2) { - return tvec4( - v1.x / v2.x, - v1.y / v2.x, - v1.z / v2.x, - v1.w / v2.x); + return tvec4(v1) /= v2; } template GLM_FUNC_QUALIFIER tvec4 operator/(T scalar, tvec4 const & v) { - return tvec4( - scalar / v.x, - scalar / v.y, - scalar / v.z, - scalar / v.w); + return tvec4(scalar) /= v; } template GLM_FUNC_QUALIFIER tvec4 operator/(tvec1 const & v1, tvec4 const & v2) { - return tvec4( - v1.x / v2.x, - v1.x / v2.y, - v1.x / v2.z, - v1.x / v2.w); + return tvec4(v1) /= v2; } template GLM_FUNC_QUALIFIER tvec4 operator/(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x / v2.x, - v1.y / v2.y, - v1.z / v2.z, - v1.w / v2.w); + return tvec4(v1) /= v2; } // -- Binary bit operators -- @@ -794,311 +762,187 @@ namespace detail template GLM_FUNC_QUALIFIER tvec4 operator%(tvec4 const & v, T scalar) { - return tvec4( - v.x % scalar, - v.y % scalar, - v.z % scalar, - v.w % scalar); + return tvec4(v) %= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator%(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x % scalar.x, - v.y % scalar.x, - v.z % scalar.x, - v.w % scalar.x); + return tvec4(v) %= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator%(T scalar, tvec4 const & v) { - return tvec4( - scalar % v.x, - scalar % v.y, - scalar % v.z, - scalar % v.w); + return tvec4(scalar) %= v; } template GLM_FUNC_QUALIFIER tvec4 operator%(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x % v.x, - scalar.x % v.y, - scalar.x % v.z, - scalar.x % v.w); + return tvec4(scalar) %= v; } template GLM_FUNC_QUALIFIER tvec4 operator%(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x % v2.x, - v1.y % v2.y, - v1.z % v2.z, - v1.w % v2.w); + return tvec4(v1) %= v2; } template GLM_FUNC_QUALIFIER tvec4 operator&(tvec4 const & v, T scalar) { - return tvec4( - v.x & scalar, - v.y & scalar, - v.z & scalar, - v.w & scalar); + return tvec4(v) %= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator&(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x & scalar.x, - v.y & scalar.x, - v.z & scalar.x, - v.w & scalar.x); + return tvec4(v) %= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator&(T scalar, tvec4 const & v) { - return tvec4( - scalar & v.x, - scalar & v.y, - scalar & v.z, - scalar & v.w); + return tvec4(scalar) &= v; } template GLM_FUNC_QUALIFIER tvec4 operator&(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x & v.x, - scalar.x & v.y, - scalar.x & v.z, - scalar.x & v.w); + return tvec4(scalar) &= v; } template GLM_FUNC_QUALIFIER tvec4 operator&(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x & v2.x, - v1.y & v2.y, - v1.z & v2.z, - v1.w & v2.w); + return tvec4(v1) &= v2; } template GLM_FUNC_QUALIFIER tvec4 operator|(tvec4 const & v, T scalar) { - return tvec4( - v.x | scalar, - v.y | scalar, - v.z | scalar, - v.w | scalar); + return tvec4(v) |= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator|(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x | scalar.x, - v.y | scalar.x, - v.z | scalar.x, - v.w | scalar.x); + return tvec4(v) |= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator|(T scalar, tvec4 const & v) { - return tvec4( - scalar | v.x, - scalar | v.y, - scalar | v.z, - scalar | v.w); + return tvec4(v) |= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator|(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x | v.x, - scalar.x | v.y, - scalar.x | v.z, - scalar.x | v.w); + return tvec4(v) |= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator|(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x | v2.x, - v1.y | v2.y, - v1.z | v2.z, - v1.w | v2.w); + return tvec4(v1) |= v2; } template GLM_FUNC_QUALIFIER tvec4 operator^(tvec4 const & v, T scalar) { - return tvec4( - v.x ^ scalar, - v.y ^ scalar, - v.z ^ scalar, - v.w ^ scalar); + return tvec4(v) ^= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator^(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x ^ scalar.x, - v.y ^ scalar.x, - v.z ^ scalar.x, - v.w ^ scalar.x); + return tvec4(v) ^= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator^(T scalar, tvec4 const & v) { - return tvec4( - scalar ^ v.x, - scalar ^ v.y, - scalar ^ v.z, - scalar ^ v.w); + return tvec4(v) ^= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator^(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x ^ v.x, - scalar.x ^ v.y, - scalar.x ^ v.z, - scalar.x ^ v.w); + return tvec4(v) ^= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator^(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x ^ v2.x, - v1.y ^ v2.y, - v1.z ^ v2.z, - v1.w ^ v2.w); + return tvec4(v1) ^= v2; } template GLM_FUNC_QUALIFIER tvec4 operator<<(tvec4 const & v, T scalar) { - return tvec4( - v.x << scalar, - v.y << scalar, - v.z << scalar, - v.w << scalar); + return tvec4(v) <<= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator<<(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x << scalar.x, - v.y << scalar.x, - v.z << scalar.x, - v.w << scalar.x); + return tvec4(v) <<= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator<<(T scalar, tvec4 const & v) { - return tvec4( - scalar << v.x, - scalar << v.y, - scalar << v.z, - scalar << v.w); + return tvec4(scalar) <<= v; } template GLM_FUNC_QUALIFIER tvec4 operator<<(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x << v.x, - scalar.x << v.y, - scalar.x << v.z, - scalar.x << v.w); + return tvec4(scalar) <<= v; } template GLM_FUNC_QUALIFIER tvec4 operator<<(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x << v2.x, - v1.y << v2.y, - v1.z << v2.z, - v1.w << v2.w); + return tvec4(v1) <<= v2; } template GLM_FUNC_QUALIFIER tvec4 operator>>(tvec4 const & v, T scalar) { - return tvec4( - v.x >> scalar, - v.y >> scalar, - v.z >> scalar, - v.w >> scalar); + return tvec4(v) >>= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator>>(tvec4 const & v, tvec1 const & scalar) { - return tvec4( - v.x >> scalar.x, - v.y >> scalar.x, - v.z >> scalar.x, - v.w >> scalar.x); + return tvec4(v) >>= scalar; } template GLM_FUNC_QUALIFIER tvec4 operator>>(T scalar, tvec4 const & v) { - return tvec4( - scalar >> v.x, - scalar >> v.y, - scalar >> v.z, - scalar >> v.w); + return tvec4(scalar) >>= v; } template GLM_FUNC_QUALIFIER tvec4 operator>>(tvec1 const & scalar, tvec4 const & v) { - return tvec4( - scalar.x >> v.x, - scalar.x >> v.y, - scalar.x >> v.z, - scalar.x >> v.w); + return tvec4(scalar) >>= v; } template GLM_FUNC_QUALIFIER tvec4 operator>>(tvec4 const & v1, tvec4 const & v2) { - return tvec4( - v1.x >> v2.x, - v1.y >> v2.y, - v1.z >> v2.z, - v1.w >> v2.w); + return tvec4(v1) >>= v2; } template GLM_FUNC_QUALIFIER tvec4 operator~(tvec4 const & v) { - return tvec4( - ~v.x, - ~v.y, - ~v.z, - ~v.w); + return tvec4(~v.x, ~v.y, ~v.z, ~v.w); } // -- Boolean operators -- diff --git a/glm/detail/type_vec4_simd.inl b/glm/detail/type_vec4_simd.inl index ded285c9..c2ed2f97 100644 --- a/glm/detail/type_vec4_simd.inl +++ b/glm/detail/type_vec4_simd.inl @@ -16,6 +16,50 @@ namespace detail return Result; } }; + + template + struct compute_vec4_sub + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + tvec4 Result(uninitialize); + Result.data = _mm_sub_ps(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_mul + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + tvec4 Result(uninitialize); + Result.data = _mm_mul_ps(a.data, b.data); + return Result; + } + }; + + template + struct compute_vec4_div + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + tvec4 Result(uninitialize); + Result.data = _mm_div_ps(a.data, b.data); + return Result; + } + }; + + template <> + struct compute_vec4_div + { + static tvec4 call(tvec4 const & a, tvec4 const & b) + { + tvec4 Result(uninitialize); + Result.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data)); + return Result; + } + }; }//namespace detail # if !GLM_HAS_DEFAULTED_FUNCTIONS