[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