[Bf-blender-cvs] [57097e9a851] master: Fix T99261: partial LibOverride creation would not properly remap all needed data.

Bastien Montagne noreply at git.blender.org
Tue Jul 12 14:47:36 CEST 2022


Commit: 57097e9a8515048b580459354fa197f78a442409
Author: Bastien Montagne
Date:   Tue Jul 12 14:27:50 2022 +0200
Branches: master
https://developer.blender.org/rB57097e9a8515048b580459354fa197f78a442409

Fix T99261: partial LibOverride creation would not properly remap all needed data.

When creating partial overrides, there may also be need to reamap usage
of linked data towards already existing overrides, in newly created
overrides.

===================================================================

M	source/blender/blenkernel/intern/lib_override.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc
index cdea97b6c6a..1969ec9196c 100644
--- a/source/blender/blenkernel/intern/lib_override.cc
+++ b/source/blender/blenkernel/intern/lib_override.cc
@@ -428,14 +428,40 @@ static void lib_override_prefill_newid_from_existing_overrides(Main *bmain, ID *
 {
   ID *id_iter;
   FOREACH_MAIN_ID_BEGIN (bmain, id_iter) {
-    if (ID_IS_OVERRIDE_LIBRARY_REAL(id_iter) &&
-        id_iter->override_library->hierarchy_root == id_hierarchy_root) {
-      id_iter->override_library->reference->newid = id_iter;
+    ID *id = id_iter;
+    if (GS(id_iter->name) == ID_KE) {
+      id = reinterpret_cast<Key *>(id_iter)->from;
+      BLI_assert(id != nullptr);
+    }
+    if (ID_IS_OVERRIDE_LIBRARY_REAL(id) &&
+        id->override_library->hierarchy_root == id_hierarchy_root) {
+      id->override_library->reference->newid = id;
+      if (GS(id_iter->name) == ID_KE) {
+        Key *reference_key = BKE_key_from_id(id->override_library->reference);
+        if (reference_key != nullptr) {
+          reference_key->id.newid = id_iter;
+        }
+      }
     }
   }
   FOREACH_MAIN_ID_END;
 }
 
+static void lib_override_remapper_overrides_add(IDRemapper *id_remapper,
+                                                ID *reference_id,
+                                                ID *local_id)
+{
+  BKE_id_remapper_add(id_remapper, reference_id, local_id);
+
+  Key *reference_key, *local_key = nullptr;
+  if ((reference_key = BKE_key_from_id(reference_id)) != nullptr) {
+    local_key = BKE_key_from_id(reference_id->newid);
+    BLI_assert(local_key != nullptr);
+
+    BKE_id_remapper_add(id_remapper, &reference_key->id, &local_key->id);
+  }
+}
+
 /* TODO: Make this static local function instead? API is becoming complex, and it's not used
  * outside of this file anyway. */
 bool BKE_lib_override_library_create_from_tag(Main *bmain,
@@ -544,6 +570,7 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain,
     BLI_assert(id_hierarchy_root != nullptr);
 
     LinkNode *relinked_ids = nullptr;
+    IDRemapper *id_remapper = BKE_id_remapper_create();
     /* Still checking the whole Main, that way we can tag other local IDs as needing to be
      * remapped to use newly created overriding IDs, if needed. */
     ID *id;
@@ -568,6 +595,13 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain,
        * consider we should also relink it, as part of recursive resync. */
       if ((other_id->tag & LIB_TAG_DOIT) != 0 && other_id->lib != id_root_reference->lib) {
         BLI_linklist_prepend(&relinked_ids, other_id);
+        if (ID_IS_OVERRIDE_LIBRARY_REAL(other_id) &&
+            other_id->override_library->hierarchy_root == id_hierarchy_root) {
+          reference_id = other_id->override_library->reference;
+          ID *local_id = reference_id->newid;
+          BLI_assert(other_id == local_id);
+          lib_override_remapper_overrides_add(id_remapper, reference_id, local_id);
+        }
       }
       if (other_id != id) {
         other_id->lib = id_root_reference->lib;
@@ -575,7 +609,6 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain,
     }
     FOREACH_MAIN_ID_END;
 
-    IDRemapper *id_remapper = BKE_id_remapper_create();
     for (todo_id_iter = static_cast<LinkData *>(todo_ids.first); todo_id_iter != nullptr;
          todo_id_iter = todo_id_iter->next) {
       reference_id = static_cast<ID *>(todo_id_iter->data);
@@ -587,15 +620,7 @@ bool BKE_lib_override_library_create_from_tag(Main *bmain,
 
       local_id->override_library->hierarchy_root = id_hierarchy_root;
 
-      BKE_id_remapper_add(id_remapper, reference_id, local_id);
-
-      Key *reference_key, *local_key = nullptr;
-      if ((reference_key = BKE_key_from_id(reference_id)) != nullptr) {
-        local_key = BKE_key_from_id(reference_id->newid);
-        BLI_assert(local_key != nullptr);
-
-        BKE_id_remapper_add(id_remapper, &reference_key->id, &local_key->id);
-      }
+      lib_override_remapper_overrides_add(id_remapper, reference_id, local_id);
     }
 
     BKE_libblock_relink_multiple(bmain,



More information about the Bf-blender-cvs mailing list