Blender V4.3
lib_override.cc File Reference
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#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.hh"
#include "DEG_depsgraph_build.hh"
#include "BKE_anim_data.hh"
#include "BKE_armature.hh"
#include "BKE_blender.hh"
#include "BKE_collection.hh"
#include "BKE_fcurve.hh"
#include "BKE_global.hh"
#include "BKE_idtype.hh"
#include "BKE_key.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_override.hh"
#include "BKE_lib_query.hh"
#include "BKE_lib_remap.hh"
#include "BKE_main.hh"
#include "BKE_main_namemap.hh"
#include "BKE_node.hh"
#include "BKE_report.hh"
#include "BKE_scene.hh"
#include "BLO_readfile.hh"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_memarena.h"
#include "BLI_set.hh"
#include "BLI_string.h"
#include "BLI_task.h"
#include "BLI_time.h"
#include "BLI_utildefines.h"
#include "BLI_vector.hh"
#include "RNA_access.hh"
#include "RNA_path.hh"
#include "RNA_prototypes.hh"
#include "RNA_types.hh"
#include "atomic_ops.h"
#include "lib_intern.hh"

Go to the source code of this file.

Classes

struct  LibOverrideGroupTagData
 
struct  LibOverrideOpCreateData
 

Macros

#define HIERARCHY_BREAKING_ID_TYPES   ID_SCE, ID_LI, ID_SCR, ID_WM, ID_WS
 
#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME   "OVERRIDE_RESYNC_LEFTOVERS"
 

Typedefs

using LibOverrideMissingIDsData_Key = const std::pair<std::string, Library *>
 
using LibOverrideMissingIDsData_Value = std::deque<ID *>
 
using LibOverrideMissingIDsData
 

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 IDOverrideLibraryRuntimeoverride_library_runtime_ensure (IDOverrideLibrary *liboverride)
 
BLI_INLINE void lib_override_object_posemode_transfer (ID *id_dst, ID *id_src)
 
BLI_INLINE const IDOverrideLibraryBKE_lib_override_library_get (const Main *, const ID *id, const ID *, 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 *liboverride, const bool do_id_user)
 
void BKE_lib_override_library_free (IDOverrideLibrary **liboverride, 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 *liboverride_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)
 
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, 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 (id::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 bool lib_override_hierarchy_dependencies_relationship_skip_check (MainIDRelationsEntryItem *relation_id_entry)
 
static bool lib_override_hierarchy_dependencies_skip_check (ID *owner_id, ID *other_id, const bool check_override)
 
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)
 
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, blender::Set< ID * > &processed_ids)
 
void BKE_lib_override_library_main_hierarchy_root_ensure (Main *bmain)
 
static void lib_override_library_remap (Main *bmain, const ID *id_root_reference, blender::Vector< std::pair< ID *, ID * > > &references_and_new_overrides, GHash *linkedref_to_old_override)
 
static LibOverrideMissingIDsData_Key lib_override_library_resync_missing_id_key (ID *id)
 
static LibOverrideMissingIDsData lib_override_library_resync_build_missing_ids_data (Main *bmain)
 
static IDlib_override_library_resync_search_missing_ids_data (LibOverrideMissingIDsData &missing_ids, ID *id_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)
 
static void lib_override_cleanup_after_resync (Main *bmain)
 
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 void lib_override_resync_tagging_finalize_recurse (Main *bmain, ID *id_root, ID *id_from, const int library_indirect_level, bool is_in_partial_resync_hierarchy)
 
static bool lib_override_library_main_resync_id_skip_check (ID *id, const int library_indirect_level)
 
static bool lib_override_resync_tagging_finalize_recursive_check_from (Main *bmain, ID *id, const int library_indirect_level)
 
static void lib_override_resync_tagging_finalize (Main *bmain, GHash *id_roots, const int library_indirect_level)
 
static bool 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 (Main *bmain, ID *id)
 
BLI_INLINE GHashoverride_library_rna_path_mapping_ensure (IDOverrideLibrary *liboverride)
 
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)
 
bool BKE_lib_override_rna_property_find (PointerRNA *idpoin, const IDOverrideLibraryProperty *library_prop, PointerRNA *r_override_poin, PropertyRNA **r_override_prop, int *r_index)
 
bool BKE_lib_override_library_property_rna_path_change (IDOverrideLibrary *liboverride, const char *old_rna_path, const char *new_rna_path)
 
static void lib_override_library_property_delete (IDOverrideLibrary *liboverride, IDOverrideLibraryProperty *liboverride_property, const bool do_runtime_updates)
 
bool BKE_lib_override_library_property_search_and_delete (IDOverrideLibrary *liboverride, const char *rna_path)
 
void BKE_lib_override_library_property_delete (IDOverrideLibrary *liboverride, IDOverrideLibraryProperty *liboverride_property)
 
static IDOverrideLibraryPropertyOperationliboverride_opop_find_name_lib_iterative (ListBase *liboverride_operations, const char *subitem_main_name, const char *subitem_other_name, const std::optional< const ID * > &subitem_main_id, const std::optional< const ID * > &subitem_other_id, const size_t offesetof_opop_main_name, const size_t offesetof_opop_other_name, const size_t offesetof_opop_main_id, const size_t offesetof_opop_other_id)
 
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, const int subitem_refindex, const int subitem_locindex, const bool strict, bool *r_strict)
 
IDOverrideLibraryPropertyOperationBKE_lib_override_library_property_operation_get (IDOverrideLibraryProperty *liboverride_property, const short operation, const char *subitem_refname, const char *subitem_locname, const std::optional< ID * > &subitem_refid, const std::optional< ID * > &subitem_locid, 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 *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)
 
static bool override_library_is_valid (const ID &id, const IDOverrideLibrary &liboverride, ReportList *reports)
 
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)
 
static void lib_override_library_operations_create (Main *bmain, ID *local, const eRNAOverrideMatch liboverride_match_flags, eRNAOverrideMatchResult *r_report_flags)
 
void BKE_lib_override_library_operations_create (Main *bmain, ID *local, int *r_report_flags)
 
void BKE_lib_override_library_operations_restore (Main *bmain, ID *local, int *r_report_flags)
 
static void lib_override_library_operations_create_cb (TaskPool *__restrict pool, void *taskdata)
 
void BKE_lib_override_library_main_operations_create (Main *bmain, const bool force_auto, int *r_report_flags)
 
void BKE_lib_override_library_main_operations_restore (Main *bmain, int *r_report_flags)
 
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 *liboverride_property, const short tag, const bool do_set)
 
void BKE_lib_override_library_properties_tag (IDOverrideLibrary *liboverride, 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)
 
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 *, ID *local)
 
void BKE_lib_override_library_operations_store_finalize (OverrideLibraryStorage *liboverride_storage)
 

Variables

static CLG_LogRef LOG = {"bke.liboverride"}
 
static CLG_LogRef LOG_RESYNC = {"bke.liboverride_resync"}
 

Macro Definition Documentation

◆ HIERARCHY_BREAKING_ID_TYPES

#define HIERARCHY_BREAKING_ID_TYPES   ID_SCE, ID_LI, ID_SCR, ID_WM, ID_WS

◆ OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME

#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME   "OVERRIDE_RESYNC_LEFTOVERS"

Typedef Documentation

◆ LibOverrideMissingIDsData

Initial value:
std::map<LibOverrideMissingIDsData_Key, LibOverrideMissingIDsData_Value>

Definition at line 2043 of file lib_override.cc.

◆ LibOverrideMissingIDsData_Key

using LibOverrideMissingIDsData_Key = const std::pair<std::string, Library *>

Mapping to find suitable missing linked liboverrides to replace by the newly generated linked liboverrides during resync process.

Note
About Order: In most cases, if there are several virtual linked liboverrides generated with the same base name (like OBCube.001, OBCube.002, etc.), this mapping system will find the correct one, for the following reasons:
  • Order of creation of these virtual IDs in resync process is expected to be stable (i.e. several runs of resync code based on the same linked data would re-create the same virtual liboverride IDs in the same order);
  • Order of creation and usage of the mapping data (a FIFO queue) also ensures that the missing placeholder OBCube.001 is always 're-used' before OBCube.002.

In case linked data keep being modified, these conditions may fail and the mapping may start to return 'wrong' results. However, this is considered as an acceptable limitation here, since this is mainly a 'best effort' to recover from situations that should not be happening in the first place.

Definition at line 2041 of file lib_override.cc.

◆ LibOverrideMissingIDsData_Value

using LibOverrideMissingIDsData_Value = std::deque<ID *>

Definition at line 2042 of file lib_override.cc.

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() [1/2]

◆ BKE_lib_override_library_get() [2/2]

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

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_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().

◆ foreachid_is_hierarchy_leaf_fn()

◆ lib_override_cleanup_after_resync()

◆ lib_override_group_tag_data_object_to_collection_init()

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

◆ lib_override_hierarchy_dependencies_recursive_tag_from()

◆ lib_override_hierarchy_dependencies_relationship_skip_check()

◆ lib_override_hierarchy_dependencies_skip_check()

◆ 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 3638 of file lib_override.cc.

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

Referenced by BKE_lib_override_library_main_resync().

◆ lib_override_library_create_do()

◆ lib_override_library_create_from()

◆ lib_override_library_create_post_process()

◆ lib_override_library_id_hierarchy_recursive_reset()

◆ lib_override_library_id_reset_do()

◆ lib_override_library_main_resync_id_skip_check()

◆ lib_override_library_main_resync_on_library_indirect_level()

static bool 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 3270 of file lib_override.cc.

References BKE_id_free(), BKE_id_multi_tagged_delete(), BKE_lib_override_library_is_user_edited(), 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(), BLI_time_now_seconds(), LibOverrideGroupTagData::bmain, CLOG_ERROR, CLOG_INFO, CLOG_WARN, BlendFileReadReport::count, BlendFileReadReport::do_resynced_lib_overrides_libraries_list, BlendFileReadReport::duration, FOREACH_MAIN_ID_BEGIN, FOREACH_MAIN_ID_END, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY_REAL, ID_TAG_DOIT, ID_TAG_LIBOVERRIDE_NEED_RESYNC, ID_TAG_MISSING, LinkNodePair::last_node, ID::lib, lib_override_group_tag_data_object_to_collection_init(), lib_override_hierarchy_dependencies_recursive_tag(), lib_override_hierarchy_dependencies_relationship_skip_check(), lib_override_library_main_resync_id_skip_check(), lib_override_library_resync(), lib_override_linked_group_tag(), lib_override_resync_tagging_finalize(), BlendFileReadReport::lib_overrides_recursive_resync, LIBOVERRIDE_TAG_NEED_RESYNC_ORIGINAL, LIBOVERRIDE_TAG_RESYNC_ISOLATED_FROM_ROOT, LIBRARY_TAG_RESYNC_REQUIRED, LinkNode::link, LinkNodePair::list, LISTBASE_FOREACH_MUTABLE, LOG_RESYNC, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, MEM_freeN(), ID::name, override_library_runtime_ensure(), Main::relations, MainIDRelations::relations_from_pointers, BlendFileReadReport::resynced_lib_overrides, BlendFileReadReport::resynced_lib_overrides_libraries, BlendFileReadReport::resynced_lib_overrides_libraries_count, Library::runtime, scene, ID::tag, IDOverrideLibraryRuntime::tag, Library_Runtime::tag, and MainIDRelationsEntry::to_ids.

Referenced by BKE_lib_override_library_main_resync().

◆ lib_override_library_operations_create()

◆ lib_override_library_operations_create_cb()

◆ lib_override_library_property_clear()

◆ lib_override_library_property_copy()

◆ lib_override_library_property_delete()

◆ lib_override_library_property_operation_clear()

◆ lib_override_library_property_operation_copy()

◆ lib_override_library_remap()

◆ 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 2106 of file lib_override.cc.

References blender::Vector< T, InlineBufferCapacity, Allocator >::append(), BKE_id_multi_tagged_delete(), BKE_key_from_id(), BKE_key_from_id_p(), 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(), BKE_scene_view_layers_synced_ensure(), BKE_view_layer_active_object_get(), BKE_view_layer_synced_ensure(), 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_listbase_is_empty(), LibOverrideGroupTagData::bmain, blender::Vector< T, InlineBufferCapacity, Allocator >::clear(), CLOG_ERROR, CLOG_INFO, CLOG_WARN, 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, Key::id, Object::id, id_fake_user_set(), ID_FLAG_LIB_OVERRIDE_RESYNC_LEFTOVER, ID_GR, ID_IS_LINKED, ID_IS_OVERRIDE_LIBRARY, ID_IS_OVERRIDE_LIBRARY_REAL, ID_KE, ID_NT, ID_OB, ID_REMAP_FORCE_NEVER_NULL_USAGE, ID_REMAP_FORCE_USER_REFCOUNT, ID_REMAP_TYPE_CLEANUP, ID_SCE, ID_TAG_DOIT, ID_TAG_INDIRECT, ID_TAG_LIBOVERRIDE_NEED_RESYNC, ID_TAG_MISSING, ID_TAG_NO_MAIN, ID_TAG_NO_USER_REFCOUNT, ID::lib, 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_library_resync_build_missing_ids_data(), lib_override_library_resync_search_missing_ids_data(), lib_override_linked_group_tag(), lib_override_object_posemode_transfer(), lib_override_overrides_group_tag(), LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE, LISTBASE_FOREACH_MUTABLE, LOG_RESYNC, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, MAX_ID_NAME, ID::name, ID::newid, IDOverrideLibraryProperty::next, LinkNode::next, blender::bke::node_tree_from_id(), OB_DATA_SUPPORT_ID, ID::override_library, Object::parent, 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_library_resync_build_missing_ids_data()

static LibOverrideMissingIDsData lib_override_library_resync_build_missing_ids_data ( Main * bmain)
static

◆ lib_override_library_resync_missing_id_key()

static LibOverrideMissingIDsData_Key lib_override_library_resync_missing_id_key ( ID * id)
static

◆ lib_override_library_resync_search_missing_ids_data()

static ID * lib_override_library_resync_search_missing_ids_data ( LibOverrideMissingIDsData & missing_ids,
ID * id_override )
static

◆ lib_override_linked_group_tag()

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

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

◆ lib_override_overrides_group_tag_recursive()

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

◆ lib_override_resync_tagging_finalize_recurse()

◆ lib_override_resync_tagging_finalize_recursive_check_from()

static bool lib_override_resync_tagging_finalize_recursive_check_from ( Main * bmain,
ID * id,
const int library_indirect_level )
static

Clear 'unreachable' tag of existing liboverrides if they are using another reachable liboverride (typical case: Mesh object which only relationship to the rest of the liboverride hierarchy is through its 'parent' pointer (i.e. rest of the hierarchy has no actual relationship to this mesh object).

Logic and rational of this function are very similar to these of lib_override_hierarchy_dependencies_recursive_tag_from, but withing specific resync context.

Returns
True if it finds a non-isolated 'parent' ID, false otherwise.

Definition at line 3048 of file lib_override.cc.

References BLI_assert, BLI_ghash_lookup(), lib_override_hierarchy_dependencies_relationship_skip_check(), lib_override_library_main_resync_id_skip_check(), lib_override_resync_tagging_finalize_recursive_check_from(), LIBOVERRIDE_TAG_RESYNC_ISOLATED_FROM_ROOT, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_TO, ID::override_library, Main::relations, MainIDRelations::relations_from_pointers, IDOverrideLibrary::runtime, IDOverrideLibraryRuntime::tag, MainIDRelationsEntry::tags, and MainIDRelationsEntry::to_ids.

Referenced by lib_override_resync_tagging_finalize(), and lib_override_resync_tagging_finalize_recursive_check_from().

◆ lib_override_root_find()

◆ lib_override_root_hierarchy_set()

◆ lib_override_sort_libraries_func()

◆ liboverride_opop_find_name_lib_iterative()

static IDOverrideLibraryPropertyOperation * liboverride_opop_find_name_lib_iterative ( ListBase * liboverride_operations,
const char * subitem_main_name,
const char * subitem_other_name,
const std::optional< const ID * > & subitem_main_id,
const std::optional< const ID * > & subitem_other_id,
const size_t offesetof_opop_main_name,
const size_t offesetof_opop_other_name,
const size_t offesetof_opop_main_id,
const size_t offesetof_opop_other_id )
static

◆ override_library_is_valid()

static bool override_library_is_valid ( const ID & id,
const IDOverrideLibrary & liboverride,
ReportList * reports )
static

◆ override_library_rna_path_mapping_ensure()

◆ override_library_runtime_ensure()

Variable Documentation

◆ LOG

◆ LOG_RESYNC