diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2019-05-07 14:51:40 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2019-05-07 15:00:38 +0300 |
commit | c041e10c9a94864537e78c4a36e3f03838889655 (patch) | |
tree | 506afd546de50762234ed46e7841019c463b035f /source | |
parent | 59688265621026a71263920c91b412a46a608ae6 (diff) |
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.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_rna.cc | 29 |
1 files 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<Object *>(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<Object *>(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; |