From ba664597088a9b53e20033a1b0101109577c2d10 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Fri, 21 Oct 2022 10:20:03 +0300 Subject: [PATCH] new project function for projecting Z someitmes we need to project z only. this function reduces a few calculations and parameters. --- include/cglm/call/project.h | 4 ++++ include/cglm/clipspace/project_no.h | 23 ++++++++++++++++++++++ include/cglm/clipspace/project_zo.h | 23 ++++++++++++++++++++++ include/cglm/project.h | 22 +++++++++++++++++++++ include/cglm/struct/clipspace/project_no.h | 20 +++++++++++++++++++ include/cglm/struct/clipspace/project_zo.h | 20 +++++++++++++++++++ src/project.c | 6 ++++++ 7 files changed, 118 insertions(+) diff --git a/include/cglm/call/project.h b/include/cglm/call/project.h index 991ba1d..fcfcf2b 100644 --- a/include/cglm/call/project.h +++ b/include/cglm/call/project.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest); +CGLM_EXPORT +float +glmc_project_z(vec3 pos, mat4 m); + CGLM_EXPORT void glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest); diff --git a/include/cglm/clipspace/project_no.h b/include/cglm/clipspace/project_no.h index 7e74323..fc6d2ca 100644 --- a/include/cglm/clipspace/project_no.h +++ b/include/cglm/clipspace/project_no.h @@ -83,4 +83,27 @@ glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) { dest[2] = pos4[2]; } +/*! + * @brief map object's z coordinate to window coordinates + * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] v object coordinates + * @param[in] m MVP matrix + * + * @returns projected z coordinate + */ +CGLM_INLINE +float +glm_project_z_no(vec3 v, mat4 m) { + float z, w; + + z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2]; + w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3]; + + return 0.5f * (z / w) + 0.5; +} + #endif /* cglm_project_no_h */ diff --git a/include/cglm/clipspace/project_zo.h b/include/cglm/clipspace/project_zo.h index 98e58af..dc32078 100644 --- a/include/cglm/clipspace/project_zo.h +++ b/include/cglm/clipspace/project_zo.h @@ -85,4 +85,27 @@ glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) { dest[1] = pos4[1] * vp[3] + vp[1]; } +/*! + * @brief map object's z coordinate to window coordinates + * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] v object coordinates + * @param[in] m MVP matrix + * + * @returns projected z coordinate + */ +CGLM_INLINE +float +glm_project_z_zo(vec3 v, mat4 m) { + float z, w; + + z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2]; + w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3]; + + return z / w; +} + #endif /* cglm_project_zo_h */ diff --git a/include/cglm/project.h b/include/cglm/project.h index f52d3a0..1d0a4e5 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -114,6 +114,28 @@ glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { #endif } +/*! + * @brief map object's z coordinate to window coordinates + * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] v object coordinates + * @param[in] m MVP matrix + * + * @returns projected z coordinate + */ +CGLM_INLINE +float +glm_project_z(vec3 v, mat4 m) { +#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT + return glm_project_z_zo(v, m); +#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT + return glm_project_z_no(v, m); +#endif +} + /*! * @brief define a picking region * diff --git a/include/cglm/struct/clipspace/project_no.h b/include/cglm/struct/clipspace/project_no.h index 4855a5e..a12fb61 100644 --- a/include/cglm/struct/clipspace/project_no.h +++ b/include/cglm/struct/clipspace/project_no.h @@ -43,6 +43,7 @@ * @param[in] pos point/position in viewport coordinates * @param[in] invMat matrix (see brief) * @param[in] vp viewport as [x, y, width, height] + * * @returns unprojected coordinates */ CGLM_INLINE @@ -63,6 +64,7 @@ glms_unprojecti_no(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) { * @param[in] pos object coordinates * @param[in] m MVP matrix * @param[in] vp viewport as [x, y, width, height] + * * @returns projected coordinates */ CGLM_INLINE @@ -73,4 +75,22 @@ glms_project_no(vec3s pos, mat4s m, vec4s vp, vec3s dest) { return dest; } +/*! + * @brief map object's z coordinate to window coordinates + * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] v object coordinates + * @param[in] m MVP matrix + * + * @returns projected z coordinate + */ +CGLM_INLINE +vec3s +glms_project_z_no(vec3s v, mat4s m) { + return glm_project_z_no(v.raw, m.raw); +} + #endif /* cglms_project_rh_no_h */ diff --git a/include/cglm/struct/clipspace/project_zo.h b/include/cglm/struct/clipspace/project_zo.h index 93117e9..c510396 100644 --- a/include/cglm/struct/clipspace/project_zo.h +++ b/include/cglm/struct/clipspace/project_zo.h @@ -43,6 +43,7 @@ * @param[in] pos point/position in viewport coordinates * @param[in] invMat matrix (see brief) * @param[in] vp viewport as [x, y, width, height] + * * @returns unprojected coordinates */ CGLM_INLINE @@ -63,6 +64,7 @@ glms_unprojecti_zo(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) { * @param[in] pos object coordinates * @param[in] m MVP matrix * @param[in] vp viewport as [x, y, width, height] + * * @returns projected coordinates */ CGLM_INLINE @@ -73,4 +75,22 @@ glms_project_zo(vec3s pos, mat4s m, vec4s vp, vec3 dest) { return dest; } +/*! + * @brief map object's z coordinate to window coordinates + * + * Computing MVP: + * glm_mat4_mul(proj, view, viewProj); + * glm_mat4_mul(viewProj, model, MVP); + * + * @param[in] v object coordinates + * @param[in] m MVP matrix + * + * @returns projected z coordinate + */ +CGLM_INLINE +vec3s +glms_project_z_zo(vec3s v, mat4s m) { + return glm_project_z_zo(v.raw, m.raw); +} + #endif /* cglm_project_zo_h */ diff --git a/src/project.c b/src/project.c index 3e09ac6..4d22337 100644 --- a/src/project.c +++ b/src/project.c @@ -26,6 +26,12 @@ glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { glm_project(pos, m, vp, dest); } +CGLM_EXPORT +float +glmc_project_z(vec3 pos, mat4 m) { + return glm_project_z(pos, m); +} + CGLM_EXPORT void glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {