diff --git a/HandmadeMath.h b/HandmadeMath.h index f3bf3de..641c378 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -2504,41 +2504,53 @@ static inline HMM_Quat HMM_M4ToQ_LH(HMM_Mat4 M) COVERAGE(HMM_QFromAxisAngle_RH, 1) -static inline HMM_Quat HMM_QFromAxisAngle_RH(HMM_Vec3 Axis, float AngleOfRotation) +static inline HMM_Quat HMM_QFromAxisAngle_RH(HMM_Vec3 Axis, float Angle) { ASSERT_COVERED(HMM_QFromAxisAngle_RH); HMM_Quat Result; HMM_Vec3 AxisNormalized = HMM_NormV3(Axis); - float SineOfRotation = HMM_SinF(AngleOfRotation / 2.0f); + float SineOfRotation = HMM_SinF(Angle / 2.0f); Result.XYZ = HMM_MulV3F(AxisNormalized, SineOfRotation); - Result.W = HMM_CosF(AngleOfRotation / 2.0f); + Result.W = HMM_CosF(Angle / 2.0f); return Result; } COVERAGE(HMM_QFromAxisAngle_LH, 1) -static inline HMM_Quat HMM_QFromAxisAngle_LH(HMM_Vec3 Axis, float AngleOfRotation) +static inline HMM_Quat HMM_QFromAxisAngle_LH(HMM_Vec3 Axis, float Angle) { ASSERT_COVERED(HMM_QFromAxisAngle_LH); - return HMM_QFromAxisAngle_RH(Axis, -AngleOfRotation); + return HMM_QFromAxisAngle_RH(Axis, -Angle); } - // implementation from // https://blog.molecular-matters.com/2013/05/24/a-faster-quaternion-vector-multiplication/ -COVERAGE(HMM_RotateQV3, 1) -static inline HMM_Vec3 HMM_RotateQV3(HMM_Quat Q, HMM_Vec3 V) +COVERAGE(HMM_RotateV3Q, 1) +static inline HMM_Vec3 HMM_RotateV3Q(HMM_Vec3 V, HMM_Quat Q) { - ASSERT_COVERED(HMM_RotateQV3); + ASSERT_COVERED(HMM_RotateV3Q); HMM_Vec3 t = HMM_MulV3F(HMM_Cross(Q.XYZ, V), 2); return HMM_AddV3(V, HMM_AddV3(HMM_MulV3F(t, Q.W), HMM_Cross(Q.XYZ, t))); } +COVERAGE(HMM_RotateV3AxisAngle_LH, 1) +static inline HMM_Vec3 HMM_RotateV3AxisAngle_LH(HMM_Vec3 V, HMM_Vec3 Axis, float Angle) { + ASSERT_COVERED(HMM_RotateV3AxisAngle_LH); + + return HMM_RotateV3Q(V, HMM_QFromAxisAngle_LH(Axis, Angle)); +} + +COVERAGE(HMM_RotateV3AxisAngle_RH, 1) +static inline HMM_Vec3 HMM_RotateV3AxisAngle_RH(HMM_Vec3 V, HMM_Vec3 Axis, float Angle) { + ASSERT_COVERED(HMM_RotateV3AxisAngle_RH); + + return HMM_RotateV3Q(V, HMM_QFromAxisAngle_RH(Axis, Angle)); +} #ifdef __cplusplus diff --git a/test/categories/QuaternionOps.h b/test/categories/QuaternionOps.h index c96096c..18bebf2 100644 --- a/test/categories/QuaternionOps.h +++ b/test/categories/QuaternionOps.h @@ -254,43 +254,20 @@ TEST(QuaternionOps, Mat4ToQuat) } } -TEST(QuaternionOps, FromAxisAngle) -{ - HMM_Vec3 axis = HMM_V3(1.0f, 0.0f, 0.0f); - float angle = HMM_PI32 / 2.0f; - - { - HMM_Quat result = HMM_QFromAxisAngle_RH(axis, angle); - EXPECT_NEAR(result.X, 0.707107f, 0.001f); - EXPECT_NEAR(result.Y, 0.0f, 0.001f); - EXPECT_NEAR(result.Z, 0.0f, 0.001f); - EXPECT_NEAR(result.W, 0.707107f, 0.001f); - } - { - HMM_Quat result = HMM_QFromAxisAngle_LH(axis, angle); - EXPECT_NEAR(result.X, -0.707107f, 0.001f); - EXPECT_NEAR(result.Y, 0.0f, 0.001f); - EXPECT_NEAR(result.Z, 0.0f, 0.001f); - EXPECT_NEAR(result.W, 0.707107f, 0.001f); - } -} - -TEST(QuaternionOps, RotateVector) +TEST(QuaternionOps, RotateVectorAxisAngle) { { HMM_Vec3 axis = HMM_V3(0.0f, 1.0f, 0.0f); - float angle = -HMM_PI32 / 2.0f; - HMM_Quat q = HMM_QFromAxisAngle_RH(axis, angle); - HMM_Vec3 result = HMM_RotateQV3(q, HMM_V3(1.0f, 0.0f, 0.0f)); + float angle = HMM_AngleTurn(1.0/4); + HMM_Vec3 result = HMM_RotateV3AxisAngle_LH(HMM_V3(1.0f, 0.0f, 0.0f), axis, angle); EXPECT_NEAR(result.X, 0.0f, 0.001f); EXPECT_NEAR(result.Y, 0.0f, 0.001f); EXPECT_NEAR(result.Z, 1.0f, 0.001f); } { HMM_Vec3 axis = HMM_V3(1.0f, 0.0f, 0.0f); - float angle = HMM_PI32 / 4.0f; - HMM_Quat q = HMM_QFromAxisAngle_RH(axis, angle); - HMM_Vec3 result = HMM_RotateQV3(q, HMM_V3(0.0f, 0.0f, 1.0f)); + float angle = HMM_AngleTurn(1.0/8); + HMM_Vec3 result = HMM_RotateV3AxisAngle_RH(HMM_V3(0.0f, 0.0f, 1.0f), axis, angle); EXPECT_NEAR(result.X, 0.0f, 0.001f); EXPECT_NEAR(result.Y, -0.707170f, 0.001f); EXPECT_NEAR(result.Z, 0.707170f, 0.001f);