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 _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs