[Bf-blender-cvs] [ea0b7dc6d19] functions: make multifunction generation work with inlined node trees
Jacques Lucke
noreply at git.blender.org
Sat Nov 30 16:40:06 CET 2019
Commit: ea0b7dc6d195756bd587785ce4ce10e6fcc57c50
Author: Jacques Lucke
Date: Wed Nov 27 15:47:40 2019 +0100
Branches: functions
https://developer.blender.org/rBea0b7dc6d195756bd587785ce4ce10e6fcc57c50
make multifunction generation work with inlined node trees
===================================================================
M source/blender/functions/intern/vtree_multi_function_network/builder.cc
M source/blender/functions/intern/vtree_multi_function_network/builder.h
M source/blender/functions/intern/vtree_multi_function_network/generate.cc
===================================================================
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.cc b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
index a5687c2f00a..ad8ca2cbcd7 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -194,7 +194,7 @@ const MultiFunction &VNodeMFNetworkBuilder::get_vectorized_function(
std::unique_ptr<VTreeMFNetwork> VTreeMFNetworkBuilder::build()
{
- m_builder->to_dot__clipboard();
+ // m_builder->to_dot__clipboard();
auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.h b/source/blender/functions/intern/vtree_multi_function_network/builder.h
index a6aaa304f00..92c0af3bf34 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -9,12 +9,15 @@
namespace FN {
+using BKE::VSocket;
+using BKE::XGroupInput;
using BLI::MultiMap;
class PreprocessedVTreeMFData {
private:
const InlinedNodeTree &m_vtree;
Array<Optional<MFDataType>> m_data_type_by_vsocket_id;
+ Array<Optional<MFDataType>> m_data_type_by_group_input_id;
public:
PreprocessedVTreeMFData(const InlinedNodeTree &vtree) : m_vtree(vtree)
@@ -23,13 +26,14 @@ class PreprocessedVTreeMFData {
m_data_type_by_vsocket_id = Array<Optional<MFDataType>>(vtree.socket_count());
for (const XSocket *vsocket : vtree.all_sockets()) {
- const MFDataType *data_type = mappings.data_type_by_idname.lookup_ptr(vsocket->idname());
- if (data_type == nullptr) {
- m_data_type_by_vsocket_id[vsocket->id()] = {};
- }
- else {
- m_data_type_by_vsocket_id[vsocket->id()] = MFDataType(*data_type);
- }
+ m_data_type_by_vsocket_id[vsocket->id()] = mappings.data_type_by_idname.try_lookup(
+ vsocket->idname());
+ }
+
+ m_data_type_by_group_input_id = Array<Optional<MFDataType>>(vtree.all_group_inputs().size());
+ for (const XGroupInput *group_input : vtree.all_group_inputs()) {
+ m_data_type_by_group_input_id[group_input->id()] = mappings.data_type_by_idname.try_lookup(
+ group_input->vsocket().idname());
}
}
@@ -47,6 +51,11 @@ class PreprocessedVTreeMFData {
{
return m_data_type_by_vsocket_id[vsocket.id()].has_value();
}
+
+ bool is_data_group_input(const XGroupInput &group_input) const
+ {
+ return m_data_type_by_group_input_id[group_input.id()].has_value();
+ }
};
class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
@@ -63,6 +72,8 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
MultiMap<uint, uint> m_multiple_inputs_by_vsocket;
static constexpr intptr_t MULTI_MAP_INDICATOR = 1;
+ Map<const XGroupInput *, MFBuilderOutputSocket *> m_group_inputs_mapping;
+
std::unique_ptr<MFNetworkBuilder> m_builder;
public:
@@ -125,6 +136,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
return m_preprocessed_vtree_data.is_data_socket(vsocket);
}
+ bool is_data_group_input(const XGroupInput &group_input) const
+ {
+ return m_preprocessed_vtree_data.is_data_group_input(group_input);
+ }
+
void map_data_sockets(const XNode &vnode, MFBuilderNode &node);
void map_sockets(const XInputSocket &vsocket, MFBuilderInputSocket &socket)
@@ -174,6 +190,16 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
}
}
+ void map_group_input(const XGroupInput &group_input, MFBuilderOutputSocket &socket)
+ {
+ m_group_inputs_mapping.add_new(&group_input, &socket);
+ }
+
+ MFBuilderOutputSocket &lookup_group_input(const XGroupInput &group_input) const
+ {
+ return *m_group_inputs_mapping.lookup(&group_input);
+ }
+
bool vsocket_is_mapped(const XSocket &vsocket) const
{
return m_single_socket_by_vsocket[vsocket.id()] != VTreeMFSocketMap_UNMAPPED;
@@ -233,11 +259,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
class VSocketMFNetworkBuilder {
private:
VTreeMFNetworkBuilder &m_network_builder;
- const XSocket &m_vsocket;
+ const VSocket &m_vsocket;
MFBuilderOutputSocket *m_socket_to_build = nullptr;
public:
- VSocketMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const XSocket &vsocket)
+ VSocketMFNetworkBuilder(VTreeMFNetworkBuilder &network_builder, const VSocket &vsocket)
: m_network_builder(network_builder), m_vsocket(vsocket)
{
}
@@ -248,7 +274,7 @@ class VSocketMFNetworkBuilder {
return *m_socket_to_build;
}
- const XSocket &vsocket() const
+ const VSocket &vsocket() const
{
return m_vsocket;
}
diff --git a/source/blender/functions/intern/vtree_multi_function_network/generate.cc b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
index f4728098050..77b4fceb511 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -10,6 +10,8 @@
namespace FN {
+using BKE::XGroupInput;
+
static bool insert_nodes(VTreeMFNetworkBuilder &builder,
const VTreeMultiFunctionMappings &mappings)
{
@@ -30,6 +32,16 @@ static bool insert_nodes(VTreeMFNetworkBuilder &builder,
}
}
+ for (const XGroupInput *group_input : vtree.all_group_inputs()) {
+ VSocketMFNetworkBuilder socket_builder{builder, group_input->vsocket()};
+ const InsertVSocketFunction *inserter = mappings.vsocket_inserters.lookup_ptr(
+ group_input->vsocket().idname());
+ if (inserter != nullptr) {
+ (*inserter)(socket_builder);
+ builder.map_group_input(*group_input, socket_builder.built_socket());
+ }
+ }
+
return true;
}
@@ -37,21 +49,34 @@ static bool insert_links(VTreeMFNetworkBuilder &builder,
const VTreeMultiFunctionMappings &mappings)
{
for (const XInputSocket *to_vsocket : builder.vtree().all_input_sockets()) {
- ArrayRef<const XOutputSocket *> origins = to_vsocket->linked_sockets();
- if (origins.size() != 1) {
+ if (!builder.is_data_socket(*to_vsocket)) {
continue;
}
- if (!builder.is_data_socket(*to_vsocket)) {
+ ArrayRef<const XOutputSocket *> origin_sockets = to_vsocket->linked_sockets();
+ ArrayRef<const XGroupInput *> origin_group_inputs = to_vsocket->linked_group_inputs();
+ if (origin_sockets.size() + origin_group_inputs.size() != 1) {
continue;
}
- const XOutputSocket *from_vsocket = origins[0];
- if (!builder.is_data_socket(*from_vsocket)) {
- return false;
+ MFBuilderOutputSocket *from_socket = nullptr;
+ StringRef from_idname;
+
+ if (origin_sockets.size() == 1) {
+ if (!builder.is_data_socket(*origin_sockets[0])) {
+ return false;
+ }
+ from_socket = &builder.lookup_socket(*origin_sockets[0]);
+ from_idname = origin_sockets[0]->idname();
+ }
+ else {
+ if (!builder.is_data_group_input(*origin_group_inputs[0])) {
+ return false;
+ }
+ from_socket = &builder.lookup_group_input(*origin_group_inputs[0]);
+ from_idname = origin_group_inputs[0]->vsocket().idname();
}
- MFBuilderOutputSocket *from_socket = &builder.lookup_socket(*from_vsocket);
Vector<MFBuilderInputSocket *> to_sockets = builder.lookup_socket(*to_vsocket);
BLI_assert(to_sockets.size() >= 1);
@@ -60,7 +85,7 @@ static bool insert_links(VTreeMFNetworkBuilder &builder,
if (from_type != to_type) {
const InsertImplicitConversionFunction *inserter = mappings.conversion_inserters.lookup_ptr(
- {from_vsocket->idname(), to_vsocket->idname()});
+ {from_idname, to_vsocket->idname()});
if (inserter == nullptr) {
return false;
}
@@ -97,7 +122,7 @@ static bool insert_unlinked_inputs(VTreeMFNetworkBuilder &builder,
return false;
}
- VSocketMFNetworkBuilder vsocket_builder{builder, *vsocket};
+ VSocketMFNetworkBuilder vsocket_builder{builder, vsocket->vsocket()};
(*inserter)(vsocket_builder);
for (MFBuilderInputSocket *to_socket : builder.lookup_socket(*vsocket)) {
builder.add_link(vsocket_builder.built_socket(), *to_socket);
More information about the Bf-blender-cvs
mailing list