[Bf-blender-cvs] [7a6ab07e9e9] functions: make it possible to build data flow graphs for any node tree
Jacques Lucke
noreply at git.blender.org
Thu Jul 4 16:46:09 CEST 2019
Commit: 7a6ab07e9e939e884966e98d1fafd7e950739f96
Author: Jacques Lucke
Date: Thu Jul 4 14:49:53 2019 +0200
Branches: functions
https://developer.blender.org/rB7a6ab07e9e939e884966e98d1fafd7e950739f96
make it possible to build data flow graphs for any node tree
===================================================================
M source/blender/blenkernel/intern/node_tree.cpp
M source/blender/blenlib/BLI_listbase_wrapper.hpp
M source/blender/blenlib/BLI_small_vector.hpp
M source/blender/functions/frontends/data_flow_nodes/builder.cpp
M source/blender/functions/frontends/data_flow_nodes/builder.hpp
M source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M source/blender/simulations/bparticles/core.hpp
===================================================================
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 423cc50620f..0c2d8462865 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -7,10 +7,10 @@ IndexedNodeTree::IndexedNodeTree(bNodeTree *btree)
: m_btree(btree), m_original_nodes(btree->nodes, true), m_original_links(btree->links, true)
{
for (bNode *bnode : m_original_nodes) {
- for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
m_node_by_socket.add(bsocket, bnode);
}
- for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->outputs)) {
m_node_by_socket.add(bsocket, bnode);
}
}
diff --git a/source/blender/blenlib/BLI_listbase_wrapper.hpp b/source/blender/blenlib/BLI_listbase_wrapper.hpp
index 82e64af69fd..903d50bc45c 100644
--- a/source/blender/blenlib/BLI_listbase_wrapper.hpp
+++ b/source/blender/blenlib/BLI_listbase_wrapper.hpp
@@ -20,6 +20,10 @@ template<typename T, bool intrusive> class ListBaseWrapper {
BLI_assert(listbase);
}
+ ListBaseWrapper(ListBase &listbase) : m_listbase(&listbase)
+ {
+ }
+
class Iterator {
private:
ListBase *m_listbase;
diff --git a/source/blender/blenlib/BLI_small_vector.hpp b/source/blender/blenlib/BLI_small_vector.hpp
index 5f18347acd4..9585936cf89 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -113,12 +113,12 @@ template<typename T, uint N = 4> class SmallVector {
SmallVector(ListBase &values, bool intrusive_next_and_prev_pointers) : SmallVector()
{
if (intrusive_next_and_prev_pointers) {
- for (T value : ListBaseWrapper<T, true>(&values)) {
+ for (T value : ListBaseWrapper<T, true>(values)) {
this->append(value);
}
}
else {
- for (T value : ListBaseWrapper<T, false>(&values)) {
+ for (T value : ListBaseWrapper<T, false>(values)) {
this->append(value);
}
}
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.cpp b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
index 0fec6f04ad9..b5427e4fa70 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.cpp
@@ -127,13 +127,13 @@ void BTreeGraphBuilder::map_sockets(DFGB_Node *node, struct bNode *bnode)
BLI_assert(BLI_listbase_count(&bnode->outputs) == node->output_amount());
uint input_index = 0;
- for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
this->map_socket(node->input(input_index), bsocket);
input_index++;
}
uint output_index = 0;
- for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->outputs)) {
this->map_socket(node->output(output_index), bsocket);
output_index++;
}
@@ -142,7 +142,7 @@ void BTreeGraphBuilder::map_sockets(DFGB_Node *node, struct bNode *bnode)
void BTreeGraphBuilder::map_data_sockets(DFGB_Node *node, struct bNode *bnode)
{
uint input_index = 0;
- for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
if (this->is_data_socket(bsocket)) {
this->map_socket(node->input(input_index), bsocket);
input_index++;
@@ -150,7 +150,7 @@ void BTreeGraphBuilder::map_data_sockets(DFGB_Node *node, struct bNode *bnode)
}
uint output_index = 0;
- for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->outputs)) {
if (this->is_data_socket(bsocket)) {
this->map_socket(node->output(output_index), bsocket);
output_index++;
@@ -205,8 +205,8 @@ bool BTreeGraphBuilder::check_if_sockets_are_mapped(struct bNode *bnode,
bool BTreeGraphBuilder::verify_data_sockets_mapped(struct bNode *bnode) const
{
- return (this->check_if_sockets_are_mapped(bnode, bSocketList(&bnode->inputs)) &&
- this->check_if_sockets_are_mapped(bnode, bSocketList(&bnode->outputs)));
+ return (this->check_if_sockets_are_mapped(bnode, bSocketList(bnode->inputs)) &&
+ this->check_if_sockets_are_mapped(bnode, bSocketList(bnode->outputs)));
}
IndexedNodeTree &BTreeGraphBuilder::indexed_btree() const
@@ -309,5 +309,20 @@ std::string BTreeGraphBuilder::query_socket_type_name(bNodeSocket *bsocket) cons
return type_name;
}
+bool BTreeGraphBuilder::has_data_socket(bNode *bnode) const
+{
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
+ if (this->is_data_socket(bsocket)) {
+ return true;
+ }
+ }
+ for (bNodeSocket *bsocket : bSocketList(bnode->outputs)) {
+ if (this->is_data_socket(bsocket)) {
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace DataFlowNodes
} // namespace FN
diff --git a/source/blender/functions/frontends/data_flow_nodes/builder.hpp b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
index 96ea483f42e..613d8cf052c 100644
--- a/source/blender/functions/frontends/data_flow_nodes/builder.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/builder.hpp
@@ -9,8 +9,6 @@ struct PointerRNA;
namespace FN {
namespace DataFlowNodes {
-using BKE::bLinkList;
-using BKE::bNodeList;
using BKE::bSocketList;
using BKE::IndexedNodeTree;
@@ -65,6 +63,7 @@ class BTreeGraphBuilder {
/* Query Node Information */
PointerRNA get_rna(bNode *bnode) const;
SharedType &query_type_property(bNode *bnode, const char *prop_name) const;
+ bool has_data_socket(bNode *bnode) const;
/* Query RNA */
SharedType &type_from_rna(PointerRNA &rna, const char *prop_name) const;
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 7ebfac09c61..92d785f5b92 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -10,42 +10,23 @@ namespace DataFlowNodes {
using BKE::IndexedNodeTree;
-static bool is_input_node(const bNode *bnode)
-{
- return STREQ(bnode->idname, "fn_FunctionInputNode");
-}
-
-static bool is_output_node(const bNode *bnode)
-{
- return STREQ(bnode->idname, "fn_FunctionOutputNode");
-}
-
-static void insert_input_node(BTreeGraphBuilder &builder, bNode *bnode)
+static void insert_placeholder_node(BTreeGraphBuilder &builder, bNode *bnode)
{
FunctionBuilder fn_builder;
- for (bNodeSocket *bsocket : bSocketList(&bnode->outputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
if (builder.is_data_socket(bsocket)) {
SharedType &type = builder.query_socket_type(bsocket);
- fn_builder.add_output(builder.query_socket_name(bsocket), type);
+ fn_builder.add_input(builder.query_socket_name(bsocket), type);
}
}
-
- auto fn = fn_builder.build("Function Input");
- DFGB_Node *node = builder.insert_function(fn);
- builder.map_data_sockets(node, bnode);
-}
-
-static void insert_output_node(BTreeGraphBuilder &builder, bNode *bnode)
-{
- FunctionBuilder fn_builder;
- for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->outputs)) {
if (builder.is_data_socket(bsocket)) {
SharedType &type = builder.query_socket_type(bsocket);
- fn_builder.add_input(builder.query_socket_name(bsocket), type);
+ fn_builder.add_output(builder.query_socket_name(bsocket), type);
}
}
- auto fn = fn_builder.build("Function Output");
+ auto fn = fn_builder.build(bnode->name);
DFGB_Node *node = builder.insert_function(fn);
builder.map_data_sockets(node, bnode);
}
@@ -53,53 +34,17 @@ static void insert_output_node(BTreeGraphBuilder &builder, bNode *bnode)
static bool insert_functions_for_bnodes(BTreeGraphBuilder &builder, GraphInserters &inserters)
{
for (bNode *bnode : builder.indexed_btree().actual_nodes()) {
- if (is_input_node(bnode) || is_output_node(bnode)) {
+ if (inserters.insert_node(builder, bnode)) {
continue;
}
- if (!inserters.insert_node(builder, bnode)) {
- return false;
+ if (builder.has_data_socket(bnode)) {
+ insert_placeholder_node(builder, bnode);
}
}
return true;
}
-static DFGB_SocketVector insert_function_input(BTreeGraphBuilder &builder)
-{
- bNode *input_bnode =
- builder.indexed_btree().nodes_with_idname("fn_FunctionInputNode").get(0, nullptr);
- if (input_bnode == nullptr) {
- return {};
- }
-
- DFGB_SocketVector input_sockets;
- insert_input_node(builder, input_bnode);
- for (bNodeSocket *bsocket : bSocketList(&input_bnode->outputs)) {
- if (builder.is_data_socket(bsocket)) {
- input_sockets.append(builder.lookup_socket(bsocket));
- }
- }
- return input_sockets;
-}
-
-static DFGB_SocketVector insert_function_output(BTreeGraphBuilder &builder)
-{
- bNode *output_bnode =
- builder.indexed_btree().nodes_with_idname("fn_FunctionOutputNode").get(0, nullptr);
- if (output_bnode == nullptr) {
- return {};
- }
-
- DFGB_SocketVector output_sockets;
- insert_output_node(builder, output_bnode);
- for (bNodeSocket *bsocket : bSocketList(&output_bnode->inputs)) {
- if (builder.is_data_socket(bsocket)) {
- output_sockets.append(builder.lookup_socket(bsocket));
- }
- }
- return output_sockets;
-}
-
static bool insert_links(BTreeGraphBuilder &builder, GraphInserters &inserters)
{
IndexedNodeTree indexed_btree(builder.btree());
@@ -119,8 +64,8 @@ static void insert_unlinked_inputs(BTreeGraphBuilder &builder, GraphInserters &i
SmallVector<bNodeSocket *> unlinked_inputs;
DFGB_SocketVector node_inputs;
- for (bNode *bnode : bNodeList(&builder.btree()->nodes)) {
- for (bNodeSocket *bsocket : bSocketList(&bnode->inputs)) {
+ for (bNode *bnode : builder.indexed_btree().actual_nodes()) {
+ for (bNodeSocket *bsocket : bSocketList(bnode->inputs)) {
if (builder.is_data_socket(bsocket)) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list