[Bf-blender-cvs] [31c6db7d2a7] functions: separate unlinked input grouper from inserter
Jacques Lucke
noreply at git.blender.org
Mon Aug 5 13:07:49 CEST 2019
Commit: 31c6db7d2a7c3a49f693343c263affb2c868d5e9
Author: Jacques Lucke
Date: Mon Aug 5 12:51:32 2019 +0200
Branches: functions
https://developer.blender.org/rB31c6db7d2a7c3a49f693343c263affb2c868d5e9
separate unlinked input grouper from inserter
===================================================================
M source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
M source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
M source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
M source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
M source/blender/functions/frontends/data_flow_nodes/vtree_data_graph_builder.cpp
M source/blender/functions/frontends/data_flow_nodes/vtree_data_graph_builder.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 4a9799e416a..9358a167d09 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -48,6 +48,27 @@ static bool insert_links(VTreeDataGraphBuilder &builder)
return true;
}
+static bool insert_unlinked_inputs(VTreeDataGraphBuilder &builder)
+{
+ GroupByNodeUsage grouper;
+ MultiVector<VirtualSocket *> groups;
+ grouper.group(builder, groups);
+
+ ConstantInputsHandler input_inserter;
+ for (uint i = 0; i < groups.size(); i++) {
+ ArrayRef<VirtualSocket *> unlinked_inputs = groups[i];
+ Vector<BuilderOutputSocket *> new_origins(unlinked_inputs.size());
+
+ input_inserter.insert(builder, unlinked_inputs, new_origins);
+
+ for (uint i = 0; i < unlinked_inputs.size(); i++) {
+ builder.insert_link(new_origins[i], builder.lookup_input_socket(unlinked_inputs[i]));
+ }
+ }
+
+ return true;
+}
+
ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
{
VTreeDataGraphBuilder builder(vtree);
@@ -60,9 +81,11 @@ ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
return BLI_ERROR_CREATE("error inserting links");
}
- ConstantInputsHandler input_inserter;
- GroupByNodeUsage unlinked_input_handler;
- unlinked_input_handler.handle(builder, input_inserter);
+ if (!insert_unlinked_inputs(builder)) {
+ return BLI_ERROR_CREATE("error inserting unlinked inputs");
+ }
+
+ builder.to_dot__clipboard();
return builder.build();
}
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 e5a8b565259..2b7e8c96c3b 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
@@ -1,10 +1,14 @@
#pragma once
+#include "BLI_multi_vector.hpp"
+
#include "vtree_data_graph_builder.hpp"
namespace FN {
namespace DataFlowNodes {
+using BLI::MultiVector;
+
class InputInserter {
public:
virtual void insert(VTreeDataGraphBuilder &builder,
@@ -14,7 +18,7 @@ class InputInserter {
class UnlinkedInputGrouper {
public:
- virtual void handle(VTreeDataGraphBuilder &builder, InputInserter &inserter) = 0;
+ virtual void group(VTreeDataGraphBuilder &builder, MultiVector<VirtualSocket *> &r_groups) = 0;
};
ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree);
diff --git a/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
index 26bf610b71d..e47c9e92f3f 100644
--- a/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
@@ -6,12 +6,14 @@ namespace FN {
namespace DataFlowNodes {
class DynamicSocketLoader : public InputInserter {
+ public:
void insert(VTreeDataGraphBuilder &builder,
ArrayRef<VirtualSocket *> unlinked_inputs,
ArrayRef<BuilderOutputSocket *> r_new_origins) override;
};
class ConstantInputsHandler : public InputInserter {
+ public:
void insert(VTreeDataGraphBuilder &builder,
ArrayRef<VirtualSocket *> unlinked_inputs,
ArrayRef<BuilderOutputSocket *> r_new_origins) override;
diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
index fc43c21abd6..9055f347952 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
@@ -3,66 +3,49 @@
namespace FN {
namespace DataFlowNodes {
-void SeparateNodeInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void SeparateNodeInputs::group(VTreeDataGraphBuilder &builder,
+ MultiVector<VirtualSocket *> &r_groups)
{
+ Vector<VirtualSocket *> vsockets;
for (VirtualNode *vnode : builder.vtree().nodes()) {
- Vector<VirtualSocket *> vsockets;
- Vector<BuilderInputSocket *> sockets;
-
for (VirtualSocket *vsocket : vnode->inputs()) {
- if (builder.is_data_socket(vsocket)) {
- BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
- if (socket->origin() == nullptr) {
- vsockets.append(vsocket);
- sockets.append(socket);
- }
+ if (builder.is_input_unlinked(vsocket)) {
+ vsockets.append(vsocket);
}
}
if (vsockets.size() > 0) {
- Vector<BuilderOutputSocket *> new_origins(vsockets.size());
- inserter.insert(builder, vsockets, new_origins);
- builder.insert_links(new_origins, sockets);
+ r_groups.append(vsockets);
+ vsockets.clear();
}
}
}
-void SeparateSocketInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void SeparateSocketInputs::group(VTreeDataGraphBuilder &builder,
+ MultiVector<VirtualSocket *> &r_groups)
{
for (VirtualNode *vnode : builder.vtree().nodes()) {
for (VirtualSocket *vsocket : vnode->inputs()) {
- if (builder.is_data_socket(vsocket)) {
- BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
- if (socket->origin() == nullptr) {
- std::array<BuilderOutputSocket *, 1> new_origin;
- inserter.insert(builder, {vsocket}, new_origin);
- BLI_assert(new_origin[0]);
- builder.insert_link(new_origin[0], socket);
- }
+ if (builder.is_input_unlinked(vsocket)) {
+ r_groups.append({vsocket});
}
}
}
}
-void AllInOneSocketInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void AllInOneSocketInputs::group(VTreeDataGraphBuilder &builder,
+ MultiVector<VirtualSocket *> &r_groups)
{
Vector<VirtualSocket *> unlinked_input_vsockets;
- Vector<BuilderInputSocket *> unlinked_input_sockets;
for (VirtualNode *vnode : builder.vtree().nodes()) {
for (VirtualSocket *vsocket : vnode->inputs()) {
- if (builder.is_data_socket(vsocket)) {
- BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
- if (socket->origin() == nullptr) {
- unlinked_input_vsockets.append(vsocket);
- unlinked_input_sockets.append(socket);
- }
+ if (builder.is_input_unlinked(vsocket)) {
+ unlinked_input_vsockets.append(vsocket);
}
}
}
- Vector<BuilderOutputSocket *> new_origins(unlinked_input_vsockets.size());
- inserter.insert(builder, unlinked_input_vsockets, new_origins);
- builder.insert_links(new_origins, unlinked_input_sockets);
+ r_groups.append(unlinked_input_vsockets);
}
static void update_hash_of_used_vsockets(VTreeDataGraphBuilder &builder,
@@ -94,9 +77,9 @@ static void update_hash_of_used_vsockets(VTreeDataGraphBuilder &builder,
}
}
-static void insert_input_node_for_sockets_with_same_hash(VTreeDataGraphBuilder &builder,
- ArrayRef<uint> hash_per_vsocket,
- InputInserter &inserter)
+static void group_with_same_hash(VTreeDataGraphBuilder &builder,
+ ArrayRef<uint> hash_per_vsocket,
+ MultiVector<VirtualSocket *> &r_groups)
{
MultiMap<uint, VirtualSocket *> unlinked_inputs_by_hash;
for (VirtualNode *vnode : builder.vtree().nodes()) {
@@ -114,16 +97,12 @@ static void insert_input_node_for_sockets_with_same_hash(VTreeDataGraphBuilder &
for (uint key : unlinked_inputs_by_hash.keys()) {
ArrayRef<VirtualSocket *> unlinked_vsockets = unlinked_inputs_by_hash.lookup(key);
BLI_assert(unlinked_vsockets.size() > 0);
- Vector<BuilderOutputSocket *> new_origins(unlinked_vsockets.size());
- inserter.insert(builder, unlinked_vsockets, new_origins);
-
- for (uint i = 0; i < unlinked_vsockets.size(); i++) {
- builder.insert_link(new_origins[i], builder.lookup_input_socket(unlinked_vsockets[i]));
- }
+ r_groups.append(unlinked_vsockets);
}
}
-void GroupByNodeUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void GroupByNodeUsage::group(VTreeDataGraphBuilder &builder,
+ MultiVector<VirtualSocket *> &r_groups)
{
uint socket_count = builder.vtree().socket_count();
@@ -142,10 +121,11 @@ void GroupByNodeUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &ins
updated_vsockets.clear();
}
- insert_input_node_for_sockets_with_same_hash(builder, hash_per_vsocket, inserter);
+ group_with_same_hash(builder, hash_per_vsocket, r_groups);
}
-void GroupBySocketUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void GroupBySocketUsage::group(VTreeDataGraphBuilder &builder,
+ MultiVector<VirtualSocket *> &r_groups)
{
uint socket_count = builder.vtree().socket_count();
@@ -163,7 +143,7 @@ void GroupBySocketUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &i
}
}
- insert_input_node_for_sockets_with_same_hash(builder, hash_per_vsocket, inserter);
+ group_with_same_hash(builder, hash_per_vsocket, r_groups);
}
} // namespace DataFlowNodes
diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
index 24b678ad31d..66ee183f356 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
@@ -7,27 +7,27 @@ namespace DataFlowNodes {
class SeparateNodeInputs : public UnlinkedInputGrouper {
public:
- void handle(VTreeDataGraphBuilder &builder, InputInserter &inserter) override;
+ void group(VTreeDataGraphBuilder &builder, MultiV
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list