Blender V4.5
lib_query.cc File Reference
#include <cstdlib>
#include "CLG_log.h"
#include "DNA_anim_types.h"
#include "BLI_function_ref.hh"
#include "BLI_ghash.h"
#include "BLI_linklist_stack.h"
#include "BLI_listbase.h"
#include "BLI_set.hh"
#include "BKE_anim_data.hh"
#include "BKE_idprop.hh"
#include "BKE_idtype.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_query.hh"
#include "BKE_main.hh"
#include "BKE_node.hh"

Go to the source code of this file.

Classes

struct  LibraryForeachIDData
struct  IDUsersIter
struct  UnusedIDsData

Macros

#define CALLBACK_INVOKE_ID(check_id, cb_flag)
#define CALLBACK_INVOKE(check_id_super, cb_flag)

Enumerations

enum  { IDWALK_STOP = 1 << 0 }

Functions

bool BKE_lib_query_foreachid_iter_stop (const LibraryForeachIDData *data)
void BKE_lib_query_foreachid_process (LibraryForeachIDData *data, ID **id_pp, LibraryForeachIDCallbackFlag cb_flag)
LibraryForeachIDFlag BKE_lib_query_foreachid_process_flags_get (const LibraryForeachIDData *data)
MainBKE_lib_query_foreachid_process_main_get (const LibraryForeachIDData *data)
int BKE_lib_query_foreachid_process_callback_flag_override (LibraryForeachIDData *data, const LibraryForeachIDCallbackFlag cb_flag, const bool do_replace)
static bool library_foreach_ID_link (Main *bmain, ID *owner_id, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, LibraryForeachIDFlag flag, LibraryForeachIDData *inherit_data)
void BKE_lib_query_idpropertiesForeachIDLink_callback (IDProperty *id_prop, void *user_data)
void BKE_library_foreach_ID_embedded (LibraryForeachIDData *data, ID **id_pp)
static void library_foreach_ID_data_cleanup (LibraryForeachIDData *data)
void BKE_library_foreach_ID_link (Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, const LibraryForeachIDFlag flag)
void BKE_library_update_ID_link_user (ID *id_dst, ID *id_src, const int cb_flag)
void BKE_library_foreach_subdata_id (Main *bmain, ID *owner_id, ID *self_id, blender::FunctionRef< void(LibraryForeachIDData *data)> subdata_foreach_id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, const LibraryForeachIDFlag flag)
uint64_t BKE_library_id_can_use_filter_id (const ID *owner_id, const bool include_ui, const IDTypeInfo *owner_id_type)
bool BKE_library_id_can_use_idtype (ID *owner_id, const short id_type_used)
static int foreach_libblock_id_users_callback (LibraryIDLinkCallbackData *cb_data)
int BKE_library_ID_use_ID (ID *id_user, ID *id_used)
static bool library_ID_is_used (Main *bmain, void *idv, const bool check_linked)
bool BKE_library_ID_is_locally_used (Main *bmain, void *idv)
bool BKE_library_ID_is_indirectly_used (Main *bmain, void *idv)
void BKE_library_ID_test_usages (Main *bmain, void *idv, bool *r_is_used_local, bool *r_is_used_linked)
static void lib_query_unused_ids_tag_id (ID *id, UnusedIDsData &data)
static void lib_query_unused_ids_untag_id (ID &id, UnusedIDsData &data)
static bool lib_query_unused_ids_has_exception_user (ID &id, UnusedIDsData &data)
static bool lib_query_unused_ids_tag_recurse (ID *id, UnusedIDsData &data)
static void lib_query_unused_ids_tag (UnusedIDsData &data)
void BKE_lib_query_unused_ids_amounts (Main *bmain, LibQueryUnusedIDsData &parameters)
void BKE_lib_query_unused_ids_tag (Main *bmain, const int tag, LibQueryUnusedIDsData &parameters)
static int foreach_libblock_used_linked_data_tag_clear_cb (LibraryIDLinkCallbackData *cb_data)
void BKE_library_unused_linked_data_set_tag (Main *bmain, const bool do_init_tag)
void BKE_library_indirectly_used_data_tag_clear (Main *bmain)

Variables

static CLG_LogRef LOG = {"bke.lib_query"}

Macro Definition Documentation

◆ CALLBACK_INVOKE

#define CALLBACK_INVOKE ( check_id_super,
cb_flag )
Value:
{ \
CHECK_TYPE(&((check_id_super)->id), ID *); \
BKE_lib_query_foreachid_process(&data, (ID **)&(check_id_super), (cb_flag)); \
library_foreach_ID_data_cleanup(&data); \
return false; \
} \
} \
((void)0)
bool BKE_lib_query_foreachid_iter_stop(const LibraryForeachIDData *data)
Definition lib_query.cc:73
BMesh const char void * data
Definition DNA_ID.h:404

Referenced by library_foreach_ID_link().

◆ CALLBACK_INVOKE_ID

#define CALLBACK_INVOKE_ID ( check_id,
cb_flag )
Value:
{ \
CHECK_TYPE_ANY((check_id), ID *, void *); \
BKE_lib_query_foreachid_process(&data, (ID **)&(check_id), (cb_flag)); \
library_foreach_ID_data_cleanup(&data); \
return false; \
} \
} \
((void)0)

Referenced by library_foreach_ID_link().

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
IDWALK_STOP 

Definition at line 32 of file lib_query.cc.

Function Documentation

◆ BKE_lib_query_foreachid_iter_stop()

bool BKE_lib_query_foreachid_iter_stop ( const LibraryForeachIDData * data)

Check whether current iteration over ID usages should be stopped or not.

Returns
true if the iteration should be stopped, false otherwise.

Definition at line 73 of file lib_query.cc.

References data, and IDWALK_STOP.

Referenced by BKE_lib_query_foreachid_process(), BKE_library_foreach_ID_embedded(), library_foreach_ID_link(), and window_manager_foreach_id().

◆ BKE_lib_query_foreachid_process()

◆ BKE_lib_query_foreachid_process_callback_flag_override()

int BKE_lib_query_foreachid_process_callback_flag_override ( LibraryForeachIDData * data,
const LibraryForeachIDCallbackFlag cb_flag,
const bool do_replace )

Definition at line 139 of file lib_query.cc.

References data.

◆ BKE_lib_query_foreachid_process_flags_get()

◆ BKE_lib_query_foreachid_process_main_get()

Main * BKE_lib_query_foreachid_process_main_get ( const LibraryForeachIDData * data)

Definition at line 134 of file lib_query.cc.

References data.

Referenced by blender::bke::action_foreach_id().

◆ BKE_lib_query_idpropertiesForeachIDLink_callback()

◆ BKE_lib_query_unused_ids_amounts()

◆ BKE_lib_query_unused_ids_tag()

◆ BKE_library_foreach_ID_embedded()

void BKE_library_foreach_ID_embedded ( LibraryForeachIDData * data,
ID ** id_pp )

Process embedded ID pointers (root node-trees, master collections, ...).

Those require specific care, since they are technically sub-data of their owner, yet in some cases they still behave as regular IDs.

Definition at line 172 of file lib_query.cc.

References BKE_lib_query_foreachid_iter_stop(), BKE_lib_query_foreachid_process(), BLI_assert, BLI_gset_add(), BLI_LINKSTACK_PUSH, data, flag, IDWALK_CB_EMBEDDED, IDWALK_IGNORE_EMBEDDED_ID, IDWALK_RECURSE, IDWALK_STOP, and library_foreach_ID_link().

Referenced by light_foreach_id(), linestyle_foreach_id(), material_foreach_id(), scene_foreach_id(), texture_foreach_id(), and world_foreach_id().

◆ BKE_library_foreach_ID_link()

void BKE_library_foreach_ID_link ( Main * bmain,
ID * id,
blender::FunctionRef< LibraryIDLinkCallback > callback,
void * user_data,
LibraryForeachIDFlag flag )

Loop over all of the ID's this data-block links to.

Parameters
bmainThe Main data-base containing owner_id, may be null.
idThe ID to process. Note that currently, embedded IDs may also be passed here.
callbackThe callback processing a given ID usage (i.e. a given ID pointer within the given id data).
user_dataOpaque user data for the callback processing a given ID usage.
flagFlags controlling how/which ID pointers are processed.

Definition at line 431 of file lib_query.cc.

References flag, and library_foreach_ID_link().

Referenced by BKE_blendfile_link_append_instantiate_loose(), BKE_brush_duplicate(), BKE_id_copy_for_use_in_bmain(), BKE_id_copy_in_lib(), BKE_lib_id_clear_library_data(), BKE_lib_id_expand_local(), BKE_lib_override_library_is_hierarchy_leaf(), BKE_libblock_management_main_add(), BKE_libblock_management_usercounts_clear(), BKE_libblock_management_usercounts_set(), BKE_library_ID_test_usages(), BKE_library_ID_use_ID(), BKE_library_indirectly_used_data_tag_clear(), BKE_library_unused_linked_data_set_tag(), BKE_main_id_refcount_recompute(), BKE_main_relations_create(), BKE_mesh_new_from_object_to_bmain(), blendfile_append_define_actions(), BLO_expand_main(), bpy_user_map(), blender::deg::deg_validate_eval_copy_datablock(), blender::nodes::geo_eval_log::GeoTreeLog::ensure_node_warnings(), foreach_libblock_link_append_common_processing(), gather_frames_to_render(), blender::bke::blendfile::PartialWriteContext::id_add(), blender::bke::blendfile::PartialWriteContext::is_valid(), lib_link_all(), lib_override_libraries_index_define(), libblock_relink_to_newid_prepare_data(), libblock_remap_data(), library_ID_is_used(), memfile_undosys_step_decode(), paste_material_exec(), previews_ensure_exec(), read_undo_remap_noundo_data(), reuse_bmain_data_invalid_local_usages_fix(), reuse_editable_asset_bmain_data_for_blendfile(), blender::ed::vse::sequencer_write_copy_paste_file(), swap_old_bmain_data_dependencies_process(), blender::ed::object::tag_localizable_objects(), blender::bke::tests::TEST_F(), blender::bke::tests::TEST_F(), blender::deg::DepsgraphNodeBuilder::update_invalid_cow_pointers(), and write_file_handle().

◆ BKE_library_foreach_subdata_id()

void BKE_library_foreach_subdata_id ( Main * bmain,
ID * owner_id,
ID * self_id,
blender::FunctionRef< void(LibraryForeachIDData *data)> subdata_foreach_id,
blender::FunctionRef< LibraryIDLinkCallback > callback,
void * user_data,
const LibraryForeachIDFlag flag )

Apply callback to all ID usages of the data as defined by subdata_foreach_id. Useful to e.g. process all ID usages of a node, or a modifier, and so on.

Note
This function is fully unaware of which data is actually processed. The given subdata_foreach_id callback is responsible to decide which data to process, and to call the relevant 'foreach_id' helpers (typically shared with the relevant IDTypeInfo::foreach_id code path). This is typically done by using a lambda as subdata_foreach_id, which captures the required extra parameters do process the target subdata.
main, owner_id and self_id may be null. There is also no requirement for owner_id or self_id to be actual owner IDs of the processed subdata. This function merely initializes a LibraryForeachIDData object with given parameters, and wraps a call to given subdata_foreach_id.
Parameters
bmainThe Main data-base containing owner_id, may be null.
owner_idThe owner ID, i.e. the data-block owning the given sub-data (may differ from self_id in case the later is an embedded ID).
self_idTypically the same as owner_id, unless it is an embedded ID.
subdata_foreach_idThe callback handling which data to process, and iterating over all ID usages of this subdata. Typically a lambda capturing that subdata, see comments above for details.
callbackThe callback processing a given ID usage, see BKE_library_foreach_ID_link.
user_dataOpaque user data for the callback processing a given ID usage, see BKE_library_foreach_ID_link.
flagFlags controlling the process, see BKE_library_foreach_ID_link. Note that some flags are not accepted here (IDWALK_RECURSE, IDWALK_DO_INTERNAL_RUNTIME_POINTERS, IDWALK_DO_LIBRARY_POINTER, IDWALK_INCLUDE_UI).

Definition at line 451 of file lib_query.cc.

References BLI_assert, data, flag, IDWALK_DO_INTERNAL_RUNTIME_POINTERS, IDWALK_DO_LIBRARY_POINTER, IDWALK_INCLUDE_UI, and IDWALK_RECURSE.

Referenced by blender::ed::space_node::NodeClipboard::copy_add_node(), blender::ed::space_node::NodeClipboard::paste_update_node_id_references(), blender::ed::space_node::NodeClipboard::paste_validate_id_references(), and blender::bke::tests::TEST_F().

◆ BKE_library_id_can_use_filter_id()

uint64_t BKE_library_id_can_use_filter_id ( const ID * owner_id,
const bool include_ui,
const IDTypeInfo * owner_id_type = nullptr )

◆ BKE_library_id_can_use_idtype()

bool BKE_library_id_can_use_idtype ( ID * owner_id,
short id_type_used )

Say whether given owner_id may use (in any way) a data-block of id_type_used.

This is a 'simplified' abstract version of BKE_library_foreach_ID_link() above, quite useful to reduce useless iterations in some cases.

Definition at line 517 of file lib_query.cc.

References BKE_idtype_get_info_from_id(), BKE_idtype_idcode_to_idfilter(), and BKE_library_id_can_use_filter_id().

Referenced by BKE_library_ID_test_usages(), and library_ID_is_used().

◆ BKE_library_ID_is_indirectly_used()

◆ BKE_library_ID_is_locally_used()

bool BKE_library_ID_is_locally_used ( Main * bmain,
void * idv )

Check whether given ID is used locally (i.e. by another non-linked ID).

Definition at line 623 of file lib_query.cc.

References library_ID_is_used().

◆ BKE_library_ID_test_usages()

◆ BKE_library_ID_use_ID()

int BKE_library_ID_use_ID ( ID * id_user,
ID * id_used )

Return the number of times given id_user uses/references id_used.

Note
This only checks for pointer references of an ID, shallow usages (like e.g. by RNA paths, as done for FCurves) are not detected at all.
Parameters
id_userthe ID which is supposed to use (reference) id_used.
id_usedthe ID which is supposed to be used (referenced) by id_user.
Returns
the number of direct usages/references of id_used by id_user.

Definition at line 575 of file lib_query.cc.

References BKE_library_foreach_ID_link(), IDUsersIter::count_direct, IDUsersIter::count_indirect, IDUsersIter::curr_id, foreach_libblock_id_users_callback(), IDUsersIter::id, and IDWALK_READONLY.

◆ BKE_library_indirectly_used_data_tag_clear()

void BKE_library_indirectly_used_data_tag_clear ( Main * bmain)

Untag linked data blocks used by other untagged linked data-blocks. Used to detect data-blocks that we can forcefully make local (instead of copying them to later get rid of original): All data-blocks we want to make local are tagged by caller, after this function has ran caller knows data-blocks still tagged can directly be made local, since they are only used by other data-blocks that will also be made fully local.

Definition at line 1142 of file lib_query.cc.

References BKE_library_foreach_ID_link(), BKE_main_lists_get(), foreach_libblock_used_linked_data_tag_clear_cb(), i, ID_IS_LINKED, ID_TAG_DOIT, IDWALK_READONLY, and LISTBASE_FOREACH.

◆ BKE_library_unused_linked_data_set_tag()

void BKE_library_unused_linked_data_set_tag ( Main * bmain,
bool do_init_tag )

Compute amount of unused IDs (a.k.a 'orphaned').

By default only consider IDs with 0 user count. If do_recursive is set, it will check dependencies to detect all IDs that are not actually used in current file, including 'archipelagos` (i.e. set of IDs referencing each other in loops, but without any 'external' valid usages.

Valid usages here are defined as ref-counting usages, which are not towards embedded or loop-back data.

Parameters
r_num_totalA zero-initialized array of INDEX_ID_MAX integers. Number of IDs detected as unused from given parameters, per ID type in the matching index, and as total in INDEX_ID_NULL item.
r_num_localA zero-initialized array of INDEX_ID_MAX integers. Number of local IDs detected as unused from given parameters (but assuming do_local_ids is true), per ID type in the matching index, and as total in INDEX_ID_NULL item.
r_num_linkedA zero-initialized array of INDEX_ID_MAX integers. Number of linked IDs detected as unused from given parameters (but assuming do_linked_ids is true), per ID type in the matching index, and as total in INDEX_ID_NULL item. */ void BKE_lib_query_unused_ids_amounts(Main *bmain, LibQueryUnusedIDsData &parameters); /** Tag all unused IDs (a.k.a 'orphaned').

By default only tag IDs with 0 user count. If do_recursive is set, it will check dependencies to detect all IDs that are not actually used in current file, including 'archipelagos` (i.e. set of IDs referencing each other in loops, but without any 'external' valid usages.

Valid usages here are defined as ref-counting usages, which are not towards embedded or loop-back data.

Parameters
tagthe ID tag to use to mark the ID as unused. Should never be 0.
r_num_tagged_totalA zero-initialized array of INDEX_ID_MAX integers. Number of IDs tagged as unused from given parameters, per ID type in the matching index, and as total in INDEX_ID_NULL item. */ void BKE_lib_query_unused_ids_tag(Main *bmain, int tag, LibQueryUnusedIDsData &parameters);

/** Detect orphaned linked data blocks (i.e. linked data not used (directly or indirectly) in any way by any local data), including complex cases like "linked archipelagos", i.e. linked data-blocks that use each other in loops, which prevents their deletion by 'basic' usage checks.

Parameters
do_init_tagif true, all linked data are checked, if false, only linked data-blocks already tagged with ID_TAG_DOIT are checked.

Definition at line 1113 of file lib_query.cc.

References BKE_library_foreach_ID_link(), foreach_libblock_used_linked_data_tag_clear_cb(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, ID_TAG_DOIT, ID_TAG_INDIRECT, IDWALK_READONLY, ID::lib, and ID::tag.

◆ BKE_library_update_ID_link_user()

void BKE_library_update_ID_link_user ( ID * id_dst,
ID * id_src,
int cb_flag )

Re-usable function, use when replacing ID's.

Definition at line 440 of file lib_query.cc.

References id_us_ensure_real(), id_us_min(), id_us_plus(), IDWALK_CB_USER, and IDWALK_CB_USER_ONE.

◆ foreach_libblock_id_users_callback()

◆ foreach_libblock_used_linked_data_tag_clear_cb()

◆ lib_query_unused_ids_has_exception_user()

bool lib_query_unused_ids_has_exception_user ( ID & id,
UnusedIDsData & data )
static

Certain corner-cases require to consider an ID as used, even if there are no 'real' reference-counting usages of these.

Definition at line 773 of file lib_query.cc.

References BLI_ghash_lookup(), data, MainIDRelationsEntry::from_ids, GS, ID_IM, ID_IS_LINKED, ID_OB, IMA_SRC_VIEWER, MainIDRelationsEntryItem::next, and Image::source.

Referenced by lib_query_unused_ids_tag(), and lib_query_unused_ids_tag_recurse().

◆ lib_query_unused_ids_tag()

◆ lib_query_unused_ids_tag_id()

void lib_query_unused_ids_tag_id ( ID * id,
UnusedIDsData & data )
static

◆ lib_query_unused_ids_tag_recurse()

◆ lib_query_unused_ids_untag_id()

void lib_query_unused_ids_untag_id ( ID & id,
UnusedIDsData & data )
static

Definition at line 749 of file lib_query.cc.

References BKE_idtype_idcode_to_index(), BLI_assert, data, GS, ID_IS_LINKED, and INDEX_ID_NULL.

Referenced by lib_query_unused_ids_tag().

◆ library_foreach_ID_data_cleanup()

void library_foreach_ID_data_cleanup ( LibraryForeachIDData * data)
static

Definition at line 208 of file lib_query.cc.

References BLI_gset_free(), BLI_LINKSTACK_FREE, and data.

Referenced by library_foreach_ID_link().

◆ library_foreach_ID_link()

bool library_foreach_ID_link ( Main * bmain,
ID * owner_id,
ID * id,
blender::FunctionRef< LibraryIDLinkCallback > callback,
void * user_data,
LibraryForeachIDFlag flag,
LibraryForeachIDData * inherit_data )
static
Returns
false in case iteration over ID pointers must be stopped, true otherwise.

Definition at line 217 of file lib_query.cc.

References BKE_animdata_foreach_id(), BKE_animdata_from_id(), BKE_id_owner_get(), BKE_idtype_get_info_from_id(), BKE_lib_query_foreachid_iter_stop(), BKE_lib_query_foreachid_process(), BLI_assert, BLI_ghash_lookup(), BLI_ghashutil_ptrcmp(), BLI_ghashutil_ptrhash(), BLI_gset_add(), BLI_gset_new(), BLI_LINKSTACK_INIT, BLI_LINKSTACK_POP, LibraryForeachIDData::bmain, CALLBACK_INVOKE, CALLBACK_INVOKE_ID, LibraryForeachIDData::cb_flag, LibraryForeachIDData::cb_flag_clear, data, ELEM, flag, ID::flag, MainIDRelations::flag, IDTypeInfo::foreach_id, IDOverrideLibrary::hierarchy_root, ID_FLAG_EMBEDDED_DATA, ID_IS_LINKED, ID_TAG_NO_USER_REFCOUNT, IDP_foreach_property(), IDP_TYPE_FILTER_ID, IDWALK_CB_DIRECT_WEAK_LINK, IDWALK_CB_INDIRECT_USAGE, IDWALK_CB_INTERNAL, IDWALK_CB_LOOPBACK, IDWALK_CB_NEVER_SELF, IDWALK_CB_NOP, IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE, IDWALK_CB_USER, IDWALK_CB_USER_ONE, IDWALK_DO_DEPRECATED_POINTERS, IDWALK_DO_INTERNAL_RUNTIME_POINTERS, IDWALK_DO_LIBRARY_POINTER, IDWALK_IGNORE_MISSING_OWNER_ID, IDWALK_INCLUDE_UI, IDWALK_NO_ORIG_POINTERS_ACCESS, IDWALK_READONLY, IDWALK_RECURSE, ID::lib, library_foreach_ID_data_cleanup(), LISTBASE_FOREACH, MAINIDRELATIONS_INCLUDE_UI, ID::newid, MainIDRelationsEntryItem::next, ID::orig_id, ID::override_library, ID::properties, IDOverrideLibrary::properties, IDOverrideLibrary::reference, Main::relations, MainIDRelations::relations_from_pointers, ID::system_properties, and MainIDRelationsEntry::to_ids.

Referenced by BKE_library_foreach_ID_embedded(), and BKE_library_foreach_ID_link().

◆ library_ID_is_used()

Variable Documentation

◆ LOG

CLG_LogRef LOG = {"bke.lib_query"}
static

Definition at line 29 of file lib_query.cc.