diff options
author | Bastien Montagne <bastien@blender.org> | 2021-03-22 17:06:41 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2021-03-22 17:10:27 +0300 |
commit | e3f2c94d395c08d4ae02cfdc2dd95b5957af1e2b (patch) | |
tree | 669e7b6053d1ce9ae57953e30a5a424190447fec /source/blender/blenkernel/intern/collection.c | |
parent | 56dabfac5cba8d4762579120e6416230af1465d9 (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern/collection.c')
-rw-r--r-- | source/blender/blenkernel/intern/collection.c | 21 |
1 files changed, 13 insertions, 8 deletions
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); } } |