diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2022-01-04 14:28:37 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2022-01-06 16:43:18 +0300 |
commit | 7bcf21e66e2e46042b027b4481fa9866e64fe9a1 (patch) | |
tree | 5a17a9b8f75a5b1dafca849ddbb7b96c1ef7b480 /source/blender/depsgraph/intern/builder/deg_builder_relations.cc | |
parent | 08aa7861d6a4c2c9397833322f959fad4df4885f (diff) |
Depsgraph: fix spurious cycles with identically named idprops on bones.
If multiple bones have a custom property with the same name,
depsgraph didn't distinguish between them, potentially leading
to spurious cycles.
This patch moves ID_PROPERTY operation nodes for bone custom
properties from the parameters component to individual bone
components, thus decoupling them.
Differential Revision: https://developer.blender.org/D13729
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_relations.cc')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 558ea3dd6e0..51eefd7e31d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1729,8 +1729,17 @@ void DepsgraphRelationBuilder::build_driver_id_property(ID *id, const char *rna_ return; } const char *prop_identifier = RNA_property_identifier((PropertyRNA *)prop); - OperationKey id_property_key( - id, NodeType::PARAMETERS, OperationCode::ID_PROPERTY, prop_identifier); + /* Custom properties of bones are placed in their components to improve granularity. */ + OperationKey id_property_key; + if (RNA_struct_is_a(ptr.type, &RNA_PoseBone)) { + const bPoseChannel *pchan = static_cast<const bPoseChannel *>(ptr.data); + id_property_key = OperationKey( + id, NodeType::BONE, pchan->name, OperationCode::ID_PROPERTY, prop_identifier); + } + else { + id_property_key = OperationKey( + id, NodeType::PARAMETERS, OperationCode::ID_PROPERTY, prop_identifier); + } OperationKey parameters_exit_key(id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EXIT); add_relation( id_property_key, parameters_exit_key, "ID Property -> Done", RELATION_CHECK_BEFORE_ADD); |