diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-01 18:41:44 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-02 10:54:42 +0300 |
commit | c7947b2115bf1b15caed94a67b1b39df1959ebb2 (patch) | |
tree | aae4a64b2cd3f235d77330bba7ae46751d2678dd /source | |
parent | 429c1d60a45b5a2984c9acd64133cb7c014fe862 (diff) |
Static override: Add basic two-passes system needed for apply insert op.
And a dummy placeholder for object constraints... All this is WIP of
course!
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 58 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object.c | 32 |
2 files changed, 68 insertions, 22 deletions
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index d70309dadb8..39815dbc3d2 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -7684,12 +7684,20 @@ bool RNA_struct_override_store( static void rna_property_override_apply_ex( PointerRNA *ptr_local, PointerRNA *ptr_override, PointerRNA *ptr_storage, PropertyRNA *prop_local, PropertyRNA *prop_override, PropertyRNA *prop_storage, - IDOverrideStaticProperty *op) + IDOverrideStaticProperty *op, const bool do_insert) { for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) { + if (!do_insert != !ELEM(opop->operation, IDOVERRIDESTATIC_OP_INSERT_AFTER, IDOVERRIDESTATIC_OP_INSERT_BEFORE)) { + if (!do_insert) { + printf("Skipping insert override operations in first pass (%s)!\n", op->rna_path); + } + continue; + } if (!rna_property_override_operation_apply(ptr_local, ptr_override, ptr_storage, prop_local, prop_override, prop_storage, opop)) { + /* TODO No assert here, would be much much better to just report as warning, + * failing override applications will probably be fairly common! */ BLI_assert(0); } } @@ -7703,32 +7711,38 @@ void RNA_struct_override_apply( #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 data_override, data_local; - PropertyRNA *prop_override, *prop_local; + /* Note: Applying insert operations in a separate pass is mandatory. + * We could optimize this later, but for now, as inneficient as it is, don't think this is a critical point. + */ + bool do_insert = false; + for (int i = 0; i < 2; i++, do_insert = true) { + for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) { + /* Simplified for now! */ + PointerRNA data_override, data_local; + PropertyRNA *prop_override, *prop_local; + + if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) && + RNA_path_resolve_property(ptr_override, op->rna_path, &data_override, &prop_override)) + { + PointerRNA data_storage; + PropertyRNA *prop_storage = NULL; - if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) && - RNA_path_resolve_property(ptr_override, op->rna_path, &data_override, &prop_override)) - { - 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 (ptr_storage && (ptr_storage->id.data != NULL)) { + RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage); + } - /* It is totally OK if this does not success, only a subset of override operations actually need storage. */ - if (ptr_storage && (ptr_storage->id.data != NULL)) { - RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage); + rna_property_override_apply_ex( + &data_local, &data_override, prop_storage ? &data_storage : NULL, + prop_local, prop_override, prop_storage, op, do_insert); } - - rna_property_override_apply_ex( - &data_local, &data_override, prop_storage ? &data_storage : NULL, - prop_local, prop_override, prop_storage, op); - } #ifndef NDEBUG - else { - printf("Failed to apply static override operation to '%s.%s' (could not resolve some properties)\n", - ((ID *)ptr_override->id.data)->name, op->rna_path); - } + else { + printf("Failed to apply static override operation to '%s.%s' (could not resolve some properties)\n", + ((ID *)ptr_override->id.data)->name, op->rna_path); + } #endif + } } #ifdef DEBUG_OVERRIDE_TIMEIT TIMEIT_END_AVERAGED(RNA_struct_override_apply); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 0fec39f9676..581ff354a90 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1133,6 +1133,37 @@ static void rna_Object_constraints_clear(Object *object) WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, object); } +bool rna_Object_constraints_override_apply( + PointerRNA *ptr_dst, PointerRNA *ptr_src, PointerRNA *UNUSED(ptr_storage), + PropertyRNA *UNUSED(prop_dst), PropertyRNA *UNUSED(prop_src), PropertyRNA *UNUSED(prop_storage), + const int UNUSED(len_dst), const int UNUSED(len_src), const int UNUSED(len_storage), + IDOverrideStaticPropertyOperation *opop) +{ + BLI_assert(opop->operation == IDOVERRIDESTATIC_OP_INSERT_AFTER && + "Unsupported RNA override operation on constraints collection"); + + printf("%s: We are supposed to insert a constraint...\n", __func__); + return false; +#if 0 + /* AnimData is a special case, since you cannot edit/replace it, it's either existent or not. */ + AnimData *adt_dst = RNA_property_pointer_get(ptr_dst, prop_dst).data; + AnimData *adt_src = RNA_property_pointer_get(ptr_src, prop_src).data; + + if (adt_dst == NULL && adt_src != NULL) { + /* Copy anim data from reference into final local ID. */ + BKE_animdata_copy_id(NULL, ptr_dst->id.data, ptr_src->id.data, false, true); + return true; + } + else if (adt_dst != NULL && adt_src == NULL) { + /* Override has cleared/removed anim data from its reference. */ + BKE_animdata_free(ptr_dst->id.data, true); + return true; + } + + return false; +#endif +} + static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, const char *name, int type) { @@ -2075,6 +2106,7 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Constraint"); RNA_def_property_flag(prop, PROP_OVERRIDABLE_STATIC | PROP_OVERRIDABLE_STATIC_INSERTION); RNA_def_property_ui_text(prop, "Constraints", "Constraints affecting the transformation of the object"); + RNA_def_property_override_funcs(prop, NULL, NULL, "rna_Object_constraints_override_apply"); /* RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "constraints__add", "constraints__remove"); */ rna_def_object_constraints(brna, prop); |