[Bf-blender-cvs] [ffca77814e6] blender2.8: DRW: Add plane culling test.

Clément Foucault noreply at git.blender.org
Thu May 3 16:08:21 CEST 2018


Commit: ffca77814e642f5962481be96deb336ea5f86ff6
Author: Clément Foucault
Date:   Thu May 3 15:43:42 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBffca77814e642f5962481be96deb336ea5f86ff6

DRW: Add plane culling test.

Usefull to see if the view frustum is totally behind a plane.

===================================================================

M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_exec.c

===================================================================

diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index c0f5a0df3bf..51fba1500f7 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -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);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index c6c2d5928d8..00d7c7233a5 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -320,6 +320,7 @@ typedef struct DRWManager {
 
 	struct {
 		float frustum_planes[6][4];
+		BoundBox frustum_corners;
 		BoundSphere frustum_bsphere;
 		bool updated;
 	} clipping;
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index a70d80257e6..232ae36438e 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -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;
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */



More information about the Bf-blender-cvs mailing list