mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user