51 id->properties =
nullptr;
54 if (id->override_library) {
56 id->override_library =
nullptr;
63 if (id->library_weak_reference !=
nullptr) {
74 if (idtype_info !=
nullptr) {
84static int id_free(
Main *bmain,
void *idv,
int flag,
const bool use_flag_from_idtag)
86 ID *
id =
static_cast<ID *
>(idv);
88 if (use_flag_from_idtag) {
93 flag &= ~LIB_ID_FREE_NO_MAIN;
100 flag &= ~LIB_ID_FREE_NO_USER_REFCOUNT;
107 flag &= ~LIB_ID_FREE_NOT_ALLOCATED;
115 const short type =
GS(id->name);
149 remapper.
add(
id,
nullptr);
184 const ID_Type id_type =
GS(
static_cast<ID *
>(idv)->name);
186 int flag_final =
id_free(bmain, idv, flag_orig, use_flag_from_idtag);
208 ID *
id =
static_cast<ID *
>(idv);
225 const bool is_lib =
GS(id->name) ==
ID_LI;
239 const int extra_remapping_flags)
241 bool has_deleted_library =
false;
265 bool keep_looping =
true;
266 while (keep_looping) {
267 keep_looping =
false;
273 for (
int i = 0; i < base_count; i++) {
279 if (ids_to_delete.
contains(id_iter) ||
284 ids_to_delete.
add(id_iter);
285 id_remapper.
add(id_iter,
nullptr);
294 if (shape_key && !ids_to_delete.
contains(&shape_key->
id)) {
297 ids_to_delete.
add(&shape_key->
id);
298 id_remapper.
add(&shape_key->
id,
nullptr);
315 ids_to_delete.
add(id_never_null_iter);
334 for (
ID *
id : ids_to_delete) {
341 if (!has_deleted_library &&
GS(id->name) ==
ID_LI) {
342 has_deleted_library =
true;
345 id_free(bmain,
id, free_flag,
false);
352 if (has_deleted_library) {
357 return size_t(ids_to_delete.
size());
362 ID *
id =
static_cast<ID *
>(idv);
366 id_delete(bmain, ids_to_delete, extra_remapping_flags);
380 ids_to_delete.
add(id_iter);
384 return id_delete(bmain, ids_to_delete, 0);
389 return id_delete(bmain, ids_to_delete, 0);
399# ifdef WITH_PYTHON_SAFETY
402 if (id->py_instance) {
void BKE_animdata_free(ID *id, bool do_id_user)
void BKE_asset_metadata_free(AssetMetaData **asset_data)
void IDP_FreePropertyContent_ex(IDProperty *prop, bool do_id_user)
const IDTypeInfo * BKE_idtype_get_info_from_id(const ID *id)
Key * BKE_key_from_id(ID *id)
void BKE_layer_collection_resync_forbid()
void BKE_main_collection_sync_remap(const Main *bmain)
void BKE_layer_collection_resync_allow()
void id_us_clear_real(ID *id)
@ LIB_ID_FREE_NOT_ALLOCATED
@ LIB_ID_FREE_NO_USER_REFCOUNT
@ LIB_ID_FREE_NO_NAMEMAP_REMOVE
void BKE_lib_override_library_free(IDOverrideLibrary **liboverride, bool do_id_user)
void BKE_libblock_remap_multiple_locked(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS
@ ID_REMAP_FORCE_NEVER_NULL_USAGE
@ ID_REMAP_STORE_NEVER_NULL_USAGE
void BKE_libblock_relink_multiple(Main *bmain, const blender::Span< ID * > ids, eIDRemapType remap_type, blender::bke::id::IDRemapper &id_remapper, int remap_flags)
void void void BKE_libblock_unlink(Main *bmain, void *idv, bool do_skip_indirect) ATTR_NONNULL()
void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(2)
void BKE_library_main_rebuild_hierarchy(Main *bmain)
#define FOREACH_MAIN_ID_END
ListBase * which_libbase(Main *bmain, short type)
#define FOREACH_MAIN_LISTBASE_ID_END
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
void BKE_main_lock(Main *bmain)
int set_listbasepointers(Main *bmain, ListBase *lb[])
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void BKE_main_unlock(Main *bmain)
void BKE_main_namemap_remove_name(Main *bmain, ID *id, const char *name) ATTR_NONNULL()
#define BLI_assert_msg(a, msg)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BPY_id_release(ID *id)
void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
void DEG_id_type_tag(Main *bmain, short id_type)
ID and Library types, which are fundamental for SDNA.
#define ID_FAKE_USERS(id)
#define ID_IS_LINKED(_id)
@ ID_TAG_NO_USER_REFCOUNT
Read Guarded memory(de)allocation.
bool contains(const Key &key) const
void add(ID *old_id, ID *new_id)
const Set< ID * > & never_null_users() const
void BKE_id_free_ex(Main *bmain, void *idv, const int flag_orig, const bool use_flag_from_idtag)
size_t BKE_id_multi_tagged_delete(Main *bmain)
void BKE_libblock_free_data_py(ID *id)
size_t BKE_id_multi_delete(Main *bmain, blender::Set< ID * > &ids_to_delete)
void BKE_id_free(Main *bmain, void *idv)
void BKE_libblock_free_data(ID *id, const bool do_id_user)
void BKE_id_delete_ex(Main *bmain, void *idv, const int extra_remapping_flags)
void BKE_id_free_us(Main *bmain, void *idv)
static int id_free(Main *bmain, void *idv, int flag, const bool use_flag_from_idtag)
void BKE_id_delete(Main *bmain, void *idv)
static size_t id_delete(Main *bmain, blender::Set< ID * > &ids_to_delete, const int extra_remapping_flags)
void BKE_libblock_free_datablock(ID *id, const int)
BKE_library_remap_editor_id_reference_cb remap_editor_id_reference_cb
BKE_library_free_notifier_reference_cb free_notifier_reference_cb
void MEM_freeN(void *vmemh)
IDTypeFreeDataFunction free_data
bool is_locked_for_linking
bool is_memfile_undo_written