diff --git a/include/cglm/call/clipspace/persp_lh_zo.h b/include/cglm/call/clipspace/persp_lh_zo.h index c22deac..53c2c1c 100644 --- a/include/cglm/call/clipspace/persp_lh_zo.h +++ b/include/cglm/call/clipspace/persp_lh_zo.h @@ -11,7 +11,7 @@ extern "C" { #endif -#include "../cglm.h" +#include "../../cglm.h" CGLM_EXPORT void diff --git a/include/cglm/call/clipspace/project_no.h b/include/cglm/call/clipspace/project_no.h index 858f525..8c26c96 100644 --- a/include/cglm/call/clipspace/project_no.h +++ b/include/cglm/call/clipspace/project_no.h @@ -17,6 +17,10 @@ CGLM_EXPORT void glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest); +CGLM_EXPORT +void +glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/clipspace/project_zo.h b/include/cglm/call/clipspace/project_zo.h index ccfe64b..d95a5fe 100644 --- a/include/cglm/call/clipspace/project_zo.h +++ b/include/cglm/call/clipspace/project_zo.h @@ -17,6 +17,10 @@ CGLM_EXPORT void glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest); +CGLM_EXPORT +void +glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/clipspace/project_no.h b/include/cglm/clipspace/project_no.h index 4496364..7e74323 100644 --- a/include/cglm/clipspace/project_no.h +++ b/include/cglm/clipspace/project_no.h @@ -54,4 +54,33 @@ glm_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { glm_vec3(v, 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] + * @param[out] dest projected coordinates + */ +CGLM_INLINE +void +glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + CGLM_ALIGN(16) 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 */ + glm_vec4_scale(pos4, 0.5f, pos4); + glm_vec4_adds(pos4, 0.5f, pos4); + + dest[0] = pos4[0] * vp[2] + vp[0]; + dest[1] = pos4[1] * vp[3] + vp[1]; + dest[2] = pos4[2]; +} + #endif /* cglm_project_no_h */ diff --git a/include/cglm/clipspace/project_zo.h b/include/cglm/clipspace/project_zo.h index e23d086..adc3597 100644 --- a/include/cglm/clipspace/project_zo.h +++ b/include/cglm/clipspace/project_zo.h @@ -54,4 +54,35 @@ glm_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { glm_vec3(v, 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] + * @param[out] dest projected coordinates + */ +CGLM_INLINE +void +glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + CGLM_ALIGN(16) 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[2] = pos4[2]; + + glm_vec4_scale(pos4, 0.5f, pos4); + glm_vec4_adds(pos4, 0.5f, pos4); + + dest[0] = pos4[0] * vp[2] + vp[0]; + dest[1] = pos4[1] * vp[3] + vp[1]; +} + #endif /* cglm_project_zo_h */ diff --git a/include/cglm/project.h b/include/cglm/project.h index b39b6b6..ceeb528 100644 --- a/include/cglm/project.h +++ b/include/cglm/project.h @@ -107,18 +107,11 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) { CGLM_INLINE void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) { - CGLM_ALIGN(16) 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] * vp[2] + vp[0]; - dest[1] = pos4[1] * vp[3] + vp[1]; - dest[2] = pos4[2]; +#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT + glm_project_zo(pos, m, vp, dest); +#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT + glm_project_no(pos, m, vp, dest); +#endif } #endif /* cglm_project_h */ diff --git a/src/clipspace/project_no.c b/src/clipspace/project_no.c index e160a86..ceb8b0b 100644 --- a/src/clipspace/project_no.c +++ b/src/clipspace/project_no.c @@ -12,3 +12,9 @@ void glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { glm_unprojecti_no(pos, invMat, vp, dest); } + +CGLM_EXPORT +void +glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + glm_project_no(pos, m, vp, dest); +} diff --git a/src/clipspace/project_zo.c b/src/clipspace/project_zo.c index 1496986..0d4110b 100644 --- a/src/clipspace/project_zo.c +++ b/src/clipspace/project_zo.c @@ -12,3 +12,9 @@ void glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) { glm_unprojecti_zo(pos, invMat, vp, dest); } + +CGLM_EXPORT +void +glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) { + glm_project_zo(pos, m, vp, dest); +}