Blender  V3.3
Classes | Macros | Functions | Variables
lib_override.cc File Reference
#include <cstdlib>
#include <cstring>
#include "CLG_log.h"
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_collection_types.h"
#include "DNA_key_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
#include "BKE_anim_data.h"
#include "BKE_armature.h"
#include "BKE_collection.h"
#include "BKE_fcurve.h"
#include "BKE_global.h"
#include "BKE_idtype.h"
#include "BKE_key.h"
#include "BKE_layer.h"
#include "BKE_lib_id.h"
#include "BKE_lib_override.h"
#include "BKE_lib_query.h"
#include "BKE_lib_remap.h"
#include "BKE_main.h"
#include "BKE_main_namemap.h"
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BLO_readfile.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_memarena.h"
#include "BLI_string.h"
#include "BLI_task.h"
#include "BLI_utildefines.h"
#include "PIL_time.h"
#include "RNA_access.h"
#include "RNA_path.h"
#include "RNA_prototypes.h"
#include "RNA_types.h"
#include "atomic_ops.h"

Go to the source code of this file.

Classes

struct  LibOverrideGroupTagData
 
struct  LibOverrideOpCreateData
 

Macros

#define OVERRIDE_AUTO_CHECK_DELAY   0.2 /* 200ms between auto-override checks. */
 
#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME   "OVERRIDE_RESYNC_LEFTOVERS"
 

Functions

static void lib_override_library_property_copy (IDOverrideLibraryProperty *op_dst, IDOverrideLibraryProperty *op_src)
 
static void lib_override_library_property_operation_copy (IDOverrideLibraryPropertyOperation *opop_dst, IDOverrideLibraryPropertyOperation *opop_src)
 
static void lib_override_library_property_clear (IDOverrideLibraryProperty *op)
 
static void lib_override_library_property_operation_clear (IDOverrideLibraryPropertyOperation *opop)
 
BLI_INLINE void lib_override_object_posemode_transfer (ID *id_dst, ID *id_src)
 
BLI_INLINE const IDOverrideLibraryBKE_lib_override_library_get (const Main *bmain, const ID *id, const ID *owner_id_hint, const ID **r_owner_id)
 
IDOverrideLibraryBKE_lib_override_library_get (Main *bmain, ID *id, ID *owner_id_hint, ID **r_owner_id)
 
IDOverrideLibraryBKE_lib_override_library_init (ID *local_id, ID *reference_id)
 
void BKE_lib_override_library_copy (ID *dst_id, const ID *src_id, const bool do_full_copy)
 
void BKE_lib_override_library_clear (IDOverrideLibrary *override, const bool do_id_user)
 
void BKE_lib_override_library_free (IDOverrideLibrary **override, const bool do_id_user)
 
static IDlib_override_library_create_from (Main *bmain, Library *owner_library, ID *reference_id, const int lib_id_copy_flags)
 
bool BKE_lib_override_library_is_user_edited (const ID *id)
 
bool BKE_lib_override_library_is_system_defined (const Main *bmain, const ID *id)
 
bool BKE_lib_override_library_property_is_animated (const ID *id, const IDOverrideLibraryProperty *override_prop, const PropertyRNA *override_rna_prop, const int rnaprop_index)
 
static int foreachid_is_hierarchy_leaf_fn (LibraryIDLinkCallbackData *cb_data)
 
bool BKE_lib_override_library_is_hierarchy_leaf (Main *bmain, ID *id)
 
IDBKE_lib_override_library_create_from_id (Main *bmain, ID *reference_id, const bool do_tagged_remap)
 
static void lib_override_prefill_newid_from_existing_overrides (Main *bmain, ID *id_hierarchy_root)
 
static void lib_override_remapper_overrides_add (IDRemapper *id_remapper, ID *reference_id, ID *local_id)
 
bool BKE_lib_override_library_create_from_tag (Main *bmain, Library *owner_library, const ID *id_root_reference, ID *id_hierarchy_root, const ID *id_hierarchy_root_reference, const bool do_no_main, const bool do_fully_editable)
 
static void lib_override_group_tag_data_object_to_collection_init_collection_process (LibOverrideGroupTagData *data, Collection *collection)
 
static void lib_override_group_tag_data_object_to_collection_init (LibOverrideGroupTagData *data)
 
static void lib_override_group_tag_data_clear (LibOverrideGroupTagData *data)
 
static void lib_override_hierarchy_dependencies_recursive_tag_from (LibOverrideGroupTagData *data)
 
static bool lib_override_hierarchy_dependencies_recursive_tag (LibOverrideGroupTagData *data)
 
static void lib_override_linked_group_tag_recursive (LibOverrideGroupTagData *data)
 
static bool lib_override_linked_group_tag_collections_keep_tagged_check_recursive (LibOverrideGroupTagData *data, Collection *collection)
 
static void lib_override_linked_group_tag_clear_boneshapes_objects (LibOverrideGroupTagData *data)
 
static void lib_override_linked_group_tag (LibOverrideGroupTagData *data)
 
static void lib_override_overrides_group_tag_recursive (LibOverrideGroupTagData *data)
 
static void lib_override_overrides_group_tag (LibOverrideGroupTagData *data)
 
static bool lib_override_library_create_do (Main *bmain, Scene *scene, Library *owner_library, ID *id_root_reference, ID *id_hierarchy_root_reference, const bool do_fully_editable)
 
static void lib_override_library_create_post_process (Main *bmain, Scene *scene, ViewLayer *view_layer, const Library *owner_library, ID *id_root, ID *id_instance_hint, Collection *residual_storage, const Object *old_active_object, const bool is_resync)
 
bool BKE_lib_override_library_create (Main *bmain, Scene *scene, ViewLayer *view_layer, Library *owner_library, ID *id_root_reference, ID *id_hierarchy_root_reference, ID *id_instance_hint, ID **r_id_root_override, const bool do_fully_editable)
 
bool BKE_lib_override_library_template_create (ID *id)
 
static IDlib_override_root_find (Main *bmain, ID *id, const int curr_level, int *r_best_level)
 
static void lib_override_root_hierarchy_set (Main *bmain, ID *id_root, ID *id, ID *id_from)
 
void BKE_lib_override_library_main_hierarchy_root_ensure (Main *bmain)
 
static void lib_override_library_remap (Main *bmain, const ID *id_root_reference, GHash *linkedref_to_old_override)
 
static bool lib_override_library_resync (Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, LinkNode *id_resync_roots, ListBase *no_main_ids_list, Collection *override_resync_residual_storage, const bool do_hierarchy_enforce, const bool do_post_process, BlendFileReadReport *reports)
 
bool BKE_lib_override_library_resync (Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, Collection *override_resync_residual_storage, const bool do_hierarchy_enforce, BlendFileReadReport *reports)
 
static bool lib_override_resync_id_lib_level_is_valid (ID *id, const int library_indirect_level, const bool do_strict_equal)
 
static IDlib_override_library_main_resync_root_get (Main *bmain, ID *id)
 
static bool lib_override_resync_tagging_finalize_recurse (Main *bmain, ID *id, GHash *id_roots, const int library_indirect_level, const bool check_only)
 
static void lib_override_library_main_resync_on_library_indirect_level (Main *bmain, Scene *scene, ViewLayer *view_layer, Collection *override_resync_residual_storage, const int library_indirect_level, BlendFileReadReport *reports)
 
static int lib_override_sort_libraries_func (LibraryIDLinkCallbackData *cb_data)
 
static int lib_override_libraries_index_define (Main *bmain)
 
void BKE_lib_override_library_main_resync (Main *bmain, Scene *scene, ViewLayer *view_layer, BlendFileReadReport *reports)
 
void BKE_lib_override_library_delete (Main *bmain, ID *id_root)
 
void BKE_lib_override_library_make_local (ID *id)
 
BLI_INLINE IDOverrideLibraryRuntimeoverride_library_rna_path_runtime_ensure (IDOverrideLibrary *override)
 
BLI_INLINE GHashoverride_library_rna_path_mapping_ensure (IDOverrideLibrary *override)
 
IDOverrideLibraryPropertyBKE_lib_override_library_property_find (IDOverrideLibrary *override, const char *rna_path)
 
IDOverrideLibraryPropertyBKE_lib_override_library_property_get (IDOverrideLibrary *override, const char *rna_path, bool *r_created)
 
bool BKE_lib_override_rna_property_find (PointerRNA *idpoin, const IDOverrideLibraryProperty *library_prop, PointerRNA *r_override_poin, PropertyRNA **r_override_prop, int *r_index)
 
void BKE_lib_override_library_property_delete (IDOverrideLibrary *override, IDOverrideLibraryProperty *override_property)
 
IDOverrideLibraryPropertyOperationBKE_lib_override_library_property_operation_find (IDOverrideLibraryProperty *override_property, const char *subitem_refname, const char *subitem_locname, const int subitem_refindex, const int subitem_locindex, const bool strict, bool *r_strict)
 
IDOverrideLibraryPropertyOperationBKE_lib_override_library_property_operation_get (IDOverrideLibraryProperty *override_property, const short operation, const char *subitem_refname, const char *subitem_locname, const int subitem_refindex, const int subitem_locindex, const bool strict, bool *r_strict, bool *r_created)
 
void BKE_lib_override_library_property_operation_delete (IDOverrideLibraryProperty *override_property, IDOverrideLibraryPropertyOperation *override_property_operation)
 
bool BKE_lib_override_library_property_operation_operands_validate (IDOverrideLibraryPropertyOperation *override_property_operation, PointerRNA *ptr_dst, PointerRNA *ptr_src, PointerRNA *ptr_storage, PropertyRNA *prop_dst, PropertyRNA *prop_src, PropertyRNA *prop_storage)
 
void BKE_lib_override_library_validate (Main *bmain, ID *id, ReportList *reports)
 
void BKE_lib_override_library_main_validate (Main *bmain, ReportList *reports)
 
bool BKE_lib_override_library_status_check_local (Main *bmain, ID *local)
 
bool BKE_lib_override_library_status_check_reference (Main *bmain, ID *local)
 
bool BKE_lib_override_library_operations_create (Main *bmain, ID *local)
 
static void lib_override_library_operations_create_cb (TaskPool *__restrict pool, void *taskdata)
 
bool BKE_lib_override_library_main_operations_create (Main *bmain, const bool force_auto)
 
static bool lib_override_library_id_reset_do (Main *bmain, ID *id_root, const bool do_reset_system_override)
 
void BKE_lib_override_library_id_reset (Main *bmain, ID *id_root, const bool do_reset_system_override)
 
static void lib_override_library_id_hierarchy_recursive_reset (Main *bmain, ID *id_root, const bool do_reset_system_override)
 
void BKE_lib_override_library_id_hierarchy_reset (Main *bmain, ID *id_root, const bool do_reset_system_override)
 
void BKE_lib_override_library_operations_tag (IDOverrideLibraryProperty *override_property, const short tag, const bool do_set)
 
void BKE_lib_override_library_properties_tag (IDOverrideLibrary *override, const short tag, const bool do_set)
 
void BKE_lib_override_library_main_tag (Main *bmain, const short tag, const bool do_set)
 
void BKE_lib_override_library_id_unused_cleanup (ID *local)
 
void BKE_lib_override_library_main_unused_cleanup (Main *bmain)
 
static void lib_override_id_swap (Main *bmain, ID *id_local, ID *id_temp)
 
void BKE_lib_override_library_update (Main *bmain, ID *local)
 
void BKE_lib_override_library_main_update (Main *bmain)
 
bool BKE_lib_override_library_id_is_user_deletable (Main *bmain, ID *id)
 
OverrideLibraryStorageBKE_lib_override_library_operations_store_init (void)
 
IDBKE_lib_override_library_operations_store_start (Main *bmain, OverrideLibraryStorage *override_storage, ID *local)
 
void BKE_lib_override_library_operations_store_end (OverrideLibraryStorage *UNUSED(override_storage), ID *local)
 
void BKE_lib_override_library_operations_store_finalize (OverrideLibraryStorage *override_storage)
 

Variables

static CLG_LogRef LOG = {"bke.liboverride"}
 

Macro Definition Documentation

◆ OVERRIDE_AUTO_CHECK_DELAY

#define OVERRIDE_AUTO_CHECK_DELAY   0.2 /* 200ms between auto-override checks. */

Definition at line 61 of file lib_override.cc.

◆ OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME

#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME   "OVERRIDE_RESYNC_LEFTOVERS"

Function Documentation

◆ BKE_lib_override_library_clear()

void BKE_lib_override_library_clear ( struct IDOverrideLibrary override,
bool  do_id_user 
)

◆ BKE_lib_override_library_copy()

void BKE_lib_override_library_copy ( ID dst_id,
const ID src_id,
const bool  do_full_copy 
)

◆ BKE_lib_override_library_create()

bool BKE_lib_override_library_create ( struct Main bmain,
struct Scene scene,
struct ViewLayer view_layer,
struct Library owner_library,
struct ID id_root_reference,
struct ID id_hierarchy_root_reference,
struct ID id_instance_hint,
struct ID **  r_id_root_override,
const bool  do_fully_editable 
)

Advanced 'smart' function to create fully functional overrides.

Note
Currently it only does special things if given id_root is an object or collection, more specific behaviors may be added in the future for other ID types.
It will override all IDs tagged with LIB_TAG_DOIT, and it does not clear that tag at its beginning, so caller code can add extra data-blocks to be overridden as well.
Parameters
view_layerthe active view layer to search instantiated collections in, can be NULL (in which case scene's master collection children hierarchy is used instead).
owner_librarythe library in which the overrides should be created. Besides versioning and resync code path, this should always be NULL (i.e. the local .blend file).
id_root_referenceThe linked root ID to create an override from. May be a sub-root of the overall hierarchy, in which case calling code is expected to have already tagged required 'path' of IDs leading from the given id_hierarchy_root to the given id_root.
id_hierarchy_root_referenceThe ID to be used a hierarchy root of the overrides to be created. Can be either the linked root ID of the whole override hierarchy, (typically the same as id_root, unless a sub-part only of the hierarchy is overridden), or the already existing override hierarchy root if part of the hierarchy is already overridden.
id_instance_hintSome ID used as hint/reference to do some post-processing after overrides have been created, may be NULL. Typically, the Empty object instantiating the linked collection we override, currently.
r_id_root_overrideif not NULL, the override generated for the given id_root.
do_fully_editableif true, tag all created overrides as user-editable by default.
Returns
true if override was successfully created.

Definition at line 1371 of file lib_override.cc.

References BKE_lib_override_library_main_operations_create(), BKE_main_id_newptr_and_tag_clear(), BKE_main_id_tag_all(), lib_override_library_create_do(), lib_override_library_create_post_process(), LIB_TAG_DOIT, ID::newid, OBACT, and scene.

Referenced by BKE_lib_override_library_proxy_convert(), id_override_library_create_hierarchy(), make_override_library_exec(), and ui_template_id_liboverride_hierarchy_make().

◆ BKE_lib_override_library_create_from_id()

ID* BKE_lib_override_library_create_from_id ( struct Main bmain,
struct ID reference_id,
bool  do_tagged_remap 
)

Create an overridden local copy of linked reference.

Note
This function is very basic, low-level. It does not consider any hierarchical dependency, and also prevents any automatic re-sync of this local override.

Definition at line 393 of file lib_override.cc.

References BKE_key_from_id(), BKE_libblock_relink_ex(), BLI_assert, IDOverrideLibrary::flag, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, IDOverrideLibrary::hierarchy_root, Key::id, ID_IS_LINKED, ID_REMAP_SKIP_INDIRECT_USAGE, ID_REMAP_SKIP_OVERRIDE_LIBRARY, IDOVERRIDE_LIBRARY_FLAG_NO_HIERARCHY, IDOVERRIDE_LIBRARY_FLAG_SYSTEM_DEFINED, lib_override_library_create_from(), LIB_TAG_DOIT, ID::override_library, and ID::tag.

Referenced by id_override_library_create_hierarchy().

◆ BKE_lib_override_library_create_from_tag()

bool BKE_lib_override_library_create_from_tag ( Main bmain,
Library owner_library,
const ID id_root_reference,
ID id_hierarchy_root,
const ID id_hierarchy_root_reference,
const bool  do_no_main,
const bool  do_fully_editable 
)

◆ BKE_lib_override_library_delete()

void BKE_lib_override_library_delete ( struct Main bmain,
struct ID id_root 
)

◆ BKE_lib_override_library_free()

void BKE_lib_override_library_free ( struct IDOverrideLibrary **  override,
bool  do_id_user 
)

◆ BKE_lib_override_library_get() [1/2]

BLI_INLINE const IDOverrideLibrary* BKE_lib_override_library_get ( const Main bmain,
const ID id,
const ID owner_id_hint,
const ID **  r_owner_id 
)

◆ BKE_lib_override_library_get() [2/2]

IDOverrideLibrary* BKE_lib_override_library_get ( struct Main bmain,
struct ID id,
struct ID owner_id_hint,
struct ID **  r_owner_id 
)

Return the actual IDOverrideLibrary data 'controlling' the given id, and the actual ID owning it.

Note
This is especially useful when id is a non-real override (e.g. embedded ID like a master collection or root node tree, or a shape key).
Parameters
owner_id_hintIf not NULL, a potential owner for the given override-embedded id.
r_owner_idIf given, will be set with the actual ID owning the return liboverride data.

Definition at line 120 of file lib_override.cc.

References BKE_lib_override_library_get().

Referenced by blender::ed::outliner::id_is_in_override_hierarchy(), and ui_template_id_liboverride_hierarchy_make().

◆ BKE_lib_override_library_id_hierarchy_reset()

void BKE_lib_override_library_id_hierarchy_reset ( struct Main bmain,
struct ID id_root,
bool  do_reset_system_override 
)

Reset all overrides in given id_root and its dependencies, while preserving ID relations.

Parameters
do_reset_system_overrideIf true, reset the given ID and all of its descendants in the override hierarchy as system override ones (i.e. non-editable).

Definition at line 3600 of file lib_override.cc.

References BKE_lib_override_library_update(), BKE_main_relations_create(), BKE_main_relations_free(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, ID_IS_OVERRIDE_LIBRARY_REAL, IDOVERRIDE_LIBRARY_RUNTIME_TAG_NEEDS_RELOAD, lib_override_library_id_hierarchy_recursive_reset(), ID::override_library, IDOverrideLibrary::runtime, and IDOverrideLibraryRuntime::tag.

Referenced by id_override_library_reset_fn().

◆ BKE_lib_override_library_id_is_user_deletable()

bool BKE_lib_override_library_id_is_user_deletable ( struct Main bmain,
struct ID id 
)

In case an ID is used by another liboverride ID, user may not be allowed to delete it.

Definition at line 3867 of file lib_override.cc.

References BKE_collection_has_object(), Main::collections, GS, id, ID_IS_OVERRIDE_LIBRARY, ID_OB, LISTBASE_FOREACH, and ID::name.

Referenced by ED_object_base_free_and_unlink(), join_shapes_exec(), object_delete_exec(), and object_join_exec().

◆ BKE_lib_override_library_id_reset()

void BKE_lib_override_library_id_reset ( struct Main bmain,
struct ID id_root,
bool  do_reset_system_override 
)

◆ BKE_lib_override_library_id_unused_cleanup()

void BKE_lib_override_library_id_unused_cleanup ( struct ID local)

◆ BKE_lib_override_library_init()

IDOverrideLibrary* BKE_lib_override_library_init ( struct ID local_id,
struct ID reference_id 
)

◆ BKE_lib_override_library_is_hierarchy_leaf()

bool BKE_lib_override_library_is_hierarchy_leaf ( struct Main bmain,
struct ID id 
)

Check if given ID is a leaf in its liboverride hierarchy (i.e. if it does not use any other override ID).

NOTE: Embedded IDs of override IDs are not considered as leaves.

Definition at line 381 of file lib_override.cc.

References BKE_library_foreach_ID_link(), foreachid_is_hierarchy_leaf_fn(), ID_IS_OVERRIDE_LIBRARY_REAL, and IDWALK_READONLY.

Referenced by clear_override_library_exec(), id_override_library_clear_single_fn(), and override_idtemplate_clear_exec().

◆ BKE_lib_override_library_is_system_defined()

bool BKE_lib_override_library_is_system_defined ( const Main bmain,
const ID id 
)

◆ BKE_lib_override_library_is_user_edited()

bool BKE_lib_override_library_is_user_edited ( const ID id)

◆ BKE_lib_override_library_main_hierarchy_root_ensure()

void BKE_lib_override_library_main_hierarchy_root_ensure ( struct Main bmain)

Find and set the 'hierarchy root' ID pointer of all library overrides in given bmain.

NOTE: Cannot be called from do_versions_after_linking as this code needs a single complete Main database, not a split-by-libraries one.

Definition at line 1616 of file lib_override.cc.

References BKE_main_relations_create(), BKE_main_relations_free(), BKE_main_relations_tag_set(), BLI_assert, CLOG_ERROR, CLOG_WARN, ELEM, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, IDOverrideLibrary::hierarchy_root, id, ID_IS_OVERRIDE_LIBRARY_REAL, ID::lib, lib_override_root_find(), lib_override_root_hierarchy_set(), LOG, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, ID::name, and ID::override_library.

Referenced by lib_override_library_main_resync_on_library_indirect_level(), and setup_app_data().

◆ BKE_lib_override_library_main_operations_create()

bool BKE_lib_override_library_main_operations_create ( struct Main bmain,
bool  force_auto 
)

◆ BKE_lib_override_library_main_resync()

void BKE_lib_override_library_main_resync ( struct Main bmain,
struct Scene scene,
struct ViewLayer view_layer,
struct BlendFileReadReport reports 
)

Detect and handle required resync of overrides data, when relations between reference linked IDs have changed.

This is a fairly complex and costly operation, typically it should be called after BKE_lib_override_library_main_update, which would already detect and tag a lot of cases.

This function will first detect the remaining cases requiring a resync (namely, either when an existing linked ID that did not require to be overridden before now would be, or when new IDs are added to the hierarchy).

Then it will handle the resync of necessary IDs (through calls to BKE_lib_override_library_resync).

Parameters
view_layerthe active view layer to search instantiated collections in, can be NULL (in which case scene's master collection children hierarchy is used instead).

Definition at line 2687 of file lib_override.cc.

References BKE_collection_add(), BKE_collection_delete(), BKE_collection_is_empty(), BKE_layer_collection_resync_allow(), BKE_layer_collection_resync_forbid(), BKE_main_namemap_validate(), BLI_assert, BLI_findstring(), CLOG_INFO, COLLECTION_HIDE_RENDER, COLLECTION_HIDE_VIEWPORT, Main::collections, Collection::flag, ID_IS_LINKED, lib_override_libraries_index_define(), lib_override_library_create_post_process(), lib_override_library_main_resync_on_library_indirect_level(), Main::libraries, library, LIBRARY_TAG_RESYNC_REQUIRED, LISTBASE_FOREACH, LOG, Scene::master_collection, OBACT, OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME, and scene.

Referenced by BKE_blendfile_library_relocate(), and setup_app_data().

◆ BKE_lib_override_library_main_tag()

void BKE_lib_override_library_main_tag ( struct Main bmain,
short  tag,
bool  do_set 
)

Set or clear given tag in all properties and operations in that Main's ID override data.

Definition at line 3656 of file lib_override.cc.

References BKE_lib_override_library_properties_tag(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, ID_IS_OVERRIDE_LIBRARY, and ID::override_library.

Referenced by BKE_lib_override_library_main_operations_create().

◆ BKE_lib_override_library_main_unused_cleanup()

void BKE_lib_override_library_main_unused_cleanup ( struct Main bmain)

Remove all tagged-as-unused properties and operations from that Main's ID override data.

Definition at line 3687 of file lib_override.cc.

References BKE_lib_override_library_id_unused_cleanup(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, and ID_IS_OVERRIDE_LIBRARY.

Referenced by BKE_lib_override_library_main_operations_create().

◆ BKE_lib_override_library_main_update()

void BKE_lib_override_library_main_update ( struct Main bmain)

◆ BKE_lib_override_library_main_validate()

void BKE_lib_override_library_main_validate ( struct Main bmain,
struct ReportList reports 
)

Check against potential bmain.

Definition at line 3198 of file lib_override.cc.

References BKE_lib_override_library_validate(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, and ID_IS_OVERRIDE_LIBRARY.

Referenced by blo_read_file_internal(), and library_link_end().

◆ BKE_lib_override_library_make_local()

void BKE_lib_override_library_make_local ( struct ID id)

◆ BKE_lib_override_library_operations_create()

bool BKE_lib_override_library_operations_create ( struct Main bmain,
struct ID local 
)

Compare local and reference data-blocks and create new override operations as needed, or reset to reference values if overriding is not allowed.

Note
Defining override operations is only mandatory before saving a .blend file on disk (not for undo!). Knowing that info at runtime is only useful for UI/UX feedback.
This is by far the biggest operation (the more time-consuming) of the three so far, since it has to go over all properties in depth (all overridable ones at least). Generating differential values and applying overrides are much cheaper.
Returns
true if any library operation was created.

Definition at line 3316 of file lib_override.cc.

References BKE_pose_ensure(), BLI_assert, CLOG_INFO, Object::data, GS, ID_IS_LINKED, ID_MISSING, ID_OB, LOG, ID::name, OB_ARMATURE, ID::override_library, IDOverrideLibrary::reference, RNA_id_pointer_create(), RNA_OVERRIDE_COMPARE_CREATE, RNA_OVERRIDE_COMPARE_RESTORE, RNA_OVERRIDE_MATCH_RESULT_CREATED, RNA_OVERRIDE_MATCH_RESULT_RESTORED, RNA_struct_override_matches(), and Object::type.

Referenced by BKE_lib_override_library_operations_store_start(), and lib_override_library_operations_create_cb().

◆ BKE_lib_override_library_operations_store_end()

void BKE_lib_override_library_operations_store_end ( OverrideLibraryStorage UNUSEDoverride_storage,
ID local 
)

◆ BKE_lib_override_library_operations_store_finalize()

void BKE_lib_override_library_operations_store_finalize ( OverrideLibraryStorage override_storage)

◆ BKE_lib_override_library_operations_store_init()

OverrideLibraryStorage* BKE_lib_override_library_operations_store_init ( void  )

Storage (how to store overriding data into .blend files).

Basically: 1) Only 'differential' overrides needs special handling here. All others (replacing values or inserting/removing items from a collection) can be handled with simply storing current content of local data-block. 2) We store the differential value into a second 'ghost' data-block, which is an empty ID of same type as the local one, where we only define values that need differential data.

This avoids us having to modify 'real' data-block at write time (and restoring it afterwards), which is inefficient, and potentially dangerous (in case of concurrent access...), while not using much extra memory in typical cases. It also ensures stored data-block always contains exact same data as "desired" ones (kind of "baked" data-blocks).

Definition at line 3903 of file lib_override.cc.

References BKE_main_new().

Referenced by write_file_handle().

◆ BKE_lib_override_library_operations_store_start()

ID* BKE_lib_override_library_operations_store_start ( struct Main bmain,
OverrideLibraryStorage override_storage,
struct ID local 
)

◆ BKE_lib_override_library_operations_tag()

void BKE_lib_override_library_operations_tag ( struct IDOverrideLibraryProperty override_property,
short  tag,
bool  do_set 
)

Set or clear given tag in all operations in that override property data.

Definition at line 3622 of file lib_override.cc.

References LISTBASE_FOREACH, IDOverrideLibraryProperty::operations, and IDOverrideLibraryProperty::tag.

Referenced by BKE_lib_override_library_properties_tag(), and RNA_struct_override_matches().

◆ BKE_lib_override_library_properties_tag()

void BKE_lib_override_library_properties_tag ( struct IDOverrideLibrary override,
short  tag,
bool  do_set 
)

Set or clear given tag in all properties and operations in that override data.

Definition at line 3645 of file lib_override.cc.

References BKE_lib_override_library_operations_tag(), LISTBASE_FOREACH, and override.

Referenced by BKE_lib_override_library_main_operations_create(), and BKE_lib_override_library_main_tag().

◆ BKE_lib_override_library_property_delete()

void BKE_lib_override_library_property_delete ( struct IDOverrideLibrary override,
struct IDOverrideLibraryProperty override_property 
)

◆ BKE_lib_override_library_property_find()

IDOverrideLibraryProperty* BKE_lib_override_library_property_find ( struct IDOverrideLibrary override,
const char *  rna_path 
)

◆ BKE_lib_override_library_property_get()

IDOverrideLibraryProperty* BKE_lib_override_library_property_get ( struct IDOverrideLibrary override,
const char *  rna_path,
bool r_created 
)

Find override property from given RNA path, or create it if it does not exist.

Definition at line 2864 of file lib_override.cc.

References BKE_lib_override_library_property_find(), BLI_addtail(), BLI_ghash_insert(), BLI_strdup(), override, override_library_rna_path_mapping_ensure(), and IDOverrideLibraryProperty::rna_path.

Referenced by RNA_property_override_property_get().

◆ BKE_lib_override_library_property_is_animated()

bool BKE_lib_override_library_property_is_animated ( const ID id,
const IDOverrideLibraryProperty override_prop,
const PropertyRNA override_rna_prop,
const int  rnaprop_index 
)

◆ BKE_lib_override_library_property_operation_delete()

void BKE_lib_override_library_property_operation_delete ( struct IDOverrideLibraryProperty override_property,
struct IDOverrideLibraryPropertyOperation override_property_operation 
)

◆ BKE_lib_override_library_property_operation_find()

IDOverrideLibraryPropertyOperation* BKE_lib_override_library_property_operation_find ( struct IDOverrideLibraryProperty override_property,
const char *  subitem_refname,
const char *  subitem_locname,
int  subitem_refindex,
int  subitem_locindex,
bool  strict,
bool r_strict 
)

◆ BKE_lib_override_library_property_operation_get()

IDOverrideLibraryPropertyOperation* BKE_lib_override_library_property_operation_get ( struct IDOverrideLibraryProperty override_property,
short  operation,
const char *  subitem_refname,
const char *  subitem_locname,
int  subitem_refindex,
int  subitem_locindex,
bool  strict,
bool r_strict,
bool r_created 
)

◆ BKE_lib_override_library_property_operation_operands_validate()

bool BKE_lib_override_library_property_operation_operands_validate ( struct IDOverrideLibraryPropertyOperation override_property_operation,
struct PointerRNA ptr_dst,
struct PointerRNA ptr_src,
struct PointerRNA ptr_storage,
struct PropertyRNA prop_dst,
struct PropertyRNA prop_src,
struct PropertyRNA prop_storage 
)

◆ BKE_lib_override_library_resync()

bool BKE_lib_override_library_resync ( struct Main bmain,
struct Scene scene,
struct ViewLayer view_layer,
struct ID id_root,
struct Collection override_resync_residual_storage,
bool  do_hierarchy_enforce,
struct BlendFileReadReport reports 
)

Advanced 'smart' function to resync, re-create fully functional overrides up-to-date with linked data, from an existing override hierarchy.

Parameters
view_layerthe active view layer to search instantiated collections in, can be NULL (in which case scene's master collection children hierarchy is used instead).
id_rootThe root liboverride ID to resync from.
Returns
true if override was successfully resynced.

Definition at line 2174 of file lib_override.cc.

References BKE_id_free(), lib_override_library_resync(), LinkNode::link, LISTBASE_FOREACH_MUTABLE, ID::next, and scene.

Referenced by id_override_library_resync_hierarchy_process().

◆ BKE_lib_override_library_status_check_local()

bool BKE_lib_override_library_status_check_local ( struct Main bmain,
struct ID local 
)

Check that status of local data-block is still valid against current reference one.

It means that all overridable, but not overridden, properties' local values must be equal to reference ones. Clears #LIB_TAG_OVERRIDE_OK if they do not.

This is typically used to detect whether some property has been changed in local and a new #IDOverrideProperty (of #IDOverridePropertyOperation) has to be added.

Returns
true if status is OK, false otherwise.

Definition at line 3210 of file lib_override.cc.

References BKE_pose_ensure(), BLI_assert, Object::data, GS, ID_IS_OVERRIDE_LIBRARY_REAL, ID_OB, LIB_TAG_OVERRIDE_LIBRARY_REFOK, ID::name, OB_ARMATURE, ID::override_library, IDOverrideLibrary::reference, RNA_id_pointer_create(), RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE, RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN, RNA_struct_override_matches(), ID::tag, and Object::type.

◆ BKE_lib_override_library_status_check_reference()

bool BKE_lib_override_library_status_check_reference ( struct Main bmain,
struct ID local 
)

Check that status of reference data-block is still valid against current local one.

It means that all non-overridden properties' local values must be equal to reference ones. Clears LIB_TAG_OVERRIDE_OK if they do not.

This is typically used to detect whether some reference has changed and local needs to be updated against it.

Returns
true if status is OK, false otherwise.

Definition at line 3260 of file lib_override.cc.

References BKE_lib_override_library_status_check_reference(), BKE_pose_ensure(), BLI_assert, Object::data, GS, ID_IS_OVERRIDE_LIBRARY_REAL, ID_OB, LIB_TAG_OVERRIDE_LIBRARY_REFOK, ID::name, OB_ARMATURE, ID::override_library, IDOverrideLibrary::reference, RNA_id_pointer_create(), RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN, RNA_struct_override_matches(), ID::tag, and Object::type.

Referenced by BKE_lib_override_library_status_check_reference().

◆ BKE_lib_override_library_template_create()

bool BKE_lib_override_library_template_create ( struct ID id)

Create a library override template.

Definition at line 1426 of file lib_override.cc.

References BKE_lib_override_library_init(), ID_IS_LINKED, and ID_IS_OVERRIDE_LIBRARY.

◆ BKE_lib_override_library_update()

void BKE_lib_override_library_update ( struct Main bmain,
struct ID local 
)

◆ BKE_lib_override_library_validate()

void BKE_lib_override_library_validate ( struct Main bmain,
struct ID id,
struct ReportList reports 
)

◆ BKE_lib_override_rna_property_find()

bool BKE_lib_override_rna_property_find ( PointerRNA idpoin,
const IDOverrideLibraryProperty library_prop,
PointerRNA r_override_poin,
PropertyRNA **  r_override_prop,
int *  r_index 
)

◆ foreachid_is_hierarchy_leaf_fn()

static int foreachid_is_hierarchy_leaf_fn ( LibraryIDLinkCallbackData cb_data)
static

◆ lib_override_group_tag_data_clear()

static void lib_override_group_tag_data_clear ( LibOverrideGroupTagData data)
static

◆ lib_override_group_tag_data_object_to_collection_init()

static void lib_override_group_tag_data_object_to_collection_init ( LibOverrideGroupTagData data)
static

◆ lib_override_group_tag_data_object_to_collection_init_collection_process()

static void lib_override_group_tag_data_object_to_collection_init_collection_process ( LibOverrideGroupTagData data,
Collection collection 
)
static

◆ lib_override_hierarchy_dependencies_recursive_tag()

static bool lib_override_hierarchy_dependencies_recursive_tag ( LibOverrideGroupTagData data)
static

◆ lib_override_hierarchy_dependencies_recursive_tag_from()

static void lib_override_hierarchy_dependencies_recursive_tag_from ( LibOverrideGroupTagData data)
static

◆ lib_override_id_swap()

static void lib_override_id_swap ( Main bmain,
ID id_local,
ID id_temp 
)
static

◆ lib_override_libraries_index_define()

static int lib_override_libraries_index_define ( Main bmain)
static

Define the temp_index of libraries from their highest level of indirect usage.

E.g. if lib_a uses lib_b, lib_c and lib_d, and lib_b also uses lib_d, then lib_a has an index of 1, lib_b and lib_c an index of 2, and lib_d an index of 3.

Definition at line 2661 of file lib_override.cc.

References BKE_library_foreach_ID_link(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, IDWALK_READONLY, lib_override_sort_libraries_func(), Main::libraries, library, and LISTBASE_FOREACH.

Referenced by BKE_lib_override_library_main_resync().

◆ lib_override_library_create_do()

static bool lib_override_library_create_do ( Main bmain,
Scene scene,
Library owner_library,
ID id_root_reference,
ID id_hierarchy_root_reference,
const bool  do_fully_editable 
)
static

◆ lib_override_library_create_from()

static ID* lib_override_library_create_from ( Main bmain,
Library owner_library,
ID reference_id,
const int  lib_id_copy_flags 
)
static

◆ lib_override_library_create_post_process()

static void lib_override_library_create_post_process ( Main bmain,
Scene scene,
ViewLayer view_layer,
const Library owner_library,
ID id_root,
ID id_instance_hint,
Collection residual_storage,
const Object old_active_object,
const bool  is_resync 
)
static

◆ lib_override_library_id_hierarchy_recursive_reset()

static void lib_override_library_id_hierarchy_recursive_reset ( Main bmain,
ID id_root,
const bool  do_reset_system_override 
)
static

◆ lib_override_library_id_reset_do()

static bool lib_override_library_id_reset_do ( Main bmain,
ID id_root,
const bool  do_reset_system_override 
)
static

◆ lib_override_library_main_resync_on_library_indirect_level()

static void lib_override_library_main_resync_on_library_indirect_level ( Main bmain,
Scene scene,
ViewLayer view_layer,
Collection override_resync_residual_storage,
const int  library_indirect_level,
BlendFileReadReport reports 
)
static

Definition at line 2373 of file lib_override.cc.

References BKE_id_free(), BKE_lib_override_library_main_hierarchy_root_ensure(), BKE_main_id_tag_all(), BKE_main_relations_create(), BKE_main_relations_free(), BKE_main_relations_tag_set(), BLI_assert, BLI_ghash_free(), BLI_ghash_haskey(), BLI_ghash_lookup(), BLI_ghash_ptr_new(), BLI_ghashIterator_done(), BLI_ghashIterator_free(), BLI_ghashIterator_getKey(), BLI_ghashIterator_getValue(), BLI_ghashIterator_new(), BLI_ghashIterator_step(), BLI_linklist_free(), BLI_linklist_index(), BLI_linklist_prepend(), BLI_listbase_clear(), CLOG_ERROR, CLOG_INFO, BlendFileReadReport::count, data, BlendFileReadReport::do_resynced_lib_overrides_libraries_list, BlendFileReadReport::duration, IDOverrideLibrary::flag, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, id, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY, ID_IS_OVERRIDE_LIBRARY_REAL, IDOVERRIDE_LIBRARY_FLAG_NO_HIERARCHY, IDWALK_CB_OVERRIDE_LIBRARY_NOT_OVERRIDABLE, LinkNodePair::last_node, ID::lib, lib_override_group_tag_data_clear(), lib_override_group_tag_data_object_to_collection_init(), lib_override_hierarchy_dependencies_recursive_tag(), lib_override_library_resync(), lib_override_linked_group_tag(), lib_override_resync_id_lib_level_is_valid(), lib_override_resync_tagging_finalize_recurse(), BlendFileReadReport::lib_overrides_recursive_resync, LIB_TAG_DOIT, LIB_TAG_LIB_OVERRIDE_NEED_RESYNC, LIB_TAG_MISSING, library, LIBRARY_TAG_RESYNC_REQUIRED, LinkNode::link, LinkNodePair::list, LISTBASE_FOREACH_MUTABLE, LOG, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, MEM_freeN, ID::name, MainIDRelationsEntryItem::next, LinkNode::next, ID::override_library, PIL_check_seconds_timer(), IDOverrideLibrary::reference, Main::relations, MainIDRelations::relations_from_pointers, BlendFileReadReport::resynced_lib_overrides, BlendFileReadReport::resynced_lib_overrides_libraries, BlendFileReadReport::resynced_lib_overrides_libraries_count, scene, ID::tag, Library::tag, Library::temp_index, and MainIDRelationsEntry::to_ids.

Referenced by BKE_lib_override_library_main_resync().

◆ lib_override_library_main_resync_root_get()

static ID* lib_override_library_main_resync_root_get ( Main bmain,
ID id 
)
static

◆ lib_override_library_operations_create_cb()

static void lib_override_library_operations_create_cb ( TaskPool *__restrict  pool,
void taskdata 
)
static

◆ lib_override_library_property_clear()

void lib_override_library_property_clear ( IDOverrideLibraryProperty op)
static

◆ lib_override_library_property_copy()

void lib_override_library_property_copy ( IDOverrideLibraryProperty op_dst,
IDOverrideLibraryProperty op_src 
)
static

◆ lib_override_library_property_operation_clear()

void lib_override_library_property_operation_clear ( IDOverrideLibraryPropertyOperation opop)
static

◆ lib_override_library_property_operation_copy()

void lib_override_library_property_operation_copy ( IDOverrideLibraryPropertyOperation opop_dst,
IDOverrideLibraryPropertyOperation opop_src 
)
static

◆ lib_override_library_remap()

static void lib_override_library_remap ( Main bmain,
const ID id_root_reference,
GHash linkedref_to_old_override 
)
static

◆ lib_override_library_resync()

static bool lib_override_library_resync ( Main bmain,
Scene scene,
ViewLayer view_layer,
ID id_root,
LinkNode id_resync_roots,
ListBase no_main_ids_list,
Collection override_resync_residual_storage,
const bool  do_hierarchy_enforce,
const bool  do_post_process,
BlendFileReadReport reports 
)
static

ID_IS_LINKED(id_override_new) ||

Definition at line 1712 of file lib_override.cc.

References BKE_id_multi_tagged_delete(), BKE_id_remapper_create(), BKE_id_remapper_free(), BKE_key_from_id(), BKE_lib_override_library_create_from_tag(), BKE_lib_override_library_get(), BKE_lib_override_library_is_user_edited(), BKE_lib_override_library_property_delete(), BKE_libblock_management_main_add(), BKE_libblock_relink_multiple(), BKE_main_collection_sync(), BKE_main_id_newptr_and_tag_clear(), BKE_main_id_tag_all(), BKE_main_relations_create(), BKE_main_relations_free(), BKE_main_relations_tag_set(), BKE_reportf(), BLI_addtail(), BLI_assert, BLI_duplicatelist(), BLI_findindex(), BLI_freelinkN(), BLI_ghash_free(), BLI_ghash_haskey(), BLI_ghash_insert(), BLI_ghash_lookup(), BLI_ghash_new(), BLI_ghashutil_ptrcmp(), BLI_ghashutil_ptrhash(), BLI_insertlinkreplace(), BLI_linklist_free(), BLI_linklist_prepend(), BLI_listbase_is_empty(), CLOG_ERROR, CLOG_INFO, CLOG_WARN, data, ELEM, ListBase::first, IDOverrideLibrary::flag, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, FOREACH_MAIN_LISTBASE_BEGIN, FOREACH_MAIN_LISTBASE_END, FOREACH_MAIN_LISTBASE_ID_BEGIN, FOREACH_MAIN_LISTBASE_ID_END, GS, IDOverrideLibrary::hierarchy_root, id, Library::id, id_fake_user_set(), ID_GR, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY, ID_IS_OVERRIDE_LIBRARY_REAL, ID_KE, ID_NT, ID_REMAP_FORCE_NEVER_NULL_USAGE, ID_REMAP_FORCE_USER_REFCOUNT, ID_REMAP_TYPE_CLEANUP, ID_SCE, IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE, ID::lib, LIB_LIB_OVERRIDE_RESYNC_LEFTOVER, lib_override_group_tag_data_clear(), lib_override_group_tag_data_object_to_collection_init(), lib_override_hierarchy_dependencies_recursive_tag(), lib_override_library_create_post_process(), lib_override_library_property_copy(), lib_override_library_property_operation_clear(), lib_override_library_remap(), lib_override_linked_group_tag(), lib_override_object_posemode_transfer(), lib_override_overrides_group_tag(), LIB_TAG_DOIT, LIB_TAG_INDIRECT, LIB_TAG_LIB_OVERRIDE_NEED_RESYNC, LIB_TAG_MISSING, LIB_TAG_NO_MAIN, LIB_TAG_NO_USER_REFCOUNT, LISTBASE_FOREACH, LISTBASE_FOREACH_MUTABLE, LOG, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, MAX_ID_NAME, ID::name, ID::newid, LinkNode::next, IDOverrideLibraryProperty::next, ntreeFromID(), OB_DATA_SUPPORT_ID, OBACT, ID::override_library, PROP_COLLECTION, PROP_POINTER, IDOverrideLibrary::properties, IDOverrideLibrary::reference, BlendFileReadReport::reports, RNA_id_pointer_create(), RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS, RNA_OVERRIDE_APPLY_FLAG_NOP, RNA_struct_override_apply(), RPT_ERROR, RPT_WARNING, scene, and ID::tag.

Referenced by BKE_lib_override_library_resync(), and lib_override_library_main_resync_on_library_indirect_level().

◆ lib_override_linked_group_tag()

static void lib_override_linked_group_tag ( LibOverrideGroupTagData data)
static

◆ lib_override_linked_group_tag_clear_boneshapes_objects()

static void lib_override_linked_group_tag_clear_boneshapes_objects ( LibOverrideGroupTagData data)
static

◆ lib_override_linked_group_tag_collections_keep_tagged_check_recursive()

static bool lib_override_linked_group_tag_collections_keep_tagged_check_recursive ( LibOverrideGroupTagData data,
Collection collection 
)
static

◆ lib_override_linked_group_tag_recursive()

static void lib_override_linked_group_tag_recursive ( LibOverrideGroupTagData data)
static

◆ lib_override_object_posemode_transfer()

BLI_INLINE void lib_override_object_posemode_transfer ( ID id_dst,
ID id_src 
)

Helper to preserve Pose mode on override objects. A bit annoying to have this special case, but not much to be done here currently, since the matching RNA property is read-only.

Definition at line 82 of file lib_override.cc.

References GS, ID_OB, Object::mode, ID::name, OB_ARMATURE, OB_MODE_POSE, Object::restore_mode, and Object::type.

Referenced by BKE_lib_override_library_update(), and lib_override_library_resync().

◆ lib_override_overrides_group_tag()

static void lib_override_overrides_group_tag ( LibOverrideGroupTagData data)
static

◆ lib_override_overrides_group_tag_recursive()

static void lib_override_overrides_group_tag_recursive ( LibOverrideGroupTagData data)
static

◆ lib_override_prefill_newid_from_existing_overrides()

static void lib_override_prefill_newid_from_existing_overrides ( Main bmain,
ID id_hierarchy_root 
)
static

◆ lib_override_remapper_overrides_add()

static void lib_override_remapper_overrides_add ( IDRemapper *  id_remapper,
ID reference_id,
ID local_id 
)
static

◆ lib_override_resync_id_lib_level_is_valid()

static bool lib_override_resync_id_lib_level_is_valid ( ID id,
const int  library_indirect_level,
const bool  do_strict_equal 
)
static

◆ lib_override_resync_tagging_finalize_recurse()

static bool lib_override_resync_tagging_finalize_recurse ( Main bmain,
ID id,
GHash id_roots,
const int  library_indirect_level,
const bool  check_only 
)
static

◆ lib_override_root_find()

static ID* lib_override_root_find ( Main bmain,
ID id,
const int  curr_level,
int *  r_best_level 
)
static

◆ lib_override_root_hierarchy_set()

static void lib_override_root_hierarchy_set ( Main bmain,
ID id_root,
ID id,
ID id_from 
)
static

◆ lib_override_sort_libraries_func()

static int lib_override_sort_libraries_func ( LibraryIDLinkCallbackData cb_data)
static

◆ override_library_rna_path_mapping_ensure()

BLI_INLINE GHash* override_library_rna_path_mapping_ensure ( IDOverrideLibrary override)

◆ override_library_rna_path_runtime_ensure()

BLI_INLINE IDOverrideLibraryRuntime* override_library_rna_path_runtime_ensure ( IDOverrideLibrary override)

Variable Documentation

◆ LOG

CLG_LogRef LOG = {"bke.liboverride"}
static