[Bf-blender-cvs] [c21d8bd0d97] functions: cleanup finding node inputs

Jacques Lucke noreply at git.blender.org
Tue Jul 23 19:17:08 CEST 2019


Commit: c21d8bd0d97d1a5230913a468d2823cc24421735
Author: Jacques Lucke
Date:   Tue Jul 23 19:03:49 2019 +0200
Branches: functions
https://developer.blender.org/rBc21d8bd0d97d1a5230913a468d2823cc24421735

cleanup finding node inputs

===================================================================

M	source/blender/functions/core/function.hpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
M	source/blender/simulations/bparticles/inserters.cpp

===================================================================

diff --git a/source/blender/functions/core/function.hpp b/source/blender/functions/core/function.hpp
index bc09fe41637..483c150f484 100644
--- a/source/blender/functions/core/function.hpp
+++ b/source/blender/functions/core/function.hpp
@@ -42,7 +42,7 @@ class FunctionBody {
 
   Function *owner() const;
 
-  static const uint BODY_TYPE_AMOUNT = 4;
+  static const uint BODY_TYPE_AMOUNT = 5;
 };
 
 class Function final : public RefCountedBase {
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 5972afb9f65..d8f14f41886 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -25,6 +25,7 @@ static void insert_placeholder_node(BTreeGraphBuilder &builder, VirtualNode *vno
   }
 
   auto fn = fn_builder.build(vnode->name());
+  fn->add_body<VNodePlaceholderBody>(vnode);
   DFGB_Node *node = builder.insert_function(fn);
   builder.map_data_sockets(node, vnode);
 }
diff --git a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
index 3cf6f199d77..c5086de509d 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
@@ -47,6 +47,23 @@ class VTreeDataGraph {
   }
 };
 
+class VNodePlaceholderBody : public FunctionBody {
+ private:
+  VirtualNode *m_vnode;
+
+ public:
+  static const uint FUNCTION_BODY_ID = 4;
+
+  VNodePlaceholderBody(VirtualNode *vnode) : m_vnode(vnode)
+  {
+  }
+
+  VirtualNode *vnode()
+  {
+    return m_vnode;
+  }
+};
+
 Optional<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree);
 
 }  // namespace DataFlowNodes
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 0b80230c1c1..88cb9a00997 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -18,56 +18,95 @@
 
 namespace BParticles {
 
+using FN::DFGraphSocket;
 using FN::SharedFunction;
+using FN::SharedType;
+using FN::DataFlowNodes::VNodePlaceholderBody;
 
-static bool is_particle_data_input(VirtualNode *vnode)
+static Vector<DFGraphSocket> find_function_inputs(VTreeDataGraph &data_graph,
+                                                  ArrayRef<VirtualSocket *> output_vsockets)
 {
-  bNode *bnode = vnode->bnode();
-  return STREQ(bnode->idname, "bp_ParticleInfoNode") ||
-         STREQ(bnode->idname, "bp_MeshCollisionEventNode");
-}
+  Stack<DFGraphSocket> to_be_checked;
+  Set<DFGraphSocket> found;
+  Vector<DFGraphSocket> output;
 
-static Vector<FN::DFGraphSocket> insert_inputs(FN::FunctionBuilder &fn_builder,
-                                               VTreeDataGraph &data_graph,
-                                               ArrayRef<VirtualSocket *> output_vsockets)
-{
-  Set<VirtualSocket *> to_be_checked = output_vsockets;
-  Set<VirtualSocket *> found_inputs;
-  Vector<FN::DFGraphSocket> inputs;
-
-  while (to_be_checked.size() > 0) {
-    VirtualSocket *vsocket = to_be_checked.pop();
-    if (vsocket->is_input()) {
-      ArrayRef<VirtualSocket *> linked = vsocket->links();
-      BLI_assert(linked.size() <= 1);
-      if (linked.size() == 1) {
-        VirtualSocket *origin = linked[0];
-        if (is_particle_data_input(origin->vnode()) && !found_inputs.contains(origin)) {
-          FN::DFGraphSocket socket = data_graph.lookup_socket(origin);
-          FN::SharedType &type = data_graph.graph()->type_of_socket(socket);
-          std::string name_prefix;
-          if (STREQ(origin->vnode()->bnode()->idname, "bp_ParticleInfoNode")) {
-            name_prefix = "Attribute: ";
-          }
-          else if (STREQ(origin->vnode()->bnode()->idname, "bp_MeshCollisionEventNode")) {
-            name_prefix = "Event: ";
+  auto &graph = data_graph.graph();
+
+  for (VirtualSocket *vsocket : output_vsockets) {
+    DFGraphSocket socket = data_graph.lookup_socket(vsocket);
+    to_be_checked.push(socket);
+    found.add_new(socket);
+  }
+
+  while (!to_be_checked.empty()) {
+    DFGraphSocket socket = to_be_checked.pop();
+    if (socket.is_input()) {
+      DFGraphSocket origin = graph->origin_of_input(socket);
+      if (found.add(origin)) {
+        to_be_checked.push(origin);
+      }
+    }
+    else {
+      uint node_id = graph->node_id_of_output(socket);
+      SharedFunction &fn = graph->function_of_node(node_id);
+      auto *body = fn->body<VNodePlaceholderBody>();
+      if (body == nullptr) {
+        for (DFGraphSocket input : graph->inputs_of_node(node_id)) {
+          if (found.add(input)) {
+            to_be_checked.push(input);
           }
-          fn_builder.add_input(name_prefix + origin->bsocket()->name, type);
-          found_inputs.add(origin);
-          inputs.append(socket);
-        }
-        else {
-          to_be_checked.add(origin);
         }
       }
+      else {
+        output.append(socket);
+      }
     }
-    else {
-      VirtualNode *vnode = vsocket->vnode();
-      for (VirtualSocket *input : vnode->inputs()) {
-        to_be_checked.add(input);
+  }
+
+  return output;
+}
+
+static VirtualSocket *find_data_output(VTreeDataGraph &data_graph, VirtualNode *vnode, uint index)
+{
+  uint count = 0;
+  for (uint i = 0; i < vnode->outputs().size(); i++) {
+    VirtualSocket *vsocket = vnode->output(i);
+    if (data_graph.uses_socket(vsocket)) {
+      if (index == count) {
+        return vsocket;
       }
+      count++;
+    }
+  }
+  BLI_assert(false);
+  return nullptr;
+}
+
+static Vector<FN::DFGraphSocket> insert_function_inputs(FN::FunctionBuilder &fn_builder,
+                                                        VTreeDataGraph &data_graph,
+                                                        ArrayRef<VirtualSocket *> output_vsockets)
+{
+  Vector<DFGraphSocket> inputs = find_function_inputs(data_graph, output_vsockets);
+
+  auto &graph = data_graph.graph();
+
+  for (DFGraphSocket socket : inputs) {
+    BLI_assert(socket.is_output());
+    uint index = graph->index_of_output(socket);
+    VirtualNode *vnode = graph->function_body_of_output<VNodePlaceholderBody>(socket)->vnode();
+    VirtualSocket *vsocket = find_data_output(data_graph, vnode, index);
+
+    SharedType &type = graph->type_of_output(socket);
+    std::string name_prefix;
+    if (STREQ(vnode->idname(), "bp_ParticleInfoNode")) {
+      name_prefix = "Attribute: ";
+    }
+    else if (STREQ(vnode->idname(), "bp_MeshCollisionEventNode")) {
+      name_prefix = "Event: ";
     }
+    fn_builder.add_input(name_prefix + vsocket->name(), type);
   }
+
   return inputs;
 }
 
@@ -76,7 +115,7 @@ static SharedFunction create_function(VTreeDataGraph &data_graph,
                                       StringRef name)
 {
   FN::FunctionBuilder fn_builder;
-  auto inputs = insert_inputs(fn_builder, data_graph, output_vsockets);
+  auto inputs = insert_function_inputs(fn_builder, data_graph, output_vsockets);
 
   Vector<FN::DFGraphSocket> outputs;
   for (VirtualSocket *vsocket : output_vsockets) {



More information about the Bf-blender-cvs mailing list