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:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-03-23 17:41:36 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-03-23 17:42:38 +0300
commit2103e2112cca3e3385ac057bbe8976925eadd6d4 (patch)
treef6e54dcbe0e74be1a243e6990637c431ed6e1563 /source/blender/editors/space_node/node_relationships.c
parentc87e65542c49f348ebdf712b05d2132ccbb181bb (diff)
Fix T47870: Missing viewport update when material output is inside of the group
Diffstat (limited to 'source/blender/editors/space_node/node_relationships.c')
-rw-r--r--source/blender/editors/space_node/node_relationships.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c
index d230ebf546f..6a09605b9c6 100644
--- a/source/blender/editors/space_node/node_relationships.c
+++ b/source/blender/editors/space_node/node_relationships.c
@@ -93,12 +93,60 @@ static bool ntree_check_nodes_connected(bNodeTree *ntree, bNode *from, bNode *to
return ntree_check_nodes_connected_dfs(ntree, from, to);
}
+static bool node_group_has_output_dfs(bNode *node)
+{
+ if (node->flag & NODE_TEST) {
+ return false;
+ }
+ node->flag |= NODE_TEST;
+ bNodeTree *ntree = (bNodeTree *)node->id;
+ for (bNode *current_node = ntree->nodes.first;
+ current_node != NULL;
+ current_node = current_node->next)
+ {
+ if (current_node->type == NODE_GROUP) {
+ if (node_group_has_output_dfs(current_node)) {
+ return true;
+ }
+ }
+ if (current_node->flag & NODE_DO_OUTPUT &&
+ current_node->type != NODE_GROUP_OUTPUT)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool node_group_has_output(bNode *node)
+{
+ BLI_assert(node->type == NODE_GROUP);
+ bNodeTree *ntree = (bNodeTree *)node->id;
+ if (ntree == NULL) {
+ return false;
+ }
+ ntreeNodeFlagSet(ntree, NODE_TEST, false);
+ return node_group_has_output_dfs(node);
+}
+
bool node_connected_to_output(bNodeTree *ntree, bNode *node)
{
for (bNode *current_node = ntree->nodes.first;
current_node != NULL;
current_node = current_node->next)
{
+ /* Special case for group nodes -- if modified node connected to a group
+ * with active output inside we consider refresh is needed.
+ *
+ * We could make check more grained here by taking which socket the node
+ * is connected to and so eventually.
+ */
+ if (current_node->type == NODE_GROUP &&
+ ntree_check_nodes_connected(ntree, node, current_node) &&
+ node_group_has_output(current_node))
+ {
+ return true;
+ }
if (current_node->flag & NODE_DO_OUTPUT) {
if (ntree_check_nodes_connected(ntree, node, current_node)) {
return true;