[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