diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-12-05 18:30:30 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-12-05 18:30:30 +0300 |
commit | 69e8e34d9662f1788712f0736dafa53e4e47eea3 (patch) | |
tree | 1e4e91471dc44361b66022bd268d0f00af696bdf /source/blender/depsgraph | |
parent | d1d721769299d8c79c45fe2c2849a81c3b57e82c (diff) |
Depsgraph: avoid more transitive relations for rigid body simulation
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 3fa22741e4d..d9a21d2b888 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -410,10 +410,15 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *o * dependencies and avoid transitive relations which causes overhead. * But once we get rid of uber eval node this will need reconsideration. */ - add_relation(base_op_key, - ob_ubereval_key, - DEPSREL_TYPE_COMPONENT_ORDER, - "Temp Ubereval"); + if (ob->rigidbody_object == NULL) { + /* Rigid body will hook up another node inbetween, so skip + * relation here to avoid transitive relation. + */ + add_relation(base_op_key, + ob_ubereval_key, + DEPSREL_TYPE_COMPONENT_ORDER, + "Temp Ubereval"); + } add_relation(ob_ubereval_key, final_transform_key, DEPSREL_TYPE_COMPONENT_ORDER, @@ -1091,7 +1096,6 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene) eDepsOperation_Code trans_opcode = ob->parent ? DEG_OPCODE_TRANSFORM_PARENT : DEG_OPCODE_TRANSFORM_LOCAL; OperationKey trans_op(&ob->id, DEPSNODE_TYPE_TRANSFORM, trans_opcode); - add_relation(trans_op, rbo_key, DEPSREL_TYPE_OPERATION, "Base Ob Transform -> RBO Sync"); add_relation(sim_key, rbo_key, DEPSREL_TYPE_COMPONENT_ORDER, "Rigidbody Sim Eval -> RBO Sync"); /* if constraints exist, those depend on the result of the rigidbody sim @@ -1103,22 +1107,34 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene) * to control whether rigidbody eval gets interleaved into the constraint stack */ if (ob->constraints.first) { - OperationKey constraint_key(&ob->id, DEPSNODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_CONSTRAINTS); - add_relation(rbo_key, constraint_key, DEPSREL_TYPE_COMPONENT_ORDER, "RBO Sync -> Ob Constraints"); + OperationKey constraint_key(&ob->id, + DEPSNODE_TYPE_TRANSFORM, + DEG_OPCODE_TRANSFORM_CONSTRAINTS); + add_relation(rbo_key, + constraint_key, + DEPSREL_TYPE_COMPONENT_ORDER, + "RBO Sync -> Ob Constraints"); } else { - /* final object transform depends on rigidbody */ - OperationKey done_key(&ob->id, DEPSNODE_TYPE_TRANSFORM, DEG_OPCODE_TRANSFORM_FINAL); - add_relation(rbo_key, done_key, DEPSREL_TYPE_COMPONENT_ORDER, "RBO Sync -> Done"); - - // XXX: ubereval will be removed eventually, but we still need it in the meantime - OperationKey uber_key(&ob->id, DEPSNODE_TYPE_TRANSFORM, DEG_OPCODE_OBJECT_UBEREVAL); - add_relation(rbo_key, uber_key, DEPSREL_TYPE_COMPONENT_ORDER, "RBO Sync -> Uber (Temp)"); + /* 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(&ob->id, + DEPSNODE_TYPE_TRANSFORM, + DEG_OPCODE_OBJECT_UBEREVAL); + add_relation(rbo_key, + uber_key, + DEPSREL_TYPE_COMPONENT_ORDER, + "RBO Sync -> Uber (Temp)"); } - - /* needed to get correct base values */ - add_relation(trans_op, sim_key, DEPSREL_TYPE_OPERATION, "Base Ob Transform -> Rigidbody Sim Eval"); + /* Needed to get correct base values. */ + add_relation(trans_op, + sim_key, + DEPSREL_TYPE_OPERATION, + "Base Ob Transform -> Rigidbody Sim Eval"); } } |