[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