75 const bool is_indirect,
76 const bool is_reference,
77 const bool violates_never_null,
79 const bool is_obj_editmode)
85 id->runtime->remap.skipped_indirect++;
87 else if (violates_never_null || is_obj_editmode || is_reference) {
88 id->runtime->remap.skipped_direct++;
95 id->runtime->remap.skipped_refcounted++;
110 const bool is_indirect,
111 const bool violates_never_null)
116 BLI_assert(!skip_user_refcount || !force_user_refcount);
118 ID *old_id = *id_ptr;
119 if (!violates_never_null) {
120 mappings.
apply(id_ptr, id_remapper_options, id_self);
121 if (!skip_update_tagging) {
122 if (id_remap_data->
bmain !=
nullptr) {
126 if (id_self != id_owner) {
141 ID *new_id = violates_never_null ?
nullptr : *id_ptr;
143 if (!is_indirect && new_id) {
147 if (skip_user_refcount) {
161 if (new_id !=
nullptr && (force_user_refcount || (new_id->
tag &
ID_TAG_NO_MAIN) == 0)) {
194 BLI_assert(id_self == id_owner || is_self_embedded);
197 if (*id_p ==
nullptr) {
219 id_remapper.
add(*id_p,
nullptr);
229 *id_p, id_remapper_options, id_self);
231 if (
ELEM(expected_mapping_result,
236 "Cleanup should always do unassign.");
249 (expected_mapping_result ==
257 "In %s (lib %p): Remapping %s (%p) remap operation: %s "
258 "(is_indirect: %d, skip_indirect: %d, is_reference: %d, skip_reference: %d)\n",
280 if ((violates_never_null && skip_never_null) ||
281 (is_obj_editmode && (((
Object *)id_owner)->
data == *id_p) &&
283 (skip_indirect && is_indirect) || (is_reference && skip_reference))
303 violates_never_null);
316 if (ob->
pose ==
nullptr) {
346 switch (
GS(id_owner->
name)) {
364 const bool do_sync_collection)
370 if (do_sync_collection) {
374 if (old_ob ==
nullptr) {
376 ob =
static_cast<Object *
>(ob->id.next))
385 ob =
static_cast<Object *
>(ob->id.next))
402 if (new_collection ==
nullptr) {
421 if (ob->
data == new_id) {
422 switch (
GS(new_id->
name)) {
445 const int remap_flags = id_remap_data->
flag;
470 if (new_id !=
nullptr) {
525 printf(
"\tchecking id %s (%p, %p)\n",
id->name,
id,
id->lib);
560 id_remapper.
iter([&](
ID *old_id,
ID *new_id) {
567 if (old_id == new_id) {
590 const int skipped_refcounted = old_id->
runtime->remap.skipped_refcounted;
591 if (old_id->
us - skipped_refcounted < 0) {
593 "Error in remapping process from '%s' (%p) to '%s' (%p): "
594 "wrong user count in old ID after process (summing up to %d)",
597 new_id ? new_id->
name :
"<nullptr>",
599 old_id->
us - skipped_refcounted);
602 const int skipped_direct = old_id->
runtime->remap.skipped_direct;
603 if (skipped_direct == 0) {
614 switch (
GS(old_id->
name)) {
631 ob =
static_cast<Object *
>(ob->id.next))
664 mappings.
iter([&](
ID *old_id,
ID *new_id) {
696 ID *old_id =
static_cast<ID *
>(old_idv);
697 ID *new_id =
static_cast<ID *
>(new_idv);
698 remapper.
add(old_id, new_id);
748 bool is_object_update_processed =
false;
749 for (
ID *id_iter : ids) {
754 switch (
GS(id_iter->name)) {
763 ((
Scene *)id_iter)->master_collection;
764 switch (
GS(old_id->
name)) {
766 if (!is_object_update_processed) {
769 is_object_update_processed =
true;
782 if (new_id !=
nullptr) {
796 const int remap_flags)
800 for (
ID *id_iter : ids) {
804 if (bmain ==
nullptr) {
808 switch (remap_type) {
810 id_remapper.
iter([&](
ID *old_id,
ID *new_id) {
816 bool is_object_update_processed =
false;
817 for (
ID *id_iter : ids) {
818 switch (
GS(id_iter->name)) {
827 ((
Scene *)id_iter)->master_collection;
829 if (!is_object_update_processed) {
834 is_object_update_processed =
true;
837 bmain, owner_collection,
nullptr,
nullptr);
855 Main *bmain,
void *idv,
void *old_idv,
void *new_idv,
const int remap_flags)
860 ID *
id =
static_cast<ID *
>(idv);
861 ID *old_id =
static_cast<ID *
>(old_idv);
862 ID *new_id =
static_cast<ID *
>(new_idv);
871 if (old_id !=
nullptr) {
874 id_remapper.
add(old_id, new_id);
902 ID *
id = *id_pointer;
907 if (
id->newid !=
nullptr) {
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, bool dimension_update)
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)
LibraryForeachIDCallbackFlag
@ 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, LibraryForeachIDFlag flag)
uint64_t BKE_library_id_can_use_filter_id(const ID *owner_id, const bool include_ui, const IDTypeInfo *owner_id_type=nullptr)
@ IDWALK_DO_LIBRARY_POINTER
@ IDWALK_DO_INTERNAL_RUNTIME_POINTERS
@ IDWALK_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 blender::bke::id::IDRemapper &mappings) BKE_library_remap_editor_id_reference_cb
void(*)(const void *) BKE_library_free_notifier_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
#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_sync_length(Main *bmain, Object *ob, 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_relations_tag_update(Main *bmain)
#define ID_IS_LINKED(_id)
@ ID_REMAP_IS_LINKED_DIRECT
@ ID_REMAP_IS_USER_ONE_SKIPPED
@ ID_FLAG_INDIRECT_WEAK_LINK
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
BMesh const char void * data
unsigned long long int uint64_t
void append(const T &value)
constexpr const char * c_str() const
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
static StringRefNull result_to_string(const IDRemapperApplyResult result)
void iter(FunctionRef< void(ID *old_id, ID *new_id)> func) const
void add(ID *old_id, ID *new_id)
void never_null_users_add(ID *id)
bool contains_mappings_for_any(IDTypeFilter filter) const
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
BKE_library_remap_editor_id_reference_cb remap_editor_id_reference_cb
BKE_library_free_notifier_reference_cb free_notifier_reference_cb
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)
ID_RuntimeHandle * runtime
LibraryForeachIDCallbackFlag cb_flag
MainIDRelations * relations
blender::Vector< ID * > ids