10#include <fmt/format.h>
30#ifdef DEBUG_OVERRIDE_TIMEIT
45#include "RNA_prototypes.hh"
63 std::optional<std::string> *r_rna_path)
65 ID *
id =
ptr->owner_id;
67 const char *rna_path_prefix =
nullptr;
69 if (r_rna_path !=
nullptr) {
70 *r_rna_path = std::nullopt;
86 owner_id = ((
Key *)
id)->from;
87 rna_path_prefix =
"shape_keys.";
99 if (r_rna_path ==
nullptr) {
104 if (rna_path_prefix) {
105 r_rna_path->emplace(fmt::format(
"{}{}", rna_path_prefix, *rna_path));
108 r_rna_path->emplace(std::move(*rna_path));
171 const bool is_overridable)
177 idprop->
flag = is_overridable ? (idprop->
flag | flags) : (idprop->
flag & ~flags);
187 ID *
id =
ptr->owner_id;
221 rnaapply_ctx.
ptr_src = *fromptr;
232 const char *rna_path,
233 const size_t rna_path_len,
250 bmain, &prop_a, &prop_b,
nullptr, 0, mode,
nullptr,
eRNAOverrideMatch(0),
nullptr) ==
260 if (ptr_a ==
nullptr && ptr_b ==
nullptr) {
263 if (ptr_a ==
nullptr || ptr_b ==
nullptr) {
300 const char *rna_path,
301 const size_t rna_path_len,
333 const bool is_array_a = prop_a->
is_array;
334 const bool is_array_b = prop_b->
is_array;
336 if (is_array_a != is_array_b) {
339 return is_array_a ? 1 : -1;
346 if (len_a != len_b) {
349 return len_a > len_b ? 1 : -1;
352 if (is_array_a && len_a == 0) {
362 override_diff =
nullptr;
368 override_diff =
nullptr;
373 if (override_diff ==
nullptr) {
378 if (override_diff ==
nullptr) {
381 "'%s' gives unmatching or nullptr RNA diff callbacks, should not happen (%d vs. %d)",
398 rnadiff_ctx.
prop_a = prop_a;
399 rnadiff_ctx.
prop_b = prop_b;
400 rnadiff_ctx.
mode = mode;
406 override_diff(bmain, rnadiff_ctx);
408 if (r_report_flags) {
426 int len_local, len_reference, len_storage = 0;
427 bool changed =
false;
429 if (ptr_storage ==
nullptr) {
440 if (len_local != len_reference || len_local != len_storage) {
451 override_store =
nullptr;
457 override_store =
nullptr;
462 if (override_store ==
nullptr) {
470 override_store =
nullptr;
473 if (override_store ==
nullptr) {
476 "'%s' gives unmatching or nullptr RNA store callbacks, should not happen (%d vs. %d)",
492 if (override_store(bmain,
522 const short override_op = opop->
operation;
525 opop, ptr_dst, ptr_src, ptr_storage, prop_dst, prop_src, prop_storage))
539 override_apply =
nullptr;
545 override_apply =
nullptr;
550 if (override_apply ==
nullptr) {
558 override_apply =
nullptr;
561 if (override_apply ==
nullptr) {
564 "'%s' gives unmatching or nullptr RNA apply callbacks, should not happen (%d vs. %d)",
588 const bool success = override_apply(bmain, rnaapply_ctx);
595 const char *root_path,
596 const size_t root_path_len,
603 bool matching =
true;
614#ifdef DEBUG_OVERRIDE_TIMEIT
615 static float _sum_time_global = 0.0f;
616 static float _num_time_global = 0.0f;
617 double _timeit_time_global;
618 static float _sum_time_diffing = 0.0f;
619 static float _delta_time_diffing = 0.0f;
620 static int _num_delta_time_diffing = 0.0f;
621 static float _num_time_diffing = 0.0f;
622 double _timeit_time_diffing;
625 _delta_time_diffing = 0.0f;
626 _num_delta_time_diffing = 0;
694#define RNA_PATH_BUFFSIZE 8192
696 std::optional<std::string> rna_path;
697 size_t rna_path_len = 0;
701 BLI_assert(strlen(root_path) == root_path_len);
703 const char *prop_name = prop_local.
identifier;
704 const size_t prop_name_len = strlen(prop_name);
707 char *rna_path_c = rna_path_buffer;
711 rna_path_len = root_path_len + 1 + prop_name_len;
716 memcpy(rna_path_c, root_path, root_path_len);
717 rna_path_c[root_path_len] =
'.';
718 memcpy(rna_path_c + root_path_len + 1, prop_name, prop_name_len);
719 rna_path_c[rna_path_len] =
'\0';
722 rna_path_len = root_path_len + 2 + prop_name_len + 2;
727 memcpy(rna_path_c, root_path, root_path_len);
728 rna_path_c[root_path_len] =
'[';
729 rna_path_c[root_path_len + 1] =
'"';
730 memcpy(rna_path_c + root_path_len + 2, prop_name, prop_name_len);
731 rna_path_c[root_path_len + 2 + prop_name_len] =
'"';
732 rna_path_c[root_path_len + 2 + prop_name_len + 1] =
']';
733 rna_path_c[rna_path_len] =
'\0';
736 rna_path.emplace(rna_path_c);
742 rna_path_len = rna_path->size();
749 CLOG_INFO(&
LOG, 5,
"Override Checking %s", rna_path->c_str());
751 if (ignore_overridden) {
760#ifdef DEBUG_OVERRIDE_TIMEIT
777#ifdef DEBUG_OVERRIDE_TIMEIT
780 _delta_time_diffing += _delta_time;
781 _num_delta_time_diffing++;
785 matching = matching &&
diff == 0;
786 if (r_report_flags) {
787 *r_report_flags = (*r_report_flags | report_flags);
810 if ((do_restore || do_tag_for_restore) &&
826 rnaapply_ctx.
ptr_dst = *ptr_local;
827 rnaapply_ctx.
ptr_src = *ptr_reference;
837 "Restoreed forbidden liboverride `%s` for override data '%s'",
840 if (r_report_flags) {
847 "Failed to restore forbidden liboverride `%s` for override data '%s'",
856 liboverride, rna_path->c_str(),
nullptr);
881 "Tagging for restoration forbidden liboverride `%s` for override data '%s'",
884 if (r_report_flags) {
893 "We have differences between reference and "
894 "overriding data on non-editable property.");
904 if (!(do_create || do_restore || do_tag_for_restore)) {
910#undef RNA_PATH_BUFFSIZE
914#ifdef DEBUG_OVERRIDE_TIMEIT
917 _sum_time_global += _delta_time;
919 _sum_time_diffing += _delta_time_diffing;
922 printf(
"time end (%s): %.6f\n", __func__, _delta_time);
923 printf(
"time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
925 (_sum_time_global / _num_time_global),
927 int(_num_time_global));
928 printf(
"diffing time end (%s): %.6f (in %d runs)\n",
931 _num_delta_time_diffing);
932 printf(
"diffing time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
934 (_sum_time_diffing / _num_time_diffing),
936 int(_num_time_diffing));
949 bool changed =
false;
951#ifdef DEBUG_OVERRIDE_TIMEIT
967 if (ptr_storage && (ptr_storage->
owner_id !=
nullptr)) {
984#ifdef DEBUG_OVERRIDE_TIMEIT
992 const char *item_name,
993 const int item_name_len,
994 const bool do_id_pointer,
995 const std::optional<ID *> &item_id,
1000 bool is_match =
false;
1002 if (do_id_pointer) {
1003 if (*item_id !=
static_cast<ID *
>(ptr_item_name->
data)) {
1016 ptr_item_name, nameprop, name_buf,
sizeof(name_buf), &namelen);
1018 is_match = ((item_name_len == namelen) &&
STREQ(item_name, name));
1030 const char *item_name,
1031 const int item_name_len,
1032 const bool do_id_pointer,
1033 const std::optional<ID *> &item_id,
1042 if (do_id_pointer) {
1052 item_name, item_name_len, do_id_pointer, item_id, &iter.
ptr))
1054 *r_ptr_item_name = iter.
ptr;
1062 *r_ptr_item_name = {};
1074 const char *item_name,
1075 const std::optional<ID *> &item_id,
1076 const int item_index,
1085 const int item_name_len = item_name ? int(strlen(item_name)) : 0;
1092 if (item_index != -1) {
1094 if (item_name && r_ptr_item_index->
type) {
1096 item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_index))
1098 *r_ptr_item_name = *r_ptr_item_index;
1111 ptr, prop, item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_name))
1146 std::optional<ID *> subitem_local_id = use_id_pointer ? std::optional(opop->
subitem_local_id) :
1148 std::optional<ID *> subitem_reference_id = use_id_pointer ?
1154 if (prop_storage !=
nullptr) {
1158 PointerRNA ptr_item_dst_name, ptr_item_dst_index;
1159 PointerRNA ptr_item_src_name, ptr_item_src_index;
1160 PointerRNA ptr_item_storage_name, ptr_item_storage_index;
1167 &ptr_item_src_index);
1171 subitem_reference_id,
1174 &ptr_item_dst_index);
1185 ptr_item_dst_name.
type ==
nullptr)
1195 &ptr_item_dst_index);
1209 &ptr_item_dst_index);
1220 &ptr_item_src_index);
1229 &ptr_item_dst_index);
1238 &ptr_item_src_index);
1242 if (prop_storage !=
nullptr) {
1248 &ptr_item_storage_name,
1249 &ptr_item_storage_index);
1250 if (ptr_item_storage_name.
data ==
nullptr) {
1254 subitem_reference_id,
1256 &ptr_item_storage_name,
1257 &ptr_item_storage_index);
1259 if (ptr_item_storage_name.
data ==
nullptr && ptr_item_storage_index.
data ==
nullptr) {
1265 &ptr_item_storage_name,
1266 &ptr_item_storage_index);
1271 if (ptr_item_src_name.
type !=
nullptr && ptr_item_dst_name.
type !=
nullptr) {
1272 *ptr_item_src = ptr_item_src_name;
1273 *ptr_item_dst = ptr_item_dst_name;
1274 if (prop_storage !=
nullptr) {
1275 *ptr_item_storage = ptr_item_storage_name;
1278 else if (ptr_item_src_index.
type !=
nullptr && ptr_item_dst_index.
type !=
nullptr) {
1279 *ptr_item_src = ptr_item_src_index;
1280 *ptr_item_dst = ptr_item_dst_index;
1281 if (prop_storage !=
nullptr) {
1282 *ptr_item_storage = ptr_item_storage_index;
1289 if (ptr_item_dst->
type ==
nullptr &&
1295 "Failed to find destination sub-item '%s' (%d) of '%s' in new override data '%s'",
1301 if (ptr_item_src->
type ==
nullptr &&
1307 "Failed to find source sub-item '%s' (%d) of '%s' in old override data '%s'",
1322 bmain, ptr_src,
nullptr,
nullptr);
1324 bmain, ptr_dst,
nullptr,
nullptr);
1346 (
ELEM(
nullptr, id_src, id_dst) ||
1356 (id_dst->
lib == id_src->
lib && id_dst != id_owner_dst)))
1364 "Local override %s detected as needing resync due to mismatch in its used IDs",
1365 id_owner_dst->
name);
1374 "Local override %s detected as needing resync as its liboverride reference is "
1375 "already tagged for resync",
1376 id_owner_dst->
name);
1384 const bool do_insert = rnaapply_ctx.
do_insert;
1407 "Failed to apply '%s' override operation on %s\n",
1443 "%s: Ignoring local override on ID pointer custom property '%s', as requested by "
1444 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1456 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1458 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1462 "%s: Ignoring local override on ID pointer property '%s', as requested by "
1463 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1476 "%s: Ignoring all local override on ID pointer collection property '%s', as "
1477 "requested by RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1496#ifdef DEBUG_OVERRIDE_TIMEIT
1504 bool do_insert =
false;
1505 for (
int i = 0;
i < (do_restore_only ? 1 : 2);
i++, do_insert =
true) {
1534 "Failed to apply library override operation to '%s.%s' "
1535 "(could not resolve some properties, local: %d, override: %d)",
1539 id_ptr_dst, op->rna_path, &rnaapply_ctx.
ptr_dst, &rnaapply_ctx.
prop_dst),
1541 id_ptr_src, op->rna_path, &rnaapply_ctx.
ptr_src, &rnaapply_ctx.
prop_src));
1547 if (id_ptr_storage && (id_ptr_storage->
owner_id !=
nullptr)) {
1560 if (op->rna_prop_type ==
PROP_POINTER && op->operations.first !=
nullptr &&
1567 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1569 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1576 bmain, id_ptr_dst, id_ptr_src, &prop_ptr_dst, &prop_ptr_src);
1584 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1587 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1618 ID *id_dst =
static_cast<ID *
>(id_ptr_dst->
data);
1619 ID *id_src =
static_cast<ID *
>(id_ptr_src->
data);
1626#ifdef DEBUG_OVERRIDE_TIMEIT
1636 std::optional<std::string> rna_path;
1641 (*r_owner_id)->override_library, rna_path->c_str());
1652 std::optional<std::string> rna_path;
1654 if (r_created !=
nullptr) {
1683 op,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict);
1690 const short operation,
1696 if (r_created !=
nullptr) {
1707 op, operation,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict, r_created);
1718 return override_status;
1726 bmain,
ptr, prop, index,
false,
nullptr);
1727 if (opop !=
nullptr) {
1737 return override_status;
void BKE_pose_ensure(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
const IDTypeInfo * BKE_idtype_get_info_from_id(const ID *id)
void BKE_lib_override_library_operations_tag(IDOverrideLibraryProperty *liboverride_property, short tag, bool do_set)
IDOverrideLibraryProperty * BKE_lib_override_library_property_find(IDOverrideLibrary *liboverride, const char *rna_path)
IDOverrideLibraryProperty * BKE_lib_override_library_property_get(IDOverrideLibrary *liboverride, const char *rna_path, bool *r_created)
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)
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)
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)
@ LIBRARY_TAG_RESYNC_REQUIRED
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
double BLI_time_now_seconds(void)
Utility defines for timing/benchmarks.
#define TIMEIT_START_AVERAGED(var)
#define TIMEIT_END_AVERAGED(var)
#define UNUSED_VARS_NDEBUG(...)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
ID and Library types, which are fundamental for SDNA.
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ LIBOVERRIDE_PROP_TAG_NEEDS_RETORE
@ LIBOVERRIDE_PROP_OP_TAG_UNUSED
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
@ LIBOVERRIDE_OP_FLAG_MANDATORY
@ LIBOVERRIDE_OP_FLAG_LOCKED
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_ITEM_USE_ID
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE
@ LIBOVERRIDE_FLAG_NO_HIERARCHY
@ LIBOVERRIDE_TAG_NEEDS_RESTORE
@ ID_TAG_LIBOVERRIDE_NEED_RESYNC
@ IDP_FLAG_OVERRIDABLE_LIBRARY
@ NLATRACK_OVERRIDELIBRARY_LOCAL
@ BONE_COLLECTION_OVERRIDE_LIBRARY_LOCAL
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ CONSTRAINT_OVERRIDE_LIBRARY_LOCAL
@ eModifierFlag_OverrideLibrary_Local
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
@ RNA_OVERRIDE_STATUS_OVERRIDABLE
@ RNA_OVERRIDE_STATUS_MANDATORY
@ RNA_OVERRIDE_STATUS_OVERRIDDEN
@ RNA_OVERRIDE_STATUS_LOCKED
@ RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS
@ RNA_OVERRIDE_APPLY_FLAG_SKIP_RESYNC_CHECK
@ RNA_OVERRIDE_APPLY_FLAG_RESTORE_ONLY
@ RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN
@ RNA_OVERRIDE_COMPARE_CREATE
@ RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE
@ RNA_OVERRIDE_COMPARE_RESTORE
@ RNA_OVERRIDE_COMPARE_TAG_FOR_RESTORE
@ RNA_EQ_UNSET_MATCH_NONE
@ RNA_OVERRIDE_MATCH_RESULT_RESTORED
@ RNA_OVERRIDE_MATCH_RESULT_RESTORE_TAGGED
@ RNA_OVERRIDE_MATCH_RESULT_CREATED
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
@ PROPOVERRIDE_NO_COMPARISON
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
VecBase< float, D > constexpr mod(VecOp< float, D >, VecOp< float, D >) RET
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_LINKED(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
void rna_property_rna_or_id_get(PropertyRNA *prop, PointerRNA *ptr, PropertyRNAOrID *r_prop_rna_or_id)
bool RNA_struct_is_ID(const StructRNA *type)
StructRNA * RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
PropertyType RNA_property_type(PropertyRNA *prop)
char * RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen, int *r_len)
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_collection_next(CollectionPropertyIterator *iter)
bool RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_editable(const PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
void RNA_property_collection_end(CollectionPropertyIterator *iter)
PropertyRNA * RNA_struct_iterator_property(StructRNA *type)
bool RNA_property_editable_flag(const PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
PropertyRNA * rna_ensure_property(PropertyRNA *prop)
IDOverrideLibraryPropertyOperation * RNA_property_override_property_operation_get(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, const short operation, const int index, const bool strict, bool *r_strict, bool *r_created)
IDOverrideLibraryProperty * RNA_property_override_property_find(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, ID **r_owner_id)
IDOverrideLibraryProperty * RNA_property_override_property_get(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, bool *r_created)
bool RNA_struct_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, eRNACompareMode mode)
static void rna_property_override_collection_subitem_name_index_lookup(PointerRNA *ptr, PropertyRNA *prop, const char *item_name, const std::optional< ID * > &item_id, const int item_index, PointerRNA *r_ptr_item_name, PointerRNA *r_ptr_item_index)
static bool rna_property_override_collection_subitem_name_id_match(const char *item_name, const int item_name_len, const bool do_id_pointer, const std::optional< ID * > &item_id, PointerRNA *ptr_item_name)
static bool override_apply_property_check_skip(Main *bmain, PointerRNA *id_ptr_dst, PointerRNA *id_ptr_src, RNAPropertyOverrideApplyContext &rnaapply_ctx)
bool RNA_property_overridable_library_set(PointerRNA *, PropertyRNA *prop, const bool is_overridable)
IDOverrideLibraryPropertyOperation * RNA_property_override_property_operation_find(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, const int index, const bool strict, bool *r_strict)
bool RNA_struct_override_store(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, IDOverrideLibrary *liboverride)
static void rna_property_override_apply_ex(Main *bmain, RNAPropertyOverrideApplyContext &rnaapply_ctx)
static bool rna_property_override_operation_store(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage, IDOverrideLibraryProperty *op)
static ID * rna_property_override_property_real_id_owner(Main *, PointerRNA *ptr, PropertyRNA *prop, std::optional< std::string > *r_rna_path)
int RNA_property_override_flag(PropertyRNA *prop)
static void rna_property_override_collection_subitem_lookup(RNAPropertyOverrideApplyContext &rnaapply_ctx)
bool RNA_property_comparable(PointerRNA *, PropertyRNA *prop)
static int rna_property_override_diff(Main *bmain, PropertyRNAOrID *prop_a, PropertyRNAOrID *prop_b, const char *rna_path, const size_t rna_path_len, eRNACompareMode mode, IDOverrideLibrary *liboverride, const eRNAOverrideMatch flags, eRNAOverrideMatchResult *r_report_flags)
#define RNA_PATH_BUFFSIZE
static bool rna_property_override_operation_apply(Main *bmain, RNAPropertyOverrideApplyContext &rnaapply_ctx)
void RNA_struct_override_apply(Main *bmain, PointerRNA *id_ptr_dst, PointerRNA *id_ptr_src, PointerRNA *id_ptr_storage, IDOverrideLibrary *liboverride, const eRNAOverrideApplyFlag flag)
bool RNA_property_overridden(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_overridable_get(const PointerRNA *ptr, PropertyRNA *prop)
static bool rna_property_override_collection_subitem_name_id_lookup(PointerRNA *ptr, PropertyRNA *prop, const char *item_name, const int item_name_len, const bool do_id_pointer, const std::optional< ID * > &item_id, PointerRNA *r_ptr_item_name)
eRNAOverrideStatus RNA_property_override_library_status(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, const int index)
bool RNA_property_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop, eRNACompareMode mode)
static void rna_property_override_check_resync(Main *bmain, PointerRNA *ptr_dst, PointerRNA *ptr_src, PointerRNA *ptr_item_dst, PointerRNA *ptr_item_src)
bool RNA_struct_override_matches(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, const char *root_path, const size_t root_path_len, IDOverrideLibrary *liboverride, const eRNAOverrideMatch flags, eRNAOverrideMatchResult *r_report_flags)
bool RNA_property_copy(Main *bmain, PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index)
bool rna_property_override_apply_default(Main *bmain, RNAPropertyOverrideApplyContext &rnaapply_ctx)
void rna_property_override_diff_default(Main *bmain, RNAPropertyOverrideDiffContext &rnadiff_ctx)
bool rna_property_override_store_default(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage, int len_local, int len_reference, int len_storage, IDOverrideLibraryPropertyOperation *opop)
bool(*)(Main *bmain, RNAPropertyOverrideApplyContext &rnaapply_ctx) RNAPropOverrideApply
void(*)(Main *bmain, RNAPropertyOverrideDiffContext &rnadiff_ctx) RNAPropOverrideDiff
bool(*)(Main *bmain, PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage, int len_local, int len_reference, int len_storage, IDOverrideLibraryPropertyOperation *opop) RNAPropOverrideStore
ID * RNA_find_real_ID_and_path(ID *id, const char **r_path)
bool RNA_path_resolve_property_and_item_pointer(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, PointerRNA *r_item_ptr)
std::optional< std::string > RNA_path_from_ID_to_property(const PointerRNA *ptr, PropertyRNA *prop)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
int subitem_reference_index
char * subitem_local_name
struct ID * subitem_reference_id
struct ID * subitem_local_id
char * subitem_reference_name
unsigned int rna_prop_type
IDOverrideLibraryRuntime * runtime
IDTypeLibOverrideApplyPost lib_override_apply_post
IDOverrideLibrary * override_library
LibraryRuntimeHandle * runtime
RNAPropOverrideApply override_apply
RNAPropOverrideStore override_store
RNAPropOverrideDiff override_diff
PropertyRNA * prop_storage
IDOverrideLibrary * liboverride
IDOverrideLibraryProperty * liboverride_property
eRNAOverrideApplyFlag flag
PointerRNA ptr_item_storage
IDOverrideLibraryPropertyOperation * liboverride_operation
eRNAOverrideMatchResult report_flag
IDOverrideLibrary * liboverride
eRNAOverrideMatch liboverride_flags
PropertyRNA * nameproperty