From 462014b59b4f5ad110ebfcbc17dfa1f896582110 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 8 Sep 2022 13:06:40 +0200 Subject: IDManagement: Add new `BKE_id_owner_get` accessor. Essentially calls `IDTypeInfo->owner_get` for now, will make more sense once the callback is changed to return the address of the pointer instead. --- source/blender/blenkernel/intern/lib_id.c | 9 ++++++++ source/blender/blenkernel/intern/lib_override.cc | 28 ++++++++++-------------- source/blender/blenkernel/intern/lib_query.c | 5 ++--- 3 files changed, 23 insertions(+), 19 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index 5a394a05d86..cead6702080 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -1965,6 +1965,15 @@ bool BKE_id_can_be_asset(const ID *id) BKE_idtype_idcode_is_linkable(GS(id->name)); } +ID *BKE_id_owner_get(ID *id) +{ + const IDTypeInfo *idtype = BKE_idtype_get_info_from_id(id); + if (idtype->owner_get != NULL) { + return idtype->owner_get(id); + } + return NULL; +} + bool BKE_id_is_editable(const Main *bmain, const ID *id) { return !(ID_IS_LINKED(id) || BKE_lib_override_library_is_system_defined(bmain, id)); diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc index a85a6c5730f..0200b534ace 100644 --- a/source/blender/blenkernel/intern/lib_override.cc +++ b/source/blender/blenkernel/intern/lib_override.cc @@ -97,21 +97,17 @@ BLI_INLINE const IDOverrideLibrary *BKE_lib_override_library_get(const Main * /* const ID * /*owner_id_hint*/, const ID **r_owner_id) { - if (r_owner_id != nullptr) { - *r_owner_id = id; - } if (id->flag & LIB_EMBEDDED_DATA_LIB_OVERRIDE) { - const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id); - if (id_type->owner_get != nullptr) { - /* The #IDTypeInfo::owner_get callback should not modify the arguments, so casting away const - * is okay. */ - const ID *owner_id = id_type->owner_get(const_cast(id)); - if (r_owner_id != nullptr) { - *r_owner_id = owner_id; - } - return owner_id->override_library; + const ID *owner_id = BKE_id_owner_get(const_cast(id)); + BLI_assert_msg(owner_id != nullptr, "Liboverride-embedded ID with no owner"); + if (r_owner_id != nullptr) { + *r_owner_id = owner_id; } - BLI_assert_msg(0, "IDTypeInfo of liboverride-embedded ID with no owner getter"); + return owner_id->override_library; + } + + if (r_owner_id != nullptr) { + *r_owner_id = id; } return id->override_library; } @@ -2211,9 +2207,9 @@ static bool lib_override_resync_id_lib_level_is_valid(ID *id, static ID *lib_override_library_main_resync_root_get(Main * /*bmain*/, ID *id) { if (!ID_IS_OVERRIDE_LIBRARY_REAL(id)) { - const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id); - if (id_type->owner_get != nullptr) { - id = id_type->owner_get(id); + ID *id_owner = BKE_id_owner_get(id); + if (id_owner != nullptr) { + id = id_owner; } BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id)); } diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c index e51f3c524fa..50843b18d18 100644 --- a/source/blender/blenkernel/intern/lib_query.c +++ b/source/blender/blenkernel/intern/lib_query.c @@ -711,9 +711,8 @@ static void lib_query_unused_ids_tag_recurse(Main *bmain, ID *id_from = id_from_item->id_pointer.from; if ((id_from->flag & LIB_EMBEDDED_DATA) != 0) { /* Directly 'by-pass' to actual real ID owner. */ - const IDTypeInfo *type_info_from = BKE_idtype_get_info_from_id(id_from); - BLI_assert(type_info_from->owner_get != NULL); - id_from = type_info_from->owner_get(id_from); + id_from = BKE_id_owner_get(id_from); + BLI_assert(id_from != NULL); } lib_query_unused_ids_tag_recurse( -- cgit v1.2.3