Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2022-01-04 14:28:37 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2022-01-06 16:43:18 +0300
commit7bcf21e66e2e46042b027b4481fa9866e64fe9a1 (patch)
tree5a17a9b8f75a5b1dafca849ddbb7b96c1ef7b480 /source/blender
parent08aa7861d6a4c2c9397833322f959fad4df4885f (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')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc27
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h7
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc13
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_rna.cc10
4 files changed, 52 insertions, 5 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index ecbe89b1e7f..79d674e8415 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -271,6 +271,21 @@ OperationNode *DepsgraphNodeBuilder::add_operation_node(ID *id,
OperationNode *DepsgraphNodeBuilder::ensure_operation_node(ID *id,
NodeType comp_type,
+ const char *comp_name,
+ OperationCode opcode,
+ const DepsEvalOperationCb &op,
+ const char *name,
+ int name_tag)
+{
+ OperationNode *operation = find_operation_node(id, comp_type, comp_name, opcode, name, name_tag);
+ if (operation != nullptr) {
+ return operation;
+ }
+ return add_operation_node(id, comp_type, comp_name, opcode, op, name, name_tag);
+}
+
+OperationNode *DepsgraphNodeBuilder::ensure_operation_node(ID *id,
+ NodeType comp_type,
OperationCode opcode,
const DepsEvalOperationCb &op,
const char *name,
@@ -1198,8 +1213,16 @@ void DepsgraphNodeBuilder::build_driver_id_property(ID *id, const char *rna_path
return;
}
const char *prop_identifier = RNA_property_identifier((PropertyRNA *)prop);
- ensure_operation_node(
- id, NodeType::PARAMETERS, OperationCode::ID_PROPERTY, nullptr, prop_identifier);
+ /* Custom properties of bones are placed in their components to improve granularity. */
+ if (RNA_struct_is_a(ptr.type, &RNA_PoseBone)) {
+ const bPoseChannel *pchan = static_cast<const bPoseChannel *>(ptr.data);
+ ensure_operation_node(
+ id, NodeType::BONE, pchan->name, OperationCode::ID_PROPERTY, nullptr, prop_identifier);
+ }
+ else {
+ ensure_operation_node(
+ id, NodeType::PARAMETERS, OperationCode::ID_PROPERTY, nullptr, prop_identifier);
+ }
}
void DepsgraphNodeBuilder::build_parameters(ID *id)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 83bc33b6a4e..a1db4aaf693 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -135,6 +135,13 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
OperationNode *ensure_operation_node(ID *id,
NodeType comp_type,
+ const char *comp_name,
+ OperationCode opcode,
+ const DepsEvalOperationCb &op = nullptr,
+ const char *name = "",
+ int name_tag = -1);
+ OperationNode *ensure_operation_node(ID *id,
+ NodeType comp_type,
OperationCode opcode,
const DepsEvalOperationCb &op = nullptr,
const char *name = "",
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);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
index 43d24125dc2..76a115a06c8 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
@@ -181,7 +181,15 @@ RNANodeIdentifier RNANodeQuery::construct_node_identifier(const PointerRNA *ptr,
node_identifier.operation_name_tag = -1;
/* Handling of commonly known scenarios. */
if (rna_prop_affects_parameters_node(ptr, prop)) {
- node_identifier.type = NodeType::PARAMETERS;
+ /* Custom properties of bones are placed in their components to improve granularity. */
+ if (RNA_struct_is_a(ptr->type, &RNA_PoseBone)) {
+ const bPoseChannel *pchan = static_cast<const bPoseChannel *>(ptr->data);
+ node_identifier.type = NodeType::BONE;
+ node_identifier.component_name = pchan->name;
+ }
+ else {
+ node_identifier.type = NodeType::PARAMETERS;
+ }
node_identifier.operation_code = OperationCode::ID_PROPERTY;
node_identifier.operation_name = RNA_property_identifier(
reinterpret_cast<const PropertyRNA *>(prop));