76 const bool is_indirect,
77 const bool is_reference,
78 const bool violates_never_null,
80 const bool is_obj_editmode)
86 id->runtime.remap.skipped_indirect++;
88 else if (violates_never_null || is_obj_editmode || is_reference) {
89 id->runtime.remap.skipped_direct++;
96 id->runtime.remap.skipped_refcounted++;
111 const bool is_indirect,
112 const bool violates_never_null)
117 BLI_assert(!skip_user_refcount || !force_user_refcount);
119 ID *old_id = *id_ptr;
120 if (!violates_never_null) {
121 mappings.
apply(id_ptr, id_remapper_options, id_self);
122 if (!skip_update_tagging) {
123 if (id_remap_data->
bmain !=
nullptr) {
127 if (id_self != id_owner) {
142 ID *new_id = violates_never_null ? nullptr : *id_ptr;
144 if (!is_indirect && new_id) {
148 if (skip_user_refcount) {
162 if (new_id !=
nullptr && (force_user_refcount || (new_id->
tag &
ID_TAG_NO_MAIN) == 0)) {
176 const int cb_flag = cb_data->
cb_flag;
196 if (*id_p ==
nullptr) {
208 id_remapper.
add(*id_p,
nullptr);
218 *id_p, id_remapper_options, id_self);
220 if (
ELEM(expected_mapping_result,
225 "Cleanup should always do unassign.");
238 (expected_mapping_result ==
246 "In %s (lib %p): Remapping %s (%p) remap operation: %s "
247 "(is_indirect: %d, skip_indirect: %d, is_reference: %d, skip_reference: %d)\n",
269 if ((violates_never_null && skip_never_null) ||
270 (is_obj_editmode && (((
Object *)id_owner)->data == *id_p) &&
272 (skip_indirect && is_indirect) || (is_reference && skip_reference))
292 violates_never_null);
305 if (ob->
pose ==
nullptr) {
335 switch (
GS(id_owner->
name)) {
353 const bool do_sync_collection)
359 if (do_sync_collection) {
363 if (old_ob ==
nullptr) {
365 ob =
static_cast<Object *
>(ob->id.next))
374 ob =
static_cast<Object *
>(ob->id.next))
391 if (new_collection ==
nullptr) {
410 if (ob->
data == new_id) {
411 switch (
GS(new_id->
name)) {
434 const int remap_flags = id_remap_data->
flag;
450 new_id->
tag &= ~ID_TAG_INDIRECT;
451 new_id->
flag &= ~ID_FLAG_INDIRECT_WEAK_LINK;
459 if (new_id !=
nullptr) {
515 printf(
"\tchecking id %s (%p, %p)\n", id->name,
id, id->lib);
550 id_remapper.
iter([&](
ID *old_id,
ID *new_id) {
557 if (old_id == new_id) {
581 if (old_id->
us - skipped_refcounted < 0) {
583 "Error in remapping process from '%s' (%p) to '%s' (%p): "
584 "wrong user count in old ID after process (summing up to %d)",
587 new_id ? new_id->
name :
"<nullptr>",
589 old_id->
us - skipped_refcounted);
593 if (skipped_direct == 0) {
596 old_id->
tag &= ~ID_TAG_EXTERN;
604 switch (
GS(old_id->
name)) {
621 ob =
static_cast<Object *
>(ob->id.next))
654 mappings.
iter([&](
ID *old_id,
ID *new_id) {
686 ID *old_id =
static_cast<ID *
>(old_idv);
687 ID *new_id =
static_cast<ID *
>(new_idv);
688 remapper.
add(old_id, new_id);
738 bool is_object_update_processed =
false;
739 for (
ID *id_iter : ids) {
744 switch (
GS(id_iter->name)) {
753 ((
Scene *)id_iter)->master_collection;
754 switch (
GS(old_id->
name)) {
756 if (!is_object_update_processed) {
759 is_object_update_processed =
true;
772 if (new_id !=
nullptr) {
786 const int remap_flags)
790 for (
ID *id_iter : ids) {
794 if (bmain ==
nullptr) {
798 switch (remap_type) {
800 id_remapper.
iter([&](
ID *old_id,
ID *new_id) {
806 bool is_object_update_processed =
false;
807 for (
ID *id_iter : ids) {
808 switch (
GS(id_iter->name)) {
817 ((
Scene *)id_iter)->master_collection;
819 if (!is_object_update_processed) {
824 is_object_update_processed =
true;
827 bmain, owner_collection,
nullptr,
nullptr);
845 Main *bmain,
void *idv,
void *old_idv,
void *new_idv,
const int remap_flags)
850 ID *
id =
static_cast<ID *
>(idv);
851 ID *old_id =
static_cast<ID *
>(old_idv);
852 ID *new_id =
static_cast<ID *
>(new_idv);
861 if (old_id !=
nullptr) {
864 id_remapper.
add(old_id, new_id);
884 const int cb_flag = cb_data->
cb_flag;
892 ID *
id = *id_pointer;
897 if (id->newid !=
nullptr) {
916 id->tag &= ~ID_TAG_NEW;
void BKE_pose_clear_pointers(bPose *pose)
void BKE_collections_object_remove_invalids(Main *bmain)
void BKE_collections_child_remove_nulls(Main *bmain, Collection *parent_collection, Collection *child_collection)
void BKE_main_collections_parent_relations_rebuild(Main *bmain)
void BKE_curve_type_test(Object *ob)
void BKE_main_collection_sync_remap(const Main *bmain)
void id_fake_user_set(ID *id)
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
void id_us_ensure_real(ID *id)
void id_fake_user_clear(ID *id)
void id_us_clear_real(ID *id)
void id_us_plus_no_lib(ID *id)
void BKE_libblock_runtime_reset_remapping_status(ID *id) ATTR_NONNULL(1)
@ IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE
@ IDWALK_CB_INDIRECT_USAGE
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, int flag)
@ IDWALK_DO_LIBRARY_POINTER
@ IDWALK_DO_INTERNAL_RUNTIME_POINTERS
@ IDWALK_NO_ORIG_POINTERS_ACCESS
uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, const bool include_ui, const IDTypeInfo *owner_id_type=nullptr)
void(*)(const blender::bke::id::IDRemapper &mappings) BKE_library_remap_editor_id_reference_cb
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_SKIP_USER_REFCOUNT
@ ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS
@ ID_REMAP_SKIP_OVERRIDE_LIBRARY
@ ID_REMAP_FORCE_USER_REFCOUNT
@ ID_REMAP_SKIP_NEVER_NULL_USAGE
@ ID_REMAP_DO_LIBRARY_POINTERS
@ ID_REMAP_FORCE_OBDATA_IN_EDITMODE
@ ID_REMAP_FORCE_UI_POINTERS
@ ID_REMAP_SKIP_INDIRECT_USAGE
@ ID_REMAP_FORCE_NEVER_NULL_USAGE
@ ID_REMAP_STORE_NEVER_NULL_USAGE
@ ID_REMAP_ALLOW_IDTYPE_MISMATCH
@ ID_REMAP_SKIP_UPDATE_TAGGING
@ ID_REMAP_NO_ORIG_POINTERS_ACCESS
@ ID_REMAP_RESULT_SOURCE_REMAPPED
@ ID_REMAP_RESULT_SOURCE_UNASSIGNED
@ ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE
@ ID_REMAP_RESULT_SOURCE_UNAVAILABLE
@ ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF
void(*)(const void *) BKE_library_free_notifier_reference_cb
#define FOREACH_MAIN_ID_END
void BKE_main_lock(Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void BKE_main_unlock(Main *bmain)
General operations, lookup, etc. for materials.
void BKE_object_materials_test(struct Main *bmain, struct Object *ob, struct ID *id)
bool BKE_mball_is_basis(const Object *ob)
bool BKE_mball_is_basis_for(const Object *ob1, const Object *ob2)
void BKE_modifiers_test_object(Object *ob)
void multires_force_sculpt_rebuild(Object *object)
void BKE_ntree_update_tag_all(bNodeTree *ntree)
General operations, lookup, etc. for blender objects.
bool BKE_object_is_in_editmode(const Object *ob)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define UNUSED_VARS_NDEBUG(...)
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_id_tag_update_ex(Main *bmain, ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
#define ID_IS_LINKED(_id)
@ ID_REMAP_IS_LINKED_DIRECT
@ ID_REMAP_IS_USER_ONE_SKIPPED
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
constexpr const char * c_str() const
void append(const T &value)
IDRemapperApplyResult get_mapping_result(ID *id, IDRemapperApplyOptions options, const ID *id_self) const
IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self=nullptr) const
void iter(FunctionRef< void(ID *old_id, ID *new_id)> func) const
static const StringRefNull result_to_string(const IDRemapperApplyResult result)
void add(ID *old_id, ID *new_id)
void never_null_users_add(ID *id)
bool contains_mappings_for_any(IDTypeFilter filter) const
static void libblock_remap_data_preprocess_ob(Object *ob, eIDRemapType remap_type, const IDRemapper &id_remapper)
void BKE_libblock_relink_to_newid(Main *bmain, ID *id, const int remap_flag)
BKE_library_remap_editor_id_reference_cb remap_editor_id_reference_cb
static int id_relink_to_newid_looper(LibraryIDLinkCallbackData *cb_data)
static void libblock_remap_data_postprocess_collection_update(Main *bmain, Collection *owner_collection, Collection *, Collection *new_collection)
void BKE_library_callback_remap_editor_id_reference_set(BKE_library_remap_editor_id_reference_cb func)
static void libblock_remap_data(Main *bmain, ID *id, eIDRemapType remap_type, IDRemapper &id_remapper, const int remap_flags)
void BKE_libblock_remap_multiple(Main *bmain, IDRemapper &mappings, const int remap_flags)
static void libblock_remap_data_preprocess(ID *id_owner, eIDRemapType remap_type, const IDRemapper &id_remapper)
static void libblock_relink_foreach_idpair(ID *old_id, ID *new_id, Main *bmain, const blender::Span< ID * > ids)
static void libblock_relink_to_newid_prepare_data(Main *bmain, ID *id, RelinkToNewIDData *relink_data)
static void foreach_libblock_remap_callback_skip(const ID *, ID **id_ptr, const int cb_flag, const bool is_indirect, const bool is_reference, const bool violates_never_null, const bool, const bool is_obj_editmode)
void BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_reference_cb func)
void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv, const int remap_flags)
static void foreach_libblock_remap_callback_apply(ID *id_owner, ID *id_self, ID **id_ptr, IDRemap *id_remap_data, const IDRemapper &mappings, const IDRemapperApplyOptions id_remapper_options, const int cb_flag, const bool is_indirect, const bool violates_never_null)
void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, const int remap_flags)
void BKE_libblock_unlink(Main *bmain, void *idv, const bool do_skip_indirect)
static void libblock_remap_data_update_tags(ID *old_id, ID *new_id, IDRemap *id_remap_data)
void BKE_libblock_remap_multiple_raw(Main *bmain, IDRemapper &mappings, const int remap_flags)
static void libblock_remap_data_postprocess_obdata_relink(Main *bmain, Object *ob, ID *new_id)
static void libblock_remap_data_postprocess_object_update(Main *bmain, Object *old_ob, Object *, const bool do_sync_collection)
void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, const int remap_flags)
void BKE_libblock_remap_multiple_locked(Main *bmain, IDRemapper &mappings, const int remap_flags)
void BKE_libblock_relink_multiple(Main *bmain, const blender::Span< ID * > ids, const eIDRemapType remap_type, IDRemapper &id_remapper, const int remap_flags)
BKE_library_free_notifier_reference_cb free_notifier_reference_cb
static void libblock_remap_reset_remapping_status_fn(ID *old_id, ID *new_id)
static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data)
static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new_id)
static void libblock_remap_foreach_idpair(ID *old_id, ID *new_id, Main *bmain, int remap_flags)
void node_tree_update_all_users(Main *main, ID *id)
unsigned __int64 uint64_t
struct ID_Runtime runtime
MainIDRelations * relations
blender::Vector< ID * > ids