[Bf-blender-cvs] [31c6db7d2a7] functions: separate unlinked input grouper from inserter

Jacques Lucke noreply at git.blender.org
Mon Aug 5 13:07:49 CEST 2019


Commit: 31c6db7d2a7c3a49f693343c263affb2c868d5e9
Author: Jacques Lucke
Date:   Mon Aug 5 12:51:32 2019 +0200
Branches: functions
https://developer.blender.org/rB31c6db7d2a7c3a49f693343c263affb2c868d5e9

separate unlinked input grouper from inserter

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

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/functions/frontends/data_flow_nodes/input_inserters.hpp
M	source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
M	source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.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/functions/frontends/data_flow_nodes/graph_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
index 4a9799e416a..9358a167d09 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.cpp
@@ -48,6 +48,27 @@ static bool insert_links(VTreeDataGraphBuilder &builder)
   return true;
 }
 
+static bool insert_unlinked_inputs(VTreeDataGraphBuilder &builder)
+{
+  GroupByNodeUsage grouper;
+  MultiVector<VirtualSocket *> groups;
+  grouper.group(builder, groups);
+
+  ConstantInputsHandler input_inserter;
+  for (uint i = 0; i < groups.size(); i++) {
+    ArrayRef<VirtualSocket *> unlinked_inputs = groups[i];
+    Vector<BuilderOutputSocket *> new_origins(unlinked_inputs.size());
+
+    input_inserter.insert(builder, unlinked_inputs, new_origins);
+
+    for (uint i = 0; i < unlinked_inputs.size(); i++) {
+      builder.insert_link(new_origins[i], builder.lookup_input_socket(unlinked_inputs[i]));
+    }
+  }
+
+  return true;
+}
+
 ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
 {
   VTreeDataGraphBuilder builder(vtree);
@@ -60,9 +81,11 @@ ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree)
     return BLI_ERROR_CREATE("error inserting links");
   }
 
-  ConstantInputsHandler input_inserter;
-  GroupByNodeUsage unlinked_input_handler;
-  unlinked_input_handler.handle(builder, input_inserter);
+  if (!insert_unlinked_inputs(builder)) {
+    return BLI_ERROR_CREATE("error inserting unlinked inputs");
+  }
+
+  builder.to_dot__clipboard();
 
   return builder.build();
 }
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 e5a8b565259..2b7e8c96c3b 100644
--- a/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/graph_generation.hpp
@@ -1,10 +1,14 @@
 #pragma once
 
+#include "BLI_multi_vector.hpp"
+
 #include "vtree_data_graph_builder.hpp"
 
 namespace FN {
 namespace DataFlowNodes {
 
+using BLI::MultiVector;
+
 class InputInserter {
  public:
   virtual void insert(VTreeDataGraphBuilder &builder,
@@ -14,7 +18,7 @@ class InputInserter {
 
 class UnlinkedInputGrouper {
  public:
-  virtual void handle(VTreeDataGraphBuilder &builder, InputInserter &inserter) = 0;
+  virtual void group(VTreeDataGraphBuilder &builder, MultiVector<VirtualSocket *> &r_groups) = 0;
 };
 
 ValueOrError<VTreeDataGraph> generate_graph(VirtualNodeTree &vtree);
diff --git a/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
index 26bf610b71d..e47c9e92f3f 100644
--- a/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/input_inserters.hpp
@@ -6,12 +6,14 @@ namespace FN {
 namespace DataFlowNodes {
 
 class DynamicSocketLoader : public InputInserter {
+ public:
   void insert(VTreeDataGraphBuilder &builder,
               ArrayRef<VirtualSocket *> unlinked_inputs,
               ArrayRef<BuilderOutputSocket *> r_new_origins) override;
 };
 
 class ConstantInputsHandler : public InputInserter {
+ public:
   void insert(VTreeDataGraphBuilder &builder,
               ArrayRef<VirtualSocket *> unlinked_inputs,
               ArrayRef<BuilderOutputSocket *> r_new_origins) override;
diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
index fc43c21abd6..9055f347952 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.cpp
@@ -3,66 +3,49 @@
 namespace FN {
 namespace DataFlowNodes {
 
-void SeparateNodeInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void SeparateNodeInputs::group(VTreeDataGraphBuilder &builder,
+                               MultiVector<VirtualSocket *> &r_groups)
 {
+  Vector<VirtualSocket *> vsockets;
   for (VirtualNode *vnode : builder.vtree().nodes()) {
-    Vector<VirtualSocket *> vsockets;
-    Vector<BuilderInputSocket *> sockets;
-
     for (VirtualSocket *vsocket : vnode->inputs()) {
-      if (builder.is_data_socket(vsocket)) {
-        BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
-        if (socket->origin() == nullptr) {
-          vsockets.append(vsocket);
-          sockets.append(socket);
-        }
+      if (builder.is_input_unlinked(vsocket)) {
+        vsockets.append(vsocket);
       }
     }
 
     if (vsockets.size() > 0) {
-      Vector<BuilderOutputSocket *> new_origins(vsockets.size());
-      inserter.insert(builder, vsockets, new_origins);
-      builder.insert_links(new_origins, sockets);
+      r_groups.append(vsockets);
+      vsockets.clear();
     }
   }
 }
 
-void SeparateSocketInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void SeparateSocketInputs::group(VTreeDataGraphBuilder &builder,
+                                 MultiVector<VirtualSocket *> &r_groups)
 {
   for (VirtualNode *vnode : builder.vtree().nodes()) {
     for (VirtualSocket *vsocket : vnode->inputs()) {
-      if (builder.is_data_socket(vsocket)) {
-        BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
-        if (socket->origin() == nullptr) {
-          std::array<BuilderOutputSocket *, 1> new_origin;
-          inserter.insert(builder, {vsocket}, new_origin);
-          BLI_assert(new_origin[0]);
-          builder.insert_link(new_origin[0], socket);
-        }
+      if (builder.is_input_unlinked(vsocket)) {
+        r_groups.append({vsocket});
       }
     }
   }
 }
 
-void AllInOneSocketInputs::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void AllInOneSocketInputs::group(VTreeDataGraphBuilder &builder,
+                                 MultiVector<VirtualSocket *> &r_groups)
 {
   Vector<VirtualSocket *> unlinked_input_vsockets;
-  Vector<BuilderInputSocket *> unlinked_input_sockets;
   for (VirtualNode *vnode : builder.vtree().nodes()) {
     for (VirtualSocket *vsocket : vnode->inputs()) {
-      if (builder.is_data_socket(vsocket)) {
-        BuilderInputSocket *socket = builder.lookup_input_socket(vsocket);
-        if (socket->origin() == nullptr) {
-          unlinked_input_vsockets.append(vsocket);
-          unlinked_input_sockets.append(socket);
-        }
+      if (builder.is_input_unlinked(vsocket)) {
+        unlinked_input_vsockets.append(vsocket);
       }
     }
   }
 
-  Vector<BuilderOutputSocket *> new_origins(unlinked_input_vsockets.size());
-  inserter.insert(builder, unlinked_input_vsockets, new_origins);
-  builder.insert_links(new_origins, unlinked_input_sockets);
+  r_groups.append(unlinked_input_vsockets);
 }
 
 static void update_hash_of_used_vsockets(VTreeDataGraphBuilder &builder,
@@ -94,9 +77,9 @@ static void update_hash_of_used_vsockets(VTreeDataGraphBuilder &builder,
   }
 }
 
-static void insert_input_node_for_sockets_with_same_hash(VTreeDataGraphBuilder &builder,
-                                                         ArrayRef<uint> hash_per_vsocket,
-                                                         InputInserter &inserter)
+static void group_with_same_hash(VTreeDataGraphBuilder &builder,
+                                 ArrayRef<uint> hash_per_vsocket,
+                                 MultiVector<VirtualSocket *> &r_groups)
 {
   MultiMap<uint, VirtualSocket *> unlinked_inputs_by_hash;
   for (VirtualNode *vnode : builder.vtree().nodes()) {
@@ -114,16 +97,12 @@ static void insert_input_node_for_sockets_with_same_hash(VTreeDataGraphBuilder &
   for (uint key : unlinked_inputs_by_hash.keys()) {
     ArrayRef<VirtualSocket *> unlinked_vsockets = unlinked_inputs_by_hash.lookup(key);
     BLI_assert(unlinked_vsockets.size() > 0);
-    Vector<BuilderOutputSocket *> new_origins(unlinked_vsockets.size());
-    inserter.insert(builder, unlinked_vsockets, new_origins);
-
-    for (uint i = 0; i < unlinked_vsockets.size(); i++) {
-      builder.insert_link(new_origins[i], builder.lookup_input_socket(unlinked_vsockets[i]));
-    }
+    r_groups.append(unlinked_vsockets);
   }
 }
 
-void GroupByNodeUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void GroupByNodeUsage::group(VTreeDataGraphBuilder &builder,
+                             MultiVector<VirtualSocket *> &r_groups)
 {
   uint socket_count = builder.vtree().socket_count();
 
@@ -142,10 +121,11 @@ void GroupByNodeUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &ins
     updated_vsockets.clear();
   }
 
-  insert_input_node_for_sockets_with_same_hash(builder, hash_per_vsocket, inserter);
+  group_with_same_hash(builder, hash_per_vsocket, r_groups);
 }
 
-void GroupBySocketUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &inserter)
+void GroupBySocketUsage::group(VTreeDataGraphBuilder &builder,
+                               MultiVector<VirtualSocket *> &r_groups)
 {
   uint socket_count = builder.vtree().socket_count();
 
@@ -163,7 +143,7 @@ void GroupBySocketUsage::handle(VTreeDataGraphBuilder &builder, InputInserter &i
     }
   }
 
-  insert_input_node_for_sockets_with_same_hash(builder, hash_per_vsocket, inserter);
+  group_with_same_hash(builder, hash_per_vsocket, r_groups);
 }
 
 }  // namespace DataFlowNodes
diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
index 24b678ad31d..66ee183f356 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_groupers.hpp
@@ -7,27 +7,27 @@ namespace DataFlowNodes {
 
 class SeparateNodeInputs : public UnlinkedInputGrouper {
  public:
-  void handle(VTreeDataGraphBuilder &builder, InputInserter &inserter) override;
+  void group(VTreeDataGraphBuilder &builder, MultiV

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list