[Bf-blender-cvs] [046204e7b27] functions: extract preprocessed vtree data from builder
Jacques Lucke
noreply at git.blender.org
Thu Nov 21 15:19:33 CET 2019
Commit: 046204e7b2743db1457fad8fd8e36284969492b7
Author: Jacques Lucke
Date: Tue Nov 19 13:38:25 2019 +0100
Branches: functions
https://developer.blender.org/rB046204e7b2743db1457fad8fd8e36284969492b7
extract preprocessed vtree data from builder
===================================================================
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 c822fa22bb6..b7b9348bd36 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.cc
@@ -2,25 +2,18 @@
namespace FN {
-VTreeMFNetworkBuilder::VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
- const VTreeMultiFunctionMappings &vtree_mappings,
- ResourceCollector &resources)
+VTreeMFNetworkBuilder::VTreeMFNetworkBuilder(
+ const VirtualNodeTree &vtree,
+ const PreprocessedVTreeMFData &preprocessed_vtree_data,
+ const VTreeMultiFunctionMappings &vtree_mappings,
+ ResourceCollector &resources)
: m_vtree(vtree),
+ m_preprocessed_vtree_data(preprocessed_vtree_data),
m_vtree_mappings(vtree_mappings),
m_resources(resources),
m_single_socket_by_vsocket(vtree.socket_count(), VTreeMFSocketMap_UNMAPPED),
- m_type_by_vsocket(vtree.socket_count()),
m_builder(BLI::make_unique<MFNetworkBuilder>())
{
- for (const VSocket *vsocket : vtree.all_sockets()) {
- const MFDataType *data_type = vtree_mappings.data_type_by_idname.lookup_ptr(vsocket->idname());
- if (data_type == nullptr) {
- m_type_by_vsocket[vsocket->id()] = {};
- }
- else {
- m_type_by_vsocket[vsocket->id()] = MFDataType(*data_type);
- }
- }
}
MFBuilderFunctionNode &VTreeMFNetworkBuilder::add_function(const MultiFunction &function,
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 ee31a3c0b67..260eb8e32d1 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -10,9 +10,48 @@ namespace FN {
using BLI::MultiMap;
+class PreprocessedVTreeMFData {
+ private:
+ const VirtualNodeTree &m_vtree;
+ Array<Optional<MFDataType>> m_data_type_by_vsocket_id;
+
+ public:
+ PreprocessedVTreeMFData(const VirtualNodeTree &vtree) : m_vtree(vtree)
+ {
+ auto &mappings = get_vtree_multi_function_mappings();
+
+ m_data_type_by_vsocket_id = Array<Optional<MFDataType>>(vtree.socket_count());
+ for (const VSocket *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);
+ }
+ }
+ }
+
+ Optional<MFDataType> try_lookup_data_type(const VSocket &vsocket) const
+ {
+ return m_data_type_by_vsocket_id[vsocket.id()];
+ }
+
+ MFDataType lookup_data_type(const VSocket &vsocket) const
+ {
+ return m_data_type_by_vsocket_id[vsocket.id()].value();
+ }
+
+ bool is_data_socket(const VSocket &vsocket) const
+ {
+ return m_data_type_by_vsocket_id[vsocket.id()].has_value();
+ }
+};
+
class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
private:
const VirtualNodeTree &m_vtree;
+ const PreprocessedVTreeMFData &m_preprocessed_vtree_data;
const VTreeMultiFunctionMappings &m_vtree_mappings;
ResourceCollector &m_resources;
@@ -23,11 +62,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
MultiMap<uint, uint> m_multiple_inputs_by_vsocket;
static constexpr intptr_t MULTI_MAP_INDICATOR = 1;
- Array<Optional<MFDataType>> m_type_by_vsocket;
std::unique_ptr<MFNetworkBuilder> m_builder;
public:
VTreeMFNetworkBuilder(const VirtualNodeTree &vtree,
+ const PreprocessedVTreeMFData &preprocessed_vtree_data,
const VTreeMultiFunctionMappings &vtree_mappings,
ResourceCollector &resources);
@@ -82,12 +121,12 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
Optional<MFDataType> try_get_data_type(const VSocket &vsocket) const
{
- return m_type_by_vsocket[vsocket.id()];
+ return m_preprocessed_vtree_data.try_lookup_data_type(vsocket);
}
bool is_data_socket(const VSocket &vsocket) const
{
- return m_type_by_vsocket[vsocket.id()].has_value();
+ return m_preprocessed_vtree_data.is_data_socket(vsocket);
}
void map_data_sockets(const VNode &vnode, MFBuilderNode &node);
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 c454fd730a8..b92c01ca09a 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -109,8 +109,9 @@ std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const Virt
ResourceCollector &resources)
{
const VTreeMultiFunctionMappings &mappings = get_vtree_multi_function_mappings();
+ PreprocessedVTreeMFData preprocessed_data{vtree};
- VTreeMFNetworkBuilder builder(vtree, mappings, resources);
+ VTreeMFNetworkBuilder builder(vtree, preprocessed_data, mappings, resources);
if (!insert_nodes(builder, mappings)) {
BLI_assert(false);
}
More information about the Bf-blender-cvs
mailing list