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:
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc11
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc14
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h7
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h27
-rw-r--r--source/blender/depsgraph/intern/depsgraph.cc25
5 files changed, 35 insertions, 49 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 85745f36ec1..33d047bf674 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1238,10 +1238,21 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
return;
}
build_animdata(&key->id);
+ /* This is an exit operation for the entire key datablock, is what is used
+ * as dependency for modifiers evaluation. */
add_operation_node(&key->id,
DEG_NODE_TYPE_GEOMETRY,
NULL,
DEG_OPCODE_GEOMETRY_SHAPEKEY);
+ /* Create per-key block properties, allowing tricky inter-dependnecies for
+ * drivers evaluation. */
+ LISTBASE_FOREACH (KeyBlock *, key_block, &key->block) {
+ add_operation_node(&key->id,
+ DEG_NODE_TYPE_PARAMETERS,
+ NULL,
+ DEG_OPCODE_PARAMETERS_EVAL,
+ key_block->name);
+ }
}
/* ObData Geometry Evaluation */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 95535355bb5..04d0c6cd02c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1553,8 +1553,7 @@ void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
continue;
}
if (is_same_bone_dependency(variable_exit_key, self_key) ||
- is_same_nodetree_node_dependency(variable_exit_key, self_key) ||
- is_same_shapekey_dependency(variable_exit_key, self_key))
+ is_same_nodetree_node_dependency(variable_exit_key, self_key))
{
continue;
}
@@ -1929,8 +1928,17 @@ void DepsgraphRelationBuilder::build_shapekeys(Key *key)
if (built_map_.checkIsBuiltAndTag(key)) {
return;
}
- /* attach animdata to geometry */
+ /* Attach animdata to geometry. */
build_animdata(&key->id);
+ /* Connect all blocks properties to the final result evaluation. */
+ ComponentKey geometry_key(&key->id, DEG_NODE_TYPE_GEOMETRY);
+ LISTBASE_FOREACH (KeyBlock *, key_block, &key->block) {
+ OperationKey key_block_key(&key->id,
+ DEG_NODE_TYPE_PARAMETERS,
+ DEG_OPCODE_PARAMETERS_EVAL,
+ key_block->name);
+ add_relation(key_block_key, geometry_key, "Key Block Properties");
+ }
}
/**
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 3b1a2d00e98..aafd351cbc5 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -347,13 +347,6 @@ protected:
bool is_same_nodetree_node_dependency(const KeyFrom& key_from,
const KeyTo& key_to);
- /* Similar to above, but used to check whether driver is using key from
- * the same key datablock as a driver variable.
- */
- template <typename KeyFrom, typename KeyTo>
- bool is_same_shapekey_dependency(const KeyFrom& key_from,
- const KeyTo& key_to);
-
private:
struct BuilderWalkUserData {
DepsgraphRelationBuilder *builder;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
index 726393f39b9..f5b9a9ed25a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
@@ -217,31 +217,4 @@ bool DepsgraphRelationBuilder::is_same_nodetree_node_dependency(
return true;
}
-template <typename KeyFrom, typename KeyTo>
-bool DepsgraphRelationBuilder::is_same_shapekey_dependency(
- const KeyFrom& key_from,
- const KeyTo& key_to)
-{
- /* Get operations for requested keys. */
- DepsNode *node_from = get_node(key_from);
- DepsNode *node_to = get_node(key_to);
- if (node_from == NULL || node_to == NULL) {
- return false;
- }
- OperationDepsNode *op_from = node_from->get_exit_operation();
- OperationDepsNode *op_to = node_to->get_entry_operation();
- if (op_from == NULL || op_to == NULL) {
- return false;
- }
- /* Check if this is actually a shape key datablock. */
- if (GS(op_from->owner->owner->id_orig->name) != ID_KE) {
- return false;
- }
- /* Different key data blocks. */
- if (op_from->owner->owner != op_to->owner->owner) {
- return false;
- }
- return true;
-}
-
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index d7da6658e3e..00a16f3e32c 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -124,7 +124,7 @@ static bool pointer_to_component_node_criteria(
RNAPointerSource /*source*/,
ID **id,
eDepsNode_Type *type,
- const char **subdata,
+ const char **component_name,
eDepsOperation_Code *operation_code,
const char **operation_name,
int *operation_name_tag)
@@ -134,7 +134,7 @@ static bool pointer_to_component_node_criteria(
}
/* Set default values for returns. */
*id = (ID *)ptr->id.data;
- *subdata = "";
+ *component_name = "";
*operation_code = DEG_OPCODE_OPERATION;
*operation_name = "";
*operation_name_tag = -1;
@@ -150,7 +150,7 @@ static bool pointer_to_component_node_criteria(
else {
/* Bone - generally, we just want the bone component. */
*type = DEG_NODE_TYPE_BONE;
- *subdata = pchan->name;
+ *component_name = pchan->name;
/* But B-Bone properties should connect to the actual operation. */
if (!ELEM(NULL, pchan->bone, prop) && pchan->bone->segments > 1 &&
STRPREFIX(RNA_property_identifier(prop), "bbone_"))
@@ -165,7 +165,7 @@ static bool pointer_to_component_node_criteria(
/* armature-level bone, but it ends up going to bone component anyway */
// NOTE: the ID in this case will end up being bArmature.
*type = DEG_NODE_TYPE_BONE;
- *subdata = bone->name;
+ *component_name = bone->name;
return true;
}
else if (RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
@@ -174,8 +174,7 @@ static bool pointer_to_component_node_criteria(
/* Check whether is object or bone constraint. */
/* NOTE: Currently none of the area can address transform of an object
* at a given constraint, but for rigging one might use constraint
- * influence to be used to drive some corrective shape keys or so.
- */
+ * influence to be used to drive some corrective shape keys or so. */
if (BLI_findindex(&object->constraints, con) != -1) {
*type = DEG_NODE_TYPE_TRANSFORM;
*operation_code = DEG_OPCODE_TRANSFORM_LOCAL;
@@ -186,7 +185,7 @@ static bool pointer_to_component_node_criteria(
if (BLI_findindex(&pchan->constraints, con) != -1) {
*type = DEG_NODE_TYPE_BONE;
*operation_code = DEG_OPCODE_BONE_LOCAL;
- *subdata = pchan->name;
+ *component_name = pchan->name;
return true;
}
}
@@ -202,7 +201,7 @@ static bool pointer_to_component_node_criteria(
if (pchan != NULL) {
*type = DEG_NODE_TYPE_BONE;
*operation_code = DEG_OPCODE_BONE_LOCAL;
- *subdata = pchan->name;
+ *component_name = pchan->name;
}
else {
*type = DEG_NODE_TYPE_TRANSFORM;
@@ -230,16 +229,18 @@ static bool pointer_to_component_node_criteria(
}
else if (strstr(prop_identifier, "data")) {
/* We access object.data, most likely a geometry.
- * Might be a bone tho..
- */
+ * Might be a bone tho. */
*type = DEG_NODE_TYPE_GEOMETRY;
return true;
}
}
}
else if (ptr->type == &RNA_ShapeKey) {
+ KeyBlock *key_block = (KeyBlock *)ptr->data;
*id = (ID *)ptr->id.data;
- *type = DEG_NODE_TYPE_GEOMETRY;
+ *type = DEG_NODE_TYPE_PARAMETERS;
+ *operation_code = DEG_OPCODE_PARAMETERS_EVAL;
+ *operation_name = key_block->name;
return true;
}
else if (ptr->type == &RNA_Key) {
@@ -251,7 +252,7 @@ static bool pointer_to_component_node_criteria(
Sequence *seq = (Sequence *)ptr->data;
/* Sequencer strip */
*type = DEG_NODE_TYPE_SEQUENCER;
- *subdata = seq->name; // xxx?
+ *component_name = seq->name;
return true;
}
else if (RNA_struct_is_a(ptr->type, &RNA_NodeSocket)) {