66 #define OVERRIDE_AUTO_CHECK_DELAY 0.2
69 #ifdef DEBUG_OVERRIDE_TIMEIT
153 op_dst = op_dst->next, op_src = op_src->next) {
186 if ((*override)->runtime !=
NULL) {
187 if ((*override)->runtime->rna_path_to_override_properties !=
NULL) {
205 if (local_id ==
NULL) {
256 const bool do_tagged_remap)
263 if (do_tagged_remap) {
264 Key *reference_key, *local_key =
NULL;
280 if (reference_key !=
NULL) {
320 todo_id_iter =
MEM_callocN(
sizeof(*todo_id_iter), __func__);
321 todo_id_iter->
data = reference_id;
328 for (todo_id_iter = todo_ids.
first; todo_id_iter !=
NULL; todo_id_iter = todo_id_iter->
next) {
329 reference_id = todo_id_iter->
data;
347 reference_key->
id.
newid = &local_key->
id;
356 for (todo_id_iter = todo_ids.
first; todo_id_iter !=
NULL; todo_id_iter = todo_id_iter->
next) {
358 reference_id = todo_id_iter->
data;
359 ID *local_id = reference_id->
newid;
361 if (local_id ==
NULL) {
365 Key *reference_key, *local_key =
NULL;
382 if (reference_key !=
NULL) {
396 for (todo_id_iter = todo_ids.
first; todo_id_iter !=
NULL; todo_id_iter = todo_id_iter->
next) {
397 reference_id = todo_id_iter->
data;
438 to_id_entry = to_id_entry->next) {
445 ID *to_id = *to_id_entry->id_pointer.to;
465 ID *id_owner =
data->id_root;
468 const uint missing_tag =
data->missing_tag;
483 to_id_entry = to_id_entry->next) {
489 ID *to_id = *to_id_entry->id_pointer.to;
494 if (to_id->
lib != id_owner->
lib) {
504 to_id->
tag |= missing_tag;
531 ID *id_root =
data->id_root;
534 id_root->
tag |=
data->missing_tag;
548 for (
bPoseChannel *pchan = ob->pose->chanbase.first; pchan !=
NULL; pchan = pchan->next) {
549 if (pchan->custom !=
NULL) {
550 pchan->custom->id.tag &= ~(
data->tag |
data->missing_tag);
561 ID *id_owner =
data->id_root;
564 const uint missing_tag =
data->missing_tag;
579 to_id_entry = to_id_entry->next) {
585 ID *to_id = *to_id_entry->id_pointer.to;
598 reference_lib = ((
Key *)id_owner)->from->override_library->reference->lib;
609 to_id->
tag |= missing_tag;
626 ID *id_root =
data->id_root;
630 id_root->
tag |=
data->missing_tag;
661 const bool is_resync)
672 if (!is_resync && id_root !=
NULL && id_root->
newid !=
NULL) {
673 switch (
GS(id_root->
name)) {
682 if (ob_reference !=
NULL) {
685 else if (id_reference !=
NULL) {
714 Collection *default_instantiating_collection = residual_storage;
722 if (id_root !=
NULL && default_instantiating_collection ==
NULL) {
724 switch (
GS(id_ref->
name)) {
737 bmain, (
Collection *)id_root,
"OVERRIDE_HIDDEN");
751 default_instantiating_collection = collection;
760 if (default_instantiating_collection ==
NULL) {
798 bmain,
scene, view_layer, id_root, id_reference,
NULL,
false);
842 const bool is_override_instancing_object = ob_proxy_group !=
NULL;
845 ID *id_reference = is_override_instancing_object ? &ob_proxy_group->
id : &ob_proxy->
id;
881 const bool do_hierarchy_enforce,
882 const bool do_post_process)
895 data.id_root = id_root_reference;
935 bool do_break =
false;
973 ID *id_override_new =
id->
newid;
978 if (id_override_old !=
NULL) {
981 memcpy(id_name_buf, id_override_old->
name,
sizeof(id_name_buf));
982 memcpy(id_override_old->
name, id_override_new->
name,
sizeof(id_override_old->
name));
983 memcpy(id_override_new->
name, id_name_buf,
sizeof(id_override_new->
name));
1002 op_new = op_new->next, op_old = op_old->next) {
1017 ID *id_override_new =
id->
newid;
1020 if (id_override_old !=
NULL) {
1050 do_hierarchy_enforce ?
1069 if (id_override_old !=
NULL) {
1090 CLOG_INFO(&
LOG, 2,
"Old override %s is being kept around as it was user-edited",
id->
name);
1100 id_root = id_root_reference->
newid;
1102 if (do_post_process) {
1113 override_resync_residual_storage,
1144 #define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME "OVERRIDE_RESYNC_LEFTOVERS"
1147 if (override_resync_residual_storage !=
NULL &&
1148 override_resync_residual_storage->
id.
lib !=
NULL) {
1149 override_resync_residual_storage =
NULL;
1151 if (override_resync_residual_storage ==
NULL) {
1179 .id_root =
id->override_library->reference,
1205 entry_item = entry_item->next) {
1209 ID *id_to = *entry_item->id_pointer.to;
1216 "ID %s now tagged as needing resync because they use linked %s that now needs "
1232 bool do_continue =
true;
1233 while (do_continue) {
1235 do_continue =
false;
1256 bmain,
scene, view_layer,
id, override_resync_residual_storage,
false,
false);
1270 bmain,
scene, view_layer,
NULL,
NULL, override_resync_residual_storage,
true);
1337 if (shape_key !=
NULL) {
1343 if (master_collection !=
NULL) {
1360 return override->runtime;
1382 const char *rna_path)
1392 const char *rna_path,
1409 else if (r_created) {
1430 idpoin, library_prop->
rna_path, r_override_poin, r_override_prop);
1442 opop_dst = opop_dst->next, opop_src = opop_src->next) {
1480 const char *subitem_refname,
1481 const char *subitem_locname,
1482 const int subitem_refindex,
1483 const int subitem_locindex,
1488 const int subitem_defindex = -1;
1494 if (subitem_locname !=
NULL) {
1512 if (subitem_refname !=
NULL) {
1534 sizeof(subitem_locindex),
1542 sizeof(subitem_refindex),
1549 if (!strict && (subitem_locindex != subitem_defindex) &&
1553 sizeof(subitem_defindex),
1569 const short operation,
1570 const char *subitem_refname,
1571 const char *subitem_locname,
1572 const int subitem_refindex,
1573 const int subitem_locindex,
1590 if (subitem_locname) {
1593 if (subitem_refname) {
1605 else if (r_created) {
1656 switch (override_property_operation->
operation) {
1664 if (ptr_storage ==
NULL || ptr_storage->
data ==
NULL || prop_storage ==
NULL) {
1665 BLI_assert(!
"Missing data to apply differential override operation.");
1676 BLI_assert(!
"Missing data to apply override operation.");
1699 "Data corruption: data-block '%s' is using itself as library override reference",
1701 id->override_library->reference =
NULL;
1709 "Data corruption: data-block '%s' is using another local data-block ('%s') as "
1710 "library override reference",
1713 id->override_library->reference =
NULL;
1747 if (reference ==
NULL) {
1806 if (reference ==
NULL) {
1874 bool created =
false;
1917 CLOG_INFO(&
LOG, 2,
"We did restore some properties of %s from its reference", local->
name);
1920 CLOG_INFO(&
LOG, 2,
"We did generate library override rules for %s", local->
name);
1951 #ifdef DEBUG_OVERRIDE_TIMEIT
2009 #ifdef DEBUG_OVERRIDE_TIMEIT
2013 return create_pool_data.
changed;
2018 bool was_op_deleted =
false;
2022 bool do_op_delete =
true;
2024 if (is_collection || op->rna_prop_type ==
PROP_POINTER) {
2041 if (is_collection) {
2061 was_op_deleted =
true;
2065 if (was_op_deleted) {
2072 return was_op_deleted;
2099 if (entry_vp ==
NULL) {
2118 to_id_entry = to_id_entry->next) {
2125 if (*to_id_entry->id_pointer.to !=
NULL) {
2126 ID *to_id = *to_id_entry->id_pointer.to;
2160 if (override_property !=
NULL) {
2162 override_property->
tag |= tag;
2165 override_property->
tag &= ~tag;
2184 if (
override !=
NULL) {
2282 if (tmp_id ==
NULL) {
2296 if (local_key !=
NULL && tmp_key !=
NULL) {
2300 PointerRNA rnaptr_src, rnaptr_dst, rnaptr_storage_stack, *rnaptr_storage =
NULL;
2304 rnaptr_storage = &rnaptr_storage_stack;
2319 if (local_key !=
NULL && tmp_key !=
NULL) {
2327 local_key->
from = local;
2328 tmp_key->
from = tmp_id;
2339 if (ob->pose !=
NULL && ob->data == local) {
2434 #ifdef DEBUG_OVERRIDE_TIMEIT
2455 if (storage_id !=
NULL) {
2456 PointerRNA rnaptr_reference, rnaptr_final, rnaptr_storage;
2473 #ifdef DEBUG_OVERRIDE_TIMEIT
void BKE_pose_ensure(struct Main *bmain, struct Object *ob, struct bArmature *arm, const bool do_id_user)
void BKE_pose_clear_pointers(struct bPose *pose)
struct Collection * BKE_collection_add(struct Main *bmain, struct Collection *parent, const char *name)
void BKE_collection_object_add_from(struct Main *bmain, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst)
bool BKE_collection_object_add(struct Main *bmain, struct Collection *collection, struct Object *ob)
struct GSet * BKE_scene_objects_as_gset(struct Scene *scene, struct GSet *objects_gset)
void BKE_collection_add_from_object(struct Main *bmain, struct Scene *scene, const struct Object *ob_src, struct Collection *collection_dst)
bool BKE_collection_has_object(struct Collection *collection, const struct Object *ob)
void BKE_collection_add_from_collection(struct Main *bmain, struct Scene *scene, struct Collection *collection_src, struct Collection *collection_dst)
bool BKE_collection_is_in_scene(struct Collection *collection)
bool BKE_collection_is_empty(const struct Collection *collection)
bool BKE_collection_delete(struct Main *bmain, struct Collection *collection, bool hierarchy)
bool BKE_idtype_idcode_is_linkable(const short idcode)
struct Key * BKE_key_from_id(struct ID *id)
struct Key ** BKE_key_from_id_p(struct ID *id)
void BKE_main_collection_sync(const struct Main *bmain)
bool BKE_view_layer_has_collection(struct ViewLayer *view_layer, const struct Collection *collection)
struct ID * BKE_id_copy(struct Main *bmain, const struct ID *id)
void id_us_min(struct ID *id)
void BKE_main_id_tag_all(struct Main *mainvar, const int tag, const bool value)
void id_fake_user_set(struct ID *id)
@ LIB_ID_COPY_NO_LIB_OVERRIDE
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag)
void BKE_main_id_clear_newpoins(struct Main *bmain)
void id_us_plus(struct ID *id)
void BKE_id_delete(struct Main *bmain, void *idv) ATTR_NONNULL()
size_t BKE_id_multi_tagged_delete(struct Main *bmain) ATTR_NONNULL()
void BKE_id_free_ex(struct Main *bmain, void *idv, int flag, const bool use_flag_from_idtag)
void BKE_lib_id_swap(struct Main *bmain, struct ID *id_a, struct ID *id_b)
@ IDWALK_CB_OVERRIDE_LIBRARY_NOT_OVERRIDABLE
void void BKE_libblock_remap(struct Main *bmain, void *old_idv, void *new_idv, const short remap_flags) ATTR_NONNULL(1
void BKE_libblock_relink_ex(struct Main *bmain, void *idv, void *old_idv, void *new_idv, const short remap_flags) ATTR_NONNULL(1
@ ID_REMAP_SKIP_OVERRIDE_LIBRARY
@ ID_REMAP_SKIP_INDIRECT_USAGE
#define FOREACH_MAIN_ID_END
struct Main * BKE_main_new(void)
void BKE_main_relations_create(struct Main *bmain, const short flag)
#define FOREACH_MAIN_LISTBASE_ID_END
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
void BKE_main_relations_tag_set(struct Main *bmain, const MainIDRelationsEntryTags tag, const bool value)
#define FOREACH_MAIN_LISTBASE_END
@ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED
void BKE_main_relations_free(struct Main *bmain)
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void BKE_main_free(struct Main *mainvar)
struct bNodeTree * ntreeFromID(struct ID *id)
void BKE_reportf(ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_assert_unreachable()
bool BLI_ghashutil_strcmp(const void *a, const void *b)
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
unsigned int BLI_ghashutil_ptrhash(const void *key)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_haskey(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
unsigned int BLI_ghashutil_strhash_p_murmur(const void *ptr)
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void * BLI_gset_lookup(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring_ptr(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void * BLI_listbase_bytes_find(const ListBase *listbase, const void *bytes, const size_t bytes_size, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_listbase_swaplinks(struct ListBase *listbase, void *vlinka, void *vlinkb) ATTR_NONNULL(1
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
void * BLI_task_pool_user_data(TaskPool *pool)
void BLI_task_pool_work_and_wait(TaskPool *pool)
TaskPool * BLI_task_pool_create(void *userdata, TaskPriority priority)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
#define UNUSED_VARS_NDEBUG(...)
#define CLOG_INFO(clg_ref, level,...)
void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_relations_tag_update(struct Main *bmain)
ID and Library types, which are fundamental for sdna.
#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id)
@ ID_RECALC_COPY_ON_WRITE
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIB_TAG_OVERRIDE_LIBRARY_REFOK
@ LIB_TAG_LIB_OVERRIDE_NEED_RESYNC
@ LIB_TAG_OVERRIDE_LIBRARY_AUTOREFRESH
#define ID_IS_OVERRIDABLE_LIBRARY(_id)
#define ID_IS_LINKED(_id)
@ LIB_LIB_OVERRIDE_RESYNC_LEFTOVER
@ LIB_EMBEDDED_DATA_LIB_OVERRIDE
@ IDOVERRIDE_LIBRARY_RUNTIME_TAG_NEEDS_RELOAD
@ IDOVERRIDE_LIBRARY_FLAG_IDPOINTER_MATCH_REFERENCE
@ IDOVERRIDE_LIBRARY_TAG_UNUSED
#define ID_REAL_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define ID_IS_OVERRIDE_LIBRARY_TEMPLATE(_id)
@ IDOVERRIDE_LIBRARY_OP_MULTIPLY
@ IDOVERRIDE_LIBRARY_OP_INSERT_AFTER
@ IDOVERRIDE_LIBRARY_OP_NOOP
@ IDOVERRIDE_LIBRARY_OP_SUBTRACT
@ IDOVERRIDE_LIBRARY_OP_ADD
@ IDOVERRIDE_LIBRARY_OP_INSERT_BEFORE
@ IDOVERRIDE_LIBRARY_OP_REPLACE
Object groups, one object can be in many groups at once.
@ COLLECTION_RESTRICT_RENDER
@ COLLECTION_RESTRICT_VIEWPORT
Object is a sort of wrapper for general info.
#define OB_DATA_SUPPORT_ID(_id_type)
Read Guarded memory(de)allocation.
Utility defines for timing/benchmarks.
#define TIMEIT_START_AVERAGED(var)
#define TIMEIT_END_AVERAGED(var)
@ RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS
@ RNA_OVERRIDE_APPLY_FLAG_NOP
@ RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN
@ RNA_OVERRIDE_COMPARE_CREATE
@ RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE
@ RNA_OVERRIDE_COMPARE_RESTORE
@ RNA_OVERRIDE_MATCH_RESULT_RESTORED
@ RNA_OVERRIDE_MATCH_RESULT_CREATED
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE uint8_t atomic_fetch_and_or_uint8(uint8_t *p, uint8_t b)
static bool lib_override_hierarchy_dependencies_recursive_tag(LibOverrideGroupTagData *data)
void BKE_lib_override_library_operations_store_finalize(OverrideLibraryStorage *override_storage)
static void lib_override_library_property_clear(IDOverrideLibraryProperty *op)
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, const bool do_post_process)
void BKE_lib_override_library_validate(Main *UNUSED(bmain), ID *id, ReportList *reports)
bool BKE_lib_override_library_proxy_convert(Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob_proxy)
static void lib_override_library_create_post_process(Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, ID *id_reference, Collection *residual_storage, const bool is_resync)
ID * BKE_lib_override_library_create_from_id(Main *bmain, ID *reference_id, const bool do_tagged_remap)
void BKE_lib_override_library_main_validate(Main *bmain, ReportList *reports)
bool BKE_lib_override_library_create(Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, ID *id_reference)
static void lib_override_linked_group_tag(LibOverrideGroupTagData *data)
IDOverrideLibraryProperty * BKE_lib_override_library_property_get(IDOverrideLibrary *override, const char *rna_path, bool *r_created)
bool BKE_lib_override_library_template_create(struct ID *id)
void BKE_lib_override_library_main_tag(struct Main *bmain, const short tag, const bool do_set)
ID * BKE_lib_override_library_operations_store_start(Main *bmain, OverrideLibraryStorage *override_storage, ID *local)
#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME
static void lib_override_local_group_tag(LibOverrideGroupTagData *data)
static void lib_override_library_property_operation_copy(IDOverrideLibraryPropertyOperation *opop_dst, IDOverrideLibraryPropertyOperation *opop_src)
void BKE_lib_override_library_clear(IDOverrideLibrary *override, const bool do_id_user)
bool BKE_lib_override_library_status_check_reference(Main *bmain, ID *local)
bool BKE_lib_override_library_operations_create(Main *bmain, ID *local)
void BKE_lib_override_library_update(Main *bmain, ID *local)
void BKE_lib_override_library_id_unused_cleanup(struct ID *local)
static void lib_override_id_swap(Main *bmain, ID *id_local, ID *id_temp)
static void lib_override_local_group_tag_recursive(LibOverrideGroupTagData *data)
OverrideLibraryStorage * BKE_lib_override_library_operations_store_init(void)
BLI_INLINE GHash * override_library_rna_path_mapping_ensure(IDOverrideLibrary *override)
IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_get(IDOverrideLibraryProperty *override_property, const short operation, const char *subitem_refname, const char *subitem_locname, const int subitem_refindex, const int subitem_locindex, const bool strict, bool *r_strict, bool *r_created)
IDOverrideLibrary * BKE_lib_override_library_init(ID *local_id, ID *reference_id)
void BKE_lib_override_library_main_unused_cleanup(struct Main *bmain)
static void lib_override_library_operations_create_cb(TaskPool *__restrict pool, void *taskdata)
bool BKE_lib_override_library_create_from_tag(Main *bmain)
static ID * lib_override_library_create_from(Main *bmain, ID *reference_id)
void BKE_lib_override_library_main_resync(Main *bmain, Scene *scene, ViewLayer *view_layer)
void BKE_lib_override_library_operations_store_end(OverrideLibraryStorage *UNUSED(override_storage), ID *local)
void BKE_lib_override_library_id_reset(Main *bmain, ID *id_root)
bool BKE_lib_override_library_status_check_local(Main *bmain, ID *local)
void BKE_lib_override_library_properties_tag(struct IDOverrideLibrary *override, const short tag, const bool do_set)
bool BKE_lib_override_library_is_user_edited(struct ID *id)
void BKE_lib_override_library_operations_tag(struct IDOverrideLibraryProperty *override_property, const short tag, const bool do_set)
bool BKE_lib_override_library_property_operation_operands_validate(struct IDOverrideLibraryPropertyOperation *override_property_operation, struct PointerRNA *ptr_dst, struct PointerRNA *ptr_src, struct PointerRNA *ptr_storage, struct PropertyRNA *prop_dst, struct PropertyRNA *prop_src, struct PropertyRNA *prop_storage)
void BKE_lib_override_library_property_delete(IDOverrideLibrary *override, IDOverrideLibraryProperty *override_property)
static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *id_root)
void BKE_lib_override_library_free(struct IDOverrideLibrary **override, const bool do_id_user)
static bool lib_override_library_create_do(Main *bmain, ID *id_root)
void BKE_lib_override_library_delete(Main *bmain, ID *id_root)
static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *data)
static void lib_override_library_property_operation_clear(IDOverrideLibraryPropertyOperation *opop)
void BKE_lib_override_library_main_update(Main *bmain)
void BKE_lib_override_library_make_local(ID *id)
BLI_INLINE IDOverrideLibraryRuntime * override_library_rna_path_runtime_ensure(IDOverrideLibrary *override)
IDOverrideLibraryPropertyOperation * BKE_lib_override_library_property_operation_find(IDOverrideLibraryProperty *override_property, const char *subitem_refname, const char *subitem_locname, const int subitem_refindex, const int subitem_locindex, const bool strict, bool *r_strict)
void BKE_lib_override_library_id_hierarchy_reset(Main *bmain, ID *id_root)
static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root)
IDOverrideLibraryProperty * BKE_lib_override_library_property_find(IDOverrideLibrary *override, const char *rna_path)
bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool force_auto)
struct LibOverrideGroupTagData LibOverrideGroupTagData
void BKE_lib_override_library_copy(ID *dst_id, const ID *src_id, const bool do_full_copy)
void BKE_lib_override_library_property_operation_delete(IDOverrideLibraryProperty *override_property, IDOverrideLibraryPropertyOperation *override_property_operation)
bool BKE_lib_override_rna_property_find(PointerRNA *idpoin, const IDOverrideLibraryProperty *library_prop, PointerRNA *r_override_poin, PropertyRNA **r_override_prop)
static void lib_override_library_property_copy(IDOverrideLibraryProperty *op_dst, IDOverrideLibraryProperty *op_src)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
bool RNA_struct_is_ID(const StructRNA *type)
PropertyType RNA_property_type(PropertyRNA *prop)
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
StructRNA * RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_path_resolve_property(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
bool RNA_struct_override_store(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, IDOverrideLibrary *override)
void RNA_struct_override_apply(Main *bmain, PointerRNA *ptr_dst, PointerRNA *ptr_src, PointerRNA *ptr_storage, IDOverrideLibrary *override, const eRNAOverrideApplyFlag flag)
bool RNA_struct_override_matches(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, const char *root_path, const size_t root_path_len, IDOverrideLibrary *override, const eRNAOverrideMatch flags, eRNAOverrideMatchResult *r_report_flags)
int subitem_reference_index
char * subitem_local_name
char * subitem_reference_name
struct GHash * rna_path_to_override_properties
IDOverrideLibraryRuntime * runtime
IDOverrideLibrary * override_library
struct MainIDRelationsEntryItem * to_ids
struct GHash * relations_from_pointers
struct MainIDRelations * relations
struct Object * proxy_group
struct Collection * instance_collection
struct Object * proxy_from
struct Collection * master_collection