frustum: make clipspace coords configurable

* now users can override clip space coords
* add more desc to header
* add call version for _corners_at
This commit is contained in:
Recep Aslantas
2018-01-14 11:03:03 +03:00
parent 944d285e14
commit 8bcd6bd077
3 changed files with 60 additions and 25 deletions

View File

@@ -29,6 +29,12 @@ CGLM_EXPORT
void void
glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]); glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]);
CGLM_EXPORT
void
glmc_frustum_corners_at(vec4 corners[8],
float splitDist,
float farDist,
vec4 planeCorners[4]);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -11,15 +11,15 @@
#include "common.h" #include "common.h"
#include "plane.h" #include "plane.h"
#define GLM_LBN 0 #define GLM_LBN 0 /* left bottom near */
#define GLM_LTN 1 #define GLM_LTN 1 /* left top near */
#define GLM_RTN 2 #define GLM_RTN 2 /* right top near */
#define GLM_RBN 3 #define GLM_RBN 3 /* right bottom near */
#define GLM_LBF 4 #define GLM_LBF 4 /* left bottom far */
#define GLM_LTF 5 #define GLM_LTF 5 /* left top far */
#define GLM_RTF 6 #define GLM_RTF 6 /* right top far */
#define GLM_RBF 7 #define GLM_RBF 7 /* right bottom far */
#define GLM_LEFT 0 #define GLM_LEFT 0
#define GLM_RIGHT 1 #define GLM_RIGHT 1
@@ -28,6 +28,25 @@
#define GLM_NEAR 4 #define GLM_NEAR 4
#define GLM_FAR 5 #define GLM_FAR 5
/* you can override clip space coords
but you have to provide all with same name
e.g.: define GLM_CSCOORD_LBN {0.0f, 0.0f, 1.0f, 1.0f} */
#ifndef GLM_CUSTOM_CLIPSPACE
/* near */
#define GLM_CSCOORD_LBN {-1.0f, -1.0f, -1.0f, 1.0f}
#define GLM_CSCOORD_LTN {-1.0f, 1.0f, -1.0f, 1.0f}
#define GLM_CSCOORD_RTN { 1.0f, 1.0f, -1.0f, 1.0f}
#define GLM_CSCOORD_RBN { 1.0f, -1.0f, -1.0f, 1.0f}
/* far */
#define GLM_CSCOORD_LBF {-1.0f, -1.0f, 1.0f, 1.0f}
#define GLM_CSCOORD_LTF {-1.0f, 1.0f, 1.0f, 1.0f}
#define GLM_CSCOORD_RTF { 1.0f, 1.0f, 1.0f, 1.0f}
#define GLM_CSCOORD_RBF { 1.0f, -1.0f, 1.0f, 1.0f}
#endif
/*! /*!
* @brief extracts view frustum planes * @brief extracts view frustum planes
* *
@@ -97,15 +116,15 @@ glm_frustum_corners(mat4 invMat, vec4 dest[8]) {
/* indexOf(nearCoord) = indexOf(farCoord) + 4 */ /* indexOf(nearCoord) = indexOf(farCoord) + 4 */
vec4 csCoords[8] = { vec4 csCoords[8] = {
{-1.0f, -1.0f, -1.0f, 1.0f}, /* GLM_LBN */ GLM_CSCOORD_LBN,
{-1.0f, 1.0f, -1.0f, 1.0f}, /* GLM_LTN */ GLM_CSCOORD_LTN,
{ 1.0f, 1.0f, -1.0f, 1.0f}, /* GLM_RTN */ GLM_CSCOORD_RTN,
{ 1.0f, -1.0f, -1.0f, 1.0f}, /* GLM_RBN */ GLM_CSCOORD_RBN,
{-1.0f, -1.0f, 1.0f, 1.0f}, /* GLM_LBF */ GLM_CSCOORD_LBF,
{-1.0f, 1.0f, 1.0f, 1.0f}, /* GLM_LTF */ GLM_CSCOORD_LTF,
{ 1.0f, 1.0f, 1.0f, 1.0f}, /* GLM_RTF */ GLM_CSCOORD_RTF,
{ 1.0f, -1.0f, 1.0f, 1.0f} /* GLM_RBF */ GLM_CSCOORD_RBF
}; };
glm_mat4_mulv(invMat, csCoords[0], c[0]); glm_mat4_mulv(invMat, csCoords[0], c[0]);
@@ -205,28 +224,29 @@ glm_frustum_corners_at(vec4 corners[8],
vec4 corner; vec4 corner;
float dist, sc; float dist, sc;
dist = glm_vec_distance(corners[4], corners[0]); /* because distance and scale is same for all */
dist = glm_vec_distance(corners[GLM_RTF], corners[GLM_RTN]);
sc = dist * (splitDist / farDist); sc = dist * (splitDist / farDist);
/* left bottom */ /* left bottom */
glm_vec4_sub(corners[4], corners[0], corner); glm_vec4_sub(corners[GLM_LBF], corners[GLM_LBN], corner);
glm_vec4_scale_as(corner, sc, corner); glm_vec4_scale_as(corner, sc, corner);
glm_vec4_add(corners[0], corner, planeCorners[0]); glm_vec4_add(corners[GLM_LBN], corner, planeCorners[0]);
/* left top */ /* left top */
glm_vec4_sub(corners[5], corners[1], corner); glm_vec4_sub(corners[GLM_LTF], corners[GLM_LTN], corner);
glm_vec4_scale_as(corner, sc, corner); glm_vec4_scale_as(corner, sc, corner);
glm_vec4_add(corners[1], corner, planeCorners[1]); glm_vec4_add(corners[GLM_LTN], corner, planeCorners[1]);
/* right top */ /* right top */
glm_vec4_sub(corners[6], corners[2], corner); glm_vec4_sub(corners[GLM_RTF], corners[GLM_RTN], corner);
glm_vec4_scale_as(corner, sc, corner); glm_vec4_scale_as(corner, sc, corner);
glm_vec4_add(corners[2], corner, planeCorners[2]); glm_vec4_add(corners[GLM_RTN], corner, planeCorners[2]);
/* right bottom */ /* right bottom */
glm_vec4_sub(corners[7], corners[3], corner); glm_vec4_sub(corners[GLM_RBF], corners[GLM_RBN], corner);
glm_vec4_scale_as(corner, sc, corner); glm_vec4_scale_as(corner, sc, corner);
glm_vec4_add(corners[3], corner, planeCorners[3]); glm_vec4_add(corners[GLM_RBN], corner, planeCorners[3]);
} }
#endif /* cglm_frustum_h */ #endif /* cglm_frustum_h */

View File

@@ -31,3 +31,12 @@ void
glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) { glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
glm_frustum_box(corners, m, box); glm_frustum_box(corners, m, box);
} }
CGLM_EXPORT
void
glmc_frustum_corners_at(vec4 corners[8],
float splitDist,
float farDist,
vec4 planeCorners[4]) {
glm_frustum_corners_at(corners, splitDist, farDist, planeCorners);
}