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) {
307 const char *rna_path,
308 const size_t rna_path_len,
340 const bool is_array_a = prop_a->
is_array;
341 const bool is_array_b = prop_b->
is_array;
343 if (is_array_a != is_array_b) {
346 return is_array_a ? 1 : -1;
353 if (len_a != len_b) {
356 return len_a > len_b ? 1 : -1;
359 if (is_array_a && len_a == 0) {
369 override_diff =
nullptr;
375 override_diff =
nullptr;
380 if (override_diff ==
nullptr) {
385 if (override_diff ==
nullptr) {
388 "'%s' gives unmatching or nullptr RNA diff callbacks, should not happen (%d vs. %d)",
405 rnadiff_ctx.
prop_a = prop_a;
406 rnadiff_ctx.
prop_b = prop_b;
407 rnadiff_ctx.
mode = mode;
413 override_diff(bmain, rnadiff_ctx);
415 if (r_report_flags) {
433 int len_local, len_reference, len_storage = 0;
434 bool changed =
false;
436 if (ptr_storage ==
nullptr) {
447 if (len_local != len_reference || len_local != len_storage) {
458 override_store =
nullptr;
464 override_store =
nullptr;
469 if (override_store ==
nullptr) {
477 override_store =
nullptr;
480 if (override_store ==
nullptr) {
483 "'%s' gives unmatching or nullptr RNA store callbacks, should not happen (%d vs. %d)",
499 if (override_store(bmain,
529 const short override_op = opop->
operation;
532 opop, ptr_dst, ptr_src, ptr_storage, prop_dst, prop_src, prop_storage))
546 override_apply =
nullptr;
552 override_apply =
nullptr;
557 if (override_apply ==
nullptr) {
565 override_apply =
nullptr;
568 if (override_apply ==
nullptr) {
571 "'%s' gives unmatching or nullptr RNA apply callbacks, should not happen (%d vs. %d)",
595 const bool success = override_apply(bmain, rnaapply_ctx);
602 const char *root_path,
603 const size_t root_path_len,
610 bool matching =
true;
621#ifdef DEBUG_OVERRIDE_TIMEIT
622 static float _sum_time_global = 0.0f;
623 static float _num_time_global = 0.0f;
624 double _timeit_time_global;
625 static float _sum_time_diffing = 0.0f;
626 static float _delta_time_diffing = 0.0f;
627 static int _num_delta_time_diffing = 0.0f;
628 static float _num_time_diffing = 0.0f;
629 double _timeit_time_diffing;
632 _delta_time_diffing = 0.0f;
633 _num_delta_time_diffing = 0;
701#define RNA_PATH_BUFFSIZE 8192
703 std::optional<std::string> rna_path;
704 size_t rna_path_len = 0;
708 BLI_assert(strlen(root_path) == root_path_len);
710 const char *prop_name = prop_local.
identifier;
711 const size_t prop_name_len = strlen(prop_name);
714 char *rna_path_c = rna_path_buffer;
718 rna_path_len = root_path_len + 1 + prop_name_len;
723 memcpy(rna_path_c, root_path, root_path_len);
724 rna_path_c[root_path_len] =
'.';
725 memcpy(rna_path_c + root_path_len + 1, prop_name, prop_name_len);
726 rna_path_c[rna_path_len] =
'\0';
729 rna_path_len = root_path_len + 2 + prop_name_len + 2;
734 memcpy(rna_path_c, root_path, root_path_len);
735 rna_path_c[root_path_len] =
'[';
736 rna_path_c[root_path_len + 1] =
'"';
737 memcpy(rna_path_c + root_path_len + 2, prop_name, prop_name_len);
738 rna_path_c[root_path_len + 2 + prop_name_len] =
'"';
739 rna_path_c[root_path_len + 2 + prop_name_len + 1] =
']';
740 rna_path_c[rna_path_len] =
'\0';
743 rna_path.emplace(rna_path_c);
749 rna_path_len = rna_path->size();
758 if (ignore_overridden) {
767#ifdef DEBUG_OVERRIDE_TIMEIT
784#ifdef DEBUG_OVERRIDE_TIMEIT
787 _delta_time_diffing += _delta_time;
788 _num_delta_time_diffing++;
792 matching = matching &&
diff == 0;
793 if (r_report_flags) {
794 *r_report_flags = (*r_report_flags | report_flags);
817 if ((do_restore || do_tag_for_restore) &&
833 rnaapply_ctx.
ptr_dst = *ptr_local;
834 rnaapply_ctx.
ptr_src = *ptr_reference;
843 "Restoreed forbidden liboverride `%s` for override data '%s'",
846 if (r_report_flags) {
852 "Failed to restore forbidden liboverride `%s` for override data '%s'",
861 liboverride, rna_path->c_str(),
nullptr);
885 "Tagging for restoration forbidden liboverride `%s` for override data '%s'",
888 if (r_report_flags) {
897 "We have differences between reference and "
898 "overriding data on non-editable property.");
908 if (!(do_create || do_restore || do_tag_for_restore)) {
914#undef RNA_PATH_BUFFSIZE
918#ifdef DEBUG_OVERRIDE_TIMEIT
921 _sum_time_global += _delta_time;
923 _sum_time_diffing += _delta_time_diffing;
926 printf(
"time end (%s): %.6f\n", __func__, _delta_time);
927 printf(
"time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
929 (_sum_time_global / _num_time_global),
931 int(_num_time_global));
932 printf(
"diffing time end (%s): %.6f (in %d runs)\n",
935 _num_delta_time_diffing);
936 printf(
"diffing time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
938 (_sum_time_diffing / _num_time_diffing),
940 int(_num_time_diffing));
953 bool changed =
false;
955#ifdef DEBUG_OVERRIDE_TIMEIT
971 if (ptr_storage && (ptr_storage->
owner_id !=
nullptr)) {
988#ifdef DEBUG_OVERRIDE_TIMEIT
996 const char *item_name,
997 const int item_name_len,
998 const bool do_id_pointer,
999 const std::optional<ID *> &item_id,
1004 bool is_match =
false;
1006 if (do_id_pointer) {
1007 if (*item_id !=
static_cast<ID *
>(ptr_item_name->
data)) {
1020 ptr_item_name, nameprop, name_buf,
sizeof(name_buf), &namelen);
1022 is_match = ((item_name_len == namelen) &&
STREQ(item_name,
name));
1034 const char *item_name,
1035 const int item_name_len,
1036 const bool do_id_pointer,
1037 const std::optional<ID *> &item_id,
1046 if (do_id_pointer) {
1056 item_name, item_name_len, do_id_pointer, item_id, &iter.
ptr))
1058 *r_ptr_item_name = iter.
ptr;
1066 *r_ptr_item_name = {};
1078 const char *item_name,
1079 const std::optional<ID *> &item_id,
1080 const int item_index,
1082 const bool ignore_index_only_lookup,
1091 const int item_name_len = item_name ? int(strlen(item_name)) : 0;
1098 if (item_index != -1) {
1100 if (item_name && r_ptr_item_index->
type) {
1102 item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_index))
1104 *r_ptr_item_name = *r_ptr_item_index;
1118 if (ignore_index_only_lookup) {
1124 ptr, prop, item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_name))
1159 std::optional<ID *> subitem_local_id = use_id_pointer ? std::optional(opop->
subitem_local_id) :
1161 std::optional<ID *> subitem_reference_id = use_id_pointer ?
1167 if (prop_storage !=
nullptr) {
1179 const bool ignore_index_only_lookup = (subitem_local_id || subitem_reference_id);
1181 PointerRNA ptr_item_dst_name, ptr_item_dst_index;
1182 PointerRNA ptr_item_src_name, ptr_item_src_index;
1183 PointerRNA ptr_item_storage_name, ptr_item_storage_index;
1189 ignore_index_only_lookup,
1191 &ptr_item_src_index);
1195 subitem_reference_id,
1197 ignore_index_only_lookup,
1199 &ptr_item_dst_index);
1210 ptr_item_dst_name.
type ==
nullptr)
1219 ignore_index_only_lookup,
1221 &ptr_item_dst_index);
1234 ignore_index_only_lookup,
1236 &ptr_item_dst_index);
1246 ignore_index_only_lookup,
1248 &ptr_item_src_index);
1256 ignore_index_only_lookup,
1258 &ptr_item_dst_index);
1266 ignore_index_only_lookup,
1268 &ptr_item_src_index);
1272 if (prop_storage !=
nullptr) {
1278 ignore_index_only_lookup,
1279 &ptr_item_storage_name,
1280 &ptr_item_storage_index);
1281 if (ptr_item_storage_name.
data ==
nullptr) {
1285 subitem_reference_id,
1287 ignore_index_only_lookup,
1288 &ptr_item_storage_name,
1289 &ptr_item_storage_index);
1291 if (ptr_item_storage_name.
data ==
nullptr && ptr_item_storage_index.
data ==
nullptr) {
1297 ignore_index_only_lookup,
1298 &ptr_item_storage_name,
1299 &ptr_item_storage_index);
1306 if ((ptr_item_src_name.
type || ptr_item_dst_name.
type) &&
1307 !(ptr_item_src_index.
type && ptr_item_dst_index.
type))
1309 *ptr_item_src = ptr_item_src_name;
1310 *ptr_item_dst = ptr_item_dst_name;
1311 if (prop_storage !=
nullptr) {
1312 *ptr_item_storage = ptr_item_storage_name;
1315 else if (ptr_item_src_index.
type !=
nullptr || ptr_item_dst_index.
type !=
nullptr) {
1316 *ptr_item_src = ptr_item_src_index;
1317 *ptr_item_dst = ptr_item_dst_index;
1318 if (prop_storage !=
nullptr) {
1319 *ptr_item_storage = ptr_item_storage_index;
1326 if (ptr_item_dst->
type ==
nullptr &&
1331 "Failed to find destination sub-item '%s' (%d) of '%s' in new override data '%s'",
1337 if (ptr_item_src->
type ==
nullptr &&
1342 "Failed to find source sub-item '%s' (%d) of '%s' in old override data '%s'",
1357 bmain, ptr_src,
nullptr,
nullptr);
1359 bmain, ptr_dst,
nullptr,
nullptr);
1381 (
ELEM(
nullptr, id_src, id_dst) ||
1391 (id_dst->
lib == id_src->
lib && id_dst != id_owner_dst)))
1398 "Local override %s detected as needing resync due to mismatch in its used IDs",
1399 id_owner_dst->
name);
1407 "Local override %s detected as needing resync as its liboverride reference is "
1408 "already tagged for resync",
1409 id_owner_dst->
name);
1417 const bool do_insert = rnaapply_ctx.
do_insert;
1439 "Failed to apply '%s' override operation on %s\n",
1474 "%s: Ignoring local override on ID pointer custom property '%s', as requested by "
1475 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1487 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1489 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1492 "%s: Ignoring local override on ID pointer property '%s', as requested by "
1493 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1505 "%s: Ignoring all local override on ID pointer collection property '%s', as "
1506 "requested by RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1525#ifdef DEBUG_OVERRIDE_TIMEIT
1533 bool do_insert =
false;
1534 for (
int i = 0;
i < (do_restore_only ? 1 : 2);
i++, do_insert =
true) {
1562 "Failed to apply library override operation to '%s.%s' "
1563 "(could not resolve some properties, local: %d, override: %d)",
1567 id_ptr_dst, op->rna_path, &rnaapply_ctx.
ptr_dst, &rnaapply_ctx.
prop_dst),
1569 id_ptr_src, op->rna_path, &rnaapply_ctx.
ptr_src, &rnaapply_ctx.
prop_src));
1575 if (id_ptr_storage && (id_ptr_storage->
owner_id !=
nullptr)) {
1588 if (op->rna_prop_type ==
PROP_POINTER && op->operations.first !=
nullptr &&
1595 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1597 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1604 bmain, id_ptr_dst, id_ptr_src, &prop_ptr_dst, &prop_ptr_src);
1612 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1615 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1646 ID *id_dst =
static_cast<ID *
>(id_ptr_dst->
data);
1647 ID *id_src =
static_cast<ID *
>(id_ptr_src->
data);
1654#ifdef DEBUG_OVERRIDE_TIMEIT
1664 std::optional<std::string> rna_path;
1669 (*r_owner_id)->override_library, rna_path->c_str());
1680 std::optional<std::string> rna_path;
1682 if (r_created !=
nullptr) {
1711 op,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict);
1718 const short operation,
1724 if (r_created !=
nullptr) {
1735 op, operation,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict, r_created);
1746 return override_status;
1754 bmain,
ptr, prop, index,
false,
nullptr);
1755 if (opop !=
nullptr) {
1765 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_DEBUG(clg_ref,...)
ID and Library types, which are fundamental for SDNA.
@ ID_TAG_LIBOVERRIDE_NEED_RESYNC
@ LIBOVERRIDE_TAG_NEEDS_RESTORE
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIBOVERRIDE_OP_FLAG_MANDATORY
@ LIBOVERRIDE_OP_FLAG_LOCKED
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_ITEM_USE_ID
@ LIBOVERRIDE_OP_FLAG_IDPOINTER_MATCH_REFERENCE
#define ID_IS_LINKED(_id)
@ LIBOVERRIDE_PROP_TAG_NEEDS_RETORE
@ LIBOVERRIDE_PROP_OP_TAG_UNUSED
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ LIBOVERRIDE_FLAG_NO_HIERARCHY
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ 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
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)
bool RNA_pointer_is_null(const PointerRNA *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 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)
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, const bool ignore_index_only_lookup, PointerRNA *r_ptr_item_name, PointerRNA *r_ptr_item_index)
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