Commit: 7e909a564fc4e3814e9c6ee06521d9757ea4580e
Author: Bastien Montagne
Date:   Tue Nov 14 22:31:55 2017 +0100
Branches: id_override_static
https://developer.blender.org/rB7e909a564fc4e3814e9c6ee06521d9757ea4580e

Heavy refactor of new RNA override/comparison code.

Main reason here is to make 
comparison/override_diff/override_store/override_apply
customizable per RNA property if needed.

This should allow us especially to get advanced behavior on case-by-case
basis, when dealing with Pointer and Collection properties mostly.

Note that IDProps remain fuzzy area for now, a big part of the code
tries to take them into account, but it's most likely still missing some
bits, and definitively not tested at all yet!

===================================================================

M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/RNA_define.h
M       source/blender/makesrna/intern/makesrna.c
M       source/blender/makesrna/intern/rna_access.c
M       source/blender/makesrna/intern/rna_define.c
M       source/blender/makesrna/intern/rna_internal.h
M       source/blender/makesrna/intern/rna_internal_types.h
M       source/blender/makesrna/intern/rna_rna.c

===================================================================

diff --git a/source/blender/makesrna/RNA_access.h 
b/source/blender/makesrna/RNA_access.h
index 4e73843c36f..2cc2add8b65 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -1234,18 +1234,20 @@ StructRNA *ID_code_to_RNA_type(short idcode);
 
 void _RNA_warning(const char *format, ...) ATTR_PRINTF_FORMAT(1, 2);
 
-/* Equals test (skips pointers and collections)
- * is_strict false assumes uninitialized properties are equal */
+/* Equals test. */
 
-typedef enum eRNAEqualsMode {
+/* Note: In practice, EQ_STRICT and EQ_COMPARE have same behavior currently, 
and will yield same result. */
+typedef enum eRNACompareMode {
+       /* Only care about equality, not full comparison. */
        RNA_EQ_STRICT,           /* set/unset ignored */
        RNA_EQ_UNSET_MATCH_ANY,  /* unset property matches anything */
        RNA_EQ_UNSET_MATCH_NONE, /* unset property never matches set property */
-} eRNAEqualsMode;
-
-bool RNA_property_equals(struct PointerRNA *a, struct PointerRNA *b, struct 
PropertyRNA *prop, eRNAEqualsMode mode);
-bool RNA_struct_equals(struct PointerRNA *a, struct PointerRNA *b, 
eRNAEqualsMode mode);
+       /* Full comparison. */
+       RNA_EQ_COMPARE,
+} eRNACompareMode;
 
+bool RNA_property_equals(struct PointerRNA *a, struct PointerRNA *b, struct 
PropertyRNA *prop, eRNACompareMode mode);
+bool RNA_struct_equals(struct PointerRNA *a, struct PointerRNA *b, 
eRNACompareMode mode);
 
 /* Override. */
 
diff --git a/source/blender/makesrna/RNA_define.h 
b/source/blender/makesrna/RNA_define.h
index 47648583e14..755c5747523 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -175,6 +175,8 @@ void RNA_def_property_update(PropertyRNA *prop, int 
noteflag, const char *update
 void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable);
 void RNA_def_property_editable_array_func(PropertyRNA *prop, const char 
*editable);
 
+void RNA_def_property_override_funcs(PropertyRNA *prop, const char *diff, 
const char *store, const char *apply);
+
 void RNA_def_property_update_runtime(PropertyRNA *prop, const void *func);
 void RNA_def_property_poll_runtime(PropertyRNA *prop, const void *func);
 
diff --git a/source/blender/makesrna/intern/makesrna.c 
b/source/blender/makesrna/intern/makesrna.c
index 720f7324bdb..90e9304998f 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -3015,12 +3015,15 @@ static void rna_generate_property(FILE *f, StructRNA 
*srna, const char *nest, Pr
                prop->arraylength[1],
                prop->arraylength[2],
                prop->totarraylength);
-       fprintf(f, "\t%s%s, %d, %s, %s,\n",
+       fprintf(f, "\t%s%s, %d, %s, %s, %s, %s, %s,\n",
                (prop->flag & PROP_CONTEXT_UPDATE) ? "(UpdateFunc)" : "",
                rna_function_string(prop->update),
                prop->noteflag,
                rna_function_string(prop->editable),
-               rna_function_string(prop->itemeditable));
+               rna_function_string(prop->itemeditable),
+               rna_function_string(prop->override_diff),
+               rna_function_string(prop->override_store),
+               rna_function_string(prop->override_apply));
 
        if (prop->flag_internal & PROP_INTERN_RAW_ACCESS) rna_set_raw_offset(f, 
srna, prop);
        else fprintf(f, "\t0, -1");
diff --git a/source/blender/makesrna/intern/rna_access.c 
b/source/blender/makesrna/intern/rna_access.c
index a79e6655317..808d0837b4f 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -6929,11 +6929,21 @@ bool RNA_property_reset(PointerRNA *ptr, PropertyRNA 
*prop, int index)
 }
 
 static bool rna_property_override_operation_apply(
-        PointerRNA *ptr, PointerRNA *fromptr, PointerRNA *storage, PropertyRNA 
*prop, int index, int override_op);
+        PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA 
*ptr_storage, PropertyRNA *prop_local,
+        IDOverridePropertyOperation *opop);
 
 bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA 
*prop, int index)
 {
-       return rna_property_override_operation_apply(ptr, fromptr, NULL, prop, 
index, IDOVERRIDE_OP_REPLACE);
+       if (!RNA_property_editable(ptr, prop)) {
+               return false;
+       }
+
+       IDOverridePropertyOperation opop = {
+           .operation = IDOVERRIDE_OP_REPLACE,
+           .subitem_reference_index = index,
+           .subitem_local_index = index
+       };
+       return rna_property_override_operation_apply(ptr, fromptr, NULL, prop, 
&opop);
 }
 
 /* use RNA_warning macro which includes __func__ suffix */
@@ -6958,18 +6968,18 @@ void _RNA_warning(const char *format, ...)
 #endif
 }
 
-static bool rna_property_override_equals(PointerRNA *a, PointerRNA *b, 
PropertyRNA *prop, eRNAEqualsMode mode,
-        IDOverride *override, const char *rna_path, bool *r_override_changed,
-        const bool ignore_non_overridable, const bool ignore_overridden);
+static int rna_property_override_diff(
+        PointerRNA *a, PointerRNA *b, PropertyRNA *prop, eRNACompareMode mode,
+        IDOverride *override, const char *rna_path, bool *r_override_changed, 
const int flags);
 
-bool RNA_property_equals(PointerRNA *a, PointerRNA *b, PropertyRNA *prop, 
eRNAEqualsMode mode)
+bool RNA_property_equals(PointerRNA *a, PointerRNA *b, PropertyRNA *prop, 
eRNACompareMode mode)
 {
        BLI_assert(ELEM(mode, RNA_EQ_STRICT, RNA_EQ_UNSET_MATCH_ANY, 
RNA_EQ_UNSET_MATCH_NONE));
 
-       return rna_property_override_equals(a, b, prop, mode, NULL, NULL, NULL, 
false, false);
+       return (rna_property_override_diff(a, b, prop, mode, NULL, NULL, NULL, 
0) != 0);
 }
 
-bool RNA_struct_equals(PointerRNA *a, PointerRNA *b, eRNAEqualsMode mode)
+bool RNA_struct_equals(PointerRNA *a, PointerRNA *b, eRNACompareMode mode)
 {
        CollectionPropertyIterator iter;
        PropertyRNA *iterprop;
@@ -7000,1071 +7010,180 @@ bool RNA_struct_equals(PointerRNA *a, PointerRNA *b, 
eRNAEqualsMode mode)
 
 /* Low-level functions, also used by non-override RNA API like copy or 
equality check. */
 #include "PIL_time_utildefines.h"
-/* Used for both Pointer and Collection properties. */
-static bool rna_property_override_equals_propptr(
-        PointerRNA *propptr_a, PointerRNA *propptr_b, eRNAEqualsMode mode,
-        IDOverride *override, const char *rna_path, bool *r_override_changed,
-        const bool ignore_non_overridable, const bool ignore_overridden)
-{
-       bool is_id = false;
-       bool is_type_null = false;
-
-       /* Beware, PointerRNA_NULL has no type and is considered a 'blank 
page'! */
-       if (propptr_a->type == NULL) {
-               if (propptr_b->type == NULL) {
-                       if (r_override_changed) {
-                               *r_override_changed = false;
-                       }
-                       return true;
-               }
-               is_id = RNA_struct_is_ID(propptr_b->type);
-               is_type_null = true;
-       }
-       else {
-               is_id = RNA_struct_is_ID(propptr_a->type);
-               is_type_null = (propptr_b->type == NULL);
-       }
-
-       if (is_id) {
-               BLI_assert(propptr_a->data == propptr_a->id.data && 
propptr_b->data == propptr_b->id.data);
-       }
-
-       if (override) {
-               if (rna_path) {
-                       if (is_type_null || is_id) {
-                               /* In case this is an ID (or one of the 
pointers is NULL), do not compare structs!
-                                * This is a quite safe path to infinite loop.
-                                * Instead, just compare pointers themselves 
(we assume sub-ID structs cannot loop). */
-                               const bool equals = (propptr_a->data == 
propptr_b->data);
+static int rna_property_override_diff(
+        PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop_a, 
eRNACompareMode mode,
+        IDOverride *override, const char *rna_path, bool *r_override_changed, 
const int flags)
+{
+       int len_a, len_b;
 
-                               if (!equals && rna_path) {
-                                       bool created = false;
-                                       IDOverrideProperty *op = 
BKE_override_property_get(override, rna_path, &created);
+       PropertyRNA *prop_b = prop_a;
 
-                                       if (op != NULL && created) {  /* If not 
yet overridden... */
-                                               
BKE_override_property_operation_get(op, IDOVERRIDE_OP_REPLACE, NULL, NULL, -1, 
-1, true, NULL, NULL);
-                                               if (r_override_changed) {
-                                                       *r_override_changed = 
created;
-                                               }
-                                       }
-                               }
+       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! */
+               prop_a = (PropertyRNA *)rna_idproperty_find(ptr_a, ((IDProperty 
*)prop_a)->name);
+               prop_b = (PropertyRNA *)rna_idproperty_find(ptr_b, ((IDProperty 
*)prop_b)->name);
 
-                               return equals;
-                       }
-                       else {
-                               const bool changed = 
RNA_struct_auto_override(propptr_a, propptr_b, override, rna_path);
-                               if (r_override_changed) {
-                                       *r_override_changed = 
*r_override_changed || changed;
-                               }
-                               /* XXX Simplification here, if no override was 
added we assume they are equal,
-                                *     this may not be good behavior, time will 
say. */
-                               return !changed;
-                       }
-               }
-               else {
-                       return RNA_struct_override_matches(
-                                   propptr_a, propptr_b, override, 
ignore_non_overridable, ignore_overridden);
+               if (ELEM(NULL, prop_a, prop_b)) {
+                       return 1;
                }
        }
-       else {
-               return RNA_struct_equals(propptr_a, propptr_b, mode);
-       }
-}
 
-static bool rna_property_override_equals(
-        PointerRNA *a, PointerRNA *b, PropertyRNA *prop, eRNAEqualsMode mode,
-        IDOverride *override, const char *rna_path, bool *r_override_changed,
-        const bool ignore_non_overridable, const bool ignore_overridden)
-{
-       int len, fromlen;
+       BLI_assert(prop_a->override_diff == prop_b->override_diff && 
prop_a->override_diff != NULL);
 
        if (mode == RNA_EQ_UNSET_MATCH_ANY) {
                /* uninitialized properties are assumed to match anything */
-               if (!RNA_property_is_set(a, prop) || !RNA_property_is_set(b, 
prop))
-                       return true;
+               if (!RNA_property_is_set(ptr_a, prop_a) || 
!RNA_property_is_set(ptr_b, prop_b))
+                       return 0;
        }
        else if (mode == RNA_EQ_UNSET_MATCH_NONE) {
                /* unset properties never match set properties */
-               if (RNA_property_is_set(a, prop) != RNA_property_is_set(b, 
prop))
-                       return false;
+               if (RNA_property_is_set(ptr_a, prop_a) != 
RNA_property_is_set(ptr_b, prop_b))
+                       return 1;
        }
 
        /* get the length of the array to work with */
-       len = RNA_property_array_length(a, prop);


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to