[Bf-blender-cvs] [c7947b2115b] tmp-static-override-insertion: Static override: Add basic two-passes system needed for apply insert op.

Bastien Montagne noreply at git.blender.org
Wed May 2 11:38:18 CEST 2018


Commit: c7947b2115bf1b15caed94a67b1b39df1959ebb2
Author: Bastien Montagne
Date:   Tue May 1 17:41:44 2018 +0200
Branches: tmp-static-override-insertion
https://developer.blender.org/rBc7947b2115bf1b15caed94a67b1b39df1959ebb2

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!

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

M	source/blender/makesrna/intern/rna_access.c
M	source/blender/makesrna/intern/rna_object.c

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

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);



More information about the Bf-blender-cvs mailing list