diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-27 01:15:47 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-27 01:15:47 +0300 |
commit | aefc793a818aa8fa35e968b2be38e1b73909907d (patch) | |
tree | 9f6a9026cb01aa721cbbc5b97a6cdef0cbecf3c3 /source/blender/draw/engines/workbench/workbench_studiolight.c | |
parent | 60ddea7758128283f3ed3a15a2f8448691a811a8 (diff) |
Workbench: Shadow: Refine camera in shadow test.
Test if all nearplane points are not in front of the shadow BBox.
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_studiolight.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_studiolight.c | 9 |
1 files changed, 7 insertions, 2 deletions
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) */ |