From 57c3be0b9f4eb52967baa94f62dbfdaf4f8e8f6d Mon Sep 17 00:00:00 2001 From: Sergey Krivohatskiy Date: Tue, 23 Mar 2021 14:24:41 +0300 Subject: [PATCH] Added axisAngle tests Signed-off-by: Sergey Krivohatskiy --- test/gtx/gtx_matrix_interpolation.cpp | 60 ++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/test/gtx/gtx_matrix_interpolation.cpp b/test/gtx/gtx_matrix_interpolation.cpp index 38f0ce5d..d505bee3 100644 --- a/test/gtx/gtx_matrix_interpolation.cpp +++ b/test/gtx/gtx_matrix_interpolation.cpp @@ -1,8 +1,11 @@ #define GLM_ENABLE_EXPERIMENTAL #include +#include #include #include +#include + static int test_axisAngle() { @@ -34,6 +37,60 @@ static int test_axisAngle() return Error; } +template +int testForAxisAngle(glm::tvec3 const axisTrue, T const angleTrue) +{ + T const eps = sqrt(std::numeric_limits::epsilon()); + + glm::tmat4x4 const matTrue = glm::axisAngleMatrix(axisTrue, angleTrue); + + glm::tvec3 axis; + T angle; + glm::axisAngle(matTrue, axis, angle); + glm::tmat4x4 const matRebuilt = glm::axisAngleMatrix(axis, angle); + + glm::tmat4x4 const errMat = matTrue - matRebuilt; + T const maxErr = glm::compMax(glm::tvec4( + glm::compMax(glm::abs(errMat[0])), + glm::compMax(glm::abs(errMat[1])), + glm::compMax(glm::abs(errMat[2])), + glm::compMax(glm::abs(errMat[3])) + )); + + return maxErr < eps ? 0 : 1; +} + +static int test_axisAngle2() +{ + int Error = 0; + + Error += testForAxisAngle(glm::vec3(0.0f, 1.0f, 0.0f), 0.0f); + Error += testForAxisAngle(glm::vec3(0.358f, 0.0716f, 0.9309f), 0.00001f); + Error += testForAxisAngle(glm::vec3(1.0f, 0.0f, 0.0f), 0.0001f); + Error += testForAxisAngle(glm::vec3(0.0f, 0.0f, 1.0f), 0.001f); + Error += testForAxisAngle(glm::vec3(0.0f, 0.0f, 1.0f), 0.001f); + Error += testForAxisAngle(glm::vec3(0.0f, 1.0f, 0.0f), 0.005f); + Error += testForAxisAngle(glm::vec3(0.0f, 0.0f, 1.0f), 0.005f); + Error += testForAxisAngle(glm::vec3(0.358f, 0.0716f, 0.9309f), 0.03f); + Error += testForAxisAngle(glm::vec3(0.358f, 0.0716f, 0.9309f), 0.0003f); + Error += testForAxisAngle(glm::vec3(0.0f, 0.0f, 1.0f), 0.01f); + Error += testForAxisAngle(glm::dvec3(0.0f, 1.0f, 0.0f), 0.00005); + Error += testForAxisAngle(glm::dvec3(-1.0f, 0.0f, 0.0f), 0.000001); + Error += testForAxisAngle(glm::dvec3(0.7071f, 0.7071f, 0.0f), 0.5); + Error += testForAxisAngle(glm::dvec3(0.7071f, 0.0f, 0.7071f), 0.0002); + Error += testForAxisAngle(glm::dvec3(0.7071f, 0.0f, 0.7071f), 0.00002); + Error += testForAxisAngle(glm::dvec3(0.7071f, 0.0f, 0.7071f), 0.000002); + Error += testForAxisAngle(glm::dvec3(0.7071f, 0.0f, 0.7071f), 0.0000002); + Error += testForAxisAngle(glm::vec3(0.0f, 0.7071f, 0.7071f), 1.3f); + Error += testForAxisAngle(glm::vec3(0.0f, 0.7071f, 0.7071f), 6.3f); + Error += testForAxisAngle(glm::vec3(1.0f, 0.0f, 0.0f), -0.23456f); + Error += testForAxisAngle(glm::vec3(1.0f, 0.0f, 0.0f), glm::pi()); + Error += testForAxisAngle(glm::vec3(0.0f, 1.0f, 0.0f), -glm::pi()); + Error += testForAxisAngle(glm::vec3(0.358f, 0.0716f, 0.9309f), -glm::pi()); + + return Error; +} + static int test_rotate() { glm::mat4 m2(1.0); @@ -49,8 +106,9 @@ static int test_rotate() int main() { int Error = 0; - + Error += test_axisAngle(); + Error += test_axisAngle2(); Error += test_rotate(); return Error;