[Bf-blender-cvs] [f5d0dbed206] functions: move btree lookup class to separate file

Jacques Lucke noreply at git.blender.org
Tue Apr 30 11:57:46 CEST 2019


Commit: f5d0dbed206c76661af879bedd2ab75249cab1fe
Author: Jacques Lucke
Date:   Tue Apr 30 11:57:38 2019 +0200
Branches: functions
https://developer.blender.org/rBf5d0dbed206c76661af879bedd2ab75249cab1fe

move btree lookup class to separate file

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

M	source/blender/functions/CMakeLists.txt
A	source/blender/functions/frontends/data_flow_nodes/btree_lookup.cpp
A	source/blender/functions/frontends/data_flow_nodes/btree_lookup.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index cc722a1e517..5bdd5317319 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -131,6 +131,8 @@ set(SRC
   frontends/data_flow_nodes/function_generation.cpp
   frontends/data_flow_nodes/graph_generation.hpp
   frontends/data_flow_nodes/graph_generation.cpp
+  frontends/data_flow_nodes/btree_lookup.hpp
+  frontends/data_flow_nodes/btree_lookup.cpp
   frontends/data_flow_nodes/inserters.hpp
   frontends/data_flow_nodes/inserters.cpp
   frontends/data_flow_nodes/registry.hpp
diff --git a/source/blender/functions/frontends/data_flow_nodes/btree_lookup.cpp b/source/blender/functions/frontends/data_flow_nodes/btree_lookup.cpp
new file mode 100644
index 00000000000..341bca96a07
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/btree_lookup.cpp
@@ -0,0 +1,61 @@
+#include "btree_lookup.hpp"
+
+#include "DNA_node_types.h"
+
+namespace FN {
+namespace DataFlowNodes {
+
+BTreeLookup::BTreeLookup(bNodeTree *btree)
+{
+  for (bNode *bnode : bNodeList(&btree->nodes)) {
+    for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+      m_node_by_socket.add(bsocket, bnode);
+    }
+    for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+      m_node_by_socket.add(bsocket, bnode);
+    }
+  }
+
+  for (bNodeLink *blink : bLinkList(&btree->links)) {
+    BLI_assert(!m_direct_origin.contains(blink->tosock));
+    m_direct_origin.add(blink->tosock, blink->fromsock);
+  }
+
+  for (bNodeLink *blink : bLinkList(&btree->links)) {
+    bNodeSocket *target = blink->tosock;
+    bNode *target_node = blink->tonode;
+    if (this->is_reroute(target_node)) {
+      continue;
+    }
+    bNodeSocket *origin = this->try_find_data_origin(target);
+    if (origin != nullptr) {
+      m_data_links.append(DataLink{origin, target, blink});
+    }
+  }
+}
+
+bNodeSocket *BTreeLookup::try_find_data_origin(bNodeSocket *bsocket)
+{
+  BLI_assert(bsocket->in_out == SOCK_IN);
+  if (m_direct_origin.contains(bsocket)) {
+    bNodeSocket *origin = m_direct_origin.lookup(bsocket);
+    bNode *origin_node = m_node_by_socket.lookup(origin);
+    if (this->is_reroute(origin_node)) {
+      return this->try_find_data_origin((bNodeSocket *)origin_node->inputs.first);
+    }
+    else {
+      return origin;
+    }
+  }
+  else {
+    return nullptr;
+  }
+}
+
+bool BTreeLookup::is_reroute(bNode *bnode)
+{
+  return STREQ(bnode->idname, "NodeReroute");
+}
+
+}  // namespace DataFlowNodes
+}  // namespace FN
diff --git a/source/blender/functions/frontends/data_flow_nodes/btree_lookup.hpp b/source/blender/functions/frontends/data_flow_nodes/btree_lookup.hpp
new file mode 100644
index 00000000000..a580c730405
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/btree_lookup.hpp
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "FN_core.hpp"
+#include "util_wrappers.hpp"
+
+namespace FN {
+namespace DataFlowNodes {
+
+class BTreeLookup {
+ public:
+  BTreeLookup(bNodeTree *btree);
+
+  struct DataLink {
+    bNodeSocket *from;
+    bNodeSocket *to;
+    bNodeLink *source_link;
+  };
+
+  const SmallVector<DataLink> data_links()
+  {
+    return m_data_links;
+  }
+
+ private:
+  bool is_reroute(bNode *bnode);
+  bNodeSocket *try_find_data_origin(bNodeSocket *bsocket);
+
+  SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
+  SmallMap<bNodeSocket *, bNodeSocket *> m_direct_origin;
+  SmallVector<DataLink> m_data_links;
+};
+
+}  // namespace DataFlowNodes
+}  // namespace FN
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
index 997e612e63b..1b3545ec501 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -2,6 +2,7 @@
 
 #include "inserters.hpp"
 #include "util_wrappers.hpp"
+#include "btree_lookup.hpp"
 
 #include "DNA_node_types.h"
 #include "FN_types.hpp"
@@ -85,70 +86,6 @@ struct BSocketLink {
   }
 };
 
-using BSocketMapping = SmallMap<bNodeSocket *, bNodeSocket *>;
-using BSocketLinkVector = SmallVector<BSocketLink>;
-
-class TreeData {
- private:
-  SmallMap<bNodeSocket *, bNode *> m_node_by_socket;
-  BSocketMapping m_direct_origin_socket;
-  BSocketLinkVector m_data_links;
-
- public:
-  TreeData(bNodeTree *btree)
-  {
-    for (bNode *bnode : bNodeList(&btree->nodes)) {
-      for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
-        m_node_by_socket.add(bsocket, bnode);
-      }
-      for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
-        m_node_by_socket.add(bsocket, bnode);
-      }
-    }
-
-    for (bNodeLink *blink : bLinkList(&btree->links)) {
-      BLI_assert(!m_direct_origin_socket.contains(blink->tosock));
-      m_direct_origin_socket.add(blink->tosock, blink->fromsock);
-    }
-
-    for (bNodeLink *blink : bLinkList(&btree->links)) {
-      bNodeSocket *target = blink->tosock;
-      bNode *target_node = m_node_by_socket.lookup(target);
-      if (is_reroute_node(target_node)) {
-        continue;
-      }
-      bNodeSocket *origin = this->try_find_data_origin(target);
-      if (origin != nullptr) {
-        m_data_links.append(BSocketLink(origin, target, blink));
-      }
-    }
-  }
-
-  const BSocketLinkVector &data_origins()
-  {
-    return m_data_links;
-  }
-
- private:
-  bNodeSocket *try_find_data_origin(bNodeSocket *bsocket)
-  {
-    BLI_assert(bsocket->in_out == SOCK_IN);
-    if (m_direct_origin_socket.contains(bsocket)) {
-      bNodeSocket *origin = m_direct_origin_socket.lookup(bsocket);
-      bNode *origin_node = m_node_by_socket.lookup(origin);
-      if (is_reroute_node(origin_node)) {
-        return this->try_find_data_origin((bNodeSocket *)origin_node->inputs.first);
-      }
-      else {
-        return origin;
-      }
-    }
-    else {
-      return nullptr;
-    }
-  }
-};
-
 static bool insert_functions_for_bnodes(BTreeGraphBuilder &builder, GraphInserters &inserters)
 {
   for (bNode *bnode : bNodeList(&builder.btree()->nodes)) {
@@ -202,9 +139,9 @@ static DFGB_SocketVector insert_function_output(BTreeGraphBuilder &builder)
 
 static bool insert_links(BTreeGraphBuilder &builder, GraphInserters &inserters)
 {
-  TreeData tree_data(builder.btree());
-  for (auto &link : tree_data.data_origins()) {
-    if (!inserters.insert_link(builder, link.from, link.to, link.optional_source_link)) {
+  BTreeLookup btree_lookup(builder.btree());
+  for (auto &link : btree_lookup.data_links()) {
+    if (!inserters.insert_link(builder, link.from, link.to, link.source_link)) {
       return false;
     }
   }
diff --git a/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp b/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
index 8d42053143c..d178a463a90 100644
--- a/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
@@ -6,6 +6,7 @@
 struct bNode;
 struct bNodeLink;
 struct bNodeSocket;
+struct bNodeTree;
 
 namespace FN {
 namespace DataFlowNodes {



More information about the Bf-blender-cvs mailing list