mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
move frustum related stuff to frustum header
* create helpers macro which defines corner index * func for get bounding box frustum * add missing source to make file * add more desc to glm_frustum_corners
This commit is contained in:
@@ -541,116 +541,4 @@ glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
||||
dest[2] = a * dest[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief extracts view frustum planes
|
||||
*
|
||||
* planes' space:
|
||||
* 1- if m = proj: View Space
|
||||
* 2- if m = viewProj: World Space
|
||||
* 3- if m = MVP: Object Space
|
||||
*
|
||||
* You probably want to extract planes in world space so use viewProj as m
|
||||
* Computing viewProj:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
*
|
||||
* Exracted planes order: [left, right, bottom, top, near, far]
|
||||
*
|
||||
* @param[in] m matrix (see brief)
|
||||
* @param[out] dest exracted view frustum planes (see brief)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_frustum_planes(mat4 m, vec4 dest[6]) {
|
||||
mat4 t;
|
||||
|
||||
glm_mat4_transpose_to(m, t);
|
||||
|
||||
glm_vec4_add(t[3], t[0], dest[0]); /* left */
|
||||
glm_vec4_sub(t[3], t[0], dest[1]); /* right */
|
||||
glm_vec4_add(t[3], t[1], dest[2]); /* bottom */
|
||||
glm_vec4_sub(t[3], t[1], dest[3]); /* top */
|
||||
glm_vec4_add(t[3], t[2], dest[4]); /* near */
|
||||
glm_vec4_sub(t[3], t[2], dest[5]); /* far */
|
||||
|
||||
glm_plane_normalize(dest[0]);
|
||||
glm_plane_normalize(dest[1]);
|
||||
glm_plane_normalize(dest[2]);
|
||||
glm_plane_normalize(dest[3]);
|
||||
glm_plane_normalize(dest[4]);
|
||||
glm_plane_normalize(dest[5]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief extracts view frustum corners using clip-space coordinates
|
||||
*
|
||||
* corners' space:
|
||||
* 1- if m = invViewProj: World Space
|
||||
* 2- if m = invMVP: Object Space
|
||||
*
|
||||
* You probably want to extract corners in world space so use invViewProj
|
||||
* Computing invViewProj:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
* ...
|
||||
* glm_mat4_inv(viewProj, invViewProj);
|
||||
*
|
||||
* @param[in] invMat matrix (see brief)
|
||||
* @param[out] dest exracted view frustum corners (see brief)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_frustum_corners(mat4 invMat, vec4 dest[8]) {
|
||||
vec4 c[8];
|
||||
vec4 csCoords[8] = {
|
||||
{-1.0f, -1.0f, -1.0f, 1.0f},
|
||||
{-1.0f, 1.0f, -1.0f, 1.0f},
|
||||
{ 1.0f, -1.0f, -1.0f, 1.0f},
|
||||
{ 1.0f, 1.0f, -1.0f, 1.0f},
|
||||
{-1.0f, -1.0f, 1.0f, 1.0f},
|
||||
{-1.0f, 1.0f, 1.0f, 1.0f},
|
||||
{ 1.0f, -1.0f, 1.0f, 1.0f},
|
||||
{ 1.0f, 1.0f, 1.0f, 1.0f}
|
||||
};
|
||||
|
||||
glm_mat4_mulv(invMat, csCoords[0], c[0]);
|
||||
glm_mat4_mulv(invMat, csCoords[1], c[1]);
|
||||
glm_mat4_mulv(invMat, csCoords[2], c[2]);
|
||||
glm_mat4_mulv(invMat, csCoords[3], c[3]);
|
||||
glm_mat4_mulv(invMat, csCoords[4], c[4]);
|
||||
glm_mat4_mulv(invMat, csCoords[5], c[5]);
|
||||
glm_mat4_mulv(invMat, csCoords[6], c[6]);
|
||||
glm_mat4_mulv(invMat, csCoords[7], c[7]);
|
||||
|
||||
glm_vec4_scale(c[1], 1.0f / c[1][3], dest[1]);
|
||||
glm_vec4_scale(c[2], 1.0f / c[2][3], dest[2]);
|
||||
glm_vec4_scale(c[3], 1.0f / c[3][3], dest[3]);
|
||||
glm_vec4_scale(c[4], 1.0f / c[4][3], dest[4]);
|
||||
glm_vec4_scale(c[5], 1.0f / c[5][3], dest[5]);
|
||||
glm_vec4_scale(c[6], 1.0f / c[6][3], dest[6]);
|
||||
glm_vec4_scale(c[7], 1.0f / c[7][3], dest[7]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief finds center of view frustum
|
||||
*
|
||||
* @param[in] corners view frustum corners
|
||||
* @param[out] dest view frustum center
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_frustum_center(vec4 corners[8], vec4 dest) {
|
||||
vec4 center;
|
||||
|
||||
glm_vec4_copy(corners[0], center);
|
||||
|
||||
glm_vec4_add(corners[1], center, center);
|
||||
glm_vec4_add(corners[2], center, center);
|
||||
glm_vec4_add(corners[3], center, center);
|
||||
glm_vec4_add(corners[4], center, center);
|
||||
glm_vec4_add(corners[5], center, center);
|
||||
glm_vec4_add(corners[6], center, center);
|
||||
glm_vec4_add(corners[7], center, center);
|
||||
|
||||
glm_vec4_scale(center, 0.125f, dest);
|
||||
}
|
||||
|
||||
#endif /* cglm_vcam_h */
|
||||
|
||||
Reference in New Issue
Block a user