[Bf-blender-cvs] [e3f2c94d395] master: Fix T86741: Remapping could create doublons of collections in hierarchy.

Bastien Montagne noreply at git.blender.org
Mon Mar 22 15:10:33 CET 2021


Commit: e3f2c94d395c08d4ae02cfdc2dd95b5957af1e2b
Author: Bastien Montagne
Date:   Mon Mar 22 15:06:41 2021 +0100
Branches: master
https://developer.blender.org/rBe3f2c94d395c08d4ae02cfdc2dd95b5957af1e2b

Fix T86741: Remapping could create doublons of collections in hierarchy.

Code rebuilding/ensuring the sanity of the collection hierarchy was not
checking for a same collection being child of the same parent multiple
times.

This was already prevented to happen in code adding collections to other
collections, but not for the remapping case.

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

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

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

diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 178a762fd40..ac23f9012a7 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -1617,18 +1617,23 @@ bool BKE_collection_child_remove(Main *bmain, Collection *parent, Collection *ch
  */
 void BKE_collection_parent_relations_rebuild(Collection *collection)
 {
-  for (CollectionChild *child = collection->children.first, *child_next = NULL; child;
-       child = child_next) {
-    child_next = child->next;
+  LISTBASE_FOREACH_MUTABLE (CollectionChild *, child, &collection->children) {
+    /* Check for duplicated children (can happen with remapping e.g.). */
+    CollectionChild *other_child = collection_find_child(collection, child->collection);
+    if (other_child != child) {
+      BLI_freelinkN(&collection->children, child);
+      continue;
+    }
 
+    /* Invalid child, either without a collection, or because it creates a dependency cycle. */
     if (child->collection == NULL || BKE_collection_cycle_find(collection, child->collection)) {
       BLI_freelinkN(&collection->children, child);
+      continue;
     }
-    else {
-      CollectionParent *cparent = MEM_callocN(sizeof(CollectionParent), __func__);
-      cparent->collection = collection;
-      BLI_addtail(&child->collection->parents, cparent);
-    }
+
+    CollectionParent *cparent = MEM_callocN(sizeof(CollectionParent), __func__);
+    cparent->collection = collection;
+    BLI_addtail(&child->collection->parents, cparent);
   }
 }



More information about the Bf-blender-cvs mailing list