From c041e10c9a94864537e78c4a36e3f03838889655 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Tue, 7 May 2019 14:51:40 +0300 Subject: Depsgraph: provide more granularity to PoseBone property links. Most properties aren't altered by the evaluation of the bone, and can be read immediately from its input operation. B-Bone properties can be evaluated at the last possible moment. This provides more freedom in using drivers to connect bone properties: for example, it is now possible to read raw local transform values via drivers from a bone that depends on the reader bone via constraints. --- .../depsgraph/intern/builder/deg_builder_rna.cc | 29 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc index ea5f86a31a8..fa38dce1a9f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc @@ -196,11 +196,30 @@ RNANodeIdentifier RNANodeQuery::construct_node_identifier(const PointerRNA *ptr, /* Bone - generally, we just want the bone component. */ node_identifier.type = NodeType::BONE; node_identifier.component_name = pchan->name; - /* But B-Bone properties should connect to the actual operation. */ - Object *object = reinterpret_cast(node_identifier.id); - if (!ELEM(NULL, pchan->bone, prop) && STRPREFIX(RNA_property_identifier(prop), "bbone_") && - builder_->check_pchan_has_bbone_segments(object, pchan)) { - node_identifier.operation_code = OperationCode::BONE_SEGMENTS; + /* However check property name for special handling. */ + if (prop != NULL) { + Object *object = reinterpret_cast(node_identifier.id); + const char *prop_name = RNA_property_identifier(prop); + /* B-Bone properties should connect to the final operation. */ + if (STRPREFIX(prop_name, "bbone_")) { + if (builder_->check_pchan_has_bbone_segments(object, pchan)) { + node_identifier.operation_code = OperationCode::BONE_SEGMENTS; + } + else { + node_identifier.operation_code = OperationCode::BONE_DONE; + } + } + /* Final transform properties go to the Done node for the exit. */ + else if (STREQ(prop_name, "head") || STREQ(prop_name, "tail") || + STRPREFIX(prop_name, "matrix")) { + if (source == RNAPointerSource::EXIT) { + node_identifier.operation_code = OperationCode::BONE_DONE; + } + } + /* And other properties can always go to the entry operation. */ + else { + node_identifier.operation_code = OperationCode::BONE_LOCAL; + } } } return node_identifier; -- cgit v1.2.3