mirror of
https://github.com/HandmadeMath/HandmadeMath.git
synced 2025-09-07 10:48:17 +00:00
118 lines
3.6 KiB
C
118 lines
3.6 KiB
C
#include "../HandmadeTest.h"
|
|
|
|
TEST(QuaternionOps, Inverse)
|
|
{
|
|
hmm_quaternion q1 = HMM_Quaternion(1.0f, 2.0f, 3.0f, 4.0f);
|
|
hmm_quaternion inverse = HMM_InverseQuaternion(q1);
|
|
|
|
hmm_quaternion result = HMM_MultiplyQuaternion(q1, inverse);
|
|
|
|
EXPECT_FLOAT_EQ(result.X, 0.0f);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.0f);
|
|
EXPECT_FLOAT_EQ(result.Z, 0.0f);
|
|
EXPECT_FLOAT_EQ(result.W, 1.0f);
|
|
}
|
|
|
|
TEST(QuaternionOps, Dot)
|
|
{
|
|
hmm_quaternion q1 = HMM_Quaternion(1.0f, 2.0f, 3.0f, 4.0f);
|
|
hmm_quaternion q2 = HMM_Quaternion(5.0f, 6.0f, 7.0f, 8.0f);
|
|
|
|
{
|
|
float result = HMM_DotQuaternion(q1, q2);
|
|
EXPECT_FLOAT_EQ(result, 70.0f);
|
|
}
|
|
#ifdef __cplusplus
|
|
{
|
|
float result = HMM_Dot(q1, q2);
|
|
EXPECT_FLOAT_EQ(result, 70.0f);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
TEST(QuaternionOps, Normalize)
|
|
{
|
|
hmm_quaternion q = HMM_Quaternion(1.0f, 2.0f, 3.0f, 4.0f);
|
|
|
|
{
|
|
hmm_quaternion result = HMM_NormalizeQuaternion(q);
|
|
EXPECT_FLOAT_EQ(result.X, 0.1825741858f);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.3651483717f);
|
|
EXPECT_FLOAT_EQ(result.Z, 0.5477225575f);
|
|
EXPECT_FLOAT_EQ(result.W, 0.7302967433f);
|
|
}
|
|
#ifdef __cplusplus
|
|
{
|
|
hmm_quaternion result = HMM_Normalize(q);
|
|
EXPECT_FLOAT_EQ(result.X, 0.1825741858f);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.3651483717f);
|
|
EXPECT_FLOAT_EQ(result.Z, 0.5477225575f);
|
|
EXPECT_FLOAT_EQ(result.W, 0.7302967433f);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
TEST(QuaternionOps, NLerp)
|
|
{
|
|
hmm_quaternion from = HMM_Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
|
|
hmm_quaternion to = HMM_Quaternion(0.5f, 0.5f, -0.5f, 0.5f);
|
|
|
|
hmm_quaternion result = HMM_NLerp(from, 0.5f, to);
|
|
EXPECT_FLOAT_EQ(result.X, 0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.Z, -0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.W, 0.86602540f);
|
|
}
|
|
|
|
TEST(QuaternionOps, Slerp)
|
|
{
|
|
hmm_quaternion from = HMM_Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
|
|
hmm_quaternion to = HMM_Quaternion(0.5f, 0.5f, -0.5f, 0.5f);
|
|
|
|
hmm_quaternion result = HMM_Slerp(from, 0.5f, to);
|
|
EXPECT_FLOAT_EQ(result.X, 0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.Z, -0.28867513f);
|
|
EXPECT_FLOAT_EQ(result.W, 0.86602540f);
|
|
}
|
|
|
|
TEST(QuaternionOps, ToMat4)
|
|
{
|
|
const float abs_error = 0.0001f;
|
|
|
|
hmm_quaternion rot = HMM_Quaternion(0.707107f, 0.0f, 0.0f, 0.707107f);
|
|
|
|
hmm_mat4 result = HMM_QuaternionToMat4(rot);
|
|
|
|
EXPECT_NEAR(result.Elements[0][0], 1.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[0][1], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[0][2], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[0][3], 0.0f, abs_error);
|
|
|
|
EXPECT_NEAR(result.Elements[1][0], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[1][1], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[1][2], 1.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[1][3], 0.0f, abs_error);
|
|
|
|
EXPECT_NEAR(result.Elements[2][0], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[2][1], -1.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[2][2], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[2][3], 0.0f, abs_error);
|
|
|
|
EXPECT_NEAR(result.Elements[3][0], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[3][1], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[3][2], 0.0f, abs_error);
|
|
EXPECT_NEAR(result.Elements[3][3], 1.0f, abs_error);
|
|
}
|
|
|
|
TEST(QuaternionOps, FromAxisAngle)
|
|
{
|
|
hmm_vec3 axis = HMM_Vec3(1.0f, 0.0f, 0.0f);
|
|
float angle = HMM_PI32 / 2.0f;
|
|
|
|
hmm_quaternion result = HMM_QuaternionFromAxisAngle(axis, angle);
|
|
EXPECT_NEAR(result.X, 0.707107f, FLT_EPSILON * 2);
|
|
EXPECT_FLOAT_EQ(result.Y, 0.0f);
|
|
EXPECT_FLOAT_EQ(result.Z, 0.0f);
|
|
EXPECT_NEAR(result.W, 0.707107f, FLT_EPSILON * 2);
|
|
} |