diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-12-18 20:18:00 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-12-21 18:05:48 +0300 |
commit | 0edd93effbc1c0adf7aa9c5647ef69845496f669 (patch) | |
tree | 66cf32ac697824226fa8de790b0d70ada5ce42b5 /source/blender/draw/engines/eevee | |
parent | adec52a8a843a5224e1e59a1dfdcff4986d7dc18 (diff) |
Fix inconsistent/broken Cycles object visibility for instances.
Object visibility is now handled by the depsgraph iterator, but this API
was incomplete as it made no distinction for visibility of the object itself,
particles and generated instances.
The depsgraph iterator API now includes information about which part of the
object is visible, and this is used by Cycles to replace the old custom logic.
Cycles and EEVEE visibility should now be consistent, which unfortunately does
means some subtle compatibility breakage for both.
Fixes T58956, T58202, T59284.
Differential Revision: https://developer.blender.org/D4109
Diffstat (limited to 'source/blender/draw/engines/eevee')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 7 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightcache.c | 6 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_render.c | 6 |
3 files changed, 11 insertions, 8 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index aa2cf3fede3..6a2ca982d53 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -130,15 +130,14 @@ void EEVEE_cache_populate(void *vedata, Object *ob) EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure(); const DRWContextState *draw_ctx = DRW_context_state_get(); + const int ob_visibility = DRW_object_visibility_in_active_context(ob); bool cast_shadow = false; - if (ob->base_flag & BASE_VISIBLE) { + if (ob_visibility & OB_VISIBLE_PARTICLES) { EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } - if (DRW_object_is_renderable(ob) && - DRW_object_is_visible_in_active_context(ob)) - { + if (DRW_object_is_renderable(ob) && (ob_visibility & OB_VISIBLE_SELF)) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); } diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index 71082268f10..74cac25367c 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -411,7 +411,8 @@ static void eevee_lightbake_count_probes(EEVEE_LightBake *lbake) DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob) { - if (!BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_FOR_RENDER)) { + const int ob_visibility = BKE_object_visibility(ob, DAG_EVAL_RENDER); + if ((ob_visibility & OB_VISIBLE_SELF) == 0) { continue; } @@ -1006,7 +1007,8 @@ static void eevee_lightbake_gather_probes(EEVEE_LightBake *lbake) * This allows a large number of probe to be precomputed (even dupli ones). */ DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob) { - if (!BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_FOR_RENDER)) { + const int ob_visibility = BKE_object_visibility(ob, DAG_EVAL_RENDER); + if ((ob_visibility & OB_VISIBLE_SELF) == 0) { continue; } diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 8d196ee07eb..45bfba09890 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -34,6 +34,7 @@ #include "DNA_object_types.h" #include "BKE_camera.h" +#include "BKE_object.h" #include "BLI_rand.h" #include "BLI_rect.h" @@ -179,11 +180,12 @@ void EEVEE_render_cache( RE_engine_update_stats(engine, NULL, info); } - if (ob->base_flag & BASE_VISIBLE) { + const int ob_visibility = DRW_object_visibility_in_active_context(ob); + if (ob_visibility & OB_VISIBLE_PARTICLES) { EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } - if (DRW_object_is_visible_in_active_context(ob)) { + if (ob_visibility & OB_VISIBLE_SELF) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); } |