[Bf-blender-cvs] [118ce79bafe] functions: initial reroute support in graph conversion

Jacques Lucke noreply at git.blender.org
Tue Apr 2 12:36:03 CEST 2019


Commit: 118ce79bafe2c41b163b8fb4fe57e634eb739989
Author: Jacques Lucke
Date:   Tue Apr 2 12:30:45 2019 +0200
Branches: functions
https://developer.blender.org/rB118ce79bafe2c41b163b8fb4fe57e634eb739989

initial reroute support in graph conversion

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

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

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

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 ecf2754e111..a1d91b92bcc 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -18,6 +18,11 @@ namespace FN { namespace DataFlowNodes {
 		return STREQ(bnode->idname, "fn_FunctionOutputNode");
 	}
 
+	static bool is_reroute_node(const bNode *bnode)
+	{
+		return STREQ(bnode->idname, "NodeReroute");
+	}
+
 	static void find_interface_nodes(
 		bNodeTree *btree,
 		bNode **r_input,
@@ -67,6 +72,77 @@ namespace FN { namespace DataFlowNodes {
 		builder.map_data_sockets(node, bnode, ctx);
 	}
 
+	struct BSocketLink {
+		bNodeSocket *from;
+		bNodeSocket *to;
+		bNodeLink *optional_source_link;
+
+		BSocketLink(bNodeSocket *from, bNodeSocket *to, bNodeLink *link = nullptr)
+			: from(from), to(to), optional_source_link(link) {}
+	};
+
+	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);
+				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;
+			}
+		}
+	};
+
 	Optional<FunctionGraph> generate_function_graph(struct bNodeTree *btree)
 	{
 		auto graph = SharedDataFlowGraph::New();
@@ -84,6 +160,9 @@ namespace FN { namespace DataFlowNodes {
 			if (bnode == input_node || bnode == output_node) {
 				continue;
 			}
+			if (is_reroute_node(bnode)) {
+				continue;
+			}
 
 			if (!inserters.insert_node(builder, ctx, bnode)) {
 				return {};
@@ -110,8 +189,13 @@ namespace FN { namespace DataFlowNodes {
 			}
 		}
 
-		for (bNodeLink *blink : bLinkList(&btree->links)) {
-			if (!inserters.insert_link(builder, ctx, blink)) {
+		TreeData tree_data(btree);
+		for (auto &link : tree_data.data_origins()) {
+			if (!inserters.insert_link(
+				builder, ctx,
+				link.from, link.to,
+				link.optional_source_link))
+			{
 				return {};
 			}
 		}
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index dc8243767c0..93e719f34a9 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -67,12 +67,18 @@ namespace FN { namespace DataFlowNodes {
 		auto inserter = [getter](
 				Builder &builder,
 				const BuilderContext &ctx,
-				bNodeLink *blink,
 				Socket from,
-				Socket to)
+				Socket to,
+				struct bNodeLink *source_link)
 			{
 				auto fn = getter();
-				Node *node = builder.insert_function(fn, ctx.btree(), blink);
+				Node *node;
+				if (source_link == NULL) {
+					node = builder.insert_function(fn);
+				}
+				else {
+					node = builder.insert_function(fn, ctx.btree(), source_link);
+				}
 				builder.insert_link(from, node->input(0));
 				builder.insert_link(node->output(0), to);
 			};
@@ -156,16 +162,18 @@ namespace FN { namespace DataFlowNodes {
 	bool GraphInserters::insert_link(
 		Builder &builder,
 		const BuilderContext &ctx,
-		struct bNodeLink *blink)
+		struct bNodeSocket *from_bsocket,
+		struct bNodeSocket *to_bsocket,
+		struct bNodeLink *source_link)
 	{
-		BLI_assert(ctx.is_data_socket(blink->fromsock));
-		BLI_assert(ctx.is_data_socket(blink->tosock));
+		BLI_assert(ctx.is_data_socket(from_bsocket));
+		BLI_assert(ctx.is_data_socket(to_bsocket));
 
-		Socket from_socket = builder.lookup_socket(blink->fromsock);
-		Socket to_socket = builder.lookup_socket(blink->tosock);
+		Socket from_socket = builder.lookup_socket(from_bsocket);
+		Socket to_socket = builder.lookup_socket(to_bsocket);
 
-		std::string from_type = ctx.socket_type_string(blink->fromsock);
-		std::string to_type = ctx.socket_type_string(blink->tosock);
+		std::string from_type = ctx.socket_type_string(from_bsocket);
+		std::string to_type = ctx.socket_type_string(to_bsocket);
 
 		if (from_type == to_type) {
 			builder.insert_link(from_socket, to_socket);
@@ -175,7 +183,7 @@ namespace FN { namespace DataFlowNodes {
 		auto key = std::pair<std::string, std::string>(from_type, to_type);
 		if (m_conversion_inserters.contains(key)) {
 			auto inserter = m_conversion_inserters.lookup(key);
-			inserter(builder, ctx, blink, from_socket, to_socket);
+			inserter(builder, ctx, from_socket, to_socket, source_link);
 			return true;
 		}
 
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
index 9625bede1d9..7da9fdf79ee 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
@@ -23,9 +23,9 @@ namespace FN { namespace DataFlowNodes {
 	typedef std::function<void (
 		Builder &builder,
 		const BuilderContext &ctx,
-		bNodeLink *blink,
 		Socket from,
-		Socket to)> ConversionInserter;
+		Socket to,
+		struct bNodeLink *source_link)> ConversionInserter;
 
 	typedef std::function<SharedFunction ()> FunctionGetter;
 
@@ -64,7 +64,9 @@ namespace FN { namespace DataFlowNodes {
 		bool insert_link(
 			Builder &builder,
 			const BuilderContext &ctx,
-			struct bNodeLink *blink);
+			struct bNodeSocket *from_bsocket,
+			struct bNodeSocket *to_bsocket,
+			struct bNodeLink *source_link = nullptr);
 	};
 
 	GraphInserters &get_standard_inserters();



More information about the Bf-blender-cvs mailing list