[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