[Bf-blender-cvs] [b23cf5f41a8] functions: put multiple unlinked inputs into a single function

Jacques Lucke noreply at git.blender.org
Tue Mar 5 16:47:34 CET 2019


Commit: b23cf5f41a8e670ca11304ee3d64db0ea6bee942
Author: Jacques Lucke
Date:   Tue Mar 5 14:55:39 2019 +0100
Branches: functions
https://developer.blender.org/rBb23cf5f41a8e670ca11304ee3d64db0ea6bee942

put multiple unlinked inputs into a single function

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_functions.hpp
M	source/blender/functions/core/data_flow_graph.hpp
M	source/blender/functions/core/function.hpp
M	source/blender/functions/frontends/data_flow_nodes/builder.cpp
M	source/blender/functions/frontends/data_flow_nodes/builder.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.hpp
M	source/blender/functions/frontends/data_flow_nodes/test_sockets.cpp
M	source/blender/functions/frontends/data_flow_nodes/util_wrappers.hpp
D	source/blender/functions/functions/socket_input.cpp
D	source/blender/functions/functions/socket_input.hpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index f000e32ee2d..eb1a828f687 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -80,8 +80,6 @@ set(SRC
 	functions/scalar_math.cpp
 	functions/vectors.hpp
 	functions/vectors.cpp
-	functions/socket_input.hpp
-	functions/socket_input.cpp
 
 	frontends/data_flow_nodes/builder.hpp
 	frontends/data_flow_nodes/builder.cpp
diff --git a/source/blender/functions/FN_functions.hpp b/source/blender/functions/FN_functions.hpp
index 59903af56ce..e70482398a8 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -3,5 +3,4 @@
 #include "./functions/object_input.hpp"
 #include "./functions/random.hpp"
 #include "./functions/scalar_math.hpp"
-#include "./functions/vectors.hpp"
-#include "./functions/socket_input.hpp"
\ No newline at end of file
+#include "./functions/vectors.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/core/data_flow_graph.hpp b/source/blender/functions/core/data_flow_graph.hpp
index 3c82a631bfd..3aae24e3c62 100644
--- a/source/blender/functions/core/data_flow_graph.hpp
+++ b/source/blender/functions/core/data_flow_graph.hpp
@@ -82,6 +82,11 @@ namespace FN {
 			return this->function()->signature();
 		}
 
+		Signature &signature()
+		{
+			return this->function()->signature();
+		}
+
 		class SocketIterator {
 		private:
 			Node *m_node;
@@ -104,8 +109,9 @@ namespace FN {
 
 			It end() const
 			{
+				Signature &sig = m_node->signature();
 				return It(m_node, m_is_output,
-					m_node->function()->signature().inputs().size());
+					(m_is_output) ? sig.outputs().size() : sig.inputs().size());
 			}
 
 			It &operator++()
diff --git a/source/blender/functions/core/function.hpp b/source/blender/functions/core/function.hpp
index 988121cc4b9..dde7259b5e3 100644
--- a/source/blender/functions/core/function.hpp
+++ b/source/blender/functions/core/function.hpp
@@ -49,6 +49,11 @@ namespace FN {
 			return m_signature;
 		}
 
+		inline Signature &signature()
+		{
+			return m_signature;
+		}
+
 		template<typename T>
 		inline T *body() const
 		{
@@ -75,7 +80,7 @@ namespace FN {
 
 	private:
 		const std::string m_name;
-		const Signature m_signature;
+		Signature m_signature;
 		Composition m_bodies;
 	};
 
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.cpp b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
index abf910bcdfb..c48b0fface7 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
@@ -1,6 +1,7 @@
 #include "builder.hpp"
 
 #include "DNA_node_types.h"
+#include "FN_types.hpp"
 #include "util_wrappers.hpp"
 
 namespace FN { namespace DataFlowNodes {
@@ -60,4 +61,21 @@ namespace FN { namespace DataFlowNodes {
 		return &m_btree->id;
 	}
 
+	SharedType &BuilderContext::type_of_socket(bNodeSocket *bsocket) const
+	{
+		if (STREQ(bsocket->idname, "fn_FloatSocket")) {
+			return Types::get_float_type();
+		}
+		else if (STREQ(bsocket->idname, "fn_IntegerSocket")) {
+			return Types::get_int32_type();
+		}
+		else if (STREQ(bsocket->idname, "fn_VectorSocket")) {
+			return Types::get_fvec3_type();
+		}
+		else {
+			BLI_assert(false);
+			return *(SharedType *)nullptr;
+		}
+	}
+
 } } /* 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
index fe8840d24f2..a5b42bc451b 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
@@ -42,6 +42,8 @@ namespace FN { namespace DataFlowNodes {
 
 		bNodeTree *btree() const;
 		ID *btree_id() const;
+
+		SharedType &type_of_socket(bNodeSocket *bsocket) const;
 	};
 
 } }
\ 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 db760083ee6..753b50d4501 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -8,25 +8,6 @@
 
 namespace FN { namespace DataFlowNodes {
 
-	using namespace Types;
-
-	static SharedType &get_type_of_socket(bNodeSocket *bsocket)
-	{
-		if (STREQ(bsocket->idname, "fn_FloatSocket")) {
-			return get_float_type();
-		}
-		else if (STREQ(bsocket->idname, "fn_IntegerSocket")) {
-			return get_int32_type();
-		}
-		else if (STREQ(bsocket->idname, "fn_VectorSocket")) {
-			return get_fvec3_type();
-		}
-		else {
-			BLI_assert(false);
-			return *(SharedType *)nullptr;
-		}
-	}
-
 	static bool is_input_node(const bNode *bnode)
 	{
 		return STREQ(bnode->idname, "fn_FunctionInputNode");
@@ -55,11 +36,11 @@ namespace FN { namespace DataFlowNodes {
 	}
 
 	static void insert_input_node(
-		Builder &builder, bNode *bnode)
+		Builder &builder, const BuilderContext &ctx, bNode *bnode)
 	{
 		OutputParameters outputs;
 		for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
-			SharedType &type = get_type_of_socket(bsocket);
+			SharedType &type = ctx.type_of_socket(bsocket);
 			outputs.append(OutputParameter(bsocket->name, type));
 		}
 
@@ -69,11 +50,11 @@ namespace FN { namespace DataFlowNodes {
 	}
 
 	static void insert_output_node(
-		Builder &builder, bNode *bnode)
+		Builder &builder, const BuilderContext &ctx, bNode *bnode)
 	{
 		InputParameters inputs;
 		for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
-			SharedType &type = get_type_of_socket(bsocket);
+			SharedType &type = ctx.type_of_socket(bsocket);
 			inputs.append(InputParameter(bsocket->name, type));
 		}
 
@@ -109,13 +90,13 @@ namespace FN { namespace DataFlowNodes {
 		SmallSocketVector output_sockets;
 
 		if (input_node != nullptr) {
-			insert_input_node(builder, input_node);
+			insert_input_node(builder, ctx, input_node);
 			for (bNodeSocket *bsocket : bSocketList(&input_node->outputs)) {
 				input_sockets.append(socket_map.lookup(bsocket));
 			}
 		}
 		if (output_node != nullptr) {
-			insert_output_node(builder, output_node);
+			insert_output_node(builder, ctx, output_node);
 			for (bNodeSocket *bsocket : bSocketList(&output_node->inputs)) {
 				output_sockets.append(socket_map.lookup(bsocket));
 			}
@@ -130,20 +111,27 @@ namespace FN { namespace DataFlowNodes {
 			builder.insert_link(from, to);
 		}
 
+		BSockets unlinked_inputs;
+		SmallSocketVector node_inputs;
 		for (bNode *bnode : bNodeList(&btree->nodes)) {
 			for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
 				Socket socket = socket_map.lookup(bsocket);
 				if (!socket.is_linked()) {
-					Optional<Socket> new_origin = inserters.insert_socket(builder, ctx, bsocket);
-					if (!new_origin.has_value()) {
-						return {};
-					}
-					builder.insert_link(new_origin.value(), socket);
+					unlinked_inputs.append(bsocket);
+					node_inputs.append(socket);
 				}
 			}
 		}
 
+		SmallSocketVector new_origins = inserters.insert_sockets(builder, ctx, unlinked_inputs);
+		BLI_assert(unlinked_inputs.size() == new_origins.size());
+
+		for (uint i = 0; i < unlinked_inputs.size(); i++) {
+			builder.insert_link(new_origins[i], node_inputs[i]);
+		}
+
 		graph->freeze();
+		std::cout << graph->to_dot() << std::endl;
 		FunctionGraph fgraph(graph, input_sockets, output_sockets);
 		return fgraph;
 	}
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index cffc732e35b..1397612b746 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -4,6 +4,8 @@
 #include "BLI_lazy_init.hpp"
 #include "DNA_node_types.h"
 
+#include "RNA_access.h"
+
 namespace FN { namespace DataFlowNodes {
 
 	static void initialize_standard_inserters(GraphInserters &inserters)
@@ -40,10 +42,10 @@ namespace FN { namespace DataFlowNodes {
 		this->reg_node_inserter(idname, inserter);
 	}
 
-	void GraphInserters::reg_socket_inserter(std::string idname, SocketInserter inserter)
+	void GraphInserters::reg_socket_loader(std::string idname, SocketLoader loader)
 	{
-		BLI_assert(!m_node_inserters.contains(idname));
-		m_socket_inserters.add(idname, inserter);
+		BLI_assert(!m_socket_loaders.contains(idname));
+		m_socket_loaders.add(idname, loader);
 	}
 
 	bool GraphInserters::insert_node(
@@ -59,17 +61,55 @@ namespace FN { namespace DataFlowNodes {
 		return true;
 	}
 
-	Optional<Socket> GraphInserters::insert_socket(
+	class SocketLoaderBody : public TupleCallBody {
+	private:
+		bNodeTree *m_btree;
+		BSockets m_bsockets;
+		SmallVector<SocketLoader> m_loaders;
+
+	public:
+		SocketLoaderBody(
+			bNodeTree *btree,
+			BSockets &bsockets,
+			SmallVector<SocketLoader> &loaders)
+			: m_btree(btree), m_bsockets(bsockets), m_loaders(loaders) {}
+
+		void call(const Tuple &UNUSED(fn_in), Tuple &fn_out) const override
+		{
+			for (uint i = 0; i < m_bsockets.size(); i++) {
+				PointerRNA ptr;
+				bNodeSocket *bsocket = m_bsockets[i];
+				auto loader = m_loaders[i];
+
+				RNA_pointer_create(&m_btree->id,
+					&RNA_NodeSocket, bsocket, &ptr);
+				loader(&ptr, fn_out, i);
+			}
+		}
+	};
+
+	SmallSocketVector GraphInserters::insert_sockets(
 		Builder &builder,
 		const BuilderContext &ctx,
-		struct bNodeSocket *bsocket)
+		BSockets &bsockets)
 	{
-		SocketInserter *inserter = m_socket_inserters.lookup_ptr(bsocket->idname);
-		if (inserter == nullptr) {
-			return {};
+		SmallVector<SocketLoader> loaders;
+		OutputParameters outputs;
+		for (auto *bsocket : bsockets) {
+			SocketLoader loader = m_socket_loaders.lookup(bsocket->idname);
+			loaders.append(loader);
+			outputs.append(OutputParameter(bsocket->name, ctx.type_of_socket(bsocket)));
+		}
+
+		auto fn = SharedFunction::New("Input Sockets", Signature({}, outputs));
+		fn->add_body(new SocketLoaderBody(ctx.btree(), bsockets, loaders));
+		Node *node = builder.insert_function(fn);
+
+		SmallSocketV

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list