[Bf-blender-cvs] [1492f566c83] blender-v3.3-release: Fix T99450: Animated Holdout not updating on frame change

Lukas Stockner noreply at git.blender.org
Wed Oct 26 12:00:19 CEST 2022


Commit: 1492f566c83c7c7a631ecc8b0c9113981fda75c5
Author: Lukas Stockner
Date:   Sat Oct 15 22:51:21 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB1492f566c83c7c7a631ecc8b0c9113981fda75c5

Fix T99450: Animated Holdout not updating on frame change

Problem here was that layer_collection_objects_sync wasn't called when
the holdout property is updated due to frame change, so the changed
visibility flag was never applied to ob->base_flag.

Turns out there's no real reason to handle the per-object holdout
property through the layer system. So, instead of merging both the
layer holdout and object holdout into base_flag and checking that
from the render engines, only handle the layer holdout (which can't
be animated, so no issue here) through base_flag and explicitly also
check the object holdout in the render engines.

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

M	source/blender/blenkernel/intern/layer.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
M	source/blender/makesrna/intern/rna_object_api.c

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 4257bccad93..0e34d08082f 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -1012,7 +1012,7 @@ static void layer_collection_objects_sync(ViewLayer *view_layer,
     }
 
     /* Holdout and indirect only */
-    if ((layer->flag & LAYER_COLLECTION_HOLDOUT) || (base->object->visibility_flag & OB_HOLDOUT)) {
+    if ((layer->flag & LAYER_COLLECTION_HOLDOUT)) {
       base->flag_from_collection |= BASE_HOLDOUT;
     }
     if (layer->flag & LAYER_COLLECTION_INDIRECT_ONLY) {
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index efd27c19654..39ab91861f9 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -752,7 +752,8 @@ BLI_INLINE Material *eevee_object_material_get(Object *ob, int slot, bool holdou
 BLI_INLINE EeveeMaterialCache eevee_material_cache_get(
     EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, int slot, bool is_hair)
 {
-  const bool holdout = (ob->base_flag & BASE_HOLDOUT) != 0;
+  const bool holdout = ((ob->base_flag & BASE_HOLDOUT) != 0) ||
+                       ((ob->visibility_flag & OB_HOLDOUT) != 0);
   EeveeMaterialCache matcache;
   Material *ma = eevee_object_material_get(ob, slot, holdout);
   switch (ma->blend_method) {
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index e76e74b89e4..299036a552f 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -69,7 +69,8 @@ NodeGroup *BlenderFileLoader::Load()
       break;
     }
 
-    if (ob->base_flag & (BASE_HOLDOUT | BASE_INDIRECT_ONLY)) {
+    if ((ob->base_flag & (BASE_HOLDOUT | BASE_INDIRECT_ONLY)) ||
+        (ob->visibility_flag & OB_HOLDOUT)) {
       continue;
     }
 
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 6967f78026a..5ba160c1926 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -192,7 +192,7 @@ static bool rna_Object_holdout_get(Object *ob, bContext *C, ViewLayer *view_laye
     return false;
   }
 
-  return ((base->flag & BASE_HOLDOUT) != 0);
+  return ((base->flag & BASE_HOLDOUT) != 0) || ((ob->visibility_flag & OB_HOLDOUT) != 0);
 }
 
 static bool rna_Object_indirect_only_get(Object *ob, bContext *C, ViewLayer *view_layer)



More information about the Bf-blender-cvs mailing list