Blender V4.3
BKE_lib_override.hh File Reference
#include <optional>

Go to the source code of this file.

Typedefs

using OverrideLibraryStorage = Main
 

Functions

IDOverrideLibraryBKE_lib_override_library_init (ID *local_id, ID *reference_id)
 
void BKE_lib_override_library_copy (ID *dst_id, const ID *src_id, bool do_full_copy)
 
void BKE_lib_override_library_clear (IDOverrideLibrary *liboverride, bool do_id_user)
 
void BKE_lib_override_library_free (IDOverrideLibrary **liboverride, bool do_id_user)
 
IDOverrideLibraryBKE_lib_override_library_get (Main *bmain, ID *id, ID *owner_id_hint, ID **r_owner_id)
 
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 *liboverride_prop, const PropertyRNA *override_rna_prop, const int rnaprop_index)
 
bool BKE_lib_override_library_is_hierarchy_leaf (Main *bmain, ID *id)
 
void BKE_lib_override_id_tag_on_deg_tag_from_user (ID *id)
 
IDBKE_lib_override_library_create_from_id (Main *bmain, ID *reference_id, bool do_tagged_remap)
 
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, bool do_no_main, const bool do_fully_editable)
 
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_proxy_convert (Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob_proxy)
 
void BKE_lib_override_library_main_proxy_convert (Main *bmain, BlendFileReadReport *reports)
 
void BKE_lib_override_library_main_hierarchy_root_ensure (Main *bmain)
 
bool BKE_lib_override_library_resync (Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, Collection *override_resync_residual_storage, bool do_hierarchy_enforce, BlendFileReadReport *reports)
 
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 (Main *bmain, ID *id)
 
IDOverrideLibraryPropertyBKE_lib_override_library_property_find (IDOverrideLibrary *liboverride, const char *rna_path)
 
IDOverrideLibraryPropertyBKE_lib_override_library_property_get (IDOverrideLibrary *liboverride, const char *rna_path, bool *r_created)
 
void BKE_lib_override_library_property_delete (IDOverrideLibrary *liboverride, IDOverrideLibraryProperty *liboverride_property)
 
bool BKE_lib_override_library_property_search_and_delete (IDOverrideLibrary *liboverride, const char *rna_path)
 
bool BKE_lib_override_library_property_rna_path_change (IDOverrideLibrary *liboverride, const char *old_rna_path, const char *new_rna_path)
 
bool BKE_lib_override_rna_property_find (PointerRNA *idpoin, const IDOverrideLibraryProperty *library_prop, PointerRNA *r_override_poin, PropertyRNA **r_override_prop, int *r_index)
 
IDOverrideLibraryPropertyOperationBKE_lib_override_library_property_operation_find (IDOverrideLibraryProperty *liboverride_property, const char *subitem_refname, const char *subitem_locname, const std::optional< const ID * > &subitem_refid, const std::optional< const ID * > &subitem_locid, int subitem_refindex, int subitem_locindex, bool strict, bool *r_strict)
 
IDOverrideLibraryPropertyOperationBKE_lib_override_library_property_operation_get (IDOverrideLibraryProperty *liboverride_property, short operation, const char *subitem_refname, const char *subitem_locname, const std::optional< ID * > &subitem_refid, const std::optional< ID * > &subitem_locid, int subitem_refindex, int subitem_locindex, bool strict, bool *r_strict, bool *r_created)
 
void BKE_lib_override_library_property_operation_delete (IDOverrideLibraryProperty *liboverride_property, IDOverrideLibraryPropertyOperation *liboverride_property_operation)
 
bool BKE_lib_override_library_property_operation_operands_validate (IDOverrideLibraryPropertyOperation *liboverride_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)
 
void BKE_lib_override_library_operations_create (Main *bmain, ID *local, int *r_report_flags)
 
void BKE_lib_override_library_main_operations_create (Main *bmain, bool force_auto, int *r_report_flags)
 
void BKE_lib_override_library_operations_restore (Main *bmain, ID *local, int *r_report_flags)
 
void BKE_lib_override_library_main_operations_restore (Main *bmain, int *r_report_flags)
 
void BKE_lib_override_library_id_reset (Main *bmain, ID *id_root, bool do_reset_system_override)
 
void BKE_lib_override_library_id_hierarchy_reset (Main *bmain, ID *id_root, bool do_reset_system_override)
 
void BKE_lib_override_library_operations_tag (IDOverrideLibraryProperty *liboverride_property, short tag, bool do_set)
 
void BKE_lib_override_library_properties_tag (IDOverrideLibrary *liboverride, short tag, bool do_set)
 
void BKE_lib_override_library_main_tag (Main *bmain, short tag, bool do_set)
 
void BKE_lib_override_library_id_unused_cleanup (ID *local)
 
void BKE_lib_override_library_main_unused_cleanup (Main *bmain)
 
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)
 
void BKE_lib_override_debug_print (IDOverrideLibrary *liboverride, const char *intro_txt)
 
OverrideLibraryStorageBKE_lib_override_library_operations_store_init ()
 
IDBKE_lib_override_library_operations_store_start (Main *bmain, OverrideLibraryStorage *liboverride_storage, ID *local)
 
void BKE_lib_override_library_operations_store_end (OverrideLibraryStorage *liboverride_storage, ID *local)
 
void BKE_lib_override_library_operations_store_finalize (OverrideLibraryStorage *liboverride_storage)
 

Detailed Description

API to manage data-blocks inside of Blender's Main data-base, or as independent runtime-only data.

Note
BKE_lib_ files are for operations over data-blocks themselves, although they might alter Main as well (when creating/renaming/deleting an ID e.g.).

Names

Warning
Descriptions below is ideal goal, current status of naming does not yet fully follow it (this is WIP).
  • BKE_lib_override_library_ should be used for function affecting a single ID.
  • BKE_lib_override_library_main_ should be used for function affecting the whole collection of IDs in a given Main data-base.

Definition in file BKE_lib_override.hh.

Typedef Documentation

◆ OverrideLibraryStorage

Definition at line 550 of file BKE_lib_override.hh.

Function Documentation

◆ BKE_lib_override_debug_print()

void BKE_lib_override_debug_print ( IDOverrideLibrary * liboverride,
const char * intro_txt )

Debugging helper to show content of given liboverride data.

Definition at line 5162 of file lib_override.cc.

References LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE, LIBOVERRIDE_PROP_OP_TAG_UNUSED, LISTBASE_FOREACH, and IDOverrideLibrary::properties.

◆ BKE_lib_override_id_tag_on_deg_tag_from_user()

void BKE_lib_override_id_tag_on_deg_tag_from_user ( ID * id)

Tag the liboverride ID for auto-refresh when it gets tagged for depsgraph update.

NOTE: This should only handle direct user editing, it is assumed that indirect updates should never require an update of the liboverride diffing info.

Definition at line 409 of file lib_override.cc.

References ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY, and ID_TAG_LIBOVERRIDE_AUTOREFRESH.

Referenced by blender::deg::id_tag_update().

◆ BKE_lib_override_library_clear()

◆ BKE_lib_override_library_copy()

◆ BKE_lib_override_library_create()

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 )

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 ID_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 1633 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(), BKE_main_view_layers_synced_ensure(), BKE_view_layer_active_object_get(), ID_TAG_DOIT, lib_override_library_create_do(), lib_override_library_create_post_process(), and ID::newid.

Referenced by BKE_lib_override_library_proxy_convert(), blender::ed::outliner::id_override_library_create_hierarchy(), blender::ed::object::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 ( Main * bmain,
ID * reference_id,
bool do_tagged_remap )

◆ 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,
bool do_no_main,
const bool do_fully_editable )

Create overridden local copies of all tagged data-blocks in given Main.

Note
Set id->newid of overridden libraries with newly created overrides, caller is responsible to clean those pointers before/after usage as needed.
By default, it will only remap newly created local overriding data-blocks between themselves, to avoid 'enforcing' those overrides into all other usages of the linked data in main. You can add more local IDs to be remapped to use new overriding ones by setting their ID_TAG_DOIT tag.
Parameters
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 ID that is considered as the root of the overridden hierarchy.
id_hierarchy_rootthe override ID that is the root of the hierarchy. May be NULL, in which case it is assumed that the given id_root_reference is tagged for override, and its newly created override will be used as hierarchy root. Must be NULL if id_hierarchy_root_reference is not NULL.
id_hierarchy_root_referencethe linked ID that is the root of the hierarchy. Must be tagged for override. May be NULL, in which case it is assumed that the given id_root_reference is tagged for override, and its newly created override will be used as hierarchy root. Must be NULL if id_hierarchy_root is not NULL.
do_no_mainCreate the new override data outside of Main database. Used for resyncing of linked overrides.
do_fully_editableif true, tag all created overrides as user-editable by default.
Returns
true on success, false otherwise.

Definition at line 514 of file lib_override.cc.

References blender::Vector< T, InlineBufferCapacity, Allocator >::append(), BKE_id_delete(), BKE_idtype_idcode_is_linkable(), BKE_key_from_id(), BKE_lib_override_library_get(), BKE_libblock_relink_multiple(), BLI_addtail(), BLI_assert, BLI_freelistN(), blender::Vector< T, InlineBufferCapacity, Allocator >::clear(), LinkData::data, ELEM, ListBase::first, IDOverrideLibrary::flag, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, GS, IDOverrideLibrary::hierarchy_root, Key::id, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY_REAL, ID_REMAP_FORCE_USER_REFCOUNT, ID_REMAP_SKIP_OVERRIDE_LIBRARY, ID_REMAP_TYPE_REMAP, ID_TAG_DOIT, ID::lib, LIB_ID_CREATE_NO_MAIN, lib_override_library_create_from(), lib_override_prefill_newid_from_existing_overrides(), lib_override_remapper_overrides_add(), ID::name, ID::newid, LinkData::next, ID::override_library, IDOverrideLibrary::reference, and ID::tag.

Referenced by lib_override_library_create_do(), and lib_override_library_resync().

◆ BKE_lib_override_library_delete()

void BKE_lib_override_library_delete ( Main * bmain,
ID * id_root )

◆ BKE_lib_override_library_free()

void BKE_lib_override_library_free ( IDOverrideLibrary ** liboverride,
bool do_id_user )

◆ BKE_lib_override_library_get()

IDOverrideLibrary * BKE_lib_override_library_get ( Main * bmain,
ID * id,
ID * owner_id_hint,
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 136 of file lib_override.cc.

References BKE_lib_override_library_get().

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

◆ BKE_lib_override_library_id_hierarchy_reset()

void BKE_lib_override_library_id_hierarchy_reset ( Main * bmain,
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 4848 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_IS_OVERRIDE_LIBRARY_REAL, lib_override_library_id_hierarchy_recursive_reset(), and LIBOVERRIDE_TAG_NEEDS_RELOAD.

Referenced by blender::ed::outliner::id_override_library_reset().

◆ BKE_lib_override_library_id_is_user_deletable()

bool BKE_lib_override_library_id_is_user_deletable ( Main * bmain,
ID * id )

◆ BKE_lib_override_library_id_reset()

◆ BKE_lib_override_library_id_unused_cleanup()

void BKE_lib_override_library_id_unused_cleanup ( ID * local)

◆ BKE_lib_override_library_init()

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

◆ BKE_lib_override_library_is_hierarchy_leaf()

bool BKE_lib_override_library_is_hierarchy_leaf ( Main * bmain,
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 397 of file lib_override.cc.

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

Referenced by blender::ed::object::clear_override_library_exec(), blender::ed::outliner::id_override_library_clear_single_process(), and override_idtemplate_clear_exec().

◆ BKE_lib_override_library_is_system_defined()

◆ 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()

◆ BKE_lib_override_library_main_operations_create()

◆ BKE_lib_override_library_main_operations_restore()

void BKE_lib_override_library_main_operations_restore ( Main * bmain,
int * r_report_flags )

Restore forbidden modified override properties to the values of their matching properties in the linked reference ID, for all liboverride IDs tagged as needing such process in given bmain.

Parameters
r_report_flagseRNAOverrideMatchResult flags giving info about the result of this call.
Note
Typically used as part of BKE_lib_override_library_main_operations_create process, since modifying RNA properties from non-main threads is not safe.

Definition at line 4701 of file lib_override.cc.

References BKE_lib_override_library_operations_restore(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY_REAL, ID_TAG_MISSING, and LIBOVERRIDE_TAG_NEEDS_RESTORE.

Referenced by BKE_lib_override_library_main_operations_create().

◆ BKE_lib_override_library_main_proxy_convert()

void BKE_lib_override_library_main_proxy_convert ( Main * bmain,
BlendFileReadReport * reports )

◆ BKE_lib_override_library_main_resync()

void BKE_lib_override_library_main_resync ( Main * bmain,
Scene * scene,
ViewLayer * view_layer,
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 3667 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_destroy(), BKE_main_namemap_validate(), BKE_view_layer_active_object_get(), BKE_view_layer_synced_ensure(), BLI_assert, BLI_findstring(), CLOG_INFO, CLOG_WARN, COLLECTION_HIDE_RENDER, COLLECTION_HIDE_VIEWPORT, Main::collections, Collection::flag, ID_IS_LINKED, lib_override_cleanup_after_resync(), lib_override_libraries_index_define(), lib_override_library_create_post_process(), lib_override_library_main_resync_on_library_indirect_level(), Main::libraries, LIBRARY_TAG_RESYNC_REQUIRED, LISTBASE_FOREACH, LOG_RESYNC, Main::name_map_global, offsetof, and OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME.

Referenced by BKE_blendfile_library_relocate(), and setup_app_data().

◆ BKE_lib_override_library_main_tag()

void BKE_lib_override_library_main_tag ( 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 4907 of file lib_override.cc.

References BKE_lib_override_library_properties_tag(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, and ID_IS_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 ( Main * bmain)

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

Definition at line 4942 of file lib_override.cc.

References BKE_lib_override_library_id_unused_cleanup(), FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, 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 ( Main * bmain)

◆ BKE_lib_override_library_main_validate()

void BKE_lib_override_library_main_validate ( Main * bmain,
ReportList * reports )

Check against potential bmain.

Definition at line 4344 of file lib_override.cc.

References BKE_lib_override_library_validate(), FOREACH_MAIN_ID_BEGIN, and FOREACH_MAIN_ID_END.

Referenced by blo_read_file_internal(), and library_link_end().

◆ BKE_lib_override_library_make_local()

void BKE_lib_override_library_make_local ( Main * bmain,
ID * id )

Make given ID fully local.

Parameters
bmainIf given, all liboverrides hierarchy roots will be re-validated/generated after clearing the liboverride data from given id. If nullptr, caller is responsible to perform this action (call BKE_lib_override_library_main_hierarchy_root_ensure) itself.
Note
Only differs from lower-level BKE_lib_override_library_free in infamous embedded ID cases.

Definition at line 3817 of file lib_override.cc.

References BKE_key_from_id(), BKE_lib_override_library_free(), BKE_lib_override_library_main_hierarchy_root_ensure(), BLI_assert_unreachable, ID::flag, GS, Collection::id, Key::id, ID_IS_OVERRIDE_LIBRARY, ID_IS_OVERRIDE_LIBRARY_VIRTUAL, ID_SCE, node_tree, and blender::bke::node_tree_from_id().

Referenced by BKE_lib_id_make_local_generic(), BKE_lib_override_library_validate(), BKE_library_make_local(), blender::ed::outliner::id_local_fn(), and template_id_cb().

◆ BKE_lib_override_library_operations_create()

void BKE_lib_override_library_operations_create ( Main * bmain,
ID * local,
int * r_report_flags )

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

Parameters
r_report_flagseRNAOverrideMatchResult flags giving info about the result of this call.
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.

Definition at line 4514 of file lib_override.cc.

References lib_override_library_operations_create(), RNA_OVERRIDE_COMPARE_CREATE, and RNA_OVERRIDE_COMPARE_RESTORE.

Referenced by BKE_lib_override_library_operations_store_start().

◆ BKE_lib_override_library_operations_restore()

void BKE_lib_override_library_operations_restore ( Main * bmain,
ID * local,
int * r_report_flags )

Restore forbidden modified override properties to the values of their matching properties in the linked reference ID.

Parameters
r_report_flagseRNAOverrideMatchResult flags giving info about the result of this call.
Note
Typically used as part of BKE_lib_override_library_main_operations_create process, since modifying RNA properties from non-main threads is not safe.

Definition at line 4523 of file lib_override.cc.

References BKE_lib_override_library_operations_tag(), BKE_lib_override_library_property_delete(), BKE_lib_override_library_property_operation_delete(), BLI_listbase_is_empty(), ID_IS_OVERRIDE_LIBRARY_REAL, LIBOVERRIDE_PROP_TAG_NEEDS_RETORE, LIBOVERRIDE_TAG_NEEDS_RESTORE, LISTBASE_FOREACH_MUTABLE, RNA_id_pointer_create(), RNA_OVERRIDE_APPLY_FLAG_RESTORE_ONLY, RNA_OVERRIDE_APPLY_FLAG_SKIP_RESYNC_CHECK, RNA_OVERRIDE_MATCH_RESULT_RESTORED, and RNA_struct_override_apply().

Referenced by BKE_lib_override_library_main_operations_restore().

◆ BKE_lib_override_library_operations_store_end()

void BKE_lib_override_library_operations_store_end ( OverrideLibraryStorage * liboverride_storage,
ID * local )

Restore given ID modified by BKE_lib_override_library_operations_store_start, to its original state.

Definition at line 5283 of file lib_override.cc.

References BLI_assert, and ID_IS_OVERRIDE_LIBRARY_REAL.

Referenced by write_file_handle().

◆ BKE_lib_override_library_operations_store_finalize()

void BKE_lib_override_library_operations_store_finalize ( OverrideLibraryStorage * liboverride_storage)

◆ BKE_lib_override_library_operations_store_init()

OverrideLibraryStorage * BKE_lib_override_library_operations_store_init ( )

Initialize an override storage.

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 5215 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 ( Main * bmain,
OverrideLibraryStorage * liboverride_storage,
ID * local )

◆ BKE_lib_override_library_operations_tag()

void BKE_lib_override_library_operations_tag ( IDOverrideLibraryProperty * liboverride_property,
short tag,
bool do_set )

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

Definition at line 4871 of file lib_override.cc.

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

Referenced by BKE_lib_override_library_operations_restore(), BKE_lib_override_library_properties_tag(), and RNA_struct_override_matches().

◆ BKE_lib_override_library_properties_tag()

void BKE_lib_override_library_properties_tag ( IDOverrideLibrary * liboverride,
short tag,
bool do_set )

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

Definition at line 4896 of file lib_override.cc.

References BKE_lib_override_library_operations_tag(), LISTBASE_FOREACH, and IDOverrideLibrary::properties.

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 ( IDOverrideLibrary * liboverride,
IDOverrideLibraryProperty * liboverride_property )

◆ BKE_lib_override_library_property_find()

◆ BKE_lib_override_library_property_get()

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

◆ BKE_lib_override_library_property_is_animated()

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

Check if given Override Property for given ID is animated (through a F-Curve in an Action, or from a driver).

Parameters
liboverride_rna_propif not NULL, the RNA property matching the given path in the liboverride_prop.
rnaprop_indexArray in the RNA property, 0 if unknown or irrelevant.

Definition at line 349 of file lib_override.cc.

References BKE_animadata_fcurve_find_by_rna_path(), BKE_animdata_from_id(), IDOverrideLibraryProperty::rna_path, and RNA_path_array_index_token_find().

Referenced by blender::ed::outliner::iterate_properties_to_display().

◆ BKE_lib_override_library_property_operation_delete()

void BKE_lib_override_library_property_operation_delete ( IDOverrideLibraryProperty * liboverride_property,
IDOverrideLibraryPropertyOperation * liboverride_property_operation )

◆ BKE_lib_override_library_property_operation_find()

IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_find ( IDOverrideLibraryProperty * liboverride_property,
const char * subitem_refname,
const char * subitem_locname,
const std::optional< const ID * > & subitem_refid,
const std::optional< const ID * > & subitem_locid,
int subitem_refindex,
int subitem_locindex,
bool strict,
bool * r_strict )

Find override property operation from given sub-item(s), if it exists.

Parameters
subitem_refid
subitem_locidOnly for RNA collections of ID pointers, the ID pointers referenced by the given names. Note that both must be set, or left unset.

Definition at line 4062 of file lib_override.cc.

References BLI_assert, BLI_listbase_bytes_find(), ELEM, liboverride_opop_find_name_lib_iterative(), offsetof, IDOverrideLibraryProperty::operations, IDOverrideLibraryPropertyOperation::subitem_local_index, and IDOverrideLibraryPropertyOperation::subitem_reference_index.

Referenced by BKE_lib_override_library_property_operation_get(), override_remove_button_exec(), and RNA_property_override_property_operation_find().

◆ BKE_lib_override_library_property_operation_get()

IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_get ( IDOverrideLibraryProperty * liboverride_property,
short operation,
const char * subitem_refname,
const char * subitem_locname,
const std::optional< ID * > & subitem_refid,
const std::optional< ID * > & subitem_locid,
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 ( IDOverrideLibraryPropertyOperation * liboverride_property_operation,
PointerRNA * ptr_dst,
PointerRNA * ptr_src,
PointerRNA * ptr_storage,
PropertyRNA * prop_dst,
PropertyRNA * prop_src,
PropertyRNA * prop_storage )

◆ BKE_lib_override_library_property_rna_path_change()

bool BKE_lib_override_library_property_rna_path_change ( IDOverrideLibrary * liboverride,
const char * old_rna_path,
const char * new_rna_path )

Change the RNA path of a library override on a property.

No-op if the property override cannot be found.

Parameters
from_rna_pathThe RNA path of the property to change.
to_rna_pathThe new RNA path. The library override system will copy the string to its own memory; the caller will retain ownership of the passed pointer.
Returns
True if the property was found (and thus changed), false if it wasn't found.

Definition at line 3946 of file lib_override.cc.

References BLI_ghash_insert(), BLI_ghash_popkey(), BLI_strdup(), MEM_SAFE_FREE, override_library_rna_path_mapping_ensure(), and IDOverrideLibraryProperty::rna_path.

Referenced by version_liboverride_nla_strip_frame_start_end().

◆ BKE_lib_override_library_property_search_and_delete()

bool BKE_lib_override_library_property_search_and_delete ( IDOverrideLibrary * liboverride,
const char * rna_path )

Delete a property override from the given ID liboverride, if it exists.

Returns
True when the property was found (and thus deleted), false if it wasn't found.

Definition at line 3985 of file lib_override.cc.

References BLI_ghash_popkey(), lib_override_library_property_delete(), and override_library_rna_path_mapping_ensure().

Referenced by version_liboverride_nla_strip_frame_start_end().

◆ BKE_lib_override_library_proxy_convert()

bool BKE_lib_override_library_proxy_convert ( Main * bmain,
Scene * scene,
ViewLayer * view_layer,
Object * ob_proxy )

Convert a given proxy object into a library override.

Note
This is a thin wrapper around BKE_lib_override_library_create, only extra work is to actually convert the proxy itself into an override first.
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).
Returns
true if override was successfully created.

Definition at line 35 of file lib_override_proxy_conversion.cc.

References BKE_lib_override_library_create(), BKE_lib_override_library_init(), DEG_id_tag_update(), IDOverrideLibrary::flag, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, Collection::id, Object::id, ID_IS_LINKED, ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY, ID_RECALC_SYNC_TO_EVAL, ID_TAG_DOIT, id_us_min(), Object::instance_collection, ID::lib, ID::newid, ID::override_library, and ID::tag.

Referenced by lib_override_library_proxy_convert_do().

◆ BKE_lib_override_library_resync()

bool BKE_lib_override_library_resync ( Main * bmain,
Scene * scene,
ViewLayer * view_layer,
ID * id_root,
Collection * override_resync_residual_storage,
bool do_hierarchy_enforce,
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.
do_hierarchy_enforceIf true, enforce the liboverride hierarchy of dependencies to match the one from the reference linked data (i.e. if some manually override were applied to some ID pointers, they will be reset to the default reference value).
Returns
true if override was successfully resynced.

Definition at line 2765 of file lib_override.cc.

References BKE_id_free(), BKE_main_namemap_destroy(), lib_override_cleanup_after_resync(), lib_override_library_resync(), LinkNode::link, LISTBASE_FOREACH_MUTABLE, Main::name_map_global, and ID::next.

Referenced by blender::ed::outliner::id_override_library_resync_hierarchy_process().

◆ BKE_lib_override_library_status_check_local()

bool BKE_lib_override_library_status_check_local ( Main * bmain,
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 ID_TAG_LIBOVERRIDE_REFOK 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 4354 of file lib_override.cc.

References BKE_pose_ensure(), BLI_assert, Object::data, GS, ID_IS_OVERRIDE_LIBRARY_REAL, ID_OB, 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(), and Object::type.

◆ BKE_lib_override_library_status_check_reference()

bool BKE_lib_override_library_status_check_reference ( Main * bmain,
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 ID_TAG_LIBOVERRIDE_REFOK 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 4400 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, ID_TAG_LIBOVERRIDE_REFOK, OB_ARMATURE, ID::override_library, IDOverrideLibrary::reference, RNA_id_pointer_create(), RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN, RNA_struct_override_matches(), and Object::type.

Referenced by BKE_lib_override_library_status_check_reference().

◆ BKE_lib_override_library_update()

◆ BKE_lib_override_library_validate()

void BKE_lib_override_library_validate ( Main * bmain,
ID * id,
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 )

Get the RNA-property matching the library_prop override property. Used for UI to query additional data about the overridden property (e.g. UI name).

Parameters
idpoinPointer to the override ID.
library_propThe library override property to find the matching RNA property for.
r_indexThe RNA array flat index (i.e. flattened index in case of multi-dimensional array properties). See RNA_path_resolve_full family of functions for details.

Definition at line 3907 of file lib_override.cc.

References BLI_assert, PointerRNA::data, ID_IS_OVERRIDE_LIBRARY, IDOverrideLibraryProperty::rna_path, RNA_path_resolve_property_full(), RNA_struct_is_ID(), and PointerRNA::type.

Referenced by blender::ed::outliner::iterate_properties_to_display().