96 const int cb_flag = cb_data->
cb_flag;
119 if (*id_p && (*id_p == old_id)) {
133 const bool is_obj_proxy = (is_obj &&
134 (((
Object *)id_owner)->proxy || ((
Object *)id_owner)->proxy_group));
143 "In %s (lib %p): Remapping %s (%p) to %s (%p) "
144 "(is_indirect: %d, skip_indirect: %d, is_reference: %d, skip_reference: %d)\n",
149 new_id ? new_id->
name :
"<NONE>",
165 if ((is_never_null && skip_never_null) ||
166 (is_obj_editmode && (((
Object *)id_owner)->
data == *id_p) && new_id !=
NULL) ||
167 (skip_indirect && is_indirect) || (is_reference && skip_reference)) {
179 else if (is_never_null || is_obj_editmode || is_reference) {
194 if (!is_never_null) {
199 if (id_self != id_owner) {
225 if (!is_indirect || is_obj_proxy) {
229 if (is_obj_proxy && new_id !=
NULL) {
245 ID *old_id = r_id_remap_data->
old_id;
254 if (ob->
pose && (!old_id || ob->
data == old_id)) {
277 if (new_ob ==
NULL) {
286 if (old_ob ==
NULL) {
310 if (new_collection ==
NULL) {
328 if (ob->
data == new_id) {
329 switch (
GS(new_id->
name)) {
374 Main *bmain,
ID *
id,
ID *old_id,
ID *new_id, const
short remap_flags,
IDRemap *r_id_remap_data)
384 if (r_id_remap_data ==
NULL) {
385 r_id_remap_data = &id_remap_data;
387 r_id_remap_data->
bmain = bmain;
388 r_id_remap_data->old_id = old_id;
389 r_id_remap_data->new_id = new_id;
390 r_id_remap_data->id_owner =
NULL;
391 r_id_remap_data->flag = remap_flags;
392 r_id_remap_data->status = 0;
393 r_id_remap_data->skipped_direct = 0;
394 r_id_remap_data->skipped_indirect = 0;
395 r_id_remap_data->skipped_refcounted = 0;
399 printf(
"\tchecking id %s (%p, %p)\n",
id->
name,
id,
id->
lib);
401 r_id_remap_data->id_owner =
id;
417 r_id_remap_data->id_owner = id_curr;
422 (
void *)r_id_remap_data,
449 printf(
"%s: %d occurrences skipped (%d direct and %d indirect ones)\n",
451 r_id_remap_data->skipped_direct + r_id_remap_data->skipped_indirect,
452 r_id_remap_data->skipped_direct,
453 r_id_remap_data->skipped_indirect);
464 ID *old_id = old_idv;
465 ID *new_id = new_idv;
466 int skipped_direct, skipped_refcounted;
498 if (old_id->
us - skipped_refcounted < 0) {
500 "Error in remapping process from '%s' (%p) to '%s' (%p): "
501 "wrong user count in old ID after process (summing up to %d)",
504 new_id ? new_id->
name :
"<NULL>",
506 old_id->
us - skipped_refcounted);
510 if (skipped_direct == 0) {
521 switch (
GS(old_id->
name)) {
575 const bool do_flag_never_null,
576 const bool do_skip_indirect)
606 Main *bmain,
void *idv,
void *old_idv,
void *new_idv,
const short remap_flags)
609 ID *old_id = old_idv;
610 ID *new_id = new_idv;
637 ((
Scene *)
id)->master_collection;
639 switch (
GS(old_id->
name)) {
673 const int cb_flag = cb_data->
cb_flag;
679 ID *
id = *id_pointer;
void BKE_pose_clear_pointers(struct bPose *pose)
void BKE_collections_child_remove_nulls(struct Main *bmain, struct Collection *parent_collection, struct Collection *child_collection)
void BKE_collections_object_remove_nulls(struct Main *bmain)
void BKE_main_collections_parent_relations_rebuild(struct Main *bmain)
void BKE_curve_type_test(struct Object *ob)
void BKE_main_collection_sync_remap(const struct Main *bmain)
void id_us_min(struct ID *id)
void id_fake_user_set(struct ID *id)
void id_us_ensure_real(struct ID *id)
void id_us_clear_real(struct ID *id)
void id_fake_user_clear(struct ID *id)
@ IDWALK_NO_INDIRECT_PROXY_DATA_USAGE
@ IDWALK_DO_INTERNAL_RUNTIME_POINTERS
void BKE_library_foreach_ID_link(struct Main *bmain, struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
@ IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE
@ IDWALK_CB_INDIRECT_USAGE
bool BKE_library_id_can_use_idtype(struct ID *id_owner, const short id_type_used)
void BKE_library_update_ID_link_user(struct ID *id_dst, struct ID *id_src, const int cb_flag)
void(* BKE_library_free_notifier_reference_cb)(const void *)
void(* BKE_library_remap_editor_id_reference_cb)(struct ID *, struct ID *)
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS
@ ID_REMAP_SKIP_OVERRIDE_LIBRARY
@ ID_REMAP_SKIP_NEVER_NULL_USAGE
@ ID_REMAP_FLAG_NEVER_NULL_USAGE
@ ID_REMAP_SKIP_INDIRECT_USAGE
@ ID_REMAP_FORCE_NEVER_NULL_USAGE
@ ID_REMAP_NO_INDIRECT_PROXY_DATA_USAGE
#define FOREACH_MAIN_ID_END
void BKE_main_unlock(struct Main *bmain)
void BKE_main_lock(struct Main *bmain)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
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_for(struct Object *ob1, struct Object *ob2)
bool BKE_mball_is_basis(struct Object *ob)
Test, if ob is a basis meta-ball.
void BKE_modifiers_test_object(struct Object *ob)
void multires_force_sculpt_rebuild(struct Object *object)
void ntreeUpdateAllUsers(struct Main *main, struct ID *id)
General operations, lookup, etc. for blender objects.
bool BKE_object_is_in_editmode(const struct Object *ob)
#define ATTR_NONNULL(...)
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_relations_tag_update(struct Main *bmain)
@ ID_RECALC_COPY_ON_WRITE
#define ID_IS_LINKED(_id)
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
static void libblock_remap_data_postprocess_collection_update(Main *bmain, Collection *owner_collection, Collection *UNUSED(old_collection), Collection *new_collection)
BKE_library_remap_editor_id_reference_cb remap_editor_id_reference_cb
static int id_relink_to_newid_looper(LibraryIDLinkCallbackData *cb_data)
void BKE_library_callback_remap_editor_id_reference_set(BKE_library_remap_editor_id_reference_cb func)
void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, const short remap_flags)
void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv, const short remap_flags)
void BKE_libblock_unlink(Main *bmain, void *idv, const bool do_flag_never_null, const bool do_skip_indirect)
@ ID_REMAP_IS_LINKED_DIRECT
@ ID_REMAP_IS_USER_ONE_SKIPPED
static void libblock_remap_data_postprocess_object_update(Main *bmain, Object *old_ob, Object *new_ob)
static void libblock_remap_data(Main *bmain, ID *id, ID *old_id, ID *new_id, const short remap_flags, IDRemap *r_id_remap_data)
void BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_reference_cb func)
static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data)
void BKE_libblock_relink_to_newid(ID *id)
static void libblock_remap_data_postprocess_obdata_relink(Main *bmain, Object *ob, ID *new_id)
void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, const short remap_flags)
BKE_library_free_notifier_reference_cb free_notifier_reference_cb
static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data)
static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new_id)
struct Object * proxy_from