Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2021-02-04 21:20:28 +0300
committerBastien Montagne <bastien@blender.org>2021-02-04 21:23:10 +0300
commit7d5640ee101e6b9ddbd9f534539ae939f68bfd9b (patch)
treefeabf0e5479d529c25a0139f2fabee1135f74312
parent0f893656f4d1c389fb67c4015d351c7156c19ca3 (diff)
LibOverride: Improve/Fix issues in override resync process.
When we have a local override, its linked reference may not be detected as needing to be overridden anymore. In that case, if there is no actual override defined by the user, assume that we can get rid of this local override as part of the resync process, and use the linked data directly instead.
-rw-r--r--source/blender/blenkernel/intern/lib_override.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 1c9430a35a2..6911248d198 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -789,9 +789,11 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
ID *id_root_reference = id_root->override_library->reference;
+ BKE_main_relations_create(bmain, 0);
+
lib_override_local_group_tag(bmain, id_root, LIB_TAG_DOIT, LIB_TAG_MISSING);
- lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING, true);
+ lib_override_linked_group_tag(bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING, false);
/* Make a mapping 'linked reference IDs' -> 'Local override IDs' of existing overrides. */
GHash *linkedref_to_old_override = BLI_ghash_new(
@@ -804,12 +806,40 @@ bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_
* same linked ID in a same hierarchy. */
if (!BLI_ghash_haskey(linkedref_to_old_override, id->override_library->reference)) {
BLI_ghash_insert(linkedref_to_old_override, id->override_library->reference, id);
- BLI_assert(id->override_library->reference->tag & LIB_TAG_DOIT);
+ if ((id->override_library->reference->tag & LIB_TAG_DOIT) == 0) {
+ /* We have an override, but now it does not seem to be necessary to override that ID
+ * anymore. Check if there are some actual overrides from the user, otherwise assume
+ * that we can get rid of this local override. */
+ LISTBASE_FOREACH (IDOverrideLibraryProperty *, op, &id->override_library->properties) {
+ if (op->rna_prop_type != PROP_POINTER) {
+ id->override_library->reference->tag |= LIB_TAG_DOIT;
+ break;
+ }
+
+ bool do_break = false;
+ LISTBASE_FOREACH (IDOverrideLibraryPropertyOperation *, opop, &op->operations) {
+ if ((opop->flag & IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE) == 0) {
+ id->override_library->reference->tag |= LIB_TAG_DOIT;
+ do_break = true;
+ break;
+ }
+ }
+ if (do_break) {
+ break;
+ }
+ }
+ }
}
}
}
FOREACH_MAIN_ID_END;
+ /* Code above may have added some tags, we need to update this too. */
+ lib_override_hierarchy_dependencies_recursive_tag(
+ bmain, id_root_reference, LIB_TAG_DOIT, LIB_TAG_MISSING);
+
+ BKE_main_relations_free(bmain);
+
/* Make new override from linked data. */
/* Note that this call also remaps all pointers of tagged IDs from old override IDs to new
* override IDs (including within the old overrides themselves, since those are tagged too