diff --git a/HandmadeMath.h b/HandmadeMath.h index 426c2bd..b6c47c4 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -2795,6 +2795,46 @@ HMM_INLINE hmm_bool operator!=(hmm_vec4 Left, hmm_vec4 Right) return !HMM_PREFIX(EqualsVec4)(Left, Right); } +COVERAGE(HMM_UnaryMinusVec2, 1) +HMM_INLINE hmm_vec2 operator-(hmm_vec2 In) +{ + ASSERT_COVERED(HMM_UnaryMinusVec2); + + hmm_vec2 Result; + Result.X = -In.X; + Result.Y = -In.Y; + return(Result); +} + +COVERAGE(HMM_UnaryMinusVec3, 1) +HMM_INLINE hmm_vec3 operator-(hmm_vec3 In) +{ + ASSERT_COVERED(HMM_UnaryMinusVec3); + + hmm_vec3 Result; + Result.X = -In.X; + Result.Y = -In.Y; + Result.Z = -In.Z; + return(Result); +} + +COVERAGE(HMM_UnaryMinusVec4, 1) +HMM_INLINE hmm_vec4 operator-(hmm_vec4 In) +{ + ASSERT_COVERED(HMM_UnaryMinusVec4); + + hmm_vec4 Result; +#if HANDMADE_MATH__USE_SSE + Result.InternalElementsSSE = _mm_xor_ps(In.InternalElementsSSE, _mm_set1_ps(-0.0f)); +#else + Result.X = -In.X; + Result.Y = -In.Y; + Result.Z = -In.Z; + Result.W = -In.W; +#endif + return(Result); +} + #endif /* __cplusplus */ #if defined(__GNUC__) || defined(__clang__) diff --git a/README.md b/README.md index 9b53a62..b485378 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ To get started, go download [the latest release](https://github.com/HandmadeMath Version | Changes | ----------------|----------------| +**1.12.0** | Added Unary Minus operator for `HMM_Vec2`, `HMM_Vec3`, and `HMM_Vec4`. | **1.11.1** | Added HMM_PREFIX macro to a few functions that were missing it. | **1.11.0** | Added ability to customize or remove the default `HMM_` prefix on function names by defining a macro called `HMM_PREFIX(name)`. | **1.10.1** | Removed stdint.h, this doesn't exist on some really old compilers and we didn't really use it anyways. | diff --git a/test/categories/Subtraction.h b/test/categories/Subtraction.h index ff26a9b..d1a3613 100644 --- a/test/categories/Subtraction.h +++ b/test/categories/Subtraction.h @@ -199,3 +199,32 @@ TEST(Subtraction, Quaternion) EXPECT_FLOAT_EQ(q1.W, -4.0f); #endif } + +#ifdef __cplusplus +TEST(UnaryMinus, Vec2) +{ + hmm_vec2 VectorOne = {1.0f, 2.0f}; + hmm_vec2 Result = -VectorOne; + EXPECT_FLOAT_EQ(Result.X, -1.0f); + EXPECT_FLOAT_EQ(Result.Y, -2.0f); +} + +TEST(UnaryMinus, Vec3) +{ + hmm_vec3 VectorOne = {1.0f, 2.0f, 3.0f}; + hmm_vec3 Result = -VectorOne; + EXPECT_FLOAT_EQ(Result.X, -1.0f); + EXPECT_FLOAT_EQ(Result.Y, -2.0f); + EXPECT_FLOAT_EQ(Result.Z, -3.0f); +} + +TEST(UnaryMinus, Vec4) +{ + hmm_vec4 VectorOne = {1.0f, 2.0f, 3.0f, 4.0f}; + hmm_vec4 Result = -VectorOne; + EXPECT_FLOAT_EQ(Result.X, -1.0f); + EXPECT_FLOAT_EQ(Result.Y, -2.0f); + EXPECT_FLOAT_EQ(Result.Z, -3.0f); + EXPECT_FLOAT_EQ(Result.W, -4.0f); +} +#endif