[Bf-blender-cvs] [6239e089cf8] master: Nodes: cache children of frame nodes

Iliya Katueshenock noreply at git.blender.org
Fri Nov 18 11:22:05 CET 2022


Commit: 6239e089cf8e826c7fb99fb8a2a77229f5ccdac3
Author: Iliya Katueshenock
Date:   Fri Nov 18 11:20:13 2022 +0100
Branches: master
https://developer.blender.org/rB6239e089cf8e826c7fb99fb8a2a77229f5ccdac3

Nodes: cache children of frame nodes

This allows for optimizations because one does not have to iterate
over all nodes anymore to find all nodes within a frame.

Differential Revision: https://developer.blender.org/D16106

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_node_runtime.hh
M	source/blender/blenkernel/BKE_node_tree_update.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenkernel/intern/node_runtime.cc
M	source/blender/blenkernel/intern/node_tree_update.cc
M	source/blender/editors/space_node/node_add.cc
M	source/blender/editors/space_node/node_edit.cc
M	source/blender/editors/space_node/node_group.cc
M	source/blender/editors/space_node/node_relationships.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 1a36f3be0b2..b6a6fd00b7e 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -730,8 +730,8 @@ void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
 void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
 void nodeFromView(const struct bNode *node, float x, float y, float *rx, float *ry);
 bool nodeAttachNodeCheck(const struct bNode *node, const struct bNode *parent);
-void nodeAttachNode(struct bNode *node, struct bNode *parent);
-void nodeDetachNode(struct bNode *node);
+void nodeAttachNode(struct bNodeTree *ntree, struct bNode *node, struct bNode *parent);
+void nodeDetachNode(struct bNodeTree *ntree, struct bNode *node);
 
 void nodePositionRelative(struct bNode *from_node,
                           struct bNode *to_node,
diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh
index 65c801a087b..5a73dff67ce 100644
--- a/source/blender/blenkernel/BKE_node_runtime.hh
+++ b/source/blender/blenkernel/BKE_node_runtime.hh
@@ -84,6 +84,7 @@ class bNodeTreeRuntime : NonCopyable, NonMovable {
   bool has_available_link_cycle = false;
   bool has_undefined_nodes_or_sockets = false;
   bNode *group_output_node = nullptr;
+  Vector<bNode *> root_frames;
 };
 
 /**
@@ -154,6 +155,7 @@ class bNodeRuntime : NonCopyable, NonMovable {
   int index_in_tree = -1;
   bool has_available_linked_inputs = false;
   bool has_available_linked_outputs = false;
+  Vector<bNode *> direct_children_in_frame;
   bNodeTree *owner_tree = nullptr;
 };
 
@@ -323,6 +325,12 @@ inline blender::Span<bNodeSocket *> bNodeTree::all_sockets()
   return this->runtime->sockets;
 }
 
+inline blender::Span<bNode *> bNodeTree::root_frames() const
+{
+  BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this));
+  return this->runtime->root_frames;
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -439,6 +447,13 @@ inline blender::Span<const bNodeLink *> bNode::internal_links_span() const
   return this->runtime->internal_links;
 }
 
+inline blender::Span<bNode *> bNode::direct_children_in_frame() const
+{
+  BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this));
+  BLI_assert(this->is_frame());
+  return this->runtime->direct_children_in_frame;
+}
+
 inline const blender::nodes::NodeDeclaration *bNode::declaration() const
 {
   return this->runtime->declaration;
diff --git a/source/blender/blenkernel/BKE_node_tree_update.h b/source/blender/blenkernel/BKE_node_tree_update.h
index 801ba22b3e9..eafcf0fb8a1 100644
--- a/source/blender/blenkernel/BKE_node_tree_update.h
+++ b/source/blender/blenkernel/BKE_node_tree_update.h
@@ -54,6 +54,8 @@ void BKE_ntree_update_tag_active_output_changed(struct bNodeTree *ntree);
 void BKE_ntree_update_tag_missing_runtime_data(struct bNodeTree *ntree);
 /** Used when the interface sockets/values have changed. */
 void BKE_ntree_update_tag_interface(struct bNodeTree *ntree);
+/** Used when change parent node. */
+void BKE_ntree_update_tag_parent_change(struct bNodeTree *ntree, struct bNode *node);
 /** Used when an id data block changed that might be used by nodes that need to be updated. */
 void BKE_ntree_update_tag_id_changed(struct Main *bmain, struct ID *id);
 /** Used when an image user is updated that is used by any part of the node tree. */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 96165fb6209..c3b1470f820 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -2571,7 +2571,7 @@ bool nodeAttachNodeCheck(const bNode *node, const bNode *parent)
   return false;
 }
 
-void nodeAttachNode(bNode *node, bNode *parent)
+void nodeAttachNode(bNodeTree *ntree, bNode *node, bNode *parent)
 {
   BLI_assert(parent->type == NODE_FRAME);
   BLI_assert(nodeAttachNodeCheck(parent, node) == false);
@@ -2580,11 +2580,12 @@ void nodeAttachNode(bNode *node, bNode *parent)
   nodeToView(node, 0.0f, 0.0f, &locx, &locy);
 
   node->parent = parent;
+  BKE_ntree_update_tag_parent_change(ntree, node);
   /* transform to parent space */
   nodeFromView(parent, locx, locy, &node->locx, &node->locy);
 }
 
-void nodeDetachNode(struct bNode *node)
+void nodeDetachNode(bNodeTree *ntree, bNode *node)
 {
   if (node->parent) {
     BLI_assert(node->parent->type == NODE_FRAME);
@@ -2595,6 +2596,7 @@ void nodeDetachNode(struct bNode *node)
     node->locx = locx;
     node->locy = locy;
     node->parent = nullptr;
+    BKE_ntree_update_tag_parent_change(ntree, node);
   }
 }
 
@@ -2935,7 +2937,7 @@ static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
 {
   LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
     if (node->parent == parent) {
-      nodeDetachNode(node);
+      nodeDetachNode(ntree, node);
     }
   }
 }
diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc
index 4fb0e423a33..712a740bdb7 100644
--- a/source/blender/blenkernel/intern/node_runtime.cc
+++ b/source/blender/blenkernel/intern/node_runtime.cc
@@ -372,6 +372,36 @@ static void update_toposort(const bNodeTree &ntree,
   BLI_assert(tree_runtime.nodes.size() == r_sorted_nodes.size());
 }
 
+static void update_root_frames(const bNodeTree &ntree)
+{
+  bNodeTreeRuntime &tree_runtime = *ntree.runtime;
+  Span<bNode *> nodes = tree_runtime.nodes;
+
+  tree_runtime.root_frames.clear();
+
+  for (bNode *node : nodes) {
+    if (!node->parent && node->is_frame()) {
+      tree_runtime.root_frames.append(node);
+    }
+  }
+}
+
+static void update_direct_frames_childrens(const bNodeTree &ntree)
+{
+  bNodeTreeRuntime &tree_runtime = *ntree.runtime;
+  Span<bNode *> nodes = tree_runtime.nodes;
+
+  for (bNode *node : nodes) {
+    node->runtime->direct_children_in_frame.clear();
+  }
+
+  for (bNode *node : nodes) {
+    if (const bNode *frame = node->parent) {
+      frame->runtime->direct_children_in_frame.append(node);
+    }
+  }
+}
+
 static void update_group_output_node(const bNodeTree &ntree)
 {
   bNodeTreeRuntime &tree_runtime = *ntree.runtime;
@@ -403,22 +433,26 @@ static void ensure_topology_cache(const bNodeTree &ntree)
         update_socket_vectors_and_owner_node(ntree);
         update_internal_links(ntree);
         update_directly_linked_links_and_sockets(ntree);
-        threading::parallel_invoke([&]() { update_logical_origins(ntree); },
-                                   [&]() { update_nodes_by_type(ntree); },
-                                   [&]() { update_sockets_by_identifier(ntree); },
-                                   [&]() {
-                                     update_toposort(ntree,
-                                                     ToposortDirection::LeftToRight,
-                                                     tree_runtime.toposort_left_to_right,
-                                                     tree_runtime.has_available_link_cycle);
-                                   },
-                                   [&]() {
-                                     bool dummy;
-                                     update_toposort(ntree,
-                                                     ToposortDirection::RightToLeft,
-                                                     tree_runtime.toposort_right_to_left,
-                                                     dummy);
-                                   });
+        threading::parallel_invoke(
+            tree_runtime.nodes.size() > 32,
+            [&]() { update_logical_origins(ntree); },
+            [&]() { update_nodes_by_type(ntree); },
+            [&]() { update_sockets_by_identifier(ntree); },
+            [&]() {
+              update_toposort(ntree,
+                              ToposortDirection::LeftToRight,
+                              tree_runtime.toposort_left_to_right,
+                              tree_runtime.has_available_link_cycle);
+            },
+            [&]() {
+              bool dummy;
+              update_toposort(ntree,
+                              ToposortDirection::RightToLeft,
+                              tree_runtime.toposort_right_to_left,
+                              dummy);
+            },
+            [&]() { update_root_frames(ntree); },
+            [&]() { update_direct_frames_childrens(ntree); });
         update_group_output_node(ntree);
         tree_runtime.topology_cache_exists = true;
       });
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index 707bb83a3bc..7b6c7954508 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -44,6 +44,7 @@ enum eNodeTreeChangedFlag {
   NTREE_CHANGED_REMOVED_SOCKET = (1 << 7),
   NTREE_CHANGED_SOCKET_PROPERTY = (1 << 8),
   NTREE_CHANGED_INTERNAL_LINK = (1 << 9),
+  NTREE_CHANGED_PARENT = (1 << 10),
   NTREE_CHANGED_ALL = -1,
 };
 
@@ -1704,6 +1705,11 @@ void BKE_ntree_update_tag_interface(bNodeTree *ntree)
   add_tree_tag(ntree, NTREE_CHANGED_INTERFACE);
 }
 
+void BKE_ntree_update_tag_parent_change(bNodeTree *ntree, bNode *node)
+{
+  add_node_tag(ntree, node, NTREE_CHANGED_PARENT);
+}
+
 void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id)
 {
   FOREACH_NODETREE_BEGIN (bmain, ntree, ntree_id) {
diff --git a/source/blender/editors/space_node/node_add.cc b/source/blender/editors/space_node/node_add.cc
index 41f70a6d8cf..c18a6bda5d0 100644
--- a/source/blender/editors/space_node/node_add.cc
+++ b/source/blender/editors/space_node/node_add.cc
@@ -205,7 +205,7 @@ static int add_reroute_exec(bContext *C, wmOperator *op)
     for (const int i : frame_nodes.index_range()) {
       bNode *frame_node = frame_nodes.last(i);
       if (BLI_rctf_isect_pt_v(&frame_node->totr, insert_point)) {
-        nodeAttachNode(reroute, frame_node);
+        nodeAttachNode(&ntree, reroute, frame_node);
         break;
       }
     }
diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/edito

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list