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.
This commit is contained in:
Bastien Montagne 2021-03-22 15:06:41 +01:00
parent 56dabfac5c
commit e3f2c94d39
Notes: blender-bot 2023-02-14 07:40:56 +01:00
Referenced by issue #86741, Overrides: Collection can be made to appear twice in the outliner
1 changed files with 13 additions and 8 deletions

View File

@ -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);
}
}