[Bf-blender-cvs] [37458798fa0] master: LibOverride: Fix crash in ShapeKeys when making a mesh override local.

Bastien Montagne noreply at git.blender.org
Mon Jun 28 17:03:39 CEST 2021


Commit: 37458798fa02c777fb89d762b0cb2c2eadb7ca87
Author: Bastien Montagne
Date:   Mon Jun 28 17:00:08 2021 +0200
Branches: master
https://developer.blender.org/rB37458798fa02c777fb89d762b0cb2c2eadb7ca87

LibOverride: Fix crash in ShapeKeys when making a mesh override local.

Weird 'embedded for overrides' flag of embedded IDs (including ShapeKeys
in override context) was not properly cleaned up when making an override
fully local.

Reported by studio, thanks.

@jbakker should be backported to 2.93LTS if possible.

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

M	source/blender/blenkernel/BKE_lib_override.h
M	source/blender/blenkernel/intern/lib_id.c
M	source/blender/blenkernel/intern/lib_override.c
M	source/blender/editors/interface/interface_templates.c

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

diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h
index 3eb0ff44129..27076d908e7 100644
--- a/source/blender/blenkernel/BKE_lib_override.h
+++ b/source/blender/blenkernel/BKE_lib_override.h
@@ -99,6 +99,8 @@ void BKE_lib_override_library_main_resync(struct Main *bmain,
 
 void BKE_lib_override_library_delete(struct Main *bmain, struct ID *id_root);
 
+void BKE_lib_override_library_make_local(struct ID *id);
+
 struct IDOverrideLibraryProperty *BKE_lib_override_library_property_find(
     struct IDOverrideLibrary *override, const char *rna_path);
 struct IDOverrideLibraryProperty *BKE_lib_override_library_property_get(
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index b7cacba20b3..8bcfb8e159c 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -1941,13 +1941,13 @@ void BKE_library_make_local(Main *bmain,
         ntree->tag &= ~LIB_TAG_DOIT;
       }
 
-      if (id->lib == NULL) {
+      if (!ID_IS_LINKED(id->lib)) {
         id->tag &= ~(LIB_TAG_EXTERN | LIB_TAG_INDIRECT | LIB_TAG_NEW);
         id->flag &= ~LIB_INDIRECT_WEAK_LINK;
         if (ID_IS_OVERRIDE_LIBRARY_REAL(id) &&
             ELEM(lib, NULL, id->override_library->reference->lib) &&
             ((untagged_only == false) || !(id->tag & LIB_TAG_PRE_EXISTING))) {
-          BKE_lib_override_library_free(&id->override_library, true);
+          BKE_lib_override_library_make_local(id);
         }
       }
       /* The check on the fourth line (LIB_TAG_PRE_EXISTING) is done so it's possible to tag data
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 9a45f484581..f3d43aaa44f 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -1788,6 +1788,33 @@ void BKE_lib_override_library_delete(Main *bmain, ID *id_root)
   BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
 }
 
+/** Make given ID fully local.
+ *
+ *  \note Only differs from lower-level `BKE_lib_override_library_free in infamous embedded ID
+ *        cases.
+ */
+void BKE_lib_override_library_make_local(ID *id)
+{
+  BKE_lib_override_library_free(&id->override_library, true);
+
+  Key *shape_key = BKE_key_from_id(id);
+  if (shape_key != NULL) {
+    shape_key->id.flag &= ~LIB_EMBEDDED_DATA_LIB_OVERRIDE;
+  }
+
+  if (GS(id->name) == ID_SCE) {
+    Collection *master_collection = ((Scene *)id)->master_collection;
+    if (master_collection != NULL) {
+      master_collection->id.flag &= ~LIB_EMBEDDED_DATA_LIB_OVERRIDE;
+    }
+  }
+
+  bNodeTree *node_tree = ntreeFromID(id);
+  if (node_tree != NULL) {
+    node_tree->id.flag &= ~LIB_EMBEDDED_DATA_LIB_OVERRIDE;
+  }
+}
+
 BLI_INLINE IDOverrideLibraryRuntime *override_library_rna_path_runtime_ensure(
     IDOverrideLibrary *override)
 {
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index ab338a85e49..2c58277293d 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -687,7 +687,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
       break;
     case UI_ID_OVERRIDE:
       if (id && ID_IS_OVERRIDE_LIBRARY(id)) {
-        BKE_lib_override_library_free(&id->override_library, true);
+        BKE_lib_override_library_make_local(id);
         /* Reassign to get proper updates/notifiers. */
         idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
         RNA_property_pointer_set(&template_ui->ptr, template_ui->prop, idptr, NULL);



More information about the Bf-blender-cvs mailing list