mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
new project function for projecting Z
someitmes we need to project z only. this function reduces a few calculations and parameters.
This commit is contained in:
@@ -25,6 +25,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_project_z(vec3 pos, mat4 m);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
||||||
|
|||||||
@@ -83,4 +83,27 @@ glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
dest[2] = pos4[2];
|
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 */
|
#endif /* cglm_project_no_h */
|
||||||
|
|||||||
@@ -85,4 +85,27 @@ glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
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 */
|
#endif /* cglm_project_zo_h */
|
||||||
|
|||||||
@@ -114,6 +114,28 @@ glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
#endif
|
#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
|
* @brief define a picking region
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
* @param[in] pos point/position in viewport coordinates
|
* @param[in] pos point/position in viewport coordinates
|
||||||
* @param[in] invMat matrix (see brief)
|
* @param[in] invMat matrix (see brief)
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
*
|
||||||
* @returns unprojected coordinates
|
* @returns unprojected coordinates
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -63,6 +64,7 @@ glms_unprojecti_no(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) {
|
|||||||
* @param[in] pos object coordinates
|
* @param[in] pos object coordinates
|
||||||
* @param[in] m MVP matrix
|
* @param[in] m MVP matrix
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
*
|
||||||
* @returns projected coordinates
|
* @returns projected coordinates
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -73,4 +75,22 @@ glms_project_no(vec3s pos, mat4s m, vec4s vp, vec3s dest) {
|
|||||||
return 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 */
|
#endif /* cglms_project_rh_no_h */
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
* @param[in] pos point/position in viewport coordinates
|
* @param[in] pos point/position in viewport coordinates
|
||||||
* @param[in] invMat matrix (see brief)
|
* @param[in] invMat matrix (see brief)
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
*
|
||||||
* @returns unprojected coordinates
|
* @returns unprojected coordinates
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -63,6 +64,7 @@ glms_unprojecti_zo(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) {
|
|||||||
* @param[in] pos object coordinates
|
* @param[in] pos object coordinates
|
||||||
* @param[in] m MVP matrix
|
* @param[in] m MVP matrix
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
*
|
||||||
* @returns projected coordinates
|
* @returns projected coordinates
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -73,4 +75,22 @@ glms_project_zo(vec3s pos, mat4s m, vec4s vp, vec3 dest) {
|
|||||||
return 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 */
|
#endif /* cglm_project_zo_h */
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
glm_project(pos, m, vp, 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
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {
|
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {
|
||||||
|
|||||||
Reference in New Issue
Block a user