[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