diff options
author | Bastien Montagne <bastien@blender.org> | 2022-02-02 18:30:12 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2022-02-02 18:30:12 +0300 |
commit | 04a93b795c2399f7861f99039444b1d56cb47b8e (patch) | |
tree | adef90bb217c5304c2be154e73a352149f2adca6 /source/blender/blenkernel | |
parent | e54fba5591a95238b7106b6e1fba6164c69dd622 (diff) | |
parent | 43b0ff3054bae229ce033d440b116c6b73fd01bc (diff) |
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/lib_override.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c index 5abe0f5e6be..871e73b12bb 100644 --- a/source/blender/blenkernel/intern/lib_override.c +++ b/source/blender/blenkernel/intern/lib_override.c @@ -624,6 +624,35 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat } } +static bool lib_override_linked_group_tag_collections_keep_tagged_check_recursive( + LibOverrideGroupTagData *data, Collection *collection) +{ + /* NOTE: Collection's object cache (using bases, as returned by #BKE_collection_object_cache_get) + * is not usable here, as it may have become invalid from some previous operation and it should + * not be updated here. So instead only use collections' reliable 'raw' data to check if some + * object in the hierarchy of the given collection is still tagged for override. */ + for (CollectionObject *collection_object = collection->gobject.first; collection_object != NULL; + collection_object = collection_object->next) { + Object *object = collection_object->ob; + if (object == NULL) { + continue; + } + if ((object->id.tag & data->tag) != 0) { + return true; + } + } + + for (CollectionChild *collection_child = collection->children.first; collection_child != NULL; + collection_child = collection_child->next) { + if (lib_override_linked_group_tag_collections_keep_tagged_check_recursive( + data, collection_child->collection)) { + return true; + } + } + + return false; +} + static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGroupTagData *data) { Main *bmain = data->bmain; @@ -646,15 +675,8 @@ static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGr if ((collection->id.tag & data->tag) == 0) { continue; } - bool keep_tagged = false; - const ListBase object_bases = BKE_collection_object_cache_get(collection); - LISTBASE_FOREACH (Base *, base, &object_bases) { - if ((base->object->id.tag & data->tag) != 0) { - keep_tagged = true; - break; - } - } - if (!keep_tagged) { + + if (!lib_override_linked_group_tag_collections_keep_tagged_check_recursive(data, collection)) { collection->id.tag &= ~data->tag; } } |