[Bf-blender-cvs] [1618dadc160] simulation-tree: make node rebuilding function more reusable

Jacques Lucke noreply at git.blender.org
Fri Feb 28 09:59:54 CET 2020


Commit: 1618dadc160e32600bef63c79c7ff196b4a474e0
Author: Jacques Lucke
Date:   Fri Feb 28 09:34:44 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rB1618dadc160e32600bef63c79c7ff196b4a474e0

make node rebuilding function more reusable

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

M	source/blender/simulations/nodes/my_test_node.cc

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

diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index 987fb666925..855eff2afe2 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -1027,14 +1027,40 @@ template<> class DefaultHash<SocketID> {
 };
 };  // namespace BLI
 
-static void rebuild_nodes_and_keep_state(VirtualNodeTree &vtree,
-                                         IndexMask index_mask,
-                                         ArrayRef<const NodeDecl *> node_decls)
+static void get_node_declarations(bNodeTree *ntree,
+                                  ArrayRef<const VNode *> vnodes,
+                                  LinearAllocator<> &allocator,
+                                  MutableArrayRef<const NodeDecl *> r_node_decls)
+{
+  BLI::assert_same_size(vnodes, r_node_decls);
+
+  /* TODO: handle reroute and frames */
+  for (uint i : vnodes.index_range()) {
+    const VNode &vnode = *vnodes[i];
+    bNode *node = vnode.bnode();
+    NodeDecl *node_decl = allocator.construct<NodeDecl>(ntree, node);
+    node_decl->reserve_decls(allocator, vnode.inputs().size(), vnode.outputs().size());
+
+    NodeBuilder builder{allocator, *node_decl};
+    NodeDefinition::declare_node(node, builder);
+    r_node_decls[i] = node_decl;
+  }
+}
+
+static void rebuild_nodes_and_keep_state(ArrayRef<const VNode *> vnodes)
 {
+  if (vnodes.size() == 0) {
+    return;
+  }
+
+  const VirtualNodeTree &vtree = vnodes[0]->tree();
+  bNodeTree *ntree = vtree.btree();
+
   Set<std::pair<SocketID, SocketID>> links_to_restore;
   Map<SocketID, std::pair<const SocketDefinition *, void *>> value_per_socket;
 
-  index_mask.foreach_element(vtree.nodes(), [&](const VNode *vnode) {
+  /* Remember socket states. */
+  for (const VNode *vnode : vnodes) {
     for (const VInputSocket *vinput : vnode->inputs()) {
       SocketID id_to = {vinput->node().bnode(), SOCK_IN, vinput->identifier()};
       const SocketDefinition *def = SocketDefinition::get_from_socket(vinput->bsocket());
@@ -1061,11 +1087,17 @@ static void rebuild_nodes_and_keep_state(VirtualNodeTree &vtree,
         links_to_restore.add({id_from, std::move(id_to)});
       }
     }
-  });
+  }
 
-  index_mask.foreach_element(node_decls, [&](const NodeDecl *node_decl) { node_decl->build(); });
+  /* Rebuild nodes. */
+  LinearAllocator<> allocator;
+  Array<const NodeDecl *> node_decls(vnodes.size(), nullptr);
+  get_node_declarations(ntree, vnodes, allocator, node_decls);
+  for (uint i : vnodes.index_range()) {
+    node_decls[i]->build();
+  }
 
-  bNodeTree *ntree = vtree.btree();
+  /* Restore links. */
   for (const std::pair<SocketID, SocketID> &link_info : links_to_restore) {
     const SocketID &from_id = link_info.first;
     const SocketID &to_id = link_info.second;
@@ -1080,6 +1112,7 @@ static void rebuild_nodes_and_keep_state(VirtualNodeTree &vtree,
     }
   }
 
+  /* Restore socket values. */
   value_per_socket.foreach_item(
       [&](const SocketID &socket_id, const std::pair<const SocketDefinition *, void *> &value) {
         bNodeSocket *socket = nodeFindSocket(
@@ -1097,18 +1130,16 @@ static void rebuild_nodes_and_keep_state(VirtualNodeTree &vtree,
 static bool rebuild_currently_outdated_nodes(VirtualNodeTree &vtree,
                                              ArrayRef<const NodeDecl *> node_decls)
 {
-  LinearAllocator<> allocator;
+  Vector<const VNode *> vnodes_to_update;
 
-  Vector<uint> node_indices_to_update;
   for (uint i : node_decls.index_range()) {
     if (!node_decls[i]->sockets_are_correct()) {
-      node_indices_to_update.append(i);
+      vnodes_to_update.append(vtree.nodes()[i]);
     }
   }
 
-  rebuild_nodes_and_keep_state(vtree, node_indices_to_update, node_decls);
-
-  return node_indices_to_update.size() > 0;
+  rebuild_nodes_and_keep_state(vnodes_to_update);
+  return vnodes_to_update.size() > 0;
 }
 
 static bool remove_invalid_links(VirtualNodeTree &vtree)
@@ -1129,26 +1160,6 @@ static bool remove_invalid_links(VirtualNodeTree &vtree)
   return links_to_remove.size() > 0;
 }
 
-static void get_node_declarations(bNodeTree *ntree,
-                                  ArrayRef<const VNode *> vnodes,
-                                  LinearAllocator<> &allocator,
-                                  MutableArrayRef<const NodeDecl *> r_node_decls)
-{
-  BLI::assert_same_size(vnodes, r_node_decls);
-
-  /* TODO: handle reroute and frames */
-  for (uint i : vnodes.index_range()) {
-    const VNode &vnode = *vnodes[i];
-    bNode *node = vnode.bnode();
-    NodeDecl *node_decl = allocator.construct<NodeDecl>(ntree, node);
-    node_decl->reserve_decls(allocator, vnode.inputs().size(), vnode.outputs().size());
-
-    NodeBuilder builder{allocator, *node_decl};
-    NodeDefinition::declare_node(node, builder);
-    r_node_decls[i] = node_decl;
-  }
-}
-
 static bool run_operator_sockets(const VirtualNodeTree &vtree,
                                  ArrayRef<const NodeDecl *> node_decls)
 {



More information about the Bf-blender-cvs mailing list