[Bf-blender-cvs] [339839d58d3] node-tree-update-refactor: progress

Jacques Lucke noreply at git.blender.org
Mon Nov 15 19:09:22 CET 2021


Commit: 339839d58d35ca929a6d425af092b8f2304c9fcf
Author: Jacques Lucke
Date:   Mon Nov 15 18:01:00 2021 +0100
Branches: node-tree-update-refactor
https://developer.blender.org/rB339839d58d35ca929a6d425af092b8f2304c9fcf

progress

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

M	source/blender/blenkernel/intern/node_tree_update.cc
M	source/blender/makesdna/DNA_node_types.h

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

diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index d6c60eb1b38..82b62b5d37c 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -311,19 +311,93 @@ class NodeTreeMainUpdater {
 
   TreeUpdateResult update_tree(bNodeTree &ntree)
   {
-    ntreeUpdateTree(bmain_, &ntree);
     TreeUpdateResult result;
+
+    if (ntree.changed_flag & NTREE_CHANGED_INTERFACE) {
+      result.interface_changed = true;
+    }
+
+    if (ntree.changed_flag & NTREE_CHANGED_LINK) {
+      this->update_input_socket_link_pointers(ntree);
+    }
+    this->update_individual_nodes(ntree);
+
+    if (ntree.typeinfo->update) {
+      ntree.typeinfo->update(&ntree);
+    }
+
     result.interface_changed = true;
     result.output_changed = true;
+
+    if (result.interface_changed) {
+      ntreeInterfaceTypeUpdate(&ntree);
+    }
+
     return result;
   }
+
+  void update_input_socket_link_pointers(bNodeTree &ntree)
+  {
+    LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+      LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
+        socket->link = nullptr;
+      }
+    }
+
+    LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
+      link->tosock->link = link;
+    }
+
+    this->update_socket_used_tags(ntree);
+  }
+
+  void update_socket_used_tags(bNodeTree &ntree)
+  {
+    /* First clear flag. */
+    LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+      LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+        sock->flag &= ~SOCK_IN_USE;
+      }
+      LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+        sock->flag &= ~SOCK_IN_USE;
+      }
+    }
+
+    LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
+      link->fromsock->flag |= SOCK_IN_USE;
+      if (!(link->flag & NODE_LINK_MUTED)) {
+        link->tosock->flag |= SOCK_IN_USE;
+      }
+    }
+  }
+
+  void update_individual_nodes(bNodeTree &ntree)
+  {
+    LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+      if (ntree.changed_flag & NTREE_CHANGED_ANY || node->changed_flag & NODE_CHANGED_ANY) {
+        this->update_individual_node(ntree, *node);
+      }
+    }
+  }
+
+  void update_individual_node(bNodeTree &ntree, bNode &node)
+  {
+    if (node.typeinfo->updatefunc) {
+      node.typeinfo->updatefunc(&ntree, &node);
+    }
+
+    BLI_freelistN(&node.internal_links);
+    if (node.typeinfo->update_internal_links) {
+      node.typeinfo->update_internal_links(&ntree, &node);
+    }
+  }
 };
 
 }  // namespace blender::bke
 
 void BKE_node_tree_update_tag(bNodeTree *ntree)
 {
-  ntree->changed_flag |= NTREE_CHANGED_ANY;
+  ntree->changed_flag |= NTREE_CHANGED_ALL;
   ntree->update |= NTREE_UPDATE;
 }
 
@@ -381,7 +455,7 @@ void BKE_node_tree_update_tag_missing_runtime_data(bNodeTree *ntree)
 
 void BKE_node_tree_update_tag_interface(bNodeTree *ntree)
 {
-  ntree->changed_flag |= NTREE_CHANGED_ANY;
+  ntree->changed_flag |= NTREE_CHANGED_INTERFACE;
   ntree->update |= NTREE_UPDATE;
 }
 
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index a0d88bd0289..3db38a08622 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -601,6 +601,8 @@ typedef enum eNodeTreeChangedFlag {
   NTREE_CHANGED_LINK = (1 << 3),
   NTREE_CHANGED_REMOVED_ANY = (1 << 4),
   NTREE_CHANGED_MISSING_RUNTIME_DATA = (1 << 5),
+  NTREE_CHANGED_INTERFACE = (1 << 6),
+  NTREE_CHANGED_ALL = -1,
 } eNodeTreeChangedFlag;
 
 /* ntree->type, index */



More information about the Bf-blender-cvs mailing list