diff options
Diffstat (limited to 'source')
-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); } } |