LibOverride: give more remapping control to `BKE_override_library_create_from_id...
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 5 Sep 2019 14:41:35 +0000 (16:41 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 5 Sep 2019 19:31:00 +0000 (21:31 +0200)
Similar change to the one done for tagged IDs overriding some days ago.
We do not always want to remap all local usages of a linked data-block
to its new local overriding copy.

source/blender/blenkernel/BKE_library_override.h
source/blender/blenkernel/intern/library_override.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/object/object_relations.c
source/blender/editors/space_outliner/outliner_tools.c
source/blender/makesrna/intern/rna_ID.c

index 93b2355ce55a5766e695b184fb0b1ad6f59126be..5cffabd333fe28cb1259fda63b5290d13e7e2d06 100644 (file)
@@ -38,7 +38,9 @@ void BKE_override_library_copy(struct ID *dst_id, const struct ID *src_id);
 void BKE_override_library_clear(struct IDOverrideLibrary *override, const bool do_id_user);
 void BKE_override_library_free(struct IDOverrideLibrary **override, const bool do_id_user);
 
-struct ID *BKE_override_library_create_from_id(struct Main *bmain, struct ID *reference_id);
+struct ID *BKE_override_library_create_from_id(struct Main *bmain,
+                                               struct ID *reference_id,
+                                               const bool do_tagged_remap);
 bool BKE_override_library_create_from_tag(struct Main *bmain);
 
 struct IDOverrideLibraryProperty *BKE_override_library_property_find(
index 6532fce5778940d2bebe003afd91a6c8d3a25de1..b3c628f6cb887a3e6b5298a42f2a6a2fe4d451e6 100644 (file)
@@ -185,19 +185,28 @@ static ID *override_library_create_from(Main *bmain, ID *reference_id)
 }
 
 /** Create an overridden local copy of linked reference. */
-ID *BKE_override_library_create_from_id(Main *bmain, ID *reference_id)
+ID *BKE_override_library_create_from_id(Main *bmain, ID *reference_id, const bool do_tagged_remap)
 {
   BLI_assert(reference_id != NULL);
   BLI_assert(reference_id->lib != NULL);
 
   ID *local_id = override_library_create_from(bmain, reference_id);
 
-  /* Remapping, we obviously only want to affect local data
-   * (and not our own reference pointer to overridden ID). */
-  BKE_libblock_remap(bmain,
-                     reference_id,
-                     local_id,
-                     ID_REMAP_SKIP_INDIRECT_USAGE | ID_REMAP_SKIP_OVERRIDE_LIBRARY);
+  if (do_tagged_remap) {
+    ID *other_id;
+    FOREACH_MAIN_ID_BEGIN (bmain, other_id) {
+      if ((other_id->tag & LIB_TAG_DOIT) != 0 && other_id->lib == NULL) {
+        /* Note that using ID_REMAP_SKIP_INDIRECT_USAGE below is superfluous, as we only remap
+         * local IDs usages anyway... */
+        BKE_libblock_relink_ex(bmain,
+                               other_id,
+                               reference_id,
+                               local_id,
+                               ID_REMAP_SKIP_INDIRECT_USAGE | ID_REMAP_SKIP_OVERRIDE_LIBRARY);
+      }
+    }
+    FOREACH_MAIN_ID_END;
+  }
 
   return local_id;
 }
index f53bef877c4dd32e5fbb944638f3f55ac23bae03..5a333a5fa27dd9459a915750d29b12fbea502cb2 100644 (file)
@@ -516,7 +516,8 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
       if (id) {
         Main *bmain = CTX_data_main(C);
         if (BKE_override_library_is_enabled() && CTX_wm_window(C)->eventstate->shift) {
-          ID *override_id = BKE_override_library_create_from_id(bmain, id);
+          /* Only remap that specific ID usage to overriding local data-block. */
+          ID *override_id = BKE_override_library_create_from_id(bmain, id, false);
           if (override_id != NULL) {
             BKE_main_id_clear_newpoins(bmain);
 
index 06c360ed1cd96203c1531dda9498e3747fc15989..60a2b9cca0d265826d64e060ada2bca9b67b9c1a 100644 (file)
@@ -2528,7 +2528,10 @@ static int make_override_library_exec(bContext *C, wmOperator *op)
   }
   /* TODO: probably more cases where we want to do automated smart things in the future! */
   else {
-    success = (BKE_override_library_create_from_id(bmain, &obact->id) != NULL);
+    /* For now, remapp all local usages of linked ID to local override one here. */
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, true);
+    success = (BKE_override_library_create_from_id(bmain, &obact->id, true) != NULL);
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
   }
 
   WM_event_add_notifier(C, NC_WINDOW, NULL);
index a2d988f1142ead1df9c270a9d6405423665be7c5..91d7f0f9374962c367de0d73c4ff2b1a61a78dd0 100644 (file)
@@ -715,10 +715,13 @@ static void id_override_library_cb(bContext *C,
 {
   if (ID_IS_LINKED(tselem->id) && (tselem->id->tag & LIB_TAG_EXTERN)) {
     Main *bmain = CTX_data_main(C);
-    ID *override_id = BKE_override_library_create_from_id(bmain, tselem->id);
+    /* For now, remapp all local usages of linked ID to local override one here. */
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, true);
+    ID *override_id = BKE_override_library_create_from_id(bmain, tselem->id, true);
     if (override_id != NULL) {
       BKE_main_id_clear_newpoins(bmain);
     }
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
   }
 }
 
index 5a4b4a3fa3d72ceb9aa518838214efa24b99d00e..294fdb2e0d8c624e2e9bc6b11b406a00f0f2c6ef 100644 (file)
@@ -491,13 +491,22 @@ static ID *rna_ID_copy(ID *id, Main *bmain)
   return NULL;
 }
 
-static ID *rna_ID_override_create(ID *id, Main *bmain)
+static ID *rna_ID_override_create(ID *id, Main *bmain, bool remap_local_usages)
 {
   if (!BKE_override_library_is_enabled() || id->lib == NULL) {
     return NULL;
   }
 
-  return BKE_override_library_create_from_id(bmain, id);
+  if (remap_local_usages) {
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, true);
+  }
+
+  ID *local_id = BKE_override_library_create_from_id(bmain, id, remap_local_usages);
+
+  if (remap_local_usages) {
+    BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
+  }
+  return local_id;
 }
 
 static void rna_ID_update_tag(ID *id, Main *bmain, ReportList *reports, int flag)
@@ -1519,6 +1528,12 @@ static void rna_def_ID(BlenderRNA *brna)
   RNA_def_function_flag(func, FUNC_USE_MAIN);
   parm = RNA_def_pointer(func, "id", "ID", "", "New overridden local copy of the ID");
   RNA_def_function_return(func, parm);
+  RNA_def_boolean(func,
+                  "remap_local_usages",
+                  false,
+                  "",
+                  "Whether local usages of the linked ID should be remapped to the new "
+                  "library override of it");
 
   func = RNA_def_function(srna, "user_clear", "rna_ID_user_clear");
   RNA_def_function_ui_description(func,