[Bf-blender-cvs] [fb15dfbddf0] master: Depsgraph: Fix dependency cycle when rigid body is involved

Sergey Sharybin noreply at git.blender.org
Wed Feb 6 17:08:40 CET 2019


Commit: fb15dfbddf0ab65cae01e0620abdd7bb046a7aba
Author: Sergey Sharybin
Date:   Wed Feb 6 17:04:29 2019 +0100
Branches: master
https://developer.blender.org/rBfb15dfbddf0ab65cae01e0620abdd7bb046a7aba

Depsgraph: Fix dependency cycle when rigid body is involved

Was introduced by point cache reset on manual edits. Needed to
split evaluation and introduce an explicit init key, which allows
to hook up relations which are "monitoring" manual edits to the
channel.

Noticed while looking into T61190.

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 8f21d33f561..f29c221beeb 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -743,13 +743,16 @@ void DepsgraphNodeBuilder::build_object_transform(Object *object)
 {
 	OperationNode *op_node;
 	Object *ob_cow = get_cow_datablock(object);
-	/* Local transforms (from transform channels - loc/rot/scale + deltas). */
-	op_node = add_operation_node(&object->id, NodeType::TRANSFORM,
-	                             OperationCode::TRANSFORM_LOCAL,
-	                             function_bind(BKE_object_eval_local_transform,
-	                                           _1,
-	                                           ob_cow));
+	/* Transform entry operation. */
+	op_node = add_operation_node(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_INIT);
 	op_node->set_as_entry();
+	/* Local transforms (from transform channels - loc/rot/scale + deltas). */
+	add_operation_node(&object->id, NodeType::TRANSFORM,
+	                   OperationCode::TRANSFORM_LOCAL,
+	                   function_bind(BKE_object_eval_local_transform,
+	                                 _1,
+	                                 ob_cow));
 	/* Object parent. */
 	if (object->parent != NULL) {
 		add_operation_node(&object->id, NodeType::TRANSFORM,
@@ -762,7 +765,7 @@ void DepsgraphNodeBuilder::build_object_transform(Object *object)
 	}
 	/* Rest of transformation update. */
 	add_operation_node(&object->id, NodeType::TRANSFORM,
-	                   OperationCode::TRANSFORM_OBJECT_UBEREVAL,
+	                   OperationCode::TRANSFORM_EVAL,
 	                   function_bind(BKE_object_eval_uber_transform,
 	                                 _1,
 	                                 ob_cow));
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 6ec01639dfa..a15e4e7a56f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -570,20 +570,19 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 	}
 	/* Object Transforms */
 	OperationCode base_op = (object->parent) ? OperationCode::TRANSFORM_PARENT
-	                                               : OperationCode::TRANSFORM_LOCAL;
+	                                         : OperationCode::TRANSFORM_LOCAL;
 	OperationKey base_op_key(&object->id, NodeType::TRANSFORM, base_op);
-	OperationKey local_transform_key(&object->id,
-	                                 NodeType::TRANSFORM,
-	                                 OperationCode::TRANSFORM_LOCAL);
-	OperationKey parent_transform_key(&object->id,
-	                                  NodeType::TRANSFORM,
-	                                  OperationCode::TRANSFORM_PARENT);
-	OperationKey final_transform_key(&object->id,
-	                                 NodeType::TRANSFORM,
-	                                 OperationCode::TRANSFORM_FINAL);
-	OperationKey ob_ubereval_key(&object->id,
-	                             NodeType::TRANSFORM,
-	                             OperationCode::TRANSFORM_OBJECT_UBEREVAL);
+	OperationKey init_transform_key(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_INIT);
+	OperationKey local_transform_key(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_LOCAL);
+	OperationKey parent_transform_key(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_PARENT);
+	OperationKey final_transform_key(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_FINAL);
+	OperationKey ob_eval_key(
+	        &object->id, NodeType::TRANSFORM, OperationCode::TRANSFORM_EVAL);
+	add_relation(init_transform_key, local_transform_key, "Transform Init");
 	/* Various flags, flushing from bases/collections. */
 	build_object_flags(base, object);
 	/* Parenting. */
@@ -635,20 +634,19 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 		/* operation order */
 		add_relation(base_op_key, constraint_key, "ObBase-> Constraint Stack");
 		add_relation(constraint_key, final_transform_key, "ObConstraints -> Done");
-		// XXX
-		add_relation(constraint_key, ob_ubereval_key, "Temp Ubereval");
-		add_relation(ob_ubereval_key, final_transform_key, "Temp Ubereval");
+		add_relation(constraint_key, ob_eval_key, "Eval");
+		add_relation(ob_eval_key, final_transform_key, "Eval");
 	}
 	else {
 		/* NOTE: Keep an eye here, we skip some relations here to "streamline"
 		 * dependencies and avoid transitive relations which causes overhead.
 		 * But once we get rid of uber eval node this will need reconsideration. */
 		if (object->rigidbody_object == NULL) {
-			/* Rigid body will hook up another node inbetween, so skip
+			/* Rigid body will hook up another node in between, so skip
 			 * relation here to avoid transitive relation. */
-			add_relation(base_op_key, ob_ubereval_key, "Temp Ubereval");
+			add_relation(base_op_key, ob_eval_key, "Eval");
 		}
-		add_relation(ob_ubereval_key, final_transform_key, "Temp Ubereval");
+		add_relation(ob_eval_key, final_transform_key, "Eval");
 	}
 	/* Animation data */
 	build_animdata(&object->id);
@@ -661,16 +659,19 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 	/* Proxy object to copy from. */
 	if (object->proxy_from != NULL) {
 		build_object(NULL, object->proxy_from);
-		ComponentKey ob_transform_key(&object->proxy_from->id, NodeType::TRANSFORM);
+		ComponentKey ob_transform_key(
+		        &object->proxy_from->id, NodeType::TRANSFORM);
 		ComponentKey proxy_transform_key(&object->id, NodeType::TRANSFORM);
 		add_relation(ob_transform_key, proxy_transform_key, "Proxy Transform");
 	}
 	if (object->proxy_group != NULL) {
 		build_object(NULL, object->proxy_group);
-		OperationKey proxy_group_ubereval_key(&object->proxy_group->id,
-		                                      NodeType::TRANSFORM,
-		                                      OperationCode::TRANSFORM_OBJECT_UBEREVAL);
-		add_relation(proxy_group_ubereval_key, final_transform_key, "Proxy Group Transform");
+		OperationKey proxy_group_eval_key(&object->proxy_group->id,
+		                                  NodeType::TRANSFORM,
+		                                  OperationCode::TRANSFORM_EVAL);
+		add_relation(proxy_group_eval_key,
+		             final_transform_key,
+		             "Proxy Group Transform");
 	}
 	/* Object dupligroup. */
 	if (object->dup_group != NULL) {
@@ -912,7 +913,9 @@ void DepsgraphRelationBuilder::build_object_pointcache(Object *object)
 		int flag = -1;
 		if (ptcache_id->type == PTCACHE_TYPE_RIGIDBODY) {
 			flag = FLAG_TRANSFORM;
-			ComponentKey transform_key(&object->id, NodeType::TRANSFORM);
+			OperationKey transform_key(&object->id,
+			                           NodeType::TRANSFORM,
+			                           OperationCode::TRANSFORM_LOCAL);
 			add_relation(point_cache_key,
 			             transform_key,
 			             "Point Cache -> Rigid Body");
@@ -934,13 +937,13 @@ void DepsgraphRelationBuilder::build_object_pointcache(Object *object)
 	}
 	/* Manual edits to any dependency (or self) should reset the point cache. */
 	if (!BLI_listbase_is_empty(&ptcache_id_list)) {
-		OperationKey transform_local_key(&object->id,
-		                                 NodeType::TRANSFORM,
-		                                 OperationCode::TRANSFORM_LOCAL);
+		OperationKey transform_init_key(&object->id,
+		                                NodeType::TRANSFORM,
+		                                OperationCode::TRANSFORM_INIT);
 		OperationKey geometry_init_key(&object->id,
 		                               NodeType::GEOMETRY,
 		                               OperationCode::GEOMETRY_EVAL_INIT);
-		add_relation(transform_local_key,
+		add_relation(transform_init_key,
 		             point_cache_key,
 		             "Transform Local -> Point Cache",
 		             RELATION_FLAG_FLUSH_USER_EDIT_ONLY);
@@ -1637,7 +1640,8 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
 			 *         - passive don't change, so may need to know full transform... */
 			OperationKey rbo_key(&object->id, NodeType::TRANSFORM, OperationCode::RIGIDBODY_TRANSFORM_COPY);
 
-			OperationCode trans_opcode = object->parent ? OperationCode::TRANSFORM_PARENT : OperationCode::TRANSFORM_LOCAL;
+			OperationCode trans_opcode = object->parent ? OperationCode::TRANSFORM_PARENT
+			                                            : OperationCode::TRANSFORM_LOCAL;
 			OperationKey trans_op(&object->id, NodeType::TRANSFORM, trans_opcode);
 
 			add_relation(sim_key, rbo_key, "Rigidbody Sim Eval -> RBO Sync");
@@ -1663,14 +1667,13 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
 				add_relation(rbo_key, constraint_key, "RBO Sync -> Ob Constraints");
 			}
 			else {
-				/* Final object transform depends on rigidbody.
-				 *
-				 * NOTE: Currently we consider final here an ubereval node.
-				 * If it is gone we'll need to reconsider relation here. */
-				OperationKey uber_key(&object->id,
-				                      NodeType::TRANSFORM,
-				                      OperationCode::TRANSFORM_OBJECT_UBEREVAL);
-				add_relation(rbo_key, uber_key, "RBO Sync -> Uber (Temp)");
+				/* Transform evaluation depends on rigidbody. */
+				OperationKey transform_eval_key(&object->id,
+				                                NodeType::TRANSFORM,
+				                                OperationCode::TRANSFORM_EVAL);
+				add_relation(rbo_key,
+				             transform_eval_key,
+				             "RBO Sync -> Transform Eval");
 			}
 
 			/* Needed to get correct base values. */
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc
index f8f9c16af23..2a338613068 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc
@@ -49,13 +49,13 @@ const char *operationCodeAsString(OperationCode

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list