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 IDOverrideLibrary * BKE_lib_override_library_get (const Main *bmain, const ID *id, const ID *owner_id_hint, const ID **r_owner_id)
 
IDOverrideLibrary * BKE_lib_override_library_get (Main *bmain, ID *id, ID *owner_id_hint, ID **r_owner_id)
 
IDOverrideLibrary * BKE_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 ID * lib_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)
 
ID * BKE_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 ID * lib_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 ID * lib_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 IDOverrideLibraryRuntime * override_library_rna_path_runtime_ensure (IDOverrideLibrary *override)
 
BLI_INLINE GHash * override_library_rna_path_mapping_ensure (IDOverrideLibrary *override)
 
IDOverrideLibraryProperty * BKE_lib_override_library_property_find (IDOverrideLibrary *override, const char *rna_path)
 
IDOverrideLibraryProperty * BKE_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)
 
IDOverrideLibraryPropertyOperation * BKE_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)
 
IDOverrideLibraryPropertyOperation * BKE_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)
 
OverrideLibraryStorage * BKE_lib_override_library_operations_store_init (void)
 
ID * BKE_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