mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 17:09:40 +00:00
implement project zo
This commit is contained in:
@@ -11,7 +11,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../cglm.h"
|
#include "../../cglm.h"
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
|
@@ -17,6 +17,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -17,6 +17,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -54,4 +54,33 @@ glm_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
|||||||
glm_vec3(v, 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 */
|
#endif /* cglm_project_no_h */
|
||||||
|
@@ -54,4 +54,35 @@ glm_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
|||||||
glm_vec3(v, 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 */
|
#endif /* cglm_project_zo_h */
|
||||||
|
@@ -107,18 +107,11 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||||
CGLM_ALIGN(16) vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
||||||
|
glm_project_zo(pos, m, vp, dest);
|
||||||
glm_vec4(pos, 1.0f, pos4);
|
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
||||||
|
glm_project_no(pos, m, vp, dest);
|
||||||
glm_mat4_mulv(m, pos4, pos4);
|
#endif
|
||||||
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];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_project_h */
|
#endif /* cglm_project_h */
|
||||||
|
@@ -12,3 +12,9 @@ void
|
|||||||
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||||
glm_unprojecti_no(pos, invMat, vp, 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);
|
||||||
|
}
|
||||||
|
@@ -12,3 +12,9 @@ void
|
|||||||
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||||
glm_unprojecti_zo(pos, invMat, vp, 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);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user