#include #include #include #include #include #include #include #include "dvt_unit_common.h" using namespace davinci; //------------------------------------------------------------------------------------- TEST(MathUtil, Basic) { //lookat view matrix { float dEye[3] = { 0.0f, 4.0f, -10.0f }; float dAt[3] = { 0.0f, 1.0f, 0.0f }; float dUp[3] = { 0.0f, 1.0f, 0.0f }; fMatrix4 m1 = MathUtil::lookatRH( fVector3(THREE_ELEMENT(dEye)), fVector3(THREE_ELEMENT(dAt)), fVector3(THREE_ELEMENT(dUp))); glm::mat4 gm1 = glm::lookAtRH(glm::vec3(THREE_ELEMENT(dEye)), glm::vec3(THREE_ELEMENT(dAt)), glm::vec3(THREE_ELEMENT(dUp))); EXPECT_EQ_4X4_T(m1, gm1); } //lookat view matrix(random) { for (int i = 0; i < 10; i++) { fVector3 dEye, dAt, dUp; do { dEye[0] = _randomFloat(); dEye[1] = _randomFloat(); dEye[2] = _randomFloat(); dAt[0] = _randomFloat(); dAt[1] = _randomFloat(); dAt[2] = _randomFloat(); dUp[0] = _randomFloat(); dUp[1] = _randomFloat(); dUp[2] = _randomFloat(); } while ((dEye == dAt) || (dUp == fVector3::ZERO)); fMatrix4 m1 = MathUtil::lookatRH( fVector3(THREE_ELEMENT(dEye)), fVector3(THREE_ELEMENT(dAt)), fVector3(THREE_ELEMENT(dUp))); glm::mat4 gm1 = glm::lookAtRH(glm::vec3(THREE_ELEMENT(dEye)), glm::vec3(THREE_ELEMENT(dAt)), glm::vec3(THREE_ELEMENT(dUp))); EXPECT_EQ_4X4_T_APPROX(m1, gm1, std::numeric_limits::epsilon() * 1000); } } //perspective { float width = 640.f, height = 480.f; fMatrix4 m1 = MathUtil::perspectiveFovRH(MathUtil::PI_DIV4, width / height, 0.01f, 100.f); glm::mat4 gm1 = glm::perspectiveRH(MathUtil::PI_DIV4, width / height, 0.01f, 100.f); EXPECT_EQ_4X4_T_APPROX(m1, gm1, std::numeric_limits::epsilon()); } //perspective(random) { for (int i = 0; i < 10; i++) { float fov = MathUtil::rangeRandom(0.1f, MathUtil::PI); float aspect = MathUtil::rangeRandom(0.1f, 100.f); float zNear = MathUtil::rangeRandom(0.00001f, 0.01f); float zFar = MathUtil::rangeRandom(100.f, 10000.f); fMatrix4 m1 = MathUtil::perspectiveFovRH(fov, aspect, zNear, zFar); glm::mat4 gm1 = glm::perspectiveRH(fov, aspect, zNear, zFar); EXPECT_EQ_4X4_T_APPROX(m1, gm1, std::numeric_limits::epsilon() * 100); } } }