Commit: 2103e2112cca3e3385ac057bbe8976925eadd6d4
Author: Sergey Sharybin
Date:   Wed Mar 23 15:41:36 2016 +0100
Branches: master
https://developer.blender.org/rB2103e2112cca3e3385ac057bbe8976925eadd6d4

Fix T47870: Missing viewport update when material output is inside of the group

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

M       source/blender/editors/space_node/node_relationships.c

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

diff --git a/source/blender/editors/space_node/node_relationships.c 
b/source/blender/editors/space_node/node_relationships.c
index d230ebf..6a09605 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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to