From 29996d0bddea84c6ba80b5e5e0ce9f6b2e75af02 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 8 Mar 2018 13:02:33 +0300 Subject: [PATCH 01/12] add unproject function --- include/cglm/call.h | 1 + include/cglm/call/project.h | 29 +++++++++++++ include/cglm/cglm.h | 1 + include/cglm/project.h | 84 +++++++++++++++++++++++++++++++++++++ src/project.c | 21 ++++++++++ win/cglm.vcxproj | 3 ++ win/cglm.vcxproj.filters | 9 ++++ 7 files changed, 148 insertions(+) create mode 100644 include/cglm/call/project.h create mode 100644 include/cglm/project.h create mode 100644 src/project.c diff --git a/include/cglm/call.h b/include/cglm/call.h index 3f7bf14..ce08b78 100644 --- a/include/cglm/call.h +++ b/include/cglm/call.h @@ -24,6 +24,7 @@ extern "C" { #include "call/frustum.h" #include "call/box.h" #include "call/io.h" +#include "call/project.h" #ifdef __cplusplus } diff --git a/include/cglm/call/project.h b/include/cglm/call/project.h new file mode 100644 index 0000000..1120b21 --- /dev/null +++ b/include/cglm/call/project.h @@ -0,0 +1,29 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglmc_project_h +#define cglmc_project_h +#ifdef __cplusplus +extern "C" { +#endif + +#include "../cglm.h" + +CGLM_EXPORT +void +glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest); + +CGLM_EXPORT +void +glmc_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest); + +#ifdef __cplusplus +} +#endif +#endif /* cglmc_project_h */ + + diff --git a/include/cglm/cglm.h b/include/cglm/cglm.h index e99bb09..52c7e97 100644 --- a/include/cglm/cglm.h +++ b/include/cglm/cglm.h @@ -23,5 +23,6 @@ #include "color.h" #include "util.h" #include "io.h" +#include "project.h" #endif /* cglm_h */ diff --git a/include/cglm/project.h b/include/cglm/project.h new file mode 100644 index 0000000..27cb42a --- /dev/null +++ b/include/cglm/project.h @@ -0,0 +1,84 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglm_project_h +#define cglm_project_h + +#include "mat4.h" + +/*! + * @brief maps the specified viewport coordinates into specified space [1] + * the matrix should contain projection matrix. + * + * if you don't have ( and don't want to have ) an inverse matrix then use + * glm_unproject version. You may use existing inverse of matrix in somewhere + * else, this is why glm_unprojecti exists to save save inversion cost + * + * [1] space: + * 1- if m = invProj: View Space + * 2- if m = invViewProj: World Space + * 3- if m = invMVP: Object Space + * + * You probably want to map the coordinates into object space + * so use invMVP as m + * + * Computing viewProj: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * glm_mat4_inv(viewProj, invMVP); + * + * @param[in] invMat matrix (see brief) + * @param[in] vp viewport as [x, y, width, height] + * @param[in] coord viewport coordinates + * @param[out] dest unprojected coordinates + */ +CGLM_INLINE +void +glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { + vec4 v; + + v[0] = 2.0f * (coord[0] - vp[0]) / vp[2] - 1.0f; + v[1] = 2.0f * (coord[1] - vp[1]) / vp[3] - 1.0f; + v[2] = 2.0f * coord[2] - 1.0f; + v[3] = 1.0f; + + glm_mat4_mulv(invMat, v, dest); +} + +/*! + * @brief maps the specified viewport coordinates into specified space [1] + * the matrix should contain projection matrix. + * + * this is same as glm_unprojecti except this function get inverse matrix for + * you. + * + * [1] space: + * 1- if m = proj: View Space + * 2- if m = viewProj: World Space + * 3- if m = MVP: Object Space + * + * You probably want to map the coordinates into object space + * so use MVP as m + * + * Computing viewProj: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] m matrix (see brief) + * @param[in] vp viewport as [x, y, width, height] + * @param[in] coord viewport coordinates + * @param[out] dest unprojected coordinates + */ +CGLM_INLINE +void +glm_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest) { + mat4 inv; + glm_mat4_inv(m, inv); + glm_unprojecti(inv, vp, coord, dest); +} + +#endif /* cglm_project_h */ diff --git a/src/project.c b/src/project.c new file mode 100644 index 0000000..80e0b44 --- /dev/null +++ b/src/project.c @@ -0,0 +1,21 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "../include/cglm/cglm.h" +#include "../include/cglm/call.h" + +CGLM_EXPORT +void +glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest) { + glm_unprojecti(invMat, vp, coord, dest); +} + +CGLM_EXPORT +void +glmc_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest) { + glm_unproject(m, vp, coord, dest); +} diff --git a/win/cglm.vcxproj b/win/cglm.vcxproj index 4a0463d..415a87d 100644 --- a/win/cglm.vcxproj +++ b/win/cglm.vcxproj @@ -29,6 +29,7 @@ + @@ -47,6 +48,7 @@ + @@ -60,6 +62,7 @@ + diff --git a/win/cglm.vcxproj.filters b/win/cglm.vcxproj.filters index 506f3d8..3090d72 100644 --- a/win/cglm.vcxproj.filters +++ b/win/cglm.vcxproj.filters @@ -75,6 +75,9 @@ src + + src + @@ -206,5 +209,11 @@ include\cglm + + include\cglm + + + include\cglm\call + \ No newline at end of file From c148eacdc25a82c0fdca3552fe3115856c88486c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 8 Mar 2018 13:12:08 +0300 Subject: [PATCH 02/12] fix unproject's parameters --- include/cglm/project.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/project.h b/include/cglm/project.h index 27cb42a..911a69b 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -75,7 +75,7 @@ glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { */ CGLM_INLINE void -glm_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest) { +glm_unproject(mat4 m, vec4 vp, vec3 coord, vec4 dest) { mat4 inv; glm_mat4_inv(m, inv); glm_unprojecti(inv, vp, coord, dest); From 780179ff0d5796690a3ae84c2160e4cd5e4de22c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Thu, 8 Mar 2018 22:29:10 +0300 Subject: [PATCH 03/12] fix unproject --- include/cglm/call/project.h | 2 +- include/cglm/project.h | 5 ++++- src/project.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/cglm/call/project.h b/include/cglm/call/project.h index 1120b21..c60b9b3 100644 --- a/include/cglm/call/project.h +++ b/include/cglm/call/project.h @@ -19,7 +19,7 @@ glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest); CGLM_EXPORT void -glmc_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest); +glmc_unproject(mat4 m, vec4 vp, vec3 coord, vec3 dest); #ifdef __cplusplus } diff --git a/include/cglm/project.h b/include/cglm/project.h index 911a69b..8a53577 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -9,6 +9,8 @@ #define cglm_project_h #include "mat4.h" +#include "vec3.h" +#include "vec4.h" /*! * @brief maps the specified viewport coordinates into specified space [1] @@ -46,7 +48,8 @@ glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { v[2] = 2.0f * coord[2] - 1.0f; v[3] = 1.0f; - glm_mat4_mulv(invMat, v, dest); + glm_mat4_mulv(invMat, v, v); + glm_vec4_scale(v, 1.0f / v[3], dest); } /*! diff --git a/src/project.c b/src/project.c index 80e0b44..16209e7 100644 --- a/src/project.c +++ b/src/project.c @@ -16,6 +16,6 @@ glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest) { CGLM_EXPORT void -glmc_unproject(mat4 m, vec2 vp, vec3 coord, vec3 dest) { +glmc_unproject(mat4 m, vec4 vp, vec3 coord, vec3 dest) { glm_unproject(m, vp, coord, dest); } From 3399595dc261c937f883b982d4eb8dd792077e46 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 10:46:46 +0300 Subject: [PATCH 04/12] add vec2 type --- include/cglm/types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/cglm/types.h b/include/cglm/types.h index a4170c4..c411d8b 100644 --- a/include/cglm/types.h +++ b/include/cglm/types.h @@ -14,6 +14,7 @@ # define CGLM_ALIGN(X) __attribute((aligned(X))) #endif +typedef float vec2[2]; typedef float vec3[3]; typedef int ivec3[3]; typedef CGLM_ALIGN(16) float vec4[4]; From 9f389ab8ec6ef846801f202c3b3faedeaf2629d5 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 11:09:13 +0300 Subject: [PATCH 05/12] project function --- include/cglm/project.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/cglm/project.h b/include/cglm/project.h index 8a53577..fec21b0 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -84,4 +84,27 @@ glm_unproject(mat4 m, vec4 vp, vec3 coord, vec4 dest) { glm_unprojecti(inv, vp, coord, dest); } +/*! + * @brief map object coordinates to window coordinates + * + * @param[in] pos object coordinates + * @param[in] m MVP matrix + * @param[in] vp viewport as [x, y, width, height] + * @param[out] dest projected coordinates + */ +CGLM_INLINE +void +glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + vec4 pos4; + + glm_vec4(pos, 1.0f, pos4); + + glm_mat4_mulv(m, pos4, pos4); + glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */ + + dest[0] = (pos4[0] + 1.0f) * 0.5f * vp[2] + vp[0]; + dest[1] = (pos4[1] + 1.0f) * 0.5f * vp[3] + vp[1]; + dest[2] = (pos4[2] + 1.0f) * 0.5f; +} + #endif /* cglm_project_h */ From eb527e39b45d6f29322c34cff830a4d90244651e Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 11:25:33 +0300 Subject: [PATCH 06/12] optimize project --- include/cglm/project.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/include/cglm/project.h b/include/cglm/project.h index fec21b0..fdb0cf9 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -67,7 +67,7 @@ glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { * You probably want to map the coordinates into object space * so use MVP as m * - * Computing viewProj: + * Computing viewProj and MVP: * glm_mat4_mul(proj, view, viewProj); * glm_mat4_mul(viewProj, model, MVP); * @@ -87,6 +87,10 @@ glm_unproject(mat4 m, vec4 vp, vec3 coord, vec4 dest) { /*! * @brief map object coordinates to window coordinates * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * * @param[in] pos object coordinates * @param[in] m MVP matrix * @param[in] vp viewport as [x, y, width, height] @@ -95,16 +99,18 @@ glm_unproject(mat4 m, vec4 vp, vec3 coord, vec4 dest) { CGLM_INLINE void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { - vec4 pos4; + vec4 pos4, vone = GLM_VEC4_ONE_INIT; glm_vec4(pos, 1.0f, pos4); glm_mat4_mulv(m, pos4, pos4); glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */ + glm_vec4_add(pos4, vone, pos4); + glm_vec4_scale(pos4, 0.5f, pos4); - dest[0] = (pos4[0] + 1.0f) * 0.5f * vp[2] + vp[0]; - dest[1] = (pos4[1] + 1.0f) * 0.5f * vp[3] + vp[1]; - dest[2] = (pos4[2] + 1.0f) * 0.5f; + dest[0] = pos4[0] * vp[2] + vp[0]; + dest[1] = pos4[1] * vp[3] + vp[1]; + dest[2] = pos4[2]; } #endif /* cglm_project_h */ From 63acfd681e815dc0a4937d0786e2eeded845c24c Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 12:27:20 +0300 Subject: [PATCH 07/12] fix unproject, add tests to project/unproject --- include/cglm/call/project.h | 8 ++++++-- include/cglm/project.h | 19 ++++++++++--------- src/project.c | 14 ++++++++++---- test/src/test_main.c | 3 +++ test/src/test_project.c | 31 +++++++++++++++++++++++++++++++ test/src/test_tests.h | 3 +++ 6 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 test/src/test_project.c diff --git a/include/cglm/call/project.h b/include/cglm/call/project.h index c60b9b3..35ac087 100644 --- a/include/cglm/call/project.h +++ b/include/cglm/call/project.h @@ -15,11 +15,15 @@ extern "C" { CGLM_EXPORT void -glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest); +glmc_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest); CGLM_EXPORT void -glmc_unproject(mat4 m, vec4 vp, vec3 coord, vec3 dest); +glmc_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest); + +CGLM_EXPORT +void +glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest); #ifdef __cplusplus } diff --git a/include/cglm/project.h b/include/cglm/project.h index fdb0cf9..a0b306b 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -33,23 +33,24 @@ * glm_mat4_mul(viewProj, model, MVP); * glm_mat4_inv(viewProj, invMVP); * + * @param[in] pos viewport coordinates * @param[in] invMat matrix (see brief) * @param[in] vp viewport as [x, y, width, height] - * @param[in] coord viewport coordinates * @param[out] dest unprojected coordinates */ CGLM_INLINE void -glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { +glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { vec4 v; - v[0] = 2.0f * (coord[0] - vp[0]) / vp[2] - 1.0f; - v[1] = 2.0f * (coord[1] - vp[1]) / vp[3] - 1.0f; - v[2] = 2.0f * coord[2] - 1.0f; + v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f; + v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f; + v[2] = 2.0f * pos[2] - 1.0f; v[3] = 1.0f; glm_mat4_mulv(invMat, v, v); - glm_vec4_scale(v, 1.0f / v[3], dest); + glm_vec4_scale(v, 1.0f / v[3], v); + glm_vec3(v, dest); } /*! @@ -71,17 +72,17 @@ glm_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec4 dest) { * glm_mat4_mul(proj, view, viewProj); * glm_mat4_mul(viewProj, model, MVP); * + * @param[in] pos viewport coordinates * @param[in] m matrix (see brief) * @param[in] vp viewport as [x, y, width, height] - * @param[in] coord viewport coordinates * @param[out] dest unprojected coordinates */ CGLM_INLINE void -glm_unproject(mat4 m, vec4 vp, vec3 coord, vec4 dest) { +glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) { mat4 inv; glm_mat4_inv(m, inv); - glm_unprojecti(inv, vp, coord, dest); + glm_unprojecti(pos, inv, vp, dest); } /*! diff --git a/src/project.c b/src/project.c index 16209e7..91c7128 100644 --- a/src/project.c +++ b/src/project.c @@ -10,12 +10,18 @@ CGLM_EXPORT void -glmc_unprojecti(mat4 invMat, vec4 vp, vec3 coord, vec3 dest) { - glm_unprojecti(invMat, vp, coord, dest); +glmc_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { + glm_unprojecti(pos, invMat, vp, dest); } CGLM_EXPORT void -glmc_unproject(mat4 m, vec4 vp, vec3 coord, vec3 dest) { - glm_unproject(m, vp, coord, dest); +glmc_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + glm_unproject(pos, m, vp, dest); +} + +CGLM_EXPORT +void +glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + glm_project(pos, m, vp, dest); } diff --git a/test/src/test_main.c b/test/src/test_main.c index 5d59cfd..61fa7d5 100644 --- a/test/src/test_main.c +++ b/test/src/test_main.c @@ -15,6 +15,9 @@ main(int argc, const char * argv[]) { /* camera */ cmocka_unit_test(test_camera_lookat), cmocka_unit_test(test_camera_decomp) + + /* project */ + cmocka_unit_test(test_project) }; return cmocka_run_group_tests(tests, NULL, NULL); diff --git a/test/src/test_project.c b/test/src/test_project.c new file mode 100644 index 0000000..4cdac9e --- /dev/null +++ b/test/src/test_project.c @@ -0,0 +1,31 @@ +/* + * 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" + +void +test_project(void **state) { + 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); + + glmc_project(pos, mvp, viewport, projected); + glmc_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_true(fabsf(pos[0] - unprojected[0]) < 0.01); + assert_true(fabsf(pos[1] - unprojected[1]) < 0.01); + assert_true(fabsf(pos[2] - unprojected[2]) < 0.01); +} diff --git a/test/src/test_tests.h b/test/src/test_tests.h index a4e5adb..26eb91d 100644 --- a/test/src/test_tests.h +++ b/test/src/test_tests.h @@ -16,4 +16,7 @@ test_camera_lookat(void **state); void test_camera_decomp(void **state); +void +test_project(void **state); + #endif /* test_tests_h */ From be81d738950979ec5856f2cc4ca43966660a8b3e Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 12:32:21 +0300 Subject: [PATCH 08/12] Update test_main.c --- test/src/test_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test_main.c b/test/src/test_main.c index dad20f9..f1dfc9b 100644 --- a/test/src/test_main.c +++ b/test/src/test_main.c @@ -17,7 +17,7 @@ main(int argc, const char * argv[]) { cmocka_unit_test(test_camera_decomp) /* project */ - cmocka_unit_test(test_project) + cmocka_unit_test(test_project), /* vector */ cmocka_unit_test(test_clamp), From e8615ea14c1fa11e3dafcd07fb9fa071401289bd Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 12:35:30 +0300 Subject: [PATCH 09/12] fix tests list --- test/src/test_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test_main.c b/test/src/test_main.c index f1dfc9b..5c1a647 100644 --- a/test/src/test_main.c +++ b/test/src/test_main.c @@ -14,7 +14,7 @@ main(int argc, const char * argv[]) { /* camera */ cmocka_unit_test(test_camera_lookat), - cmocka_unit_test(test_camera_decomp) + cmocka_unit_test(test_camera_decomp), /* project */ cmocka_unit_test(test_project), From 024412f00ec05e1c931f604ce5261d2b30c32108 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 16:41:13 +0300 Subject: [PATCH 10/12] add docs for project/unproject --- docs/source/api.rst | 1 + docs/source/project.rst | 102 ++++++++++++++++++++++++++++++++++++++++ include/cglm/project.h | 4 +- 3 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 docs/source/project.rst diff --git a/docs/source/api.rst b/docs/source/api.rst index e2c03d4..c61365b 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -41,6 +41,7 @@ Follow the :doc:`build` documentation for this vec4-ext color plane + project util io call diff --git a/docs/source/project.rst b/docs/source/project.rst new file mode 100644 index 0000000..b31a86a --- /dev/null +++ b/docs/source/project.rst @@ -0,0 +1,102 @@ +.. default-domain:: C + +Project / UnProject +================================================================================ + +Header: cglm/project.h + +Viewport is required as *vec4* **[X, Y, Width, Height]** but this doesn't mean +that you should store it as **vec4**. You can convert your data representation +to vec4 before passing it to related functions. + +Table of contents (click to go): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Functions: + +1. :c:func:`glm_unprojecti` +#. :c:func:`glm_unproject` +#. :c:func:`glm_project` + +Functions documentation +~~~~~~~~~~~~~~~~~~~~~~~ + +.. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) + + | maps the specified viewport coordinates into specified space [1] + the matrix should contain projection matrix. + + if you don't have ( and don't want to have ) an inverse matrix then use + glm_unproject version. You may use existing inverse of matrix in somewhere + else, this is why glm_unprojecti exists to save save inversion cost + + [1] space: + - if m = invProj: View Space + - if m = invViewProj: World Space + - if m = invMVP: Object Space + + You probably want to map the coordinates into object space + so use invMVP as m + + Computing viewProj: + + .. code-block:: c + + glm_mat4_mul(proj, view, viewProj); + glm_mat4_mul(viewProj, model, MVP); + glm_mat4_inv(viewProj, invMVP); + + Parameters: + | *[in]* **pos** point/position in viewport coordinates + | *[in]* **invMat** matrix (see brief) + | *[in]* **vp** viewport as [x, y, width, height] + | *[out]* **dest** unprojected coordinates + +.. c:function:: void glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) + + | maps the specified viewport coordinates into specified space [1] + the matrix should contain projection matrix. + + this is same as glm_unprojecti except this function get inverse matrix for + you. + + [1] space: + - if m = proj: View Space + - if m = viewProj: World Space + - if m = MVP: Object Space + + You probably want to map the coordinates into object space so use MVP as m + + Computing viewProj and MVP: + + .. code-block:: c + + glm_mat4_mul(proj, view, viewProj); + glm_mat4_mul(viewProj, model, MVP); + + Parameters: + | *[in]* **pos** point/position in viewport coordinates + | *[in]* **m** matrix (see brief) + | *[in]* **vp** viewport as [x, y, width, height] + | *[out]* **dest** unprojected coordinates + +.. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) + + | map object coordinates to window coordinates + + Computing MVP: + + .. code-block:: c + + glm_mat4_mul(proj, view, viewProj); + glm_mat4_mul(viewProj, model, MVP); + + this could be useful for gettng a bbox which fits with view frustum and + object bounding boxes. In this case you crop view frustum box with objects + box + + Parameters: + | *[in]* **pos** object coordinates + | *[in]* **m** MVP matrix + | *[in]* **vp** viewport as [x, y, width, height] + | *[out]* **dest** projected coordinates diff --git a/include/cglm/project.h b/include/cglm/project.h index a0b306b..fea44b0 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -33,7 +33,7 @@ * glm_mat4_mul(viewProj, model, MVP); * glm_mat4_inv(viewProj, invMVP); * - * @param[in] pos viewport coordinates + * @param[in] pos point/position in viewport coordinates * @param[in] invMat matrix (see brief) * @param[in] vp viewport as [x, y, width, height] * @param[out] dest unprojected coordinates @@ -72,7 +72,7 @@ glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { * glm_mat4_mul(proj, view, viewProj); * glm_mat4_mul(viewProj, model, MVP); * - * @param[in] pos viewport coordinates + * @param[in] pos point/position in viewport coordinates * @param[in] m matrix (see brief) * @param[in] vp viewport as [x, y, width, height] * @param[out] dest unprojected coordinates From 429fdfd5c53442c37e9264465fb071c3d728890e Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 16:47:51 +0300 Subject: [PATCH 11/12] update build scripts --- makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/makefile.am b/makefile.am index a81bdd5..217fff3 100644 --- a/makefile.am +++ b/makefile.am @@ -98,13 +98,15 @@ libcglm_la_SOURCES=\ src/mat4.c \ src/plane.c \ src/frustum.c \ - src/box.c + src/box.c \ + src/project.c test_tests_SOURCES=\ test/src/test_common.c \ test/src/test_main.c \ test/src/test_mat4.c \ test/src/test_cam.c \ + test/src/test_project.c \ test/src/test_clamp.c \ test/src/test_euler.c From ea0a10ade9a76830c71ea3a2b528dcce7849f34a Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 3 Apr 2018 16:47:59 +0300 Subject: [PATCH 12/12] suppress warnings --- include/cglm/util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cglm/util.h b/include/cglm/util.h index 2a9ece7..85fc789 100644 --- a/include/cglm/util.h +++ b/include/cglm/util.h @@ -43,7 +43,7 @@ glm_sign(int val) { CGLM_INLINE float glm_signf(float val) { - return (val > 0.0f) - (val < 0.0f); + return (float)((val > 0.0f) - (val < 0.0f)); } /*!