[Bf-blender-cvs] [2829caa9f88] master: Cleanup: Layer resync: Split object/base resync part in own function.

Bastien Montagne noreply at git.blender.org
Wed Jul 14 17:50:04 CEST 2021


Commit: 2829caa9f882f1aa6e716fa0118839ac7057fa88
Author: Bastien Montagne
Date:   Wed Jul 14 17:48:50 2021 +0200
Branches: master
https://developer.blender.org/rB2829caa9f882f1aa6e716fa0118839ac7057fa88

Cleanup: Layer resync: Split object/base resync part in own function.

No behavioral change expected here.

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

M	source/blender/blenkernel/intern/layer.c

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index d49eb0d4da8..60e42c09ff3 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -737,6 +737,73 @@ int BKE_layer_collection_findindex(ViewLayer *view_layer, const LayerCollection
  * in at least one layer collection. That list is also synchronized here, and
  * stores state like selection. */
 
+static void layer_collection_objects_sync(ViewLayer *view_layer,
+                                          LayerCollection *layer,
+                                          ListBase *new_object_bases,
+                                          const short collection_restrict,
+                                          const short layer_restrict,
+                                          const ushort local_collections_bits)
+{
+  /* No need to sync objects if the collection is excluded. */
+  if ((layer->flag & LAYER_COLLECTION_EXCLUDE) != 0) {
+    return;
+  }
+
+  LISTBASE_FOREACH (CollectionObject *, cob, &layer->collection->gobject) {
+    if (cob->ob == NULL) {
+      continue;
+    }
+
+    /* Tag linked object as a weak reference so we keep the object
+     * base pointer on file load and remember hidden state. */
+    id_lib_indirect_weak_link(&cob->ob->id);
+
+    void **base_p;
+    Base *base;
+    if (BLI_ghash_ensure_p(view_layer->object_bases_hash, cob->ob, &base_p)) {
+      /* Move from old base list to new base list. Base might have already
+       * been moved to the new base list and the first/last test ensure that
+       * case also works. */
+      base = *base_p;
+      if (!ELEM(base, new_object_bases->first, new_object_bases->last)) {
+        BLI_remlink(&view_layer->object_bases, base);
+        BLI_addtail(new_object_bases, base);
+      }
+    }
+    else {
+      /* Create new base. */
+      base = object_base_new(cob->ob);
+      base->local_collections_bits = local_collections_bits;
+      *base_p = base;
+      BLI_addtail(new_object_bases, base);
+    }
+
+    if ((collection_restrict & COLLECTION_RESTRICT_VIEWPORT) == 0) {
+      base->flag_from_collection |= (BASE_ENABLED_VIEWPORT | BASE_VISIBLE_DEPSGRAPH);
+      if ((layer_restrict & LAYER_COLLECTION_HIDE) == 0) {
+        base->flag_from_collection |= BASE_VISIBLE_VIEWLAYER;
+      }
+      if (((collection_restrict & COLLECTION_RESTRICT_SELECT) == 0)) {
+        base->flag_from_collection |= BASE_SELECTABLE;
+      }
+    }
+
+    if ((collection_restrict & COLLECTION_RESTRICT_RENDER) == 0) {
+      base->flag_from_collection |= BASE_ENABLED_RENDER;
+    }
+
+    /* Holdout and indirect only */
+    if (layer->flag & LAYER_COLLECTION_HOLDOUT) {
+      base->flag_from_collection |= BASE_HOLDOUT;
+    }
+    if (layer->flag & LAYER_COLLECTION_INDIRECT_ONLY) {
+      base->flag_from_collection |= BASE_INDIRECT_ONLY;
+    }
+
+    layer->runtime_flag |= LAYER_COLLECTION_HAS_OBJECTS;
+  }
+}
+
 static void layer_collection_sync(ViewLayer *view_layer,
                                   const ListBase *lb_collections,
                                   ListBase *lb_layer_collections,
@@ -812,7 +879,8 @@ static void layer_collection_sync(ViewLayer *view_layer,
                           child_layer_restrict,
                           local_collections_bits);
 
-    /* Layer collection exclude is not inherited. */
+    /* Layer collection exclude is not inherited, we can skip the remaining process, including
+     * object bases synchronization. */
     lc->runtime_flag = 0;
     if (lc->flag & LAYER_COLLECTION_EXCLUDE) {
       continue;
@@ -829,60 +897,12 @@ static void layer_collection_sync(ViewLayer *view_layer,
       lc->runtime_flag |= LAYER_COLLECTION_VISIBLE_VIEW_LAYER;
     }
 
-    /* Sync objects, except if collection was excluded. */
-    LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) {
-      if (cob->ob == NULL) {
-        continue;
-      }
-
-      /* Tag linked object as a weak reference so we keep the object
-       * base pointer on file load and remember hidden state. */
-      id_lib_indirect_weak_link(&cob->ob->id);
-
-      void **base_p;
-      Base *base;
-      if (BLI_ghash_ensure_p(view_layer->object_bases_hash, cob->ob, &base_p)) {
-        /* Move from old base list to new base list. Base might have already
-         * been moved to the new base list and the first/last test ensure that
-         * case also works. */
-        base = *base_p;
-        if (!ELEM(base, new_object_bases->first, new_object_bases->last)) {
-          BLI_remlink(&view_layer->object_bases, base);
-          BLI_addtail(new_object_bases, base);
-        }
-      }
-      else {
-        /* Create new base. */
-        base = object_base_new(cob->ob);
-        base->local_collections_bits = local_collections_bits;
-        *base_p = base;
-        BLI_addtail(new_object_bases, base);
-      }
-
-      if ((child_restrict & COLLECTION_RESTRICT_VIEWPORT) == 0) {
-        base->flag_from_collection |= (BASE_ENABLED_VIEWPORT | BASE_VISIBLE_DEPSGRAPH);
-        if ((child_layer_restrict & LAYER_COLLECTION_HIDE) == 0) {
-          base->flag_from_collection |= BASE_VISIBLE_VIEWLAYER;
-        }
-        if (((child_restrict & COLLECTION_RESTRICT_SELECT) == 0)) {
-          base->flag_from_collection |= BASE_SELECTABLE;
-        }
-      }
-
-      if ((child_restrict & COLLECTION_RESTRICT_RENDER) == 0) {
-        base->flag_from_collection |= BASE_ENABLED_RENDER;
-      }
-
-      /* Holdout and indirect only */
-      if (lc->flag & LAYER_COLLECTION_HOLDOUT) {
-        base->flag_from_collection |= BASE_HOLDOUT;
-      }
-      if (lc->flag & LAYER_COLLECTION_INDIRECT_ONLY) {
-        base->flag_from_collection |= BASE_INDIRECT_ONLY;
-      }
-
-      lc->runtime_flag |= LAYER_COLLECTION_HAS_OBJECTS;
-    }
+    layer_collection_objects_sync(view_layer,
+                                  lc,
+                                  new_object_bases,
+                                  child_restrict,
+                                  child_layer_restrict,
+                                  local_collections_bits);
   }
 
   /* Free potentially remaining unused layer collections in old list.



More information about the Bf-blender-cvs mailing list