RNA override: Cleanup & small refactor.

Remove unused func from public API.

Make parameters & variables naming more consistent accross the code.

Move RNAproperty validation/'conversion' (for IDProps case) to upper
level in code, this will avoid some useless re-processing.
This commit is contained in:
2017-12-13 12:46:25 +01:00
parent 52d33d6ab9
commit ae80835d10
2 changed files with 77 additions and 92 deletions

View File

@@ -1256,21 +1256,21 @@ bool RNA_struct_equals(struct PointerRNA *a, struct PointerRNA *b, eRNACompareMo
/* Override. */
bool RNA_struct_override_matches(struct PointerRNA *local, struct PointerRNA *reference,
bool RNA_struct_override_matches(
struct PointerRNA *ptr_local, struct PointerRNA *ptr_reference,
struct IDOverrideStatic *override, const bool ignore_non_overridable, const bool ignore_overridden);
bool RNA_struct_override_store(
struct PointerRNA *local, struct PointerRNA *reference, PointerRNA *storage, struct IDOverrideStatic *override);
struct PointerRNA *ptr_local, struct PointerRNA *ptr_reference, PointerRNA *ptr_storage,
struct IDOverrideStatic *override);
void RNA_property_override_apply(
struct PointerRNA *dst, struct PointerRNA *src, struct PointerRNA *storage, struct PropertyRNA *prop,
struct IDOverrideStaticProperty *op);
void RNA_struct_override_apply(
struct PointerRNA *dst, struct PointerRNA *src, struct PointerRNA *storage,
struct PointerRNA *ptr_local, struct PointerRNA *ptr_reference, struct PointerRNA *ptr_storage,
struct IDOverrideStatic *override);
bool RNA_struct_auto_override(
struct PointerRNA *local, struct PointerRNA *reference, struct IDOverrideStatic *override, const char *root_path);
struct PointerRNA *ptr_local, struct PointerRNA *ptr_reference,
struct IDOverrideStatic *override, const char *root_path);
struct IDOverrideStaticProperty *RNA_property_override_property_find(PointerRNA *ptr, PropertyRNA *prop);
struct IDOverrideStaticProperty *RNA_property_override_property_get(PointerRNA *ptr, PropertyRNA *prop, bool *r_created);

View File

@@ -6986,7 +6986,8 @@ bool RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index)
}
static bool rna_property_override_operation_apply(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local,
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage,
PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage,
IDOverrideStaticPropertyOperation *opop);
bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index)
@@ -6995,12 +6996,22 @@ bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop,
return false;
}
PropertyRNA *prop_dst = prop;
PropertyRNA *prop_src = prop;
if (prop_dst->magic != RNA_MAGIC) {
/* In case of IDProperty, we have to find the *real* idprop of ptr,
* since prop in this case is just a fake wrapper around actual IDProp data, and not a 'real' PropertyRNA. */
prop_dst = (PropertyRNA *)rna_idproperty_find(ptr, ((IDProperty *)prop_dst)->name);
prop_src = (PropertyRNA *)rna_idproperty_find(fromptr, ((IDProperty *)prop_src)->name);
}
IDOverrideStaticPropertyOperation opop = {
.operation = IDOVERRIDESTATIC_OP_REPLACE,
.subitem_reference_index = index,
.subitem_local_index = index
};
return rna_property_override_operation_apply(ptr, fromptr, NULL, prop, &opop);
return rna_property_override_operation_apply(ptr, fromptr, NULL, prop_dst, prop_src, NULL, &opop);
}
/* use RNA_warning macro which includes __func__ suffix */
@@ -7078,7 +7089,7 @@ static int rna_property_override_diff(
if (prop_a->magic != RNA_MAGIC) {
/* In case of IDProperty, we have to find the *real* idprop of ptr,
* since prop in this case is just a fake wrapper around actual IDProp data, and not a 'real' PropertyRNA. */
/* XXX TODO this is ugly, we already get correct prop in upcalling code, whould just pass them to this func! */
/* Note: so far callers never resolve IDProps, so we can keep it here for now... */
prop_a = (PropertyRNA *)rna_idproperty_find(ptr_a, ((IDProperty *)prop_a)->name);
prop_b = (PropertyRNA *)rna_idproperty_find(ptr_b, ((IDProperty *)prop_b)->name);
@@ -7116,34 +7127,17 @@ static int rna_property_override_diff(
/* Modify local data-block to make it ready for override application (only needed for diff operations, where we use
* the local data-block's data as second operand). */
static bool rna_property_override_operation_store(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local,
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage,
PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage,
IDOverrideStaticProperty *op)
{
int len_local, len_reference, len_storage = 0;
PropertyRNA *prop_reference = prop_local;
PropertyRNA *prop_storage = prop_local;
bool changed = false;
if (!ptr_storage) {
if (ptr_storage == NULL) {
return changed;
}
if (prop_local->magic != RNA_MAGIC) {
/* In case of IDProperty, we have to find the *real* idprop of ptr,
* since prop in this case is just a fake wrapper around actual IDProp data, and not a 'real' PropertyRNA. */
/* XXX TODO this is ugly, we already get correct prop in upcalling code, should just pass them to this func! */
prop_local = (PropertyRNA *)rna_idproperty_find(ptr_local, ((IDProperty *)prop_local)->name);
prop_reference = (PropertyRNA *)rna_idproperty_find(ptr_reference, ((IDProperty *)prop_reference)->name);
if (ptr_storage) {
prop_storage = (PropertyRNA *)rna_idproperty_find(ptr_storage, ((IDProperty *)prop_storage)->name);
}
/* its possible the custom-prop doesn't exist on this data-block */
if (prop_local == NULL) {
return changed;
}
}
/* get the length of the array to work with */
len_local = RNA_property_array_length(ptr_local, prop_local);
len_reference = RNA_property_array_length(ptr_reference, prop_reference);
@@ -7178,12 +7172,11 @@ static bool rna_property_override_operation_store(
}
static bool rna_property_override_operation_apply(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, PropertyRNA *prop_local,
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage,
PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage,
IDOverrideStaticPropertyOperation *opop)
{
int len_local, len_reference, len_storage = 0;
PropertyRNA *prop_reference = prop_local;
PropertyRNA *prop_storage = prop_local;
const short override_op = opop->operation;
@@ -7197,22 +7190,6 @@ static bool rna_property_override_operation_apply(
return false;
}
if (prop_local->magic != RNA_MAGIC) {
/* In case of IDProperty, we have to find the *real* idprop of ptr,
* since prop in this case is just a fake wrapper around actual IDProp data, and not a 'real' PropertyRNA. */
/* XXX TODO this is ugly, we already get correct prop in upcalling code, whould just pass them to this func! */
prop_local = (PropertyRNA *)rna_idproperty_find(ptr_local, ((IDProperty *)prop_local)->name);
prop_reference = (PropertyRNA *)rna_idproperty_find(ptr_reference, ((IDProperty *)prop_reference)->name);
if (ptr_storage) {
prop_storage = (PropertyRNA *)rna_idproperty_find(ptr_storage, ((IDProperty *)prop_storage)->name);
}
/* its possible the custom-prop doesn't exist on this data-block */
if (prop_local == NULL) {
return false;
}
}
if (ELEM(override_op, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY) && !prop_storage) {
/* We cannot apply 'diff' override operations without some refference storage.
* This should typically only happen at read time of .blend file... */
@@ -7248,18 +7225,18 @@ static bool rna_property_override_operation_apply(
* Check whether reference and local overriden data match (are the same),
* with respect to given restrictive sets of properties. */
bool RNA_struct_override_matches(
PointerRNA *local, PointerRNA *reference,
PointerRNA *ptr_local, PointerRNA *ptr_reference,
IDOverrideStatic *override, const bool ignore_non_overridable, const bool ignore_overridden)
{
CollectionPropertyIterator iter;
PropertyRNA *iterprop;
bool equals = true;
BLI_assert(local->type == reference->type);
BLI_assert(ptr_local->type == ptr_reference->type);
iterprop = RNA_struct_iterator_property(local->type);
iterprop = RNA_struct_iterator_property(ptr_local->type);
RNA_property_collection_begin(local, iterprop, &iter);
RNA_property_collection_begin(ptr_local, iterprop, &iter);
for (; iter.valid; RNA_property_collection_next(&iter)) {
PropertyRNA *prop = iter.ptr.data;
@@ -7269,7 +7246,7 @@ bool RNA_struct_override_matches(
if (ignore_overridden) {
/* XXX TODO this will have to be refined to handle collections insertions, and array items */
char *rna_path = RNA_path_from_ID_to_property(local, prop);
char *rna_path = RNA_path_from_ID_to_property(ptr_local, prop);
if (BKE_override_static_property_find(override, rna_path) != NULL) {
MEM_SAFE_FREE(rna_path);
continue;
@@ -7284,7 +7261,7 @@ bool RNA_struct_override_matches(
if (ignore_overridden) {
flag |= RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN;
}
if (rna_property_override_diff(local, reference, prop, RNA_EQ_STRICT, override, NULL, NULL, flag) != 0) {
if (rna_property_override_diff(ptr_local, ptr_reference, prop, RNA_EQ_STRICT, override, NULL, NULL, flag) != 0) {
equals = false;
break;
}
@@ -7295,7 +7272,8 @@ bool RNA_struct_override_matches(
}
/** Store needed second operands into \a storage data-block for differential override operations. */
bool RNA_struct_override_store(PointerRNA *local, PointerRNA *reference, PointerRNA *storage, IDOverrideStatic *override)
bool RNA_struct_override_store(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, IDOverrideStatic *override)
{
bool changed = false;
@@ -7304,21 +7282,23 @@ bool RNA_struct_override_store(PointerRNA *local, PointerRNA *reference, Pointer
#endif
for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) {
/* Simplified for now! */
PointerRNA src_data, dst_data;
PropertyRNA *src_prop, *dst_prop;
PointerRNA data_reference, data_local;
PropertyRNA *prop_reference, *prop_local;
if (RNA_path_resolve_property(reference, op->rna_path, &src_data, &src_prop) &&
RNA_path_resolve_property(local, op->rna_path, &dst_data, &dst_prop))
if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) &&
RNA_path_resolve_property(ptr_reference, op->rna_path, &data_reference, &prop_reference))
{
PointerRNA storage_data;
PropertyRNA *storage_prop = NULL;
PointerRNA data_storage;
PropertyRNA *prop_storage = NULL;
/* It is totally OK if this does not success, only a subset of override operations actually need storage. */
if (storage && (storage->id.data != NULL)) {
RNA_path_resolve_property(storage, op->rna_path, &storage_data, &storage_prop);
if (ptr_storage && (ptr_storage->id.data != NULL)) {
RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage);
}
if (rna_property_override_operation_store(&dst_data, &src_data, &storage_data, src_prop, op)) {
if (rna_property_override_operation_store(&data_local, &data_reference, &data_storage,
prop_reference, prop_local, prop_storage, op))
{
changed = true;
}
}
@@ -7330,46 +7310,50 @@ bool RNA_struct_override_store(PointerRNA *local, PointerRNA *reference, Pointer
return changed;
}
/** Apply given \a op override property operations on \a dst, using \a src as source. */
void RNA_property_override_apply(
PointerRNA *dst, PointerRNA *src, PointerRNA *storage, PropertyRNA *prop, IDOverrideStaticProperty *op)
static void rna_property_override_apply_ex(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage,
PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage, IDOverrideStaticProperty *op)
{
for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) {
if (!rna_property_override_operation_apply(dst, src, storage, prop, opop)) {
if (!rna_property_override_operation_apply(ptr_local, ptr_reference, ptr_storage,
prop_local, prop_reference, prop_storage, opop))
{
BLI_assert(0);
}
}
}
/** Apply given \a override operations on \a dst, using \a src as source. */
void RNA_struct_override_apply(PointerRNA *dst, PointerRNA *src, PointerRNA *storage, IDOverrideStatic *override)
void RNA_struct_override_apply(
PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, IDOverrideStatic *override)
{
#ifdef DEBUG_OVERRIDE_TIMEIT
TIMEIT_START_AVERAGED(RNA_struct_override_apply);
#endif
for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) {
/* Simplified for now! */
PointerRNA src_data, dst_data;
PropertyRNA *src_prop, *dst_prop;
PointerRNA data_reference, data_local;
PropertyRNA *prop_reference, *prop_local;
if (RNA_path_resolve_property(src, op->rna_path, &src_data, &src_prop) &&
RNA_path_resolve_property(dst, op->rna_path, &dst_data, &dst_prop))
if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) &&
RNA_path_resolve_property(ptr_reference, op->rna_path, &data_reference, &prop_reference))
{
PointerRNA storage_data;
PropertyRNA *storage_prop = NULL;
PointerRNA data_storage;
PropertyRNA *prop_storage = NULL;
/* It is totally OK if this does not success, only a subset of override operations actually need storage. */
if (storage && (storage->id.data != NULL)) {
RNA_path_resolve_property(storage, op->rna_path, &storage_data, &storage_prop);
if (ptr_storage && (ptr_storage->id.data != NULL)) {
RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage);
}
/* Note that src and dst props are the same, unless they are IDProperties... */
RNA_property_override_apply(&dst_data, &src_data, storage_prop ? &storage_data : NULL, src_prop, op);
rna_property_override_apply_ex(
&data_local, &data_reference, prop_storage ? &data_storage : NULL,
prop_local, prop_reference, prop_storage, op);
}
#ifndef NDEBUG
else {
printf("Failed to apply static override operation to '%s.%s' (could not resolve some properties)\n",
((ID *)src->id.data)->name, op->rna_path);
((ID *)ptr_reference->id.data)->name, op->rna_path);
}
#endif
}
@@ -7379,16 +7363,17 @@ void RNA_struct_override_apply(PointerRNA *dst, PointerRNA *src, PointerRNA *sto
}
/** Automatically define override rules by comparing \a local and \a reference RNA structs. */
bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverrideStatic *override, const char *root_path)
bool RNA_struct_auto_override(
PointerRNA *ptr_local, PointerRNA *ptr_reference, IDOverrideStatic *override, const char *root_path)
{
CollectionPropertyIterator iter;
PropertyRNA *iterprop;
bool changed = false;
BLI_assert(local->type == reference->type);
BLI_assert(local->id.data && reference->id.data);
BLI_assert(ptr_local->type == ptr_reference->type);
BLI_assert(ptr_local->id.data && ptr_reference->id.data);
if ((((ID *)local->id.data)->flag & LIB_OVERRIDE_STATIC_AUTO) == 0) {
if ((((ID *)ptr_local->id.data)->flag & LIB_OVERRIDE_STATIC_AUTO) == 0) {
return changed;
}
@@ -7401,15 +7386,15 @@ bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverri
}
#endif
iterprop = RNA_struct_iterator_property(local->type);
iterprop = RNA_struct_iterator_property(ptr_local->type);
for (RNA_property_collection_begin(local, iterprop, &iter); iter.valid; RNA_property_collection_next(&iter)) {
for (RNA_property_collection_begin(ptr_local, iterprop, &iter); iter.valid; RNA_property_collection_next(&iter)) {
PropertyRNA *prop = iter.ptr.data;
if (!(prop->flag & PROP_OVERRIDABLE_STATIC)) {
continue;
}
if (RNA_property_animated(local, prop)) {
if (RNA_property_animated(ptr_local, prop)) {
continue;
}
@@ -7420,14 +7405,14 @@ bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverri
rna_path = BLI_sprintfN("%s.%s", root_path, RNA_property_identifier(prop));
}
else {
rna_path = RNA_path_from_ID_to_property(local, prop);
rna_path = RNA_path_from_ID_to_property(ptr_local, prop);
}
if (rna_path == NULL) {
continue;
}
rna_property_override_diff(local, reference, prop, RNA_EQ_STRICT, override, rna_path, &changed,
RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE | RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN);
rna_property_override_diff(ptr_local, ptr_reference, prop, RNA_EQ_STRICT, override, rna_path, &changed,
RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE | RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN);
MEM_SAFE_FREE(rna_path);
}
@@ -7438,7 +7423,7 @@ bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverri
const float _delta_time = (float)(PIL_check_seconds_timer() - _timeit_time);
_sum_time += _delta_time;
_num_time++;
printf("ID: %s\n", ((ID *)local->id.data)->name);
printf("ID: %s\n", ((ID *)ptr_local->id.data)->name);
printf("time end (%s): %.6f\n", __func__, _delta_time);
printf("time averaged (%s): %.6f (total: %.6f, in %d runs)\n", __func__, (_sum_time / _num_time), _sum_time, (int)_num_time);
}