Fix (unreported) bug in liboverride resync code.
Part of the resynching code would access collections' objects base cache, which can be invalid at that point (due to previous ID remapping and/or deletion). Use a custom recursive iterator over collections' objects instead, since those 'raw' data like collection's objects list, and collection's children lists, should always be valid. Found while investigating a studio production file.
This commit is contained in:
parent
40b84ffc50
commit
43b0ff3054
Notes:
blender-bot
2023-02-14 09:44:56 +01:00
Referenced by issue #94037, The walk mode is stuck when it is enabled while using a tablet pen
|
@ -616,6 +616,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;
|
||||
|
@ -638,15 +667,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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue