From f925f83683c4d75591ceb66399580198aa35f301 Mon Sep 17 00:00:00 2001 From: Zakary Strange Date: Sat, 11 Jan 2020 20:05:19 -0800 Subject: [PATCH] Fixed floating point comparision, and SIMD'd hmm_vec4 comparison --- HandmadeMath.h | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/HandmadeMath.h b/HandmadeMath.h index c85b5b0..e309ba7 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -150,7 +150,7 @@ extern "C" #if !defined(HMM_SINF) || !defined(HMM_COSF) || !defined(HMM_TANF) || \ !defined(HMM_SQRTF) || !defined(HMM_EXPF) || !defined(HMM_LOGF) || \ - !defined(HMM_ACOSF) || !defined(HMM_ATANF)|| !defined(HMM_ATAN2F) + !defined(HMM_ACOSF) || !defined(HMM_ATANF)|| !defined(HMM_ATAN2F) || !defined(HMM_FABS) #include #endif @@ -190,8 +190,13 @@ extern "C" #define HMM_ATAN2F atan2f #endif +#ifndef HMM_FABS +#define HMM_FABS fabs +#endif + #define HMM_PI32 3.14159265359f #define HMM_PI 3.14159265358979323846 +#define HMM_FLOAT_EPSILON 1.19209290E-07F #define HMM_MIN(a, b) (a) > (b) ? (b) : (a) #define HMM_MAX(a, b) (a) < (b) ? (b) : (a) @@ -489,6 +494,12 @@ HMM_INLINE float HMM_LogF(float Float) return (Result); } +HMM_INLINE float HMM_FAbs(float Float) +{ + float Result = HMM_FABS(Float); + return(Result); +} + COVERAGE(HMM_SquareRootF, 1) HMM_INLINE float HMM_SquareRootF(float Float) { @@ -978,12 +989,17 @@ HMM_INLINE hmm_vec4 HMM_DivideVec4f(hmm_vec4 Left, float Right) return (Result); } +HMM_INLINE hmm_bool HMM_AreFloatsSame(float InputOne, float InputTwo) +{ + return(HMM_FAbs(InputOne - InputTwo) < HMM_FLOAT_EPSILON); +} + COVERAGE(HMM_EqualsVec2, 1) HMM_INLINE hmm_bool HMM_EqualsVec2(hmm_vec2 Left, hmm_vec2 Right) { ASSERT_COVERED(HMM_EqualsVec2); - hmm_bool Result = (Left.X == Right.X && Left.Y == Right.Y); + hmm_bool Result = (HMM_AreFloatsSame(Left.X, Right.X) && HMM_AreFloatsSame(Left.Y, Right.Y)); return (Result); } @@ -993,7 +1009,7 @@ HMM_INLINE hmm_bool HMM_EqualsVec3(hmm_vec3 Left, hmm_vec3 Right) { ASSERT_COVERED(HMM_EqualsVec3); - hmm_bool Result = (Left.X == Right.X && Left.Y == Right.Y && Left.Z == Right.Z); + hmm_bool Result = (HMM_AreFloatsSame(Left.X, Right.X) && HMM_AreFloatsSame(Left.Y, Right.Y) && HMM_AreFloatsSame(Left.Z, Right.Z)); return (Result); }