[Bf-blender-cvs] [82ae82488e8] functions: cleanup data flow graph generation

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:46:13 CEST 2019


Commit: 82ae82488e8e79d3a23a7db3b78f430d0449c757
Author: Jacques Lucke
Date:   Thu Jul 4 15:31:09 2019 +0200
Branches: functions
https://developer.blender.org/rB82ae82488e8e79d3a23a7db3b78f430d0449c757

cleanup data flow graph generation

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

M	source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp

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

diff --git a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
index 94e3a3cad1c..0d92f18ef85 100644
--- a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
@@ -11,7 +11,9 @@ namespace DataFlowNodes {
 
 Optional<SharedFunction> generate_function(bNodeTree *btree)
 {
-  Optional<FunctionGraph> fgraph_ = generate_function_graph(btree);
+  IndexedNodeTree indexed_btree(btree);
+
+  Optional<FunctionGraph> fgraph_ = generate_function_graph(indexed_btree);
   if (!fgraph_.has_value()) {
     return {};
   }
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 e03b58d42fe..f57b25416f3 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -84,57 +84,48 @@ static void insert_unlinked_inputs(BTreeGraphBuilder &builder, GraphInserters &i
   }
 }
 
-static FunctionGraph finalize_function_graph(DataFlowGraphBuilder &builder,
-                                             DFGB_SocketVector input_sockets,
-                                             DFGB_SocketVector output_sockets)
+static void find_interface_sockets(IndexedNodeTree &indexed_btree,
+                                   GeneratedGraph &graph,
+                                   DFGraphSocketSetVector &r_inputs,
+                                   DFGraphSocketSetVector &r_outputs)
 {
-  auto build_result = DataFlowGraph::FromBuilder(builder);
-  auto &builder_mapping = build_result.mapping;
-
-  DFGraphSocketSetVector inputs, outputs;
-
-  for (DFGB_Socket socket : input_sockets) {
-    inputs.add(builder_mapping.map_socket(socket));
-  }
-  for (DFGB_Socket socket : output_sockets) {
-    outputs.add(builder_mapping.map_socket(socket));
-  }
-
-  return FunctionGraph(build_result.graph, inputs, outputs);
-}
-
-static void find_interface_sockets(BTreeGraphBuilder &builder,
-                                   DFGB_SocketVector &r_inputs,
-                                   DFGB_SocketVector &r_outputs)
-{
-  bNode *input_node =
-      builder.indexed_btree().nodes_with_idname("fn_FunctionInputNode").get(0, nullptr);
-  bNode *output_node =
-      builder.indexed_btree().nodes_with_idname("fn_FunctionOutputNode").get(0, nullptr);
+  bNode *input_node = indexed_btree.nodes_with_idname("fn_FunctionInputNode").get(0, nullptr);
+  bNode *output_node = indexed_btree.nodes_with_idname("fn_FunctionOutputNode").get(0, nullptr);
 
   if (input_node != nullptr) {
     for (bNodeSocket *bsocket : bSocketList(input_node->outputs)) {
-      if (builder.is_data_socket(bsocket)) {
-        r_inputs.append(builder.lookup_socket(bsocket));
+      if (bsocket != (bNodeSocket *)input_node->outputs.last) {
+        r_inputs.add_new(graph.lookup_socket(bsocket));
       }
     }
   }
 
   if (output_node != nullptr) {
     for (bNodeSocket *bsocket : bSocketList(output_node->inputs)) {
-      if (builder.is_data_socket(bsocket)) {
-        r_outputs.append(builder.lookup_socket(bsocket));
+      if (bsocket != (bNodeSocket *)output_node->inputs.last) {
+        r_outputs.add_new(graph.lookup_socket(bsocket));
       }
     }
   }
 }
 
-Optional<FunctionGraph> generate_function_graph(bNodeTree *btree)
+static SmallMap<bNodeSocket *, DFGraphSocket> build_mapping_for_original_sockets(
+    SmallMap<bNodeSocket *, DFGB_Socket> &socket_map,
+    DataFlowGraph::ToBuilderMapping &builder_mapping)
 {
-  IndexedNodeTree indexed_btree(btree);
+  SmallMap<bNodeSocket *, DFGraphSocket> original_socket_mapping;
+  for (auto item : socket_map.items()) {
+    bNodeSocket *bsocket = item.key;
+    DFGraphSocket socket = builder_mapping.map_socket(item.value);
+    original_socket_mapping.add_new(bsocket, socket);
+  }
+  return original_socket_mapping;
+}
 
+Optional<GeneratedGraph> generate_graph(IndexedNodeTree &indexed_btree)
+{
   DataFlowGraphBuilder graph_builder;
-  SmallMap<struct bNodeSocket *, DFGB_Socket> socket_map;
+  SmallMap<bNodeSocket *, DFGB_Socket> socket_map;
 
   BTreeGraphBuilder builder(indexed_btree, graph_builder, socket_map);
   GraphInserters &inserters = get_standard_inserters();
@@ -149,11 +140,25 @@ Optional<FunctionGraph> generate_function_graph(bNodeTree *btree)
 
   insert_unlinked_inputs(builder, inserters);
 
-  DFGB_SocketVector input_sockets;
-  DFGB_SocketVector output_sockets;
-  find_interface_sockets(builder, input_sockets, output_sockets);
+  auto build_result = DataFlowGraph::FromBuilder(graph_builder);
+  return GeneratedGraph(std::move(build_result.graph),
+                        build_mapping_for_original_sockets(socket_map, build_result.mapping));
+}
+
+Optional<FunctionGraph> generate_function_graph(IndexedNodeTree &indexed_btree)
+{
+  Optional<GeneratedGraph> generated_graph_ = generate_graph(indexed_btree);
+  if (!generated_graph_.has_value()) {
+    return {};
+  }
+
+  GeneratedGraph &generated_graph = generated_graph_.value();
+
+  DFGraphSocketSetVector input_sockets;
+  DFGraphSocketSetVector output_sockets;
+  find_interface_sockets(indexed_btree, generated_graph, input_sockets, output_sockets);
 
-  return finalize_function_graph(graph_builder, input_sockets, output_sockets);
+  return FunctionGraph(generated_graph.graph(), input_sockets, output_sockets);
 }
 
 }  // namespace DataFlowNodes
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
index 2fef403d5ff..7905cd3291c 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
@@ -2,12 +2,38 @@
 
 #include "FN_core.hpp"
 #include "BLI_optional.hpp"
-
-struct bNodeTree;
+#include "BKE_node_tree.hpp"
 
 namespace FN {
 namespace DataFlowNodes {
 
-Optional<FunctionGraph> generate_function_graph(struct bNodeTree *btree);
-}
+using BKE::IndexedNodeTree;
+
+class GeneratedGraph {
+ private:
+  SharedDataFlowGraph m_graph;
+  SmallMap<bNodeSocket *, DFGraphSocket> m_mapping;
+
+ public:
+  GeneratedGraph(SharedDataFlowGraph graph, SmallMap<bNodeSocket *, DFGraphSocket> mapping)
+      : m_graph(std::move(graph)), m_mapping(std::move(mapping))
+  {
+  }
+
+  SharedDataFlowGraph &graph()
+  {
+    return m_graph;
+  }
+
+  DFGraphSocket lookup_socket(bNodeSocket *bsocket)
+  {
+    return m_mapping.lookup(bsocket);
+  }
+};
+
+Optional<GeneratedGraph> generate_graph(IndexedNodeTree &indexed_btree);
+
+Optional<FunctionGraph> generate_function_graph(IndexedNodeTree &indexed_btree);
+
+}  // namespace DataFlowNodes
 }  // namespace FN



More information about the Bf-blender-cvs mailing list