DRW: Add plane culling test.
Usefull to see if the view frustum is totally behind a plane.
This commit is contained in:
@@ -462,6 +462,7 @@ void DRW_state_clip_planes_reset(void);
|
|||||||
/* Culling, return true if object is inside view frustum. */
|
/* Culling, return true if object is inside view frustum. */
|
||||||
bool DRW_culling_sphere_test(BoundSphere *bsphere);
|
bool DRW_culling_sphere_test(BoundSphere *bsphere);
|
||||||
bool DRW_culling_box_test(BoundBox *bbox);
|
bool DRW_culling_box_test(BoundBox *bbox);
|
||||||
|
bool DRW_culling_plane_test(float plane[4]);
|
||||||
|
|
||||||
/* Selection */
|
/* Selection */
|
||||||
void DRW_select_load_id(unsigned int id);
|
void DRW_select_load_id(unsigned int id);
|
||||||
|
|||||||
@@ -320,6 +320,7 @@ typedef struct DRWManager {
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
float frustum_planes[6][4];
|
float frustum_planes[6][4];
|
||||||
|
BoundBox frustum_corners;
|
||||||
BoundSphere frustum_bsphere;
|
BoundSphere frustum_bsphere;
|
||||||
bool updated;
|
bool updated;
|
||||||
} clipping;
|
} clipping;
|
||||||
|
|||||||
@@ -461,6 +461,8 @@ static void draw_clipping_setup_from_view(void)
|
|||||||
mul_m4_v3(viewinv, bbox.vec[i]);
|
mul_m4_v3(viewinv, bbox.vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memcpy(&DST.clipping.frustum_corners, &bbox, sizeof(BoundBox));
|
||||||
|
|
||||||
/* Compute clip planes using the world space frustum corners. */
|
/* Compute clip planes using the world space frustum corners. */
|
||||||
for (int p = 0; p < 6; p++) {
|
for (int p = 0; p < 6; p++) {
|
||||||
int q, r;
|
int q, r;
|
||||||
@@ -640,6 +642,22 @@ bool DRW_culling_box_test(BoundBox *bbox)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return True if the current view frustum is inside or intersect the given plane */
|
||||||
|
bool DRW_culling_plane_test(float plane[4])
|
||||||
|
{
|
||||||
|
draw_clipping_setup_from_view();
|
||||||
|
|
||||||
|
/* Test against the 8 frustum corners. */
|
||||||
|
for (int c = 0; c < 8; c++) {
|
||||||
|
float dist = plane_point_side_v3(plane, DST.clipping.frustum_corners.vec[c]);
|
||||||
|
if (dist < 0.0f) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|||||||
Reference in New Issue
Block a user