[Bf-blender-cvs] [73334782202] functions: refactor function generation from data flow nodes

Jacques Lucke noreply at git.blender.org
Fri Mar 1 13:42:19 CET 2019


Commit: 73334782202438be7aaa4b443ee356a23547fa50
Author: Jacques Lucke
Date:   Fri Mar 1 13:41:54 2019 +0100
Branches: functions
https://developer.blender.org/rB73334782202438be7aaa4b443ee356a23547fa50

refactor function generation from data flow nodes

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_data_flow_nodes.hpp
M	source/blender/functions/FN_functions.hpp
M	source/blender/functions/c_wrapper.cpp
A	source/blender/functions/frontends/data_flow_nodes/builder.cpp
A	source/blender/functions/frontends/data_flow_nodes/builder.hpp
A	source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
A	source/blender/functions/frontends/data_flow_nodes/function_generation.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
A	source/blender/functions/frontends/data_flow_nodes/inserters.cpp
A	source/blender/functions/frontends/data_flow_nodes/inserters.hpp
D	source/blender/functions/frontends/data_flow_nodes/nodes.cpp
D	source/blender/functions/frontends/data_flow_nodes/nodes.hpp
A	source/blender/functions/frontends/data_flow_nodes/registry.hpp
M	source/blender/functions/frontends/data_flow_nodes/test_nodes.cpp
A	source/blender/functions/frontends/data_flow_nodes/test_sockets.cpp
A	source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
R068	source/blender/functions/frontends/data_flow_nodes/socket_inputs.cpp	source/blender/functions/functions/socket_input.cpp
A	source/blender/functions/functions/socket_input.hpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index cf467a9eada..15c49a3854f 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -47,13 +47,21 @@ set(SRC
 	functions/scalar_math.cpp
 	functions/vectors.hpp
 	functions/vectors.cpp
+	functions/socket_input.hpp
+	functions/socket_input.cpp
 
-	frontends/data_flow_nodes/nodes.hpp
-	frontends/data_flow_nodes/nodes.cpp
+	frontends/data_flow_nodes/builder.hpp
+	frontends/data_flow_nodes/builder.cpp
+	frontends/data_flow_nodes/function_generation.hpp
+	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/socket_inputs.cpp
+	frontends/data_flow_nodes/inserters.hpp
+	frontends/data_flow_nodes/inserters.cpp
+	frontends/data_flow_nodes/registry.hpp
 	frontends/data_flow_nodes/test_nodes.cpp
+	frontends/data_flow_nodes/test_sockets.cpp
+	frontends/data_flow_nodes/util_wrappers.hpp
 )
 
 blender_add_lib(bf_functions "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/functions/FN_data_flow_nodes.hpp b/source/blender/functions/FN_data_flow_nodes.hpp
index 43629104aff..599b518ed1d 100644
--- a/source/blender/functions/FN_data_flow_nodes.hpp
+++ b/source/blender/functions/FN_data_flow_nodes.hpp
@@ -1,4 +1,3 @@
 #pragma once
 
-#include "frontends/data_flow_nodes/graph_generation.hpp"
-#include "frontends/data_flow_nodes/nodes.hpp"
\ No newline at end of file
+#include "frontends/data_flow_nodes/function_generation.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/FN_functions.hpp b/source/blender/functions/FN_functions.hpp
index e70482398a8..59903af56ce 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -3,4 +3,5 @@
 #include "./functions/object_input.hpp"
 #include "./functions/random.hpp"
 #include "./functions/scalar_math.hpp"
-#include "./functions/vectors.hpp"
\ No newline at end of file
+#include "./functions/vectors.hpp"
+#include "./functions/socket_input.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/c_wrapper.cpp b/source/blender/functions/c_wrapper.cpp
index 8c82a28d671..476300a6af8 100644
--- a/source/blender/functions/c_wrapper.cpp
+++ b/source/blender/functions/c_wrapper.cpp
@@ -18,7 +18,6 @@ WRAPPERS(const FN::TupleCallBody *, FnTupleCallBody);
 
 void FN_initialize()
 {
-	FN::DataFlowNodes::initialize();
 }
 
 void FN_function_call(FnTupleCallBody fn_call, FnTuple fn_in, FnTuple fn_out)
@@ -167,13 +166,12 @@ FnFunction FN_tree_to_function(bNodeTree *btree)
 {
 	TIMEIT("Tree to function");
 	BLI_assert(btree);
-	auto fgraph = FN::DataFlowNodes::btree_to_graph(btree);
-	//std::cout << fgraph.graph()->to_dot() << std::endl;
-
-	auto fn = FN::SharedFunction::New("Function from Node Tree", fgraph.signature());
-	fn->add_body(FN::function_graph_to_callable(fgraph));
+	auto fn_ = FN::DataFlowNodes::generate_function(btree);
+	if (!fn_.has_value()) {
+		return nullptr;
+	}
 
-	BLI::RefCounted<FN::Function> *fn_ref = fn.refcounter();
+	BLI::RefCounted<FN::Function> *fn_ref = fn_.value().refcounter();
 	fn_ref->incref();
 	return wrap(fn_ref);
 }
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.cpp b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
new file mode 100644
index 00000000000..561f3f1963d
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
@@ -0,0 +1,63 @@
+#include "builder.hpp"
+
+#include "DNA_node_types.h"
+#include "util_wrappers.hpp"
+
+namespace FN { namespace DataFlowNodes {
+
+	const Node *Builder::insert_function(SharedFunction &function)
+	{
+		return m_graph->insert(function);
+	}
+
+	void Builder::insert_link(Socket a, Socket b)
+	{
+		m_graph->link(a, b);
+	}
+
+	void Builder::map_socket(Socket socket, bNodeSocket *bsocket)
+	{
+		m_socket_map.add(bsocket, socket);
+	}
+
+	void Builder::map_sockets(const Node *node, struct bNode *bnode)
+	{
+		uint input_index = 0;
+		for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+			this->map_socket(node->input(input_index), bsocket);
+			input_index++;
+		}
+
+		uint output_index = 0;
+		for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+			this->map_socket(node->output(output_index), bsocket);
+			output_index++;
+		}
+	}
+
+	void Builder::map_input(Socket socket, struct bNode *bnode, uint index)
+	{
+		BLI_assert(socket.is_input());
+		auto bsocket = (bNodeSocket *)BLI_findlink(&bnode->inputs, index);
+		this->map_socket(socket, bsocket);
+	}
+
+	void Builder::map_output(Socket socket, struct bNode *bnode, uint index)
+	{
+		BLI_assert(socket.is_output());
+		auto bsocket = (bNodeSocket *)BLI_findlink(&bnode->outputs, index);
+		this->map_socket(socket, bsocket);
+	}
+
+
+	struct bNodeTree *BuilderContext::btree() const
+	{
+		return m_btree;
+	}
+
+	struct ID *BuilderContext::btree_id() const
+	{
+		return &m_btree->id;
+	}
+
+} } /* namespace FN::DataFlowNodes */
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.hpp b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
new file mode 100644
index 00000000000..00468d29895
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
@@ -0,0 +1,47 @@
+#pragma once
+
+#include "FN_core.hpp"
+
+struct bNode;
+struct bNodeLink;
+struct bNodeTree;
+struct bNodeSocket;
+struct ID;
+
+namespace FN { namespace DataFlowNodes {
+
+	using SocketMap = SmallMap<struct bNodeSocket *, Socket>;
+
+	class Builder {
+	private:
+		SharedDataFlowGraph &m_graph;
+		SocketMap &m_socket_map;
+
+	public:
+		Builder(
+			SharedDataFlowGraph &graph,
+			SocketMap &socket_map)
+			: m_graph(graph), m_socket_map(socket_map) {}
+
+		const Node *insert_function(SharedFunction &function);
+		void insert_link(Socket a, Socket b);
+
+		void map_socket(Socket socket, struct bNodeSocket *bsocket);
+		void map_sockets(const Node *node, struct bNode *bnode);
+		void map_input(Socket socket, struct bNode *bnode, uint index);
+		void map_output(Socket socket, struct bNode *bnode, uint index);
+	};
+
+	class BuilderContext {
+	private:
+		struct bNodeTree *m_btree;
+
+	public:
+		BuilderContext(struct bNodeTree *btree)
+			: m_btree(btree) {}
+
+		bNodeTree *btree() const;
+		ID *btree_id() const;
+	};
+
+} }
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
new file mode 100644
index 00000000000..af0ea9097f0
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
@@ -0,0 +1,22 @@
+#include "function_generation.hpp"
+#include "graph_generation.hpp"
+
+#include "DNA_node_types.h"
+
+namespace FN { namespace DataFlowNodes {
+
+	Optional<SharedFunction> generate_function(bNodeTree *btree)
+	{
+		Optional<FunctionGraph> fgraph_ = generate_function_graph(btree);
+		if (!fgraph_.has_value()) {
+			return {};
+		}
+
+		FunctionGraph fgraph = fgraph_.value();
+
+		auto fn = SharedFunction::New(btree->id.name, fgraph.signature());
+		fn->add_body(function_graph_to_callable(fgraph));
+		return fn;
+	}
+
+} } /* namespace FN::DataFlowNodes */
\ No newline at end of file
diff --git a/source/blender/functions/frontends/data_flow_nodes/function_generation.hpp b/source/blender/functions/frontends/data_flow_nodes/function_generation.hpp
new file mode 100644
index 00000000000..42edd1fcc41
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/function_generation.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "FN_core.hpp"
+#include "BLI_optional.hpp"
+
+struct bNodeTree;
+
+namespace FN { namespace DataFlowNodes {
+
+	Optional<SharedFunction> generate_function(struct bNodeTree *btree);
+
+} } /* namespace FN::DataFlowNodes */
\ No newline at end of file
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 54248b8f4b7..520ab245517 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -1,10 +1,16 @@
 #include "graph_generation.hpp"
 
+#include "inserters.hpp"
+#include "util_wrappers.hpp"
+
+#include "DNA_node_types.h"
+#include "FN_types.hpp"
+
 namespace FN { namespace DataFlowNodes {
 
 	using namespace Types;
 
-	static SharedType &get_type_of_socket(bNodeTree *UNUSED(btree), bNodeSocket *bsocket)
+	static SharedType &get_type_of_socket(bNodeSocket *bsocket)
 	{
 		if (STREQ(bsocket->idname, "fn_FloatSocket")) {
 			return get_float_type();
@@ -21,51 +27,6 @@ namespace FN { namespace DataFlowNodes {
 		}
 	}
 
-
-	static void insert_input_node(
-		bNodeTree *btree,
-		bNode *bnode,
-		SharedDataFlowGraph &graph,
-		SocketMap &socket_map)
-	{
-		OutputParameters outputs;
-		for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
-			SharedType &type = get_type_of_socket(btree, bsocket);
-			outputs.append(OutputParameter(bsocket->name, type));
-		}
-
-		auto fn = SharedFunction::New("Function Input", Signature({}, outputs));
-		const Node *node = graph->insert(fn);
-
-		uint i = 0;
-		for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
-			socket_map.add(bsocket, node->output(i));
-			i++;
-		}
-	}
-
-	static void insert_output_node(
-		bNodeTree *btree,
-		bNode *bnode,
-		SharedDataFlowGraph &graph,
-		SocketMap &socket_map)
-	{
-		InputParameters inputs;
-		for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
-			SharedType &type = get_type_of_socket(btree, bsocket);
-			inputs.append(InputParameter(bsocket->name, type));
-		}
-
-		auto fn = SharedFunction::New("Function Output", Signature(inputs, {}));
-		const Node *node = graph->insert(fn);
-
-		uint i = 0;
-		for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
-			socket_map.add(bsocket, node->input(i));
-			i++;
-		}
-	}
-
 	static bool is_input_node(const bNode *bnode)
 	{
 		return STREQ(bnode->idname, "fn_FunctionInputNode");
@@ -93,10 +54,42 @@ namespace 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list