[Bf-blender-cvs] [b4c3ea26443] master: Cleanup: move internal links of nodes to runtime data

Jacques Lucke noreply at git.blender.org
Fri Nov 18 13:47:16 CET 2022


Commit: b4c3ea264439158df70e837e20f8dd9ec548de2d
Author: Jacques Lucke
Date:   Fri Nov 18 13:46:21 2022 +0100
Branches: master
https://developer.blender.org/rBb4c3ea264439158df70e837e20f8dd9ec548de2d

Cleanup: move internal links of nodes to runtime data

No functional changes are expected.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_node_runtime.hh
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/blenloader/intern/versioning_260.c
M	source/blender/compositor/intern/COM_NodeGraph.cc
M	source/blender/editors/space_node/node_draw.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/intern/derived_node_tree.cc
M	source/blender/nodes/intern/geometry_nodes_lazy_function.cc
M	source/blender/nodes/intern/node_exec.cc
M	source/blender/nodes/intern/node_socket.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 2361d902d61..7efc28a3ab3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -690,6 +690,7 @@ void nodeRemoveNode(struct Main *bmain,
 
 void nodeDimensionsGet(const struct bNode *node, float *r_width, float *r_height);
 void nodeTagUpdateID(struct bNode *node);
+void nodeInternalLinks(struct bNode *node, struct bNodeLink ***r_links, int *r_len);
 
 #ifdef __cplusplus
 
diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh
index 60a9fec7776..831b5330a2f 100644
--- a/source/blender/blenkernel/BKE_node_runtime.hh
+++ b/source/blender/blenkernel/BKE_node_runtime.hh
@@ -186,10 +186,12 @@ class bNodeRuntime : NonCopyable, NonMovable {
   /** Offset that will be added to locx for insert offset animation. */
   float anim_ofsx;
 
+  /** List of cached internal links (input to output), for muted nodes and operators. */
+  Vector<bNodeLink *> internal_links;
+
   /** Only valid if #topology_cache_is_dirty is false. */
   Vector<bNodeSocket *> inputs;
   Vector<bNodeSocket *> outputs;
-  Vector<bNodeLink *> internal_links;
   Map<StringRefNull, bNodeSocket *> inputs_by_identifier;
   Map<StringRefNull, bNodeSocket *> outputs_by_identifier;
   int index_in_tree = -1;
@@ -481,9 +483,8 @@ inline bool bNode::is_group_output() const
   return this->type == NODE_GROUP_OUTPUT;
 }
 
-inline blender::Span<const bNodeLink *> bNode::internal_links_span() const
+inline blender::Span<const bNodeLink *> bNode::internal_links() const
 {
-  BLI_assert(blender::bke::node_tree_runtime::topology_cache_is_available(*this));
   return this->runtime->internal_links;
 }
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index b92dea6bfc6..81ee2bdd34b 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -699,8 +699,6 @@ void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
     BLO_read_data_address(reader, &node->prop);
     IDP_BlendDataRead(reader, &node->prop);
 
-    BLI_listbase_clear(&node->internal_links);
-
     if (node->type == CMP_NODE_MOVIEDISTORTION) {
       /* Do nothing, this is runtime cache and hence handled by generic code using
        * `IDTypeInfo.foreach_cache` callback. */
@@ -1970,11 +1968,12 @@ void nodeRemoveSocketEx(struct bNodeTree *ntree,
     }
   }
 
-  LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &node->internal_links) {
+  for (bNodeLink *link : node->runtime->internal_links) {
     if (link->fromsock == sock || link->tosock == sock) {
-      BLI_remlink(&node->internal_links, link);
+      node->runtime->internal_links.remove_first_occurrence_and_reorder(link);
       MEM_freeN(link);
       BKE_ntree_update_tag_node_internal_link(ntree, node);
+      break;
     }
   }
 
@@ -1996,7 +1995,10 @@ void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
     }
   }
 
-  BLI_freelistN(&node->internal_links);
+  for (bNodeLink *link : node->runtime->internal_links) {
+    MEM_freeN(link);
+  }
+  node->runtime->internal_links.clear();
 
   LISTBASE_FOREACH_MUTABLE (bNodeSocket *, sock, &node->inputs) {
     node_socket_free(sock, true);
@@ -2304,14 +2306,14 @@ bNode *node_copy_with_mapping(bNodeTree *dst_tree,
     node_dst->prop = IDP_CopyProperty_ex(node_src.prop, flag);
   }
 
-  BLI_listbase_clear(&node_dst->internal_links);
-  LISTBASE_FOREACH (const bNodeLink *, src_link, &node_src.internal_links) {
+  node_dst->runtime->internal_links.clear();
+  for (const bNodeLink *src_link : node_src.runtime->internal_links) {
     bNodeLink *dst_link = (bNodeLink *)MEM_dupallocN(src_link);
     dst_link->fromnode = node_dst;
     dst_link->tonode = node_dst;
     dst_link->fromsock = socket_map.lookup(src_link->fromsock);
     dst_link->tosock = socket_map.lookup(src_link->tosock);
-    BLI_addtail(&node_dst->internal_links, dst_link);
+    node_dst->runtime->internal_links.append(dst_link);
   }
 
   if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
@@ -2469,7 +2471,7 @@ static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
 void nodeInternalRelink(bNodeTree *ntree, bNode *node)
 {
   /* store link pointers in output sockets, for efficient lookup */
-  LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
+  for (bNodeLink *link : node->runtime->internal_links) {
     link->tosock->link = link;
   }
 
@@ -2977,7 +2979,10 @@ static void node_free_node(bNodeTree *ntree, bNode *node)
     MEM_freeN(sock);
   }
 
-  BLI_freelistN(&node->internal_links);
+  for (bNodeLink *link : node->runtime->internal_links) {
+    MEM_freeN(link);
+  }
+  node->runtime->internal_links.clear();
 
   if (node->prop) {
     /* Remember, no ID user refcount management here! */
@@ -3763,6 +3768,12 @@ void nodeTagUpdateID(bNode *node)
   node->runtime->update |= NODE_UPDATE_ID;
 }
 
+void nodeInternalLinks(bNode *node, bNodeLink ***r_links, int *r_len)
+{
+  *r_links = node->runtime->internal_links.data();
+  *r_len = node->runtime->internal_links.size();
+}
+
 /* ************** Node Clipboard *********** */
 
 #define USE_NODE_CB_VALIDATE
diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc
index 712a740bdb7..61f0bab9fef 100644
--- a/source/blender/blenkernel/intern/node_runtime.cc
+++ b/source/blender/blenkernel/intern/node_runtime.cc
@@ -67,21 +67,6 @@ static void update_link_vector(const bNodeTree &ntree)
   }
 }
 
-static void update_internal_links(const bNodeTree &ntree)
-{
-  bNodeTreeRuntime &tree_runtime = *ntree.runtime;
-  for (bNode *node : tree_runtime.nodes) {
-    node->runtime->internal_links.clear();
-    for (bNodeSocket *socket : node->runtime->outputs) {
-      socket->runtime->internal_link_input = nullptr;
-    }
-    LISTBASE_FOREACH (bNodeLink *, link, &node->internal_links) {
-      node->runtime->internal_links.append(link);
-      link->tosock->runtime->internal_link_input = link->fromsock;
-    }
-  }
-}
-
 static void update_socket_vectors_and_owner_node(const bNodeTree &ntree)
 {
   bNodeTreeRuntime &tree_runtime = *ntree.runtime;
@@ -431,7 +416,6 @@ static void ensure_topology_cache(const bNodeTree &ntree)
         update_node_vector(ntree);
         update_link_vector(ntree);
         update_socket_vectors_and_owner_node(ntree);
-        update_internal_links(ntree);
         update_directly_linked_links_and_sockets(ntree);
         threading::parallel_invoke(
             tree_runtime.nodes.size() > 32,
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index d068e150f25..3100a242c7d 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -1137,7 +1137,7 @@ class NodeTreeMainUpdater {
         }
       }
       /* Rebuilt internal links if they have changed. */
-      if (node->internal_links_span().size() != expected_internal_links.size()) {
+      if (node->runtime->internal_links.size() != expected_internal_links.size()) {
         this->update_internal_links_in_node(ntree, *node, expected_internal_links);
       }
       else {
@@ -1145,7 +1145,7 @@ class NodeTreeMainUpdater {
           const bNodeSocket *from_socket = item.first;
           const bNodeSocket *to_socket = item.second;
           bool found = false;
-          for (const bNodeLink *internal_link : node->internal_links_span()) {
+          for (const bNodeLink *internal_link : node->runtime->internal_links) {
             if (from_socket == internal_link->fromsock && to_socket == internal_link->tosock) {
               found = true;
             }
@@ -1192,7 +1192,9 @@ class NodeTreeMainUpdater {
                                      bNode &node,
                                      Span<std::pair<bNodeSocket *, bNodeSocket *>> links)
   {
-    BLI_freelistN(&node.internal_links);
+    for (bNodeLink *link : node.runtime->internal_links) {
+      MEM_freeN(link);
+    }
     for (const auto &item : links) {
       bNodeSocket *from_socket = item.first;
       bNodeSocket *to_socket = item.second;
@@ -1202,7 +1204,7 @@ class NodeTreeMainUpdater {
       link->tonode = &node;
       link->tosock = to_socket;
       link->flag |= NODE_LINK_VALID;
-      BLI_addtail(&node.internal_links, link);
+      node.runtime->internal_links.append(link);
     }
     BKE_ntree_update_tag_node_internal_link(&ntree, &node);
   }
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index 47a1f7f7241..504de311f7e 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -1707,26 +1707,6 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
     }
   }
 
-  if (!MAIN_VERSION_ATLEAST(bmain, 264, 6)) {
-    /* Fix for bug T32982, internal_links list could get corrupted from r51630 onward.
-     * Simply remove bad internal_links lists to avoid NULL pointers.
-     */
-    FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
-      bNode *node;
-      bNodeLink *link, *nextlink;
-
-      for (node = ntree->nodes.first; node; node = node->next) {
-        for (link = node->internal_links.first; link; link = nextlink) {
-          nextlink = link->next;
-          if (!link->fromnode || !link->fromsock || !link->tonode || !link->tosock) {
-            BLI_remlink(&node->internal_links, link);
-          }
-        }
-      }
-    }
-    FOREACH_NODETREE_END;
-  }
-
   if (!MAIN_VERSION_ATLEAST(bmain, 264, 7)) {
     /* convert tiles size from resolution and number of tiles */
     {
diff --git a/source/blender/compositor/intern/COM_NodeGraph.cc b/source/blender/compositor/intern/COM_NodeGraph.cc
index b38ac804cf5..34a145f6bf5 100644
--- a/source/blender/compositor/intern/COM_NodeGraph.cc
+++ b/source/blender/compositor/intern/COM_NodeGraph.cc
@@ -6,6 +6,7 @@
 #include "DNA_node_types.h"
 
 #include "BKE_node.h"
+#include "BKE_node_runtime.hh"
 
 #include "COM_Converter.h"
 #include "COM_Debug.h"
@@ -180,8 +181,7 @@ void

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list