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:
authorSybren A. Stüvel <sybren@blender.org>2020-01-24 14:15:12 +0300
committerSybren A. Stüvel <sybren@blender.org>2020-01-24 14:16:33 +0300
commit71d53ab4654c3abb9bd548b324f8c9ca34250a9b (patch)
treee12be4dc45223f71cb9f51fb2ce43d872102f595 /source/blender/depsgraph/intern/builder/deg_builder_rna.cc
parent316d2c15220d35a9b74b15f940c45ce8d8a09288 (diff)
Fix T73001: Shader Node with driver not updating when animated
When there are ID properties on an object, and these are animated and used by a driver, the depsgraph has proper connections between ACTION → ID PROPERTY → DRIVER. When these properties are defined on a mesh, however, the depsgraph relations are incorrectly created between GEOMETRY → PROPERTIES_EXIT → DRIVER (because it's assumed that 'source = ENTRY' implies 'geometry'). This patch solves this by first checking whether the targeted property is an ID property and handling it accordingly. This also made it possible to remove some special cases from pose bone relations. Maniphest Tasks: T73001 Reviewed By: sergey Differential Revision: https://developer.blender.org/D6571
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_rna.cc')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_rna.cc80
1 files changed, 35 insertions, 45 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
index 180499519f6..d092240e665 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_rna.cc
@@ -183,44 +183,42 @@ RNANodeIdentifier RNANodeQuery::construct_node_identifier(const PointerRNA *ptr,
node_identifier.operation_name = "";
node_identifier.operation_name_tag = -1;
/* Handling of commonly known scenarios. */
- if (ptr->type == &RNA_PoseBone) {
+ if (prop != NULL && RNA_property_is_idprop(prop)) {
+ node_identifier.type = NodeType::PARAMETERS;
+ node_identifier.operation_code = OperationCode::ID_PROPERTY;
+ node_identifier.operation_name = RNA_property_identifier(
+ reinterpret_cast<const PropertyRNA *>(prop));
+ return node_identifier;
+ }
+ else if (ptr->type == &RNA_PoseBone) {
const bPoseChannel *pchan = static_cast<const bPoseChannel *>(ptr->data);
- if (prop != NULL && RNA_property_is_idprop(prop)) {
- node_identifier.type = NodeType::PARAMETERS;
- node_identifier.operation_code = OperationCode::ID_PROPERTY;
- node_identifier.operation_name = RNA_property_identifier(
- reinterpret_cast<const PropertyRNA *>(prop));
- node_identifier.operation_name_tag = -1;
- }
- else {
- /* Bone - generally, we just want the bone component. */
- node_identifier.type = NodeType::BONE;
- node_identifier.component_name = pchan->name;
- /* 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") ||
- STREQ(prop_name, "length") || STRPREFIX(prop_name, "matrix")) {
- if (source == RNAPointerSource::EXIT) {
- node_identifier.operation_code = OperationCode::BONE_DONE;
- }
+ /* Bone - generally, we just want the bone component. */
+ node_identifier.type = NodeType::BONE;
+ node_identifier.component_name = pchan->name;
+ /* 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;
}
- /* And other properties can always go to the entry operation. */
else {
- node_identifier.operation_code = OperationCode::BONE_LOCAL;
+ 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") ||
+ STREQ(prop_name, "length") || 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;
}
@@ -374,18 +372,10 @@ RNANodeIdentifier RNANodeQuery::construct_node_identifier(const PointerRNA *ptr,
}
if (prop != NULL) {
/* All unknown data effectively falls under "parameter evaluation". */
- if (RNA_property_is_idprop(prop)) {
- node_identifier.type = NodeType::PARAMETERS;
- node_identifier.operation_code = OperationCode::ID_PROPERTY;
- node_identifier.operation_name = RNA_property_identifier((PropertyRNA *)prop);
- node_identifier.operation_name_tag = -1;
- }
- else {
- node_identifier.type = NodeType::PARAMETERS;
- node_identifier.operation_code = OperationCode::PARAMETERS_EVAL;
- node_identifier.operation_name = "";
- node_identifier.operation_name_tag = -1;
- }
+ node_identifier.type = NodeType::PARAMETERS;
+ node_identifier.operation_code = OperationCode::PARAMETERS_EVAL;
+ node_identifier.operation_name = "";
+ node_identifier.operation_name_tag = -1;
return node_identifier;
}
return node_identifier;