[Bf-blender-cvs] [099a4104788] master: Depsgraph: Fix cycle with rigid body and Weight Proximity
Sergey Sharybin
noreply at git.blender.org
Wed Mar 20 16:37:20 CET 2019
Commit: 099a41047882bbd835941e70c419290008ee35cd
Author: Sergey Sharybin
Date: Wed Mar 20 16:35:23 2019 +0100
Branches: master
https://developer.blender.org/rB099a41047882bbd835941e70c419290008ee35cd
Depsgraph: Fix cycle with rigid body and Weight Proximity
The issue is a feedback loop with point cache reset operation.
Solved by introducing extra node which ensures object's transformation
is ready for simulator input. Allows to route relations without causing
a fake dependency cycle now.
===================================================================
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 09a79db2dbd..39806d22071 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1072,8 +1072,11 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
if (object->type != OB_MESH) {
continue;
}
- /* 2) create operation for flushing results */
- /* object's transform component - where the rigidbody operation
+ add_operation_node(&object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_SIMULATION_INIT);
+ /* Create operation for flushing results. */
+ /* Object's transform component - where the rigidbody operation
* lives. */
add_operation_node(&object->id,
NodeType::TRANSFORM,
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index b10736c98f5..d4bd63f200b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -934,9 +934,10 @@ void DepsgraphRelationBuilder::build_object_pointcache(Object *object)
int flag = -1;
if (ptcache_id->type == PTCACHE_TYPE_RIGIDBODY) {
flag = FLAG_TRANSFORM;
- OperationKey transform_key(&object->id,
- NodeType::TRANSFORM,
- OperationCode::TRANSFORM_LOCAL);
+ OperationKey transform_key(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_SIMULATION_INIT);
add_relation(point_cache_key,
transform_key,
"Point Cache -> Rigid Body");
@@ -1731,11 +1732,19 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
"Rigidbody Sim Eval -> RBO Sync");
/* Simulation uses object transformation after parenting and solving
* contraints. */
+ OperationKey object_transform_simulation_init_key(
+ &object->id,
+ NodeType::TRANSFORM,
+ OperationCode::TRANSFORM_SIMULATION_INIT);
OperationKey object_transform_eval_key(
&object->id,
NodeType::TRANSFORM,
OperationCode::TRANSFORM_EVAL);
+
add_relation(object_transform_eval_key,
+ object_transform_simulation_init_key,
+ "Object Transform -> Simulation Init");
+ add_relation(object_transform_simulation_init_key,
rb_simulate_key,
"Object Transform -> Rigidbody Sim Eval");
/* Geometry must be known to create the rigid body. RBO_MESH_BASE
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc
index 893c108dc5a..b0b47f89acf 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc
@@ -61,6 +61,8 @@ const char *operationCodeAsString(OperationCode opcode)
return "TRANSFORM_CONSTRAINTS";
case OperationCode::TRANSFORM_FINAL: return "TRANSFORM_FINAL";
case OperationCode::TRANSFORM_EVAL: return "TRANSFORM_EVAL";
+ case OperationCode::TRANSFORM_SIMULATION_INIT:
+ return "TRANSFORM_SIMULATION_INIT";
/* Rigid body. */
case OperationCode::RIGIDBODY_REBUILD: return "RIGIDBODY_REBUILD";
case OperationCode::RIGIDBODY_SIM: return "RIGIDBODY_SIM";
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h
index c6db7b012d7..56207b08d4a 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.h
@@ -76,6 +76,10 @@ enum class OperationCode {
TRANSFORM_CONSTRAINTS,
/* Handle object-level updates, mainly proxies hacks and recalc flags. */
TRANSFORM_EVAL,
+ /* Initializes transformation for simulation.
+ * For example, ensures point cache is properly reset before doing rigid
+ * body simulation. */
+ TRANSFORM_SIMULATION_INIT,
/* Transform exit point */
TRANSFORM_FINAL,
More information about the Bf-blender-cvs
mailing list