[Bf-blender-cvs] [aefc793a818] blender2.8: Workbench: Shadow: Refine camera in shadow test.

Clément Foucault noreply at git.blender.org
Sun May 27 00:07:00 CEST 2018


Commit: aefc793a818aa8fa35e968b2be38e1b73909907d
Author: Clément Foucault
Date:   Sun May 27 00:15:47 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBaefc793a818aa8fa35e968b2be38e1b73909907d

Workbench: Shadow: Refine camera in shadow test.

Test if all nearplane points are not in front of the shadow BBox.

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

M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_studiolight.c

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

diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 7ef951abf84..bffac99c6d7 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -131,8 +131,8 @@ typedef struct WORKBENCH_PrivateData {
 	float shadow_mat[4][4];
 	float shadow_inv[4][4];
 	float shadow_near_corners[4][3]; /* Near plane corners in shadow space. */
-	float shadow_near_min[2]; /* min and max of shadow_near_corners. allow fast test */
-	float shadow_near_max[2];
+	float shadow_near_min[3]; /* min and max of shadow_near_corners. allow fast test */
+	float shadow_near_max[3];
 	float shadow_near_sides[2][4]; /* This is a parallelogram, so only 2 normal and distance to the edges. */
 	bool shadow_changed;
 } WORKBENCH_PrivateData; /* Transient data */
diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c
index a1cf4cdb4bc..5c4039d80d0 100644
--- a/source/blender/draw/engines/workbench/workbench_studiolight.c
+++ b/source/blender/draw/engines/workbench/workbench_studiolight.c
@@ -87,9 +87,9 @@ void studiolight_update_light(WORKBENCH_PrivateData *wpd, const float light_dire
 	mul_v3_mat3_m4v3(wpd->shadow_near_corners[2], wpd->shadow_inv, frustum_corners.vec[7]);
 	mul_v3_mat3_m4v3(wpd->shadow_near_corners[3], wpd->shadow_inv, frustum_corners.vec[4]);
 
-	INIT_MINMAX2(wpd->shadow_near_min, wpd->shadow_near_max);
+	INIT_MINMAX(wpd->shadow_near_min, wpd->shadow_near_max);
 	for (int i = 0; i < 4; ++i) {
-		minmax_v2v2_v2(wpd->shadow_near_min, wpd->shadow_near_max, wpd->shadow_near_corners[i]);
+		minmax_v3v3_v3(wpd->shadow_near_min, wpd->shadow_near_max, wpd->shadow_near_corners[i]);
 	}
 
 	compute_parallel_lines_nor_and_dist(wpd->shadow_near_corners[0], wpd->shadow_near_corners[1], wpd->shadow_near_corners[2], wpd->shadow_near_sides[0]);
@@ -136,6 +136,11 @@ bool studiolight_camera_in_object_shadow(WORKBENCH_PrivateData *wpd, Object *ob,
 	/* Just to be sure the min, max are updated. */
 	studiolight_object_shadow_bbox_get(wpd, ob, oed);
 
+	/* Test if near plane is in front of the shadow. */
+	if (oed->shadow_min[2] > wpd->shadow_near_max[2]) {
+		return false;
+	}
+
 	/* Separation Axis Theorem test */
 
 	/* Test bbox sides first (faster) */



More information about the Bf-blender-cvs mailing list