[Bf-blender-cvs] [71d8ebd2017] functions: refactor how information about the node tree is stored
Jacques Lucke
noreply at git.blender.org
Fri Aug 2 19:15:07 CEST 2019
Commit: 71d8ebd2017035ec30163555166478e02412aeb5
Author: Jacques Lucke
Date: Fri Aug 2 16:11:25 2019 +0200
Branches: functions
https://developer.blender.org/rB71d8ebd2017035ec30163555166478e02412aeb5
refactor how information about the node tree is stored
===================================================================
M source/blender/functions/CMakeLists.txt
M source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
A source/blender/functions/frontends/data_flow_nodes/mappings.cpp
A source/blender/functions/frontends/data_flow_nodes/mappings.hpp
M source/blender/functions/frontends/data_flow_nodes/mappings/conversion_inserters.cpp
D source/blender/functions/frontends/data_flow_nodes/mappings/mappings.hpp
M source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
D source/blender/functions/frontends/data_flow_nodes/mappings/registry.cpp
M source/blender/functions/frontends/data_flow_nodes/mappings/registry.hpp
M source/blender/functions/frontends/data_flow_nodes/mappings/socket_loaders.cpp
M source/blender/functions/frontends/data_flow_nodes/mappings/type_mappings.cpp
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/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 9fbddc4ccbc..247e50f72b6 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -145,9 +145,9 @@ set(SRC
frontends/data_flow_nodes/function_generation.cpp
frontends/data_flow_nodes/graph_generation.hpp
frontends/data_flow_nodes/graph_generation.cpp
- frontends/data_flow_nodes/mappings/mappings.hpp
+ frontends/data_flow_nodes/mappings.hpp
+ frontends/data_flow_nodes/mappings.cpp
frontends/data_flow_nodes/mappings/registry.hpp
- frontends/data_flow_nodes/mappings/registry.cpp
frontends/data_flow_nodes/mappings/node_inserters.cpp
frontends/data_flow_nodes/mappings/socket_loaders.cpp
frontends/data_flow_nodes/mappings/conversion_inserters.cpp
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 938e6c8454a..66ab893d1ff 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -2,7 +2,7 @@
#include "FN_data_flow_nodes.hpp"
-#include "mappings/mappings.hpp"
+#include "mappings.hpp"
namespace FN {
namespace DataFlowNodes {
@@ -31,12 +31,10 @@ static void insert_placeholder_node(VTreeDataGraphBuilder &builder, VirtualNode
static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
{
- auto inserters = MAPPING_node_inserters();
+ auto &inserters = MAPPING_node_inserters();
for (VirtualNode *vnode : builder.vtree().nodes()) {
- NodeInserter *inserter = inserters.lookup_ptr(vnode->idname());
- if (inserter) {
- (*inserter)(builder, vnode);
+ if (inserters->insert(builder, vnode)) {
BLI_assert(builder.verify_data_sockets_mapped(vnode));
continue;
}
@@ -50,7 +48,7 @@ static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
static bool insert_links(VTreeDataGraphBuilder &builder)
{
- Map<StringPair, ConversionInserter> &map = MAPPING_conversion_inserters();
+ std::unique_ptr<LinkInserters> &inserters = MAPPING_link_inserters();
for (VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
if (to_vsocket->links().size() > 1) {
@@ -65,20 +63,7 @@ static bool insert_links(VTreeDataGraphBuilder &builder)
return false;
}
- BuilderOutputSocket *from_socket = builder.lookup_output_socket(from_vsocket);
- BuilderInputSocket *to_socket = builder.lookup_input_socket(to_vsocket);
-
- if (STREQ(from_vsocket->idname(), to_vsocket->idname())) {
- builder.insert_link(from_socket, to_socket);
- continue;
- }
-
- StringPair key(from_vsocket->idname(), to_vsocket->idname());
- ConversionInserter *inserter = map.lookup_ptr(key);
- if (inserter != nullptr) {
- (*inserter)(builder, from_socket, to_socket);
- }
- else {
+ if (!inserters->insert(builder, from_vsocket, to_vsocket)) {
return false;
}
}
diff --git a/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp b/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
index 0c97802f090..803e76ca27c 100644
--- a/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/input_handlers.cpp
@@ -3,7 +3,7 @@
#include "FN_dependencies.hpp"
#include "FN_data_flow_nodes.hpp"
-#include "mappings/mappings.hpp"
+#include "mappings.hpp"
namespace FN {
namespace DataFlowNodes {
@@ -68,7 +68,7 @@ void DynamicSocketLoader::insert(VTreeDataGraphBuilder &builder,
ArrayRef<VirtualSocket *> unlinked_inputs,
ArrayRef<BuilderOutputSocket *> r_new_origins)
{
- auto &socket_loader_map = MAPPING_socket_loaders();
+ auto &socket_loaders = MAPPING_socket_loaders();
Vector<SocketLoader> loaders;
Vector<bNodeSocket *> bsockets;
@@ -78,7 +78,7 @@ void DynamicSocketLoader::insert(VTreeDataGraphBuilder &builder,
for (uint i = 0; i < unlinked_inputs.size(); i++) {
VirtualSocket *vsocket = unlinked_inputs[i];
- SocketLoader loader = socket_loader_map.lookup(vsocket->idname());
+ SocketLoader loader = socket_loaders->get_loader(vsocket->idname());
loaders.append(loader);
fn_builder.add_output(vsocket->name(), builder.query_socket_type(vsocket));
@@ -160,7 +160,7 @@ void ConstantInputsHandler::insert(VTreeDataGraphBuilder &builder,
ArrayRef<VirtualSocket *> unlinked_inputs,
ArrayRef<BuilderOutputSocket *> r_new_origins)
{
- auto &socket_loader_map = MAPPING_socket_loaders();
+ auto &socket_loaders = MAPPING_socket_loaders();
FunctionBuilder fn_builder;
for (VirtualSocket *vsocket : unlinked_inputs) {
@@ -176,9 +176,7 @@ void ConstantInputsHandler::insert(VTreeDataGraphBuilder &builder,
for (uint i = 0; i < unlinked_inputs.size(); i++) {
VirtualSocket *vsocket = unlinked_inputs[i];
- SocketLoader loader = socket_loader_map.lookup(vsocket->idname());
- PointerRNA rna = vsocket->rna();
- loader(&rna, *tuple1, i);
+ socket_loaders->load(vsocket, *tuple1, i);
Tuple::copy_element(*tuple1, i, *tuple2, i);
}
diff --git a/source/blender/functions/frontends/data_flow_nodes/mappings.cpp b/source/blender/functions/frontends/data_flow_nodes/mappings.cpp
new file mode 100644
index 00000000000..fb9a3ea2b23
--- /dev/null
+++ b/source/blender/functions/frontends/data_flow_nodes/mappings.cpp
@@ -0,0 +1,141 @@
+#include "BLI_lazy_init.hpp"
+
+#include "mappings.hpp"
+#include "mappings/registry.hpp"
+
+namespace FN {
+namespace DataFlowNodes {
+
+BLI_LAZY_INIT(std::unique_ptr<TypeMappings>, MAPPING_types)
+{
+ auto mappings = std::unique_ptr<TypeMappings>(new TypeMappings());
+ REGISTER_type_mappings(mappings);
+ return mappings;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<NodeInserters>, MAPPING_node_inserters)
+{
+ auto inserters = std::unique_ptr<NodeInserters>(new NodeInserters());
+ REGISTER_node_inserters(inserters);
+ return inserters;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<SocketLoaders>, MAPPING_socket_loaders)
+{
+ auto loaders = std::unique_ptr<SocketLoaders>(new SocketLoaders());
+ REGISTER_socket_loaders(loaders);
+ return loaders;
+}
+
+BLI_LAZY_INIT(std::unique_ptr<LinkInserters>, MAPPING_link_inserters)
+{
+ auto inserters = std::unique_ptr<LinkInserters>(new LinkInserters());
+ REGISTER_conversion_inserters(inserters);
+ return inserters;
+}
+
+void TypeMappings::register_type(StringRef idname, StringRef name, SharedType type)
+{
+ m_type_by_idname.add_new(idname, type);
+ m_type_by_name.add_new(name, type);
+ m_name_by_idname.add_new(idname, name.to_std_string());
+ m_idname_by_name.add_new(name, idname.to_std_string());
+}
+
+void NodeInserters::register_inserter(StringRef idname, NodeInserter inserter)
+{
+ m_inserter_by_idname.add_new(idname, inserter);
+}
+
+void NodeInserters::register_function(StringRef idname, FunctionGetter getter)
+{
+ auto inserter = [getter](VTreeDataGraphBuilder &builder, VirtualNode *vnode) {
+ SharedFunction fn = getter();
+ BuilderNode *node = builder.insert_function(fn, vnode);
+ builder.map_sockets(node, vnode);
+ };
+ this->register_inserter(idname, inserter);
+}
+
+bool NodeInserters::insert(VTreeDataGraphBuilder &builder, VirtualNode *vnode)
+{
+ NodeInserter *inserter = m_inserter_by_idname.lookup_ptr(vnode->idname());
+ if (inserter == nullptr) {
+ return false;
+ }
+ (*inserter)(builder, vnode);
+ return true;
+}
+
+SocketLoaders::SocketLoaders() : m_type_mappings(MAPPING_types())
+{
+}
+
+void SocketLoaders::register_loader(StringRef type_name, SocketLoader loader)
+{
+ StringRef idname = m_type_mappings->idname_by_name(type_name);
+ m_loader_by_idname.add_new(idname, loader);
+}
+
+void SocketLoaders::load(VirtualSocket *vsocket, Tuple &dst, uint index)
+{
+ SocketLoader &loader = m_loader_by_idname.lookup_ref(vsocket->idname());
+ PointerRNA rna = vsocket->rna();
+ loader(&rna, dst, index);
+}
+
+LinkInserters::LinkInserters() : m_type_mappings(MAPPING_types())
+{
+}
+
+void LinkInserters::register_conversion_inserter(StringRef from_type,
+ StringRef to_type,
+ ConversionInserter inserter)
+{
+ StringRef from_idname = m_type_mappings->idname_by_name(from_type);
+ StringRef to_idname = m_type_mappings->idname_by_name(to_type);
+ m_conversion_inserters.add_new(
+ StringPair(from_idname.to_std_string(), to_idname.to_std_string()), inserter);
+}
+
+void LinkInserters::register_conversion_function(StringRef from_type,
+ StringRef to_type,
+ FunctionGetter getter)
+{
+ auto inserter =
+ [getter](VTreeDataGraphBuilder &builder, BuilderOutputSocket *from, BuilderInputSocket *to) {
+ auto fn = getter();
+ BuilderNode *node = builder.insert_function(fn);
+ builder.insert_link(from, node->input(0));
+ builder.insert_link(node->output(0), to);
+ };
+ this->register_conversion_inserter(from_type, to_type, inserter);
+}
+
+bool LinkInserters::insert(VTreeDataGraphBuilder &builder, VirtualSocket *from, VirtualSocket *to)
+{
+ BLI_assert(from->is_output());
+ BLI_assert(to->is_input());
+ BLI_assert(builder.is_data_socket(from));
+ BLI_assert(builder.is_data_socket(to));
+
+ BuilderOutputSocket *from_socket = builder.lookup_output_socket(from);
+ BuilderInputSocket *to_socket = builder.lookup_input_socket(to);
+
+ if (STREQ(from->idname(), to->idname())) {
+ builder.insert_link(from_socket, to_socket);
+ return true;
+ }
+
+ StringPair key(from->idname(), to->idname());
+ ConversionInserter *inserter = m_conversion_inserters.lookup_ptr(key);
+ if (inserter != nullptr) {
+ (*inserter)(builder, from_socket, to_socket);
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace DataFlowNodes
+} // namespace FN
diff --git a/source/blender/functions/frontends/data_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list