mirror of
https://github.com/recp/cglm.git
synced 2026-01-02 21:59:56 +00:00
tests: add some test for project/unproject
This commit is contained in:
@@ -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
|
||||
|
||||
92
test/src/test_project.h
Normal file
92
test/src/test_project.h
Normal file
@@ -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
|
||||
}
|
||||
16
test/tests.h
16
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)
|
||||
|
||||
Reference in New Issue
Block a user