[Bf-blender-cvs] [0b500ba1479] master: Depsgraph: Fix fake cyclic dependencies for node tree drivers

Sergey Sharybin noreply at git.blender.org
Tue Jan 16 12:07:07 CET 2018


Commit: 0b500ba1479550c9d6696889f74b945ad0c0dbd5
Author: Sergey Sharybin
Date:   Tue Jan 16 11:53:34 2018 +0100
Branches: master
https://developer.blender.org/rB0b500ba1479550c9d6696889f74b945ad0c0dbd5

Depsgraph: Fix fake cyclic dependencies for node tree drivers

There was a fake cyclic dependency happening when node of node tree is driving
another node of the same tree.

This is related to T53794, but more fixes is needed here.

===================================================================

M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h

===================================================================

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index fbf5eac4e8c..38e58043e5b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1177,7 +1177,9 @@ void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
 				if (RNA_pointer_is_null(&variable_key.ptr)) {
 					continue;
 				}
-				if (is_same_bone_dependency(variable_key, self_key)) {
+				if (is_same_bone_dependency(variable_key, self_key) ||
+				    is_nodetree_node_dependency(variable_key, self_key))
+				{
 					continue;
 				}
 				add_relation(variable_key, driver_key, "RNA Target -> Driver");
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 9558a726402..1a761f76744 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -276,9 +276,22 @@ protected:
 	DepsNodeHandle create_node_handle(const KeyType& key,
 	                                  const char *default_name = "");
 
+	/* Check whether two keys correponds to the same bone from same armature.
+	 *
+	 * This is used by drivers relations builder to avoid possible fake
+	 * dependency cycle when one bone property drives another property of the
+	 * same bone.
+	 */
 	template <typename KeyFrom, typename KeyTo>
 	bool is_same_bone_dependency(const KeyFrom& key_from, const KeyTo& key_to);
 
+	/* Similar to above, but used to check whether driver is using node from
+	 * the same node tree as a driver variable.
+	 */
+	template <typename KeyFrom, typename KeyTo>
+	bool is_nodetree_node_dependency(const KeyFrom& key_from,
+	                                 const KeyTo& key_to);
+
 private:
 	/* State which never changes, same for the whole builder time. */
 	Main *bmain_;
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 d53b1ee58e1..5b1f7be8e45 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
@@ -30,6 +30,12 @@
 
 #pragma once
 
+#include "intern/nodes/deg_node_id.h"
+
+extern "C" {
+#include "DNA_ID.h"
+}
+
 namespace DEG {
 
 template <typename KeyType>
@@ -157,4 +163,37 @@ bool DepsgraphRelationBuilder::is_same_bone_dependency(const KeyFrom& key_from,
 	return true;
 }
 
+template <typename KeyFrom, typename KeyTo>
+bool DepsgraphRelationBuilder::is_nodetree_node_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 node tree. */
+	if (GS(op_from->owner->owner->id->name) != ID_NT) {
+		return false;
+	}
+	/* Different node trees. */
+	if (op_from->owner->owner != op_to->owner->owner) {
+		return false;
+	}
+	/* We are only interested in relations like BONE_DONE -> BONE_LOCAL... */
+	if (!(op_from->opcode == DEG_OPCODE_PARAMETERS_EVAL &&
+	      op_to->opcode == DEG_OPCODE_PARAMETERS_EVAL))
+	{
+		return false;
+	}
+	return true;
+}
+
 }  // namespace DEG



More information about the Bf-blender-cvs mailing list