[Bf-blender-cvs] [285ad21335a] temp-T94185-id_remapping-experiment-a: Add ID_remapper.

Jeroen Bakker noreply at git.blender.org
Fri Dec 17 17:04:58 CET 2021


Commit: 285ad21335a2294f1c789c29bfab221a09d4459d
Author: Jeroen Bakker
Date:   Fri Dec 17 17:03:41 2021 +0100
Branches: temp-T94185-id_remapping-experiment-a
https://developer.blender.org/rB285ad21335a2294f1c789c29bfab221a09d4459d

Add ID_remapper.

Currently not being used.

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

M	source/blender/blenkernel/BKE_lib_remap.h
M	source/blender/blenkernel/CMakeLists.txt
A	source/blender/blenkernel/intern/lib_id_remapper.cc

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

diff --git a/source/blender/blenkernel/BKE_lib_remap.h b/source/blender/blenkernel/BKE_lib_remap.h
index 9c8caa0266b..f8af3516437 100644
--- a/source/blender/blenkernel/BKE_lib_remap.h
+++ b/source/blender/blenkernel/BKE_lib_remap.h
@@ -154,6 +154,32 @@ void BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_
 void BKE_library_callback_remap_editor_id_reference_set(
     BKE_library_remap_editor_id_reference_cb func);
 
+/* IDRemapper */
+struct IDRemapper;
+
+/**
+ * \brief Create a new ID Remapper.
+ *
+ * An ID remapper stores multiple remapping rules.
+ */
+struct IDRemapper *BKE_id_remapper_create(void);
+
+/** \brief Free the given ID Remapper. */
+void BKE_id_remapper_free(struct IDRemapper *id_remapper);
+/** \brief Add a new remapping. */
+void BKE_id_remapper_add(struct IDRemapper *id_remapper, struct ID *old_id, struct ID *new_id);
+/**
+ * \brief Apply a remapping.
+ *
+ * Update the id pointer stored in the given id_ptr_ptr id a remapping rule exists.
+ *
+ * \returns
+ * false id pointer stored at the given id_ptr_ptr doesn't have a remap rule and isn't
+ *       modified.
+ * true  id pointer stored at the given id_ptr_ptr has a remap rule that is applied.
+ */
+bool BKE_id_remapper_apply(const struct IDRemapper *id_remapper, struct ID **id_ptr_ptr);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index f6e7f1c2473..3bb8439f129 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -177,6 +177,7 @@ set(SRC
   intern/lib_id.c
   intern/lib_id_delete.c
   intern/lib_id_eval.c
+  intern/lib_id_remapper.cc
   intern/lib_override.c
   intern/lib_query.c
   intern/lib_remap.c
diff --git a/source/blender/blenkernel/intern/lib_id_remapper.cc b/source/blender/blenkernel/intern/lib_id_remapper.cc
new file mode 100644
index 00000000000..9d8a5f2ed0d
--- /dev/null
+++ b/source/blender/blenkernel/intern/lib_id_remapper.cc
@@ -0,0 +1,82 @@
+
+#include "BKE_lib_remap.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_map.hh"
+
+namespace blender::bke::id::remapper {
+struct IDRemapper {
+ private:
+  Map<ID *, ID *> mappings;
+
+ public:
+  void add(ID *old_id, ID *new_id)
+  {
+    BLI_assert(old_id != nullptr);
+    mappings.add_as(old_id, new_id);
+  }
+
+  bool apply(ID **id_ptr_ptr) const
+  {
+    BLI_assert(id_ptr_ptr != nullptr);
+    if (*id_ptr_ptr == nullptr) {
+      return false;
+    }
+
+    if (!mappings.contains(*id_ptr_ptr)) {
+      return false;
+    }
+
+    *id_ptr_ptr = mappings.lookup(*id_ptr_ptr);
+    return true;
+  }
+};
+
+}  // namespace blender::bke::id::remapper
+
+extern "C" {
+/** \brief wrap CPP IDRemapper to a C handle. */
+static IDRemapper *wrap(blender::bke::id::remapper::IDRemapper *remapper)
+{
+  return static_cast<IDRemapper *>(static_cast<void *>(remapper));
+}
+
+/** \brief wrap C handle to a CPP IDRemapper. */
+static blender::bke::id::remapper::IDRemapper *unwrap(IDRemapper *remapper)
+{
+  return static_cast<blender::bke::id::remapper::IDRemapper *>(static_cast<void *>(remapper));
+}
+
+/** \brief wrap C handle to a CPP IDRemapper. */
+static const blender::bke::id::remapper::IDRemapper *unwrap_const(const IDRemapper *remapper)
+{
+  return static_cast<const blender::bke::id::remapper::IDRemapper *>(
+      static_cast<const void *>(remapper));
+}
+
+IDRemapper *BKE_id_remapper_create(void)
+{
+  blender::bke::id::remapper::IDRemapper *remapper =
+      MEM_new<blender::bke::id::remapper::IDRemapper>(__func__);
+  return wrap(remapper);
+}
+
+void BKE_id_remapper_free(IDRemapper *id_remapper)
+{
+  blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper);
+  MEM_delete<blender::bke::id::remapper::IDRemapper>(remapper);
+}
+
+void BKE_id_remapper_add(IDRemapper *id_remapper, ID *old_id, ID *new_id)
+{
+  blender::bke::id::remapper::IDRemapper *remapper = unwrap(id_remapper);
+  remapper->add(old_id, new_id);
+}
+
+bool BKE_id_remapper_apply(const IDRemapper *id_remapper, ID **id_ptr_ptr)
+{
+  const blender::bke::id::remapper::IDRemapper *remapper = unwrap_const(id_remapper);
+  return remapper->apply(id_ptr_ptr);
+}
+}
\ No newline at end of file



More information about the Bf-blender-cvs mailing list