[Bf-blender-cvs] [ea9282cbd67] functions: extract class for managing the socket mapping
Jacques Lucke
noreply at git.blender.org
Sat Jan 4 16:38:47 CET 2020
Commit: ea9282cbd67505a018894e03ef6b5327c94aedd8
Author: Jacques Lucke
Date: Fri Jan 3 15:02:41 2020 +0100
Branches: functions
https://developer.blender.org/rBea9282cbd67505a018894e03ef6b5327c94aedd8
extract class for managing the socket mapping
===================================================================
M source/blender/blenlib/BLI_index_to_ref_map.h
M source/blender/functions/intern/node_tree_multi_function_network/builder.cc
M source/blender/functions/intern/node_tree_multi_function_network/builder.h
M source/blender/functions/intern/node_tree_multi_function_network/generate.cc
===================================================================
diff --git a/source/blender/blenlib/BLI_index_to_ref_map.h b/source/blender/blenlib/BLI_index_to_ref_map.h
index a4a6e514b0b..8e4c11f830c 100644
--- a/source/blender/blenlib/BLI_index_to_ref_map.h
+++ b/source/blender/blenlib/BLI_index_to_ref_map.h
@@ -58,10 +58,15 @@ template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class In
MultiMap<uint, T *> m_fallback_multimap;
public:
- IndexToRefMultiMap(uint size) : m_array(size, IndexToRefMultiMap_UNMAPPED)
+ IndexToRefMultiMap(uint max_index) : m_array(max_index, IndexToRefMultiMap_UNMAPPED)
{
}
+ uint max_index() const
+ {
+ return m_array.size();
+ }
+
bool contains(uint key) const
{
return m_array[key] != IndexToRefMultiMap_UNMAPPED;
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
index cc7d6782ce2..91cd998eedb 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
@@ -9,15 +9,13 @@ FunctionTreeMFNetworkBuilder::FunctionTreeMFNetworkBuilder(
const FSocketDataTypes &preprocessed_function_tree_data,
const VTreeMultiFunctionMappings &function_tree_mappings,
ResourceCollector &resources,
- IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id,
- IndexToRefMap<MFBuilderOutputSocket> &socket_by_group_input_id,
+ MFSocketByFSocketMapping &socket_map,
MFNetworkBuilder &builder)
: m_function_tree(function_tree),
m_fsocket_data_types(preprocessed_function_tree_data),
m_function_tree_mappings(function_tree_mappings),
m_resources(resources),
- m_sockets_by_fsocket_id(sockets_by_fsocket_id),
- m_socket_by_group_input_id(socket_by_group_input_id),
+ m_socket_map(socket_map),
m_builder(builder)
{
}
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.h b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
index eda3d3f5342..4502cc0e7ab 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
@@ -58,6 +58,90 @@ class FSocketDataTypes {
}
};
+class MFSocketByFSocketMapping {
+ private:
+ IndexToRefMultiMap<MFBuilderSocket> m_sockets_by_fsocket_id;
+ IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input_id;
+
+ public:
+ MFSocketByFSocketMapping(const FunctionNodeTree &function_tree)
+ : m_sockets_by_fsocket_id(function_tree.all_sockets().size()),
+ m_socket_by_group_input_id(function_tree.all_group_inputs().size())
+ {
+ }
+
+ const IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id() const
+ {
+ return m_sockets_by_fsocket_id;
+ }
+
+ void add(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
+ {
+ m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+ }
+
+ void add(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
+ {
+ m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+ }
+
+ void add(ArrayRef<const FInputSocket *> fsockets, ArrayRef<MFBuilderInputSocket *> sockets)
+ {
+ BLI_assert(fsockets.size() == sockets.size());
+ for (uint i : fsockets.index_range()) {
+ this->add(*fsockets[i], *sockets[i]);
+ }
+ }
+
+ void add(ArrayRef<const FOutputSocket *> fsockets, ArrayRef<MFBuilderOutputSocket *> sockets)
+ {
+ BLI_assert(fsockets.size() == sockets.size());
+ for (uint i : fsockets.index_range()) {
+ this->add(*fsockets[i], *sockets[i]);
+ }
+ }
+
+ void add(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
+ {
+ m_socket_by_group_input_id.add_new(group_input.id(), socket);
+ }
+
+ MFBuilderOutputSocket &lookup(const FGroupInput &group_input)
+ {
+ return m_socket_by_group_input_id.lookup(group_input.id());
+ }
+
+ MFBuilderOutputSocket &lookup(const FOutputSocket &fsocket)
+ {
+ return m_sockets_by_fsocket_id.lookup_single(fsocket.id()).as_output();
+ }
+
+ ArrayRef<MFBuilderInputSocket *> lookup(const FInputSocket &fsocket)
+ {
+ return m_sockets_by_fsocket_id.lookup(fsocket.id()).cast<MFBuilderInputSocket *>();
+ }
+
+ bool is_mapped(const FSocket &fsocket) const
+ {
+ return m_sockets_by_fsocket_id.contains(fsocket.id());
+ }
+
+ Vector<std::pair<uint, uint>> get_dummy_mappings()
+ {
+ Vector<std::pair<uint, uint>> dummy_mappings;
+ for (uint fsocket_id : IndexRange(m_sockets_by_fsocket_id.max_index())) {
+ ArrayRef<MFBuilderSocket *> mapped_sockets = m_sockets_by_fsocket_id.lookup(fsocket_id);
+ if (mapped_sockets.size() == 1) {
+ MFBuilderSocket &socket = *mapped_sockets[0];
+ if (socket.node().is_dummy()) {
+ dummy_mappings.append({fsocket_id, socket.id()});
+ }
+ }
+ }
+ return dummy_mappings;
+ }
+};
+
class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
private:
const FunctionNodeTree &m_function_tree;
@@ -65,9 +149,7 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
const VTreeMultiFunctionMappings &m_function_tree_mappings;
ResourceCollector &m_resources;
- IndexToRefMultiMap<MFBuilderSocket> &m_sockets_by_fsocket_id;
- IndexToRefMap<MFBuilderOutputSocket> &m_socket_by_group_input_id;
-
+ MFSocketByFSocketMapping &m_socket_map;
MFNetworkBuilder &m_builder;
public:
@@ -75,8 +157,7 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
const FSocketDataTypes &preprocessed_function_tree_data,
const VTreeMultiFunctionMappings &function_tree_mappings,
ResourceCollector &resources,
- IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id,
- IndexToRefMap<MFBuilderOutputSocket> &socket_by_group_input_id,
+ MFSocketByFSocketMapping &socket_map,
MFNetworkBuilder &builder);
const FunctionNodeTree &function_tree() const
@@ -150,45 +231,39 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
void map_sockets(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
{
- m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+ m_socket_map.add(fsocket, socket);
}
void map_sockets(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
{
- m_sockets_by_fsocket_id.add(fsocket.id(), socket);
+ m_socket_map.add(fsocket, socket);
}
void map_sockets(ArrayRef<const FInputSocket *> fsockets,
ArrayRef<MFBuilderInputSocket *> sockets)
{
- BLI_assert(fsockets.size() == sockets.size());
- for (uint i : fsockets.index_range()) {
- this->map_sockets(*fsockets[i], *sockets[i]);
- }
+ m_socket_map.add(fsockets, sockets);
}
void map_sockets(ArrayRef<const FOutputSocket *> fsockets,
ArrayRef<MFBuilderOutputSocket *> sockets)
{
- BLI_assert(fsockets.size() == sockets.size());
- for (uint i : fsockets.index_range()) {
- this->map_sockets(*fsockets[i], *sockets[i]);
- }
+ m_socket_map.add(fsockets, sockets);
}
void map_group_input(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
{
- m_socket_by_group_input_id.add_new(group_input.id(), socket);
+ m_socket_map.add(group_input, socket);
}
MFBuilderOutputSocket &lookup_group_input(const FGroupInput &group_input)
{
- return m_socket_by_group_input_id.lookup(group_input.id());
+ return m_socket_map.lookup(group_input);
}
bool fsocket_is_mapped(const FSocket &fsocket) const
{
- return m_sockets_by_fsocket_id.contains(fsocket.id());
+ return m_socket_map.is_mapped(fsocket);
}
void assert_fnode_is_mapped_correctly(const FNode &fnode);
@@ -197,19 +272,14 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
bool has_data_sockets(const FNode &fnode) const;
- MFBuilderSocket &lookup_single_socket(const FSocket &fsocket)
- {
- return m_sockets_by_fsocket_id.lookup_single(fsocket.id());
- }
-
MFBuilderOutputSocket &lookup_socket(const FOutputSocket &fsocket)
{
- return this->lookup_single_socket(fsocket.as_base()).as_output();
+ return m_socket_map.lookup(fsocket);
}
ArrayRef<MFBuilderInputSocket *> lookup_socket(const FInputSocket &fsocket)
{
- return m_sockets_by_fsocket_id.lookup(fsocket.id()).cast<MFBuilderInputSocket *>();
+ return m_socket_map.lookup(fsocket);
}
const CPPType &cpp_type_by_name(StringRef name) const
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/generate.cc b/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
index 6e2b5e33317..f89297dad56 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/generate.cc
@@ -133,27 +133,16 @@ static bool insert_unlinked_inputs(FunctionTreeMFNetworkBuilder &builder,
static std::unique_ptr<FunctionTreeMFNetwork> build(
const FunctionNodeTree &function_tree,
std::unique_ptr<MFNetworkBuilder> network_builder,
- const IndexToRefMultiMap<MFBuilderSocket> &sockets_by_fsocket_id)
+ ArrayRef<std::pair<uint, uint>> dummy_mappings)
{
// m_builder.to_dot__clipboard();
- Vector<std::pair<uint, uint>> m_dummy_mappings;
- for (uint fsocket_id : IndexRange(function_tree.socket_count())) {
- ArrayRef<MFBuilderSocket *> mapped_sockets = sockets_by_fsocket_id.lookup(fsocket_id);
- if (mapped_sockets.size() == 1) {
- MFBuilderSocket &socket = *mapped_sockets[0];
- if (socket.node().is_dummy()) {
- m_dummy_mappings.append({fsocket_id, socket.id()});
- }
- }
- }
-
auto network = BLI::make_unique<MFNetwork>(std::move(network_builder));
IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(function_tree.socket_count());
IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(network->socket_ids(
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list