[Bf-blender-cvs] [27b365058eb] functions: remove last remainings of GraphInserters
Jacques Lucke
noreply at git.blender.org
Wed Jul 31 18:45:22 CEST 2019
Commit: 27b365058eb3c62dee8c6f0c61afb3e5b8786ab7
Author: Jacques Lucke
Date: Wed Jul 31 18:28:14 2019 +0200
Branches: functions
https://developer.blender.org/rB27b365058eb3c62dee8c6f0c61afb3e5b8786ab7
remove last remainings of GraphInserters
===================================================================
M source/blender/blenkernel/BKE_node_tree.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/inserters/conversions.cpp
M source/blender/functions/frontends/data_flow_nodes/registry.hpp
M source/blender/functions/frontends/data_flow_nodes/type_mappings.cpp
M source/blender/functions/frontends/data_flow_nodes/type_mappings.hpp
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/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index d97e35eac5a..71ad4882991 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -132,6 +132,7 @@ class VirtualNodeTree {
Vector<VirtualSocket *> m_inputs_with_links;
MultiMap<std::string, VirtualNode *> m_nodes_by_idname;
MonotonicAllocator<> m_allocator;
+
public:
void add_all_of_tree(bNodeTree *btree);
VirtualNode *add_bnode(bNodeTree *btree, bNode *bnode);
@@ -302,6 +303,11 @@ class VirtualSocket {
{
return m_bsocket->name;
}
+
+ const char *idname()
+ {
+ return m_bsocket->idname;
+ }
};
class VirtualLink {
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 8dbb328bd6c..e049703fecd 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -15,13 +15,13 @@ static void insert_placeholder_node(VTreeDataGraphBuilder &builder, VirtualNode
for (VirtualSocket *vsocket : vnode->inputs()) {
if (builder.is_data_socket(vsocket)) {
SharedType &type = builder.query_socket_type(vsocket);
- fn_builder.add_input(builder.query_socket_name(vsocket), type);
+ fn_builder.add_input(vsocket->name(), type);
}
}
for (VirtualSocket *vsocket : vnode->outputs()) {
if (builder.is_data_socket(vsocket)) {
SharedType &type = builder.query_socket_type(vsocket);
- fn_builder.add_output(builder.query_socket_name(vsocket), type);
+ fn_builder.add_output(vsocket->name(), type);
}
}
@@ -50,17 +50,39 @@ static bool insert_functions_for_bnodes(VTreeDataGraphBuilder &builder)
return true;
}
-static bool insert_links(VTreeDataGraphBuilder &builder, GraphInserters &inserters)
+static bool insert_links(VTreeDataGraphBuilder &builder)
{
- for (VirtualSocket *input : builder.vtree().inputs_with_links()) {
- if (input->links().size() > 1) {
+ Map<StringPair, ConversionInserter> &map = get_conversion_inserter_map();
+
+ for (VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
+ if (to_vsocket->links().size() > 1) {
continue;
}
- BLI_assert(input->links().size() == 1);
- if (!builder.is_data_socket(input)) {
+ BLI_assert(to_vsocket->links().size() == 1);
+ if (!builder.is_data_socket(to_vsocket)) {
continue;
}
- if (!inserters.insert_link(builder, input->links()[0], input)) {
+ VirtualSocket *from_vsocket = to_vsocket->links()[0];
+ if (!builder.is_data_socket(from_vsocket)) {
+ return false;
+ }
+
+ DFGB_Socket from_socket = builder.lookup_socket(from_vsocket);
+ DFGB_Socket to_socket = builder.lookup_socket(to_vsocket);
+
+ if (STREQ(from_vsocket->idname(), to_vsocket->idname())) {
+ builder.insert_link(from_socket, to_socket);
+ continue;
+ }
+
+ StringRef from_data_type = builder.query_socket_data_type(from_vsocket);
+ StringRef to_data_type = builder.query_socket_data_type(to_vsocket);
+ StringPair key(from_data_type.to_std_string(), to_data_type.to_std_string());
+ ConversionInserter *inserter = map.lookup_ptr(key);
+ if (inserter != nullptr) {
+ (*inserter)(builder, from_socket, to_socket);
+ }
+ else {
return false;
}
}
@@ -150,13 +172,8 @@ class SocketLoaderDependencies : public DepsBody {
};
class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
- private:
- GraphInserters &m_inserters;
-
public:
- BasicUnlinkedInputsHandler(GraphInserters &inserters) : m_inserters(inserters)
- {
- }
+ BasicUnlinkedInputsHandler() = default;
void insert(VTreeDataGraphBuilder &builder,
ArrayRef<VirtualSocket *> unlinked_inputs,
@@ -174,8 +191,7 @@ class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
SocketLoader loader = socket_loader_map.lookup(vsocket->bsocket()->idname);
loaders.append(loader);
- fn_builder.add_output(builder.query_socket_name(vsocket),
- builder.query_socket_type(vsocket));
+ fn_builder.add_output(vsocket->name(), builder.query_socket_type(vsocket));
bsockets.append(vsocket->bsocket());
btrees.append(vsocket->btree());
@@ -195,17 +211,16 @@ class BasicUnlinkedInputsHandler : public UnlinkedInputsHandler {
ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
{
VTreeDataGraphBuilder builder(vtree);
- GraphInserters &inserters = get_standard_inserters();
if (!insert_functions_for_bnodes(builder)) {
return BLI_ERROR_CREATE("error inserting functions for nodes");
}
- if (!insert_links(builder, inserters)) {
+ if (!insert_links(builder)) {
return BLI_ERROR_CREATE("error inserting links");
}
- BasicUnlinkedInputsHandler unlinked_inputs_handler(inserters);
+ BasicUnlinkedInputsHandler unlinked_inputs_handler;
insert_unlinked_inputs(builder, unlinked_inputs_handler);
return builder.build();
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index f7f946ce58b..8d276e53983 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -13,13 +13,6 @@
namespace FN {
namespace DataFlowNodes {
-using TypePair = std::pair<SharedType, SharedType>;
-
-static void initialize_standard_inserters(GraphInserters &inserters)
-{
- register_conversion_inserters(inserters);
-}
-
BLI_LAZY_INIT(StringMap<NodeInserter>, get_node_inserters_map)
{
StringMap<NodeInserter> map;
@@ -36,83 +29,14 @@ BLI_LAZY_INIT(StringMap<SocketLoader>, get_socket_loader_map)
return map;
}
-BLI_LAZY_INIT(GraphInserters, get_standard_inserters)
-{
- GraphInserters inserters;
- initialize_standard_inserters(inserters);
- return inserters;
-}
-
-GraphInserters::GraphInserters()
- : m_type_by_data_type(&get_type_by_data_type_map()),
- m_type_by_idname(&get_type_by_idname_map())
-{
-}
-
-void GraphInserters::reg_conversion_inserter(StringRef from_type,
- StringRef to_type,
- ConversionInserter inserter)
-{
- auto key = TypePair(m_type_by_data_type->lookup(from_type),
- m_type_by_data_type->lookup(to_type));
- BLI_assert(!m_conversion_inserters.contains(key));
- m_conversion_inserters.add(key, inserter);
-}
-
-void GraphInserters::reg_conversion_function(StringRef from_type,
- StringRef to_type,
- FunctionGetter getter)
-{
- auto inserter = [getter](VTreeDataGraphBuilder &builder, DFGB_Socket from, DFGB_Socket to) {
- auto fn = getter();
- DFGB_Node *node = builder.insert_function(fn);
- builder.insert_link(from, node->input(0));
- builder.insert_link(node->output(0), to);
- };
- this->reg_conversion_inserter(from_type, to_type, inserter);
-}
-
-bool GraphInserters::insert_link(VTreeDataGraphBuilder &builder,
- VirtualSocket *from_vsocket,
- VirtualSocket *to_vsocket)
+using ConversionInserterMap = Map<StringPair, ConversionInserter>;
+BLI_LAZY_INIT(ConversionInserterMap, get_conversion_inserter_map)
{
- BLI_assert(builder.is_data_socket(from_vsocket));
- BLI_assert(builder.is_data_socket(to_vsocket));
-
- DFGB_Socket from_socket = builder.lookup_socket(from_vsocket);
- DFGB_Socket to_socket = builder.lookup_socket(to_vsocket);
-
- SharedType &from_type = builder.query_socket_type(from_vsocket);
- SharedType &to_type = builder.query_socket_type(to_vsocket);
-
- if (from_type == to_type) {
- builder.insert_link(from_socket, to_socket);
- return true;
- }
-
- auto key = TypePair(from_type, to_type);
- if (m_conversion_inserters.contains(key)) {
- auto inserter = m_conversion_inserters.lookup(key);
- inserter(builder, from_socket, to_socket);
- return true;
- }
-
- return false;
+ Map<StringPair, ConversionInserter> map;
+ ConversionInserterRegistry registry(map);
+ register_conversion_inserters(registry);
+ return map;
}
} // namespace DataFlowNodes
} // namespace FN
-
-namespace std {
-template<> struct hash<FN::DataFlowNodes::TypePair> {
- typedef FN::DataFlowNodes::TypePair argument_type;
- typedef size_t result_type;
-
- result_type operator()(argument_type const &v) const noexcept
- {
- size_t h1 = std::hash<FN::SharedType>{}(v.first);
- size_t h2 = std::hash<FN::SharedType>{}(v.second);
- return h1 ^ h2;
- }
-};
-} // namespace std
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
index 36daa02dd60..3abe4f70aed 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.hpp
@@ -13,6 +13,8 @@ struct PointerRNA;
namespace FN {
namespace DataFlowNodes {
+using StringPair = std::pair<std::string, std::string>;
+
typedef std::function<void(VTreeDataGraphBuilder &builder, VirtualNode *vnode)> NodeInserter;
typedef std::function<void(PointerRNA *socket_rna_ptr, Tuple &dst, uint index)> SocketLoader;
@@ -24,6 +26,7 @@ typedef std::function<SharedFunction()> FunctionGetter;
StringMap<NodeInserter> &get_node_inserters_map();
StringMap<SocketLoader> &get_socket_loader_map();
+Map<StringPair, ConversionInserter> &get_conversion_inserter_map();
class NodeInserterRegistry {
private:
@@ -64,27 +67,44 @@ class SocketLoaderRegistry {
}
};
-class GraphInserters {
+class ConversionInserterRegistry {
private:
- Map<std::pair<SharedType, SharedType>, ConversionInserter> m_conversion_inserters;
- StringMap<SharedType> *m_type_by_data_type;
- StringMap<SharedType> *m_type_by_idname;
+ Map<StringPair, ConversionInserter> &m_map;
public:
- GraphInserters();
-
- void reg_conversion_inserter(StringRef fro
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list