From d7b37ba245a87275c1197303ac5e1ad1927fa940 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 22 Sep 2019 10:52:02 +0300 Subject: [PATCH] tests: add some test for project/unproject --- test/src/test_project.c | 34 +++++++-------- test/src/test_project.h | 92 +++++++++++++++++++++++++++++++++++++++++ test/tests.h | 16 ++++++- 3 files changed, 120 insertions(+), 22 deletions(-) create mode 100644 test/src/test_project.h diff --git a/test/src/test_project.c b/test/src/test_project.c index d590423..b55b1d8 100644 --- a/test/src/test_project.c +++ b/test/src/test_project.c @@ -5,28 +5,22 @@ * Full license can be found in the LICENSE file */ -#include "test_common.h" +/* test inline project */ -TEST_IMPL(project) { - mat4 model, view, proj, mvp; - vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f}; - vec3 pos = {13.0f, 45.0f, 0.74f}; - vec3 projected, unprojected; +#define GLM_PREFIX glm_ +#define GLM(X) (glm_ ## X) - glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f}); - glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view); +#include "test_project.h" - glm_perspective_default(0.5f, proj); - glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp); +#undef GLM +#undef GLM_PREFIX - glmc_project(pos, mvp, viewport, projected); - glmc_unproject(projected, mvp, viewport, unprojected); +/* test pre-compiled project */ - /* unprojected of projected vector must be same as original one */ - /* we used 0.01 because of projection floating point errors */ - ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01); - ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01); - ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01); - - TEST_SUCCESS -} +#define GLM_PREFIX glmc_ +#define GLM(X) (glmc_ ## X) + +#include "test_project.h" + +#undef GLM +#undef GLM_PREFIX diff --git a/test/src/test_project.h b/test/src/test_project.h new file mode 100644 index 0000000..3add32b --- /dev/null +++ b/test/src/test_project.h @@ -0,0 +1,92 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "test_common.h" + +TEST_IMPL(GLM_PREFIX, unprojecti) { + mat4 model, view, proj, mvp; + vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f}; + vec3 pos = {13.0f, 45.0f, 0.74f}; + vec3 projected, unprojected; + + glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f}); + glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view); + + glm_perspective_default(0.5f, proj); + glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp); + + GLM(project)(pos, mvp, viewport, projected); + + glm_mat4_inv(mvp, mvp); + GLM(unprojecti)(projected, mvp, viewport, unprojected); + + /* unprojected of projected vector must be same as original one */ + /* we used 0.01 because of projection floating point errors */ + ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) + ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) + ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, unproject) { + mat4 model, view, proj, mvp; + vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f}; + vec3 pos = {13.0f, 45.0f, 0.74f}; + vec3 projected, unprojected; + + glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f}); + glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view); + + glm_perspective_default(0.5f, proj); + glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp); + + GLM(project)(pos, mvp, viewport, projected); + GLM(unproject)(projected, mvp, viewport, unprojected); + + /* unprojected of projected vector must be same as original one */ + /* we used 0.01 because of projection floating point errors */ + ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) + ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) + ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, project) { + mat4 model, view, proj, mvp; + vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f}; + vec3 pos = {13.0f, 45.0f, 0.74f}; + vec3 projected, unprojected; + + glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f}); + glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view); + + glm_perspective_default(0.5f, proj); + glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp); + + GLM(project)(pos, mvp, viewport, projected); + GLM(unproject)(projected, mvp, viewport, unprojected); + + /* unprojected of projected vector must be same as original one */ + /* we used 0.01 because of projection floating point errors */ + ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) + ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) + ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) + + /* test with no projection */ + glm_mat4_identity(mvp); + + GLM(project)(pos, mvp, viewport, projected); + GLM(unproject)(projected, mvp, viewport, unprojected); + + ASSERT(glm_eq(pos[0], unprojected[0])) + ASSERT(glm_eq(pos[1], unprojected[1])) + ASSERT(glm_eq(pos[2], unprojected[2])) + + TEST_SUCCESS +} diff --git a/test/tests.h b/test/tests.h index f7eef0e..23c5925 100644 --- a/test/tests.h +++ b/test/tests.h @@ -112,7 +112,13 @@ TEST_DECLARE(camera_lookat) TEST_DECLARE(camera_decomp) /* project */ -TEST_DECLARE(project) +TEST_DECLARE(glm_unprojecti) +TEST_DECLARE(glm_unproject) +TEST_DECLARE(glm_project) + +TEST_DECLARE(glmc_unprojecti) +TEST_DECLARE(glmc_unproject) +TEST_DECLARE(glmc_project) /* utils */ TEST_DECLARE(clamp) @@ -347,7 +353,13 @@ TEST_LIST { TEST_ENTRY(camera_decomp) /* project */ - TEST_ENTRY(project) + TEST_ENTRY(glm_unprojecti) + TEST_ENTRY(glm_unproject) + TEST_ENTRY(glm_project) + + TEST_ENTRY(glmc_unprojecti) + TEST_ENTRY(glmc_unproject) + TEST_ENTRY(glmc_project) /* utils */ TEST_ENTRY(clamp)