From b40a74cb3ee382595cae9da5d9acc0185f5a4396 Mon Sep 17 00:00:00 2001 From: Trinton Bullard Date: Wed, 28 Dec 2016 15:01:39 -0700 Subject: [PATCH] Added new functions --- .gitignore | 3 +- HandmadeMath.h | 88 ++++++++++++++++++++++++++++++--- test/.vs/HandmadeMath/v14/.suo | Bin 5120 -> 0 bytes 3 files changed, 84 insertions(+), 7 deletions(-) delete mode 100644 test/.vs/HandmadeMath/v14/.suo diff --git a/.gitignore b/.gitignore index 1a4d940..6a81e71 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.lo *.o *.obj +*.vs # Precompiled Headers *.gch @@ -30,4 +31,4 @@ *.exe *.out *.app -hmm_test +hmm_test \ No newline at end of file diff --git a/HandmadeMath.h b/HandmadeMath.h index 52b9b09..95c7033 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -164,6 +164,7 @@ FieryDrake (@fierydrake) Gingerbill (@TheGingerBill) Ben Visness (@bvisness) + Trinton Bullard (@Peliex_Dev) Fixes: Jeroen van Rijn (@J_vanRijn) @@ -171,7 +172,9 @@ Insofaras (@insofaras) */ +#ifndef HANDMADE_NO_SSE #include +#endif #ifndef HANDMADE_MATH_H #define HANDMADE_MATH_H @@ -189,7 +192,7 @@ extern "C" { #endif -#ifdef HANDMADEMATH_STATIC +#ifdef HANDMADE_MATH_STATIC #define HMMDEF static #else #define HMMDEF extern @@ -476,8 +479,11 @@ HMMDEF hmm_quaternion HMM_SubtractQuaternion(hmm_quaternion Left, hmm_quaternion HMMDEF hmm_quaternion HMM_MultiplyQuaternion(hmm_quaternion Left, hmm_quaternion Right); HMMDEF hmm_quaternion HMM_MultiplyQuaternionF(hmm_quaternion Left, float Multiplicative); HMMDEF hmm_quaternion HMM_DivideQuaternion(hmm_quaternion Left, hmm_quaternion Right); +HMMDEF hmm_quaternion HMM_DivideQuaternionF(hmm_quaternion Left, float Dividend); HMMDEF float HMM_DotQuaternion(hmm_quaternion Left, hmm_quaternion Right); +HMMDEF hmm_quaternion HMM_NormalizeQuaternion(hmm_quaternion Left); HMMDEF hmm_quaternion HMM_Slerp(hmm_quaternion Left, hmm_quaternion Right, float Time); +HMMDEF hmm_mat4 HMM_QuaternionToMat4(hmm_quaternion Left); #ifdef __cplusplus } @@ -1571,10 +1577,23 @@ HMM_DivideQuaternion(hmm_quaternion Left, hmm_quaternion Right) { hmm_quaternion Result = {0}; - Result.X = Left.X * (1/Right.X); - Result.Y = Left.Y * (1/Right.Y); - Result.Z = Left.Z * (1/Right.Z); - Result.W = Left.W * (1/Right.W); + Result.X = Left.X / Right.X; + Result.Y = Left.Y / Right.Y; + Result.Z = Left.Z / Right.Z; + Result.W = Left.W / Right.W; + + return(Result); +} + +HINLINE hmm_quaternion +HMM_DivideQuaternionF(hmm_quaternion Left, float Dividend) +{ + hmm_quaternion Result = {0}; + + Result.X = Left.X / Dividend; + Result.Y = Left.Y / Dividend; + Result.Z = Left.Z / Dividend; + Result.W = Left.W / Dividend; return(Result); } @@ -1589,6 +1608,17 @@ HMM_DotQuaternion(hmm_quaternion Left, hmm_quaternion Right) return(Result); } +HINLINE hmm_quaternion +HMM_NormalizeQuaternion(hmm_quaternion Left) +{ + hmm_quaternion Result = {0}; + + float Length = HMM_SquareRootF(HMM_DotQuaternion(Left, Left)); + Result = HMM_DivideQuaternionF(Left, Length); + + return(Result); +} + HINLINE hmm_quaternion HMM_Slerp(hmm_quaternion Left, hmm_quaternion Right, float Time) { @@ -1612,6 +1642,43 @@ HMM_Slerp(hmm_quaternion Left, hmm_quaternion Right, float Time) return(Result); } +HINLINE hmm_mat4 +HMM_QuaternionToMat4(hmm_quaternion Left) +{ + hmm_mat4 Result = {0}; + Result = HMM_Mat4d(1); + + hmm_quaternion NormalizedQuaternion = HMM_NormalizeQuaternion(Left); + + float XX, YY, ZZ, + XY, XZ, YZ, + WX, WY, WZ; + + XX = NormalizedQuaternion.X * NormalizedQuaternion.X; + YY = NormalizedQuaternion.Y * NormalizedQuaternion.Y; + ZZ = NormalizedQuaternion.Z * NormalizedQuaternion.Z; + XY = NormalizedQuaternion.X * NormalizedQuaternion.Y; + XZ = NormalizedQuaternion.X * NormalizedQuaternion.Z; + YZ = NormalizedQuaternion.Y * NormalizedQuaternion.Z; + WX = NormalizedQuaternion.W * NormalizedQuaternion.X; + WY = NormalizedQuaternion.W * NormalizedQuaternion.Y; + WZ = NormalizedQuaternion.W * NormalizedQuaternion.Z; + + Result.Elements[0][0] = 1.0f - 2.0f * (YY + ZZ); + Result.Elements[0][1] = 2.0f * (XY + WZ); + Result.Elements[0][2] = 2.0f * (XZ + WY); + + Result.Elements[1][0] = 2.0f * (XY - WZ); + Result.Elements[1][1] = 1.0f - 2.0f * (XX + ZZ); + Result.Elements[1][2] = 2.0f * (YZ + WX); + + Result.Elements[2][0] = 2.0f * (XZ + WY); + Result.Elements[2][1] = 2.0f * (YZ - WX); + Result.Elements[2][2] = 1.0f - 2.0f * (XX + YY); + + return(Result) +} + #ifdef HANDMADE_MATH_CPP_MODE HMMDEF float @@ -2150,7 +2217,9 @@ operator/(hmm_vec2 Left, hmm_vec2 Right) HINLINE hmm_vec3 operator/(hmm_vec3 Left, hmm_vec3 Right) { - hmm_vec3 Result = HMM_Divide(Left, Right); + hmm_vec3 Result = {0}; + + Result = HMM_Divide(Left, Right); return (Result); } @@ -2335,3 +2404,10 @@ operator*=(hmm_mat4 &Left, float Right) #endif /* HANDMADE_MATH_CPP_MODE */ #endif /* HANDMADE_MATH_IMPLEMENTATION */ +#ifdef _MSC_VER +#pragma warning(restore:4201) +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif diff --git a/test/.vs/HandmadeMath/v14/.suo b/test/.vs/HandmadeMath/v14/.suo deleted file mode 100644 index cd716b5e92e9e19814e87ae73f30dc846454ea0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*1Oo3`{V-00RRH0|Ns{?BD42ol<=U11r_o?BXX30j3$IZ<3@!}$49N_o47m)c;C=^44XoXk%8<-Z!T=KS zU`S-hV@P4h1@}@?8FU$Z!TqQVh8S>fs+ggKA%+266-)pt|dp^ygy=_B!X^&v@Vp6DOA5@@R7>CHjfAXRxXp>G9vd qm`sQCk2}?8Fch?^JvDIipE5OYa$CWQ@Ry*Jf-l8`