10#include <fmt/format.h>
32#ifdef DEBUG_OVERRIDE_TIMEIT
47#include "RNA_prototypes.hh"
65 std::optional<std::string> *r_rna_path)
69 const char *rna_path_prefix =
nullptr;
71 if (r_rna_path !=
nullptr) {
72 *r_rna_path = std::nullopt;
86 switch (
GS(id->name)) {
88 owner_id = ((
Key *)
id)->from;
89 rna_path_prefix =
"shape_keys.";
101 if (r_rna_path ==
nullptr) {
106 if (rna_path_prefix) {
107 r_rna_path->emplace(fmt::format(
"{}{}", rna_path_prefix, *rna_path));
110 r_rna_path->emplace(std::move(*rna_path));
173 const bool is_overridable)
179 idprop->
flag = is_overridable ? (idprop->
flag | flags) : (idprop->
flag & ~flags);
218 opop.subitem_reference_index = index;
219 opop.subitem_local_index = index;
223 rnaapply_ctx.
ptr_src = *fromptr;
234 const char *rna_path,
235 const size_t rna_path_len,
252 bmain, &prop_a, &prop_b,
nullptr, 0, mode,
nullptr,
eRNAOverrideMatch(0),
nullptr) ==
262 if (ptr_a ==
nullptr && ptr_b ==
nullptr) {
265 if (ptr_a ==
nullptr || ptr_b ==
nullptr) {
302 const char *rna_path,
303 const size_t rna_path_len,
335 const bool is_array_a = prop_a->
is_array;
336 const bool is_array_b = prop_b->
is_array;
338 if (is_array_a != is_array_b) {
341 return is_array_a ? 1 : -1;
348 if (len_a != len_b) {
351 return len_a > len_b ? 1 : -1;
354 if (is_array_a && len_a == 0) {
364 override_diff =
nullptr;
370 override_diff =
nullptr;
375 if (override_diff ==
nullptr) {
380 if (override_diff ==
nullptr) {
383 "'%s' gives unmatching or nullptr RNA diff callbacks, should not happen (%d vs. %d)",
396 diff_flags &= ~RNA_OVERRIDE_COMPARE_CREATE;
400 rnadiff_ctx.
prop_a = prop_a;
401 rnadiff_ctx.
prop_b = prop_b;
402 rnadiff_ctx.
mode = mode;
408 override_diff(bmain, rnadiff_ctx);
410 if (r_report_flags) {
428 int len_local, len_reference, len_storage = 0;
429 bool changed =
false;
431 if (ptr_storage ==
nullptr) {
442 if (len_local != len_reference || len_local != len_storage) {
453 override_store =
nullptr;
459 override_store =
nullptr;
464 if (override_store ==
nullptr) {
472 override_store =
nullptr;
475 if (override_store ==
nullptr) {
478 "'%s' gives unmatching or nullptr RNA store callbacks, should not happen (%d vs. %d)",
494 if (override_store(bmain,
524 const short override_op = opop->
operation;
527 opop, ptr_dst, ptr_src, ptr_storage, prop_dst, prop_src, prop_storage))
541 override_apply =
nullptr;
547 override_apply =
nullptr;
552 if (override_apply ==
nullptr) {
560 override_apply =
nullptr;
563 if (override_apply ==
nullptr) {
566 "'%s' gives unmatching or nullptr RNA apply callbacks, should not happen (%d vs. %d)",
590 const bool success = override_apply(bmain, rnaapply_ctx);
597 const char *root_path,
598 const size_t root_path_len,
605 bool matching =
true;
616#ifdef DEBUG_OVERRIDE_TIMEIT
617 static float _sum_time_global = 0.0f;
618 static float _num_time_global = 0.0f;
619 double _timeit_time_global;
620 static float _sum_time_diffing = 0.0f;
621 static float _delta_time_diffing = 0.0f;
622 static int _num_delta_time_diffing = 0.0f;
623 static float _num_time_diffing = 0.0f;
624 double _timeit_time_diffing;
627 _delta_time_diffing = 0.0f;
628 _num_delta_time_diffing = 0;
696#define RNA_PATH_BUFFSIZE 8192
698 std::optional<std::string> rna_path;
699 size_t rna_path_len = 0;
703 BLI_assert(strlen(root_path) == root_path_len);
705 const char *prop_name = prop_local.
identifier;
706 const size_t prop_name_len = strlen(prop_name);
709 char *rna_path_c = rna_path_buffer;
713 rna_path_len = root_path_len + 1 + prop_name_len;
715 rna_path =
static_cast<char *
>(
MEM_mallocN(rna_path_len + 1, __func__));
718 memcpy(rna_path_c, root_path, root_path_len);
719 rna_path_c[root_path_len] =
'.';
720 memcpy(rna_path_c + root_path_len + 1, prop_name, prop_name_len);
721 rna_path_c[rna_path_len] =
'\0';
724 rna_path_len = root_path_len + 2 + prop_name_len + 2;
726 rna_path_c =
static_cast<char *
>(
MEM_mallocN(rna_path_len + 1, __func__));
729 memcpy(rna_path_c, root_path, root_path_len);
730 rna_path_c[root_path_len] =
'[';
731 rna_path_c[root_path_len + 1] =
'"';
732 memcpy(rna_path_c + root_path_len + 2, prop_name, prop_name_len);
733 rna_path_c[root_path_len + 2 + prop_name_len] =
'"';
734 rna_path_c[root_path_len + 2 + prop_name_len + 1] =
']';
735 rna_path_c[rna_path_len] =
'\0';
738 rna_path.emplace(rna_path_c);
744 rna_path_len = rna_path->size();
751 CLOG_INFO(&
LOG, 5,
"Override Checking %s", rna_path->c_str());
753 if (ignore_overridden) {
762#ifdef DEBUG_OVERRIDE_TIMEIT
779#ifdef DEBUG_OVERRIDE_TIMEIT
782 _delta_time_diffing += _delta_time;
783 _num_delta_time_diffing++;
787 matching = matching &&
diff == 0;
788 if (r_report_flags) {
789 *r_report_flags = (*r_report_flags | report_flags);
812 if ((do_restore || do_tag_for_restore) &&
824 opop_tmp.subitem_reference_index = -1;
825 opop_tmp.subitem_local_index = -1;
828 rnaapply_ctx.
ptr_dst = *ptr_local;
829 rnaapply_ctx.
ptr_src = *ptr_reference;
839 "Restoreed forbidden liboverride `%s` for override data '%s'",
842 if (r_report_flags) {
849 "Failed to restore forbidden liboverride `%s` for override data '%s'",
858 liboverride, rna_path->c_str(),
nullptr);
883 "Tagging for restoration forbidden liboverride `%s` for override data '%s'",
886 if (r_report_flags) {
895 "We have differences between reference and "
896 "overriding data on non-editable property.");
906 if (!(do_create || do_restore || do_tag_for_restore)) {
912#undef RNA_PATH_BUFFSIZE
916#ifdef DEBUG_OVERRIDE_TIMEIT
919 _sum_time_global += _delta_time;
921 _sum_time_diffing += _delta_time_diffing;
924 printf(
"time end (%s): %.6f\n", __func__, _delta_time);
925 printf(
"time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
927 (_sum_time_global / _num_time_global),
929 int(_num_time_global));
930 printf(
"diffing time end (%s): %.6f (in %d runs)\n",
933 _num_delta_time_diffing);
934 printf(
"diffing time averaged (%s): %.6f (total: %.6f, in %d runs)\n",
936 (_sum_time_diffing / _num_time_diffing),
938 int(_num_time_diffing));
951 bool changed =
false;
953#ifdef DEBUG_OVERRIDE_TIMEIT
969 if (ptr_storage && (ptr_storage->
owner_id !=
nullptr)) {
986#ifdef DEBUG_OVERRIDE_TIMEIT
994 const char *item_name,
995 const int item_name_len,
996 const bool do_id_pointer,
997 const std::optional<ID *> &item_id,
1002 bool is_match =
false;
1004 if (do_id_pointer) {
1005 if (*item_id !=
static_cast<ID *
>(ptr_item_name->
data)) {
1018 ptr_item_name, nameprop, name_buf,
sizeof(name_buf), &namelen);
1020 is_match = ((item_name_len == namelen) &&
STREQ(item_name, name));
1032 const char *item_name,
1033 const int item_name_len,
1034 const bool do_id_pointer,
1035 const std::optional<ID *> &item_id,
1044 if (do_id_pointer) {
1054 item_name, item_name_len, do_id_pointer, item_id, &iter.
ptr))
1056 *r_ptr_item_name = iter.
ptr;
1064 *r_ptr_item_name = {};
1077 const char *item_name,
1078 const std::optional<ID *> &item_id,
1079 const int item_index,
1088 const int item_name_len = item_name ?
int(strlen(item_name)) : 0;
1095 if (item_index != -1) {
1097 if (item_name && r_ptr_item_index->
type) {
1099 item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_index))
1101 *r_ptr_item_name = *r_ptr_item_index;
1114 ptr, prop, item_name, item_name_len, do_id_pointer, item_id, r_ptr_item_name))
1149 std::optional<ID *> subitem_local_id = use_id_pointer ? std::optional(opop->
subitem_local_id) :
1151 std::optional<ID *> subitem_reference_id = use_id_pointer ?
1157 if (prop_storage !=
nullptr) {
1161 PointerRNA ptr_item_dst_name, ptr_item_dst_index;
1162 PointerRNA ptr_item_src_name, ptr_item_src_index;
1163 PointerRNA ptr_item_storage_name, ptr_item_storage_index;
1170 &ptr_item_src_index);
1174 subitem_reference_id,
1177 &ptr_item_dst_index);
1188 ptr_item_dst_name.
type ==
nullptr)
1198 &ptr_item_dst_index);
1212 &ptr_item_dst_index);
1223 &ptr_item_src_index);
1232 &ptr_item_dst_index);
1241 &ptr_item_src_index);
1245 if (prop_storage !=
nullptr) {
1251 &ptr_item_storage_name,
1252 &ptr_item_storage_index);
1253 if (ptr_item_storage_name.
data ==
nullptr) {
1257 subitem_reference_id,
1259 &ptr_item_storage_name,
1260 &ptr_item_storage_index);
1262 if (ptr_item_storage_name.
data ==
nullptr && ptr_item_storage_index.
data ==
nullptr) {
1268 &ptr_item_storage_name,
1269 &ptr_item_storage_index);
1274 if (ptr_item_src_name.
type !=
nullptr && ptr_item_dst_name.
type !=
nullptr) {
1275 *ptr_item_src = ptr_item_src_name;
1276 *ptr_item_dst = ptr_item_dst_name;
1277 if (prop_storage !=
nullptr) {
1278 *ptr_item_storage = ptr_item_storage_name;
1281 else if (ptr_item_src_index.
type !=
nullptr && ptr_item_dst_index.
type !=
nullptr) {
1282 *ptr_item_src = ptr_item_src_index;
1283 *ptr_item_dst = ptr_item_dst_index;
1284 if (prop_storage !=
nullptr) {
1285 *ptr_item_storage = ptr_item_storage_index;
1292 if (ptr_item_dst->
type ==
nullptr &&
1298 "Failed to find destination sub-item '%s' (%d) of '%s' in new override data '%s'",
1304 if (ptr_item_src->
type ==
nullptr &&
1310 "Failed to find source sub-item '%s' (%d) of '%s' in old override data '%s'",
1325 bmain, ptr_src,
nullptr,
nullptr);
1327 bmain, ptr_dst,
nullptr,
nullptr);
1349 (
ELEM(
nullptr, id_src, id_dst) ||
1359 (id_dst->
lib == id_src->
lib && id_dst != id_owner_dst)))
1367 "Local override %s detected as needing resync due to mismatch in its used IDs",
1368 id_owner_dst->
name);
1377 "Local override %s detected as needing resync as its liboverride reference is "
1378 "already tagged for resync",
1379 id_owner_dst->
name);
1387 const bool do_insert = rnaapply_ctx.
do_insert;
1410 "Failed to apply '%s' override operation on %s\n",
1446 "%s: Ignoring local override on ID pointer custom property '%s', as requested by "
1447 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1459 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1461 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1465 "%s: Ignoring local override on ID pointer property '%s', as requested by "
1466 "RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1479 "%s: Ignoring all local override on ID pointer collection property '%s', as "
1480 "requested by RNA_OVERRIDE_APPLY_FLAG_IGNORE_ID_POINTERS flag",
1499#ifdef DEBUG_OVERRIDE_TIMEIT
1507 bool do_insert =
false;
1508 for (
int i = 0; i < (do_restore_only ? 1 : 2); i++, do_insert =
true) {
1537 "Failed to apply library override operation to '%s.%s' "
1538 "(could not resolve some properties, local: %d, override: %d)",
1542 id_ptr_dst, op->rna_path, &rnaapply_ctx.
ptr_dst, &rnaapply_ctx.
prop_dst),
1544 id_ptr_src, op->rna_path, &rnaapply_ctx.
ptr_src, &rnaapply_ctx.
prop_src));
1550 if (id_ptr_storage && (id_ptr_storage->
owner_id !=
nullptr)) {
1563 if (op->rna_prop_type ==
PROP_POINTER && op->operations.first !=
nullptr &&
1570 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1572 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1579 bmain, id_ptr_dst, id_ptr_src, &prop_ptr_dst, &prop_ptr_src);
1587 bmain, &rnaapply_ctx.
ptr_src,
nullptr,
nullptr));
1590 bmain, &rnaapply_ctx.
ptr_dst,
nullptr,
nullptr));
1621 ID *id_dst =
static_cast<ID *
>(id_ptr_dst->
data);
1622 ID *id_src =
static_cast<ID *
>(id_ptr_src->
data);
1629#ifdef DEBUG_OVERRIDE_TIMEIT
1639 std::optional<std::string> rna_path;
1644 (*r_owner_id)->override_library, rna_path->c_str());
1655 std::optional<std::string> rna_path;
1657 if (r_created !=
nullptr) {
1664 id->override_library, rna_path->c_str(), r_created);
1686 op,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict);
1693 const short operation,
1699 if (r_created !=
nullptr) {
1710 op, operation,
nullptr,
nullptr, {}, {}, index, index, strict, r_strict, r_created);
1721 return override_status;
1729 bmain,
ptr, prop, index,
false,
nullptr);
1730 if (opop !=
nullptr) {
1740 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)
#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.
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIBOVERRIDE_PROP_TAG_NEEDS_RETORE
@ LIBOVERRIDE_PROP_OP_TAG_UNUSED
@ LIBOVERRIDE_TAG_NEEDS_RESTORE
@ 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)
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ LIBOVERRIDE_OP_SUBTRACT
@ LIBOVERRIDE_OP_MULTIPLY
@ LIBOVERRIDE_OP_INSERT_BEFORE
@ LIBOVERRIDE_OP_INSERT_AFTER
@ ID_TAG_LIBOVERRIDE_NEED_RESYNC
@ LIBOVERRIDE_FLAG_NO_HIERARCHY
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ LIBRARY_TAG_RESYNC_REQUIRED
@ 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.
#define RNA_POINTER_INVALIDATE(ptr)
@ 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
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
void *(* MEM_mallocN)(size_t len, 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
struct Library_Runtime 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
ccl_device_inline int mod(int x, int m)