diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-01-17 20:00:54 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-01-17 20:02:51 +0300 |
commit | 46204f843b5710dabb99e194aee5e3202b9688e4 (patch) | |
tree | 872b2c14e02862950786b65f3b319b8ad6148655 /source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h | |
parent | 5d4ffb42a327b08542e3556e7a98f1bc14d21c70 (diff) |
Depsgraph: Fix for fake dependency cycle being created for shape key drivers
One thing i'm not fully happy with is all this is_same_* functions. Need to
get rid of this by probably adding explicit entry/init/whatever nodes and
maybe making node criteria aware of whether key will be used as "from" or
as "to" node.
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h | 29 |
1 files changed, 28 insertions, 1 deletions
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 5b1f7be8e45..b7dd05517cf 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h @@ -164,7 +164,7 @@ bool DepsgraphRelationBuilder::is_same_bone_dependency(const KeyFrom& key_from, } template <typename KeyFrom, typename KeyTo> -bool DepsgraphRelationBuilder::is_nodetree_node_dependency( +bool DepsgraphRelationBuilder::is_same_nodetree_node_dependency( const KeyFrom& key_from, const KeyTo& key_to) { @@ -196,4 +196,31 @@ bool DepsgraphRelationBuilder::is_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->name) != ID_KE) { + return false; + } + /* Different key data blocks. */ + if (op_from->owner->owner != op_to->owner->owner) { + return false; + } + return true; +} + } // namespace DEG |