[Bf-blender-cvs] [6e798feaac6] temp-T94185-id_remapping-experiment-a: Moved IDRemapper up one level.

Jeroen Bakker noreply at git.blender.org
Mon Dec 20 15:53:42 CET 2021


Commit: 6e798feaac664fedf3c4ab6cc9699ab4202b5b4b
Author: Jeroen Bakker
Date:   Mon Dec 20 14:39:48 2021 +0100
Branches: temp-T94185-id_remapping-experiment-a
https://developer.blender.org/rB6e798feaac664fedf3c4ab6cc9699ab4202b5b4b

Moved IDRemapper up one level.

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

M	source/blender/blenkernel/BKE_lib_remap.h
M	source/blender/blenkernel/intern/lib_id_remapper.cc
M	source/blender/editors/include/ED_util.h
M	source/blender/editors/util/ed_util.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_init_exit.c

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

diff --git a/source/blender/blenkernel/BKE_lib_remap.h b/source/blender/blenkernel/BKE_lib_remap.h
index 0703a99f830..89ef635f1ad 100644
--- a/source/blender/blenkernel/BKE_lib_remap.h
+++ b/source/blender/blenkernel/BKE_lib_remap.h
@@ -175,6 +175,8 @@ typedef enum IDRemapperApplyOptions {
   ID_REMAP_APPLY_ENSURE_REAL = (1 << 1),
 } IDRemapperApplyOptions;
 
+typedef void (*IDRemapperIterFunction)(struct ID *old_id, struct ID *new_id, void *user_data);
+
 /**
  * \brief Create a new ID Remapper.
  *
@@ -195,6 +197,9 @@ IDRemapperApplyResult BKE_id_remapper_apply(const struct IDRemapper *id_remapper
                                             struct ID **id_ptr_ptr,
                                             IDRemapperApplyOptions options);
 bool BKE_id_remapper_has_mapping_for(const struct IDRemapper *id_remapper, uint64_t type_filter);
+void BKE_id_remapper_iter(const struct IDRemapper *id_remapper,
+                          IDRemapperIterFunction func,
+                          void *user_data);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/lib_id_remapper.cc b/source/blender/blenkernel/intern/lib_id_remapper.cc
index fc9318a8fdb..1149653d2a0 100644
--- a/source/blender/blenkernel/intern/lib_id_remapper.cc
+++ b/source/blender/blenkernel/intern/lib_id_remapper.cc
@@ -59,6 +59,13 @@ struct IDRemapper {
     }
     return ID_REMAP_SOURCE_REMAPPED;
   }
+
+  void iter(IDRemapperIterFunction func, void *user_data) const
+  {
+    for (auto item : mappings.items()) {
+      func(item.key, item.value, user_data);
+    }
+  }
 };
 
 }  // namespace blender::bke::id::remapper
@@ -115,4 +122,12 @@ IDRemapperApplyResult BKE_id_remapper_apply(const IDRemapper *id_remapper,
   const blender::bke::id::remapper::IDRemapper *remapper = unwrap_const(id_remapper);
   return remapper->apply(id_ptr_ptr, options);
 }
+
+void BKE_id_remapper_iter(const struct IDRemapper *id_remapper,
+                          IDRemapperIterFunction func,
+                          void *user_data)
+{
+  const blender::bke::id::remapper::IDRemapper *remapper = unwrap_const(id_remapper);
+  remapper->iter(func, user_data);
+}
 }
\ No newline at end of file
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 69378d436ab..e5ead8b3cad 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -33,6 +33,7 @@ extern "C" {
 struct GPUBatch;
 struct Main;
 struct bContext;
+struct IDRemapper;
 
 /* ed_util.c */
 
@@ -62,8 +63,11 @@ bool ED_editors_flush_edits(struct Main *bmain);
  */
 void ED_spacedata_id_remap(struct ScrArea *area,
                            struct SpaceLink *sl,
-                           struct ID *old_id,
-                           struct ID *new_id);
+                           const struct IDRemapper *mappings);
+void ED_spacedata_id_remap_old(struct ScrArea *area,
+                               struct SpaceLink *sl,
+                               struct ID *old_id,
+                               struct ID *new_id);
 
 void ED_operatortypes_edutils(void);
 
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 545dc7caf98..a780c73d798 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -435,9 +435,20 @@ void unpack_menu(bContext *C,
   UI_popup_menu_end(C, pup);
 }
 
-void ED_spacedata_id_remap(struct ScrArea *area, struct SpaceLink *sl, ID *old_id, ID *new_id)
+void ED_spacedata_id_remap(struct ScrArea *area,
+                           struct SpaceLink *sl,
+                           const struct IDRemapper *mappings)
 {
   SpaceType *st = BKE_spacetype_from_id(sl->spacetype);
+  if (st && st->id_remap) {
+    st->id_remap(area, sl, mappings);
+  }
+}
+
+void ED_spacedata_id_remap_old(struct ScrArea *area, struct SpaceLink *sl, ID *old_id, ID *new_id)
+{
+  printf("%s is deprecated use ED_spacedata_id_remap_ex\n", __func__);
+  SpaceType *st = BKE_spacetype_from_id(sl->spacetype);
 
   if (st && st->id_remap) {
     /* TODO(jbakker): move up the tree to increase performance. */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 1b6df9fb0db..2908bde0b16 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -51,6 +51,7 @@
 #include "BKE_customdata.h"
 #include "BKE_global.h"
 #include "BKE_idprop.h"
+#include "BKE_lib_remap.h"
 #include "BKE_main.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
@@ -311,30 +312,45 @@ void WM_main_remove_notifier_reference(const void *reference)
 #endif
   }
 }
+static void wm_main_remap_assetlist(ID *old_id, ID *new_id, void *UNUSED(user_data))
+{
+  ED_assetlist_storage_id_remap(old_id, new_id);
+}
+
+static void wm_main_remap_msgbus_notify(ID *old_id, ID *new_id, void *user_data)
+{
+  struct wmMsgBus *mbus = user_data;
+  if (new_id != NULL) {
+    WM_msg_id_update(mbus, old_id, new_id);
+  }
+  else {
+    WM_msg_id_remove(mbus, old_id);
+  }
+}
 
 void WM_main_remap_editor_id_reference(ID *old_id, ID *new_id)
 {
   Main *bmain = G_MAIN;
 
+  struct IDRemapper *remapper = BKE_id_remapper_create();
+  BKE_id_remapper_add(remapper, old_id, new_id);
+
   LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
     LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
       LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
-        ED_spacedata_id_remap(area, sl, old_id, new_id);
+        ED_spacedata_id_remap(area, sl, remapper);
       }
     }
   }
-  ED_assetlist_storage_id_remap(old_id, new_id);
+
+  BKE_id_remapper_iter(remapper, wm_main_remap_assetlist, NULL);
 
   wmWindowManager *wm = bmain->wm.first;
   if (wm && wm->message_bus) {
-    struct wmMsgBus *mbus = wm->message_bus;
-    if (new_id != NULL) {
-      WM_msg_id_update(mbus, old_id, new_id);
-    }
-    else {
-      WM_msg_id_remove(mbus, old_id);
-    }
+    BKE_id_remapper_iter(remapper, wm_main_remap_msgbus_notify, wm->message_bus);
   }
+
+  BKE_id_remapper_free(remapper);
 }
 
 static void wm_notifier_clear(wmNotifier *note)
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 2f87e5789fe..21b39f341cc 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -252,7 +252,7 @@ void WM_init(bContext *C, int argc, const char **argv)
   BKE_region_callback_free_gizmomap_set(wm_gizmomap_remove);
   BKE_region_callback_refresh_tag_gizmomap_set(WM_gizmomap_tag_refresh);
   BKE_library_callback_remap_editor_id_reference_set(WM_main_remap_editor_id_reference);
-  BKE_spacedata_callback_id_remap_set(ED_spacedata_id_remap);
+  BKE_spacedata_callback_id_remap_set(ED_spacedata_id_remap_old);
   DEG_editors_set_update_cb(ED_render_id_flush_update, ED_render_scene_update);
 
   ED_spacetypes_init();



More information about the Bf-blender-cvs mailing list