DRW: Add plane culling test.

Usefull to see if the view frustum is totally behind a plane.
This commit is contained in:
2018-05-03 15:43:42 +02:00
parent 4d0b6652cf
commit ffca77814e
3 changed files with 20 additions and 0 deletions

View File

@@ -462,6 +462,7 @@ void DRW_state_clip_planes_reset(void);
/* Culling, return true if object is inside view frustum. */
bool DRW_culling_sphere_test(BoundSphere *bsphere);
bool DRW_culling_box_test(BoundBox *bbox);
bool DRW_culling_plane_test(float plane[4]);
/* Selection */
void DRW_select_load_id(unsigned int id);

View File

@@ -320,6 +320,7 @@ typedef struct DRWManager {
struct {
float frustum_planes[6][4];
BoundBox frustum_corners;
BoundSphere frustum_bsphere;
bool updated;
} clipping;

View File

@@ -461,6 +461,8 @@ static void draw_clipping_setup_from_view(void)
mul_m4_v3(viewinv, bbox.vec[i]);
}
memcpy(&DST.clipping.frustum_corners, &bbox, sizeof(BoundBox));
/* Compute clip planes using the world space frustum corners. */
for (int p = 0; p < 6; p++) {
int q, r;
@@ -640,6 +642,22 @@ bool DRW_culling_box_test(BoundBox *bbox)
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;
}
/** \} */
/* -------------------------------------------------------------------- */