[Bf-blender-cvs] [4cb0cb6a06b] functions: improve indexed node tree

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:45:51 CEST 2019


Commit: 4cb0cb6a06bd0d3eef43f6ef2730167c93bf9ab9
Author: Jacques Lucke
Date:   Thu Jul 4 10:54:17 2019 +0200
Branches: functions
https://developer.blender.org/rB4cb0cb6a06bd0d3eef43f6ef2730167c93bf9ab9

improve indexed node tree

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

M	source/blender/blenkernel/BKE_node_tree.hpp
M	source/blender/blenkernel/intern/node_tree.cpp
M	source/blender/simulations/bparticles/c_wrapper.cpp

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

diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 60899b9ff6d..49f5408b003 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -22,6 +22,17 @@ using bNodeList = ListBaseWrapper<struct bNode *, true>;
 using bLinkList = ListBaseWrapper<struct bNodeLink *, true>;
 using bSocketList = ListBaseWrapper<struct bNodeSocket *, true>;
 
+struct SocketWithNode {
+  bNodeSocket *socket;
+  bNode *node;
+};
+
+struct SingleOriginLink {
+  bNodeSocket *from;
+  bNodeSocket *to;
+  bNodeLink *source_link;
+};
+
 /**
  * The DNA structure of a node tree is difficult to parse, since it does not support e.g. the
  * following queries efficiently:
@@ -35,33 +46,24 @@ class IndexedNodeTree {
  public:
   IndexedNodeTree(bNodeTree *btree);
 
-  struct SingleOriginLink {
-    bNodeSocket *from;
-    bNodeSocket *to;
-    bNodeLink *source_link;
-  };
-
-  const ArrayRef<SingleOriginLink> single_origin_links() const
-  {
-    return m_single_origin_links;
-  }
-
-  SmallVector<bNode *> nodes_with_idname(StringRef idname) const;
-  SmallVector<bNode *> nodes_connected_to_socket(bNodeSocket *bsocket) const;
+  ArrayRef<SingleOriginLink> single_origin_links() const;
+  ArrayRef<bNode *> nodes_with_idname(StringRef idname) const;
+  ArrayRef<SocketWithNode> linked(bNodeSocket *bsocket) const;
 
  private:
   bool is_reroute(bNode *bnode) const;
 
   void find_connected_sockets_left(bNodeSocket *bsocket,
-                                   SmallVector<bNodeSocket *> &r_sockets) const;
+                                   SmallVector<SocketWithNode> &r_sockets) const;
   void find_connected_sockets_right(bNodeSocket *bsocket,
-                                    SmallVector<bNodeSocket *> &r_sockets) const;
+                                    SmallVector<SocketWithNode> &r_sockets) const;
 
-  SmallVector<bNode *> m_nodes;
-  SmallVector<bNodeLink *> m_links;
+  SmallVector<bNode *> m_original_nodes;
+  SmallVector<bNodeLink *> m_original_links;
   SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
-  SmallMultiMap<bNodeSocket *, bNodeSocket *> m_direct_links;
-  SmallMultiMap<bNodeSocket *, bNodeSocket *> m_links_without_reroutes;
+  SmallMultiMap<bNodeSocket *, SocketWithNode> m_direct_links;
+  SmallMultiMap<bNodeSocket *, SocketWithNode> m_links;
+  SmallMultiMap<std::string, bNode *> m_nodes_by_idname;
   SmallVector<SingleOriginLink> m_single_origin_links;
 };
 
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 243f20ff710..2e30e0e9402 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -4,9 +4,9 @@
 namespace BKE {
 
 IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
-    : m_nodes(btree->nodes, true), m_links(btree->links, true)
+    : m_original_nodes(btree->nodes, true), m_original_links(btree->links, true)
 {
-  for (bNode *bnode : m_nodes) {
+  for (bNode *bnode : m_original_nodes) {
     for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
       m_node_by_socket.add(bsocket, bnode);
     }
@@ -15,51 +15,52 @@ IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
     }
   }
 
-  for (bNodeLink *blink : m_links) {
-    m_direct_links.add(blink->tosock, blink->fromsock);
-    m_direct_links.add(blink->fromsock, blink->tosock);
+  for (bNode *bnode : m_original_nodes) {
+    m_nodes_by_idname.add(bnode->idname, bnode);
   }
 
-  for (bNodeLink *blink : m_links) {
-    if (!this->is_reroute(blink->fromnode) &&
-        !m_links_without_reroutes.contains(blink->fromsock)) {
-      SmallVector<bNodeSocket *> others;
-      this->find_connected_sockets_right(blink->fromsock, others);
-      m_links_without_reroutes.add_multiple_new(blink->fromsock, others);
+  for (bNodeLink *blink : m_original_links) {
+    m_direct_links.add(blink->tosock, {blink->fromsock, blink->fromnode});
+    m_direct_links.add(blink->fromsock, {blink->tosock, blink->tonode});
+  }
+
+  for (bNodeLink *blink : m_original_links) {
+    if (!this->is_reroute(blink->fromnode) && !m_links.contains(blink->fromsock)) {
+      SmallVector<SocketWithNode> connected;
+      this->find_connected_sockets_right(blink->fromsock, connected);
+      m_links.add_multiple_new(blink->fromsock, connected);
     }
-    if (!this->is_reroute(blink->tonode) && !m_links_without_reroutes.contains(blink->tosock)) {
-      SmallVector<bNodeSocket *> others;
-      this->find_connected_sockets_left(blink->tosock, others);
-      m_links_without_reroutes.add_multiple_new(blink->tosock, others);
-      if (others.size() == 1) {
-        m_single_origin_links.append(SingleOriginLink{others[0], blink->tosock, blink});
+    if (!this->is_reroute(blink->tonode) && !m_links.contains(blink->tosock)) {
+      SmallVector<SocketWithNode> connected;
+      this->find_connected_sockets_left(blink->tosock, connected);
+      m_links.add_multiple_new(blink->tosock, connected);
+      if (connected.size() == 1) {
+        m_single_origin_links.append(SingleOriginLink{connected[0].socket, blink->tosock, blink});
       }
     }
   }
 }
 
 void IndexedNodeTree::find_connected_sockets_left(bNodeSocket *bsocket,
-                                                  SmallVector<bNodeSocket *> &r_sockets) const
+                                                  SmallVector<SocketWithNode> &r_sockets) const
 {
   BLI_assert(bsocket->in_out == SOCK_IN);
-  for (bNodeSocket *other : m_direct_links.lookup_default(bsocket)) {
-    bNode *other_node = m_node_by_socket.lookup(other);
-    if (this->is_reroute(other_node)) {
-      this->find_connected_sockets_left((bNodeSocket *)other_node->inputs.first, r_sockets);
+  for (SocketWithNode linked : m_direct_links.lookup_default(bsocket)) {
+    if (this->is_reroute(linked.node)) {
+      this->find_connected_sockets_left((bNodeSocket *)linked.node->inputs.first, r_sockets);
     }
     else {
-      r_sockets.append(other);
+      r_sockets.append(linked);
     }
   }
 }
 void IndexedNodeTree::find_connected_sockets_right(bNodeSocket *bsocket,
-                                                   SmallVector<bNodeSocket *> &r_sockets) const
+                                                   SmallVector<SocketWithNode> &r_sockets) const
 {
   BLI_assert(bsocket->in_out == SOCK_OUT);
-  for (bNodeSocket *other : m_direct_links.lookup_default(bsocket)) {
-    bNode *other_node = m_node_by_socket.lookup(other);
-    if (this->is_reroute(other_node)) {
-      this->find_connected_sockets_right((bNodeSocket *)other_node->outputs.first, r_sockets);
+  for (SocketWithNode other : m_direct_links.lookup_default(bsocket)) {
+    if (this->is_reroute(other.node)) {
+      this->find_connected_sockets_right((bNodeSocket *)other.node->outputs.first, r_sockets);
     }
     else {
       r_sockets.append(other);
@@ -72,25 +73,22 @@ bool IndexedNodeTree::is_reroute(bNode *bnode) const
   return STREQ(bnode->idname, "NodeReroute");
 }
 
-SmallVector<bNode *> IndexedNodeTree::nodes_with_idname(StringRef idname) const
+/* Queries
+ *******************************************************/
+
+ArrayRef<bNode *> IndexedNodeTree::nodes_with_idname(StringRef idname) const
 {
-  SmallVector<bNode *> result;
-  for (bNode *bnode : m_nodes) {
-    if (bnode->idname == idname) {
-      result.append(bnode);
-    }
-  }
-  return result;
+  return m_nodes_by_idname.lookup_default(idname.to_std_string());
 }
 
-SmallVector<bNode *> IndexedNodeTree::nodes_connected_to_socket(bNodeSocket *bsocket) const
+ArrayRef<SocketWithNode> IndexedNodeTree::linked(bNodeSocket *bsocket) const
 {
-  SmallVector<bNode *> result;
-  for (bNodeSocket *other : m_links_without_reroutes.lookup_default(bsocket)) {
-    bNode *bnode = m_node_by_socket.lookup(other);
-    result.append(bnode);
-  }
-  return result;
+  return m_links.lookup_default(bsocket);
+}
+
+ArrayRef<SingleOriginLink> IndexedNodeTree::single_origin_links() const
+{
+  return m_single_origin_links;
 }
 
 }  // namespace BKE
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 3ff558edbf7..ef29a65011a 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -39,6 +39,7 @@
 using namespace BParticles;
 
 using BKE::IndexedNodeTree;
+using BKE::SocketWithNode;
 using BLI::ArrayRef;
 using BLI::float3;
 using BLI::SmallVector;
@@ -228,8 +229,8 @@ class ModifierStepDescription : public StepDescription {
 class IndexedBParticlesTree {
  private:
   IndexedNodeTree &m_indexed_tree;
-  SmallVector<bNode *> m_particle_type_nodes;
-  SmallVector<bNode *> m_emitter_nodes;
+  ArrayRef<bNode *> m_particle_type_nodes;
+  ArrayRef<bNode *> m_emitter_nodes;
 
  public:
   IndexedBParticlesTree(IndexedNodeTree &indexed_tree) : m_indexed_tree(indexed_tree)
@@ -271,8 +272,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
   auto emitter_nodes = bparticles_tree.emitter_nodes();
   for (bNode *emitter_node : emitter_nodes) {
     bNodeSocket *emitter_output = (bNodeSocket *)emitter_node->outputs.first;
-    auto connected_nodes = indexed_tree.nodes_connected_to_socket(emitter_output);
-    for (bNode *connected_node : connected_nodes) {
+    for (SocketWithNode linked : indexed_tree.linked(emitter_output)) {
       PointerRNA rna;
       RNA_pointer_create(&btree->id, &RNA_Node, emitter_node, &rna);
       Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
@@ -281,7 +281,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
       }
 
       Emitter *emitter = EMITTER_mesh_surface(
-          connected_node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
+          linked.node->name, (Mesh *)object->data, object->obmat, object->obmat, 1.0f);
       step_description->m_emitters.append(emitter);
     }
   }



More information about the Bf-blender-cvs mailing list