[Bf-blender-cvs] [c77abe1e8d7] functions: initial revised function dependency handling

Jacques Lucke noreply at git.blender.org
Fri Jul 12 14:50:26 CEST 2019


Commit: c77abe1e8d700fcdd6d1c32df0a70fac95f8fa00
Author: Jacques Lucke
Date:   Fri Jul 12 10:33:22 2019 +0200
Branches: functions
https://developer.blender.org/rBc77abe1e8d700fcdd6d1c32df0a70fac95f8fa00

initial revised function dependency handling

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

M	source/blender/functions/backends/dependencies/dependencies-c.cpp
M	source/blender/functions/backends/dependencies/dependencies.hpp
M	source/blender/functions/backends/dependencies/fgraph_dependencies.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters.cpp
M	source/blender/functions/functions/lists.cpp
M	source/blender/functions/functions/object_input.cpp
M	source/blender/simulations/bparticles/inserters.cpp

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

diff --git a/source/blender/functions/backends/dependencies/dependencies-c.cpp b/source/blender/functions/backends/dependencies/dependencies-c.cpp
index 2c78d1253a2..299b3976511 100644
--- a/source/blender/functions/backends/dependencies/dependencies-c.cpp
+++ b/source/blender/functions/backends/dependencies/dependencies-c.cpp
@@ -2,13 +2,14 @@
 
 using namespace FN;
 
-void FN_function_update_dependencies(FnFunction fn_c, struct DepsNodeHandle *deps_node)
+void FN_function_update_dependencies(FnFunction UNUSED(fn_c),
+                                     struct DepsNodeHandle *UNUSED(deps_node))
 {
-  Function *fn = unwrap(fn_c);
-  const DependenciesBody *body = fn->body<DependenciesBody>();
-  if (body) {
-    Dependencies dependencies;
-    body->dependencies(dependencies);
-    dependencies.update_depsgraph(deps_node);
-  }
+  // Function *fn = unwrap(fn_c);
+  // const DependenciesBody *body = fn->body<DependenciesBody>();
+  // if (body) {
+  //   Dependencies dependencies;
+  //   body->dependencies(dependencies);
+  //   dependencies.update_depsgraph(deps_node);
+  // }
 }
diff --git a/source/blender/functions/backends/dependencies/dependencies.hpp b/source/blender/functions/backends/dependencies/dependencies.hpp
index 4f1a09af94c..0164005b39b 100644
--- a/source/blender/functions/backends/dependencies/dependencies.hpp
+++ b/source/blender/functions/backends/dependencies/dependencies.hpp
@@ -23,6 +23,43 @@ class Dependencies {
                      const struct OperationKeyRef *target);
 };
 
+class ExternalDependenciesBuilder {
+ private:
+  SmallMultiMap<uint, Object *> m_input_objects;
+  SmallMultiMap<uint, Object *> m_output_objects;
+  SmallVector<Object *> m_transform_dependencies;
+
+ public:
+  ExternalDependenciesBuilder(SmallMultiMap<uint, Object *> inputs) : m_input_objects(inputs)
+  {
+  }
+
+  void set_output_objects(uint index, ArrayRef<Object *> objects)
+  {
+    m_output_objects.add_multiple(index, objects);
+  }
+
+  ArrayRef<Object *> get_input_objects(uint index)
+  {
+    return m_input_objects.lookup_default(index);
+  }
+
+  ArrayRef<Object *> get_output_objects(uint index)
+  {
+    return m_output_objects.lookup_default(index);
+  }
+
+  void depends_on_transforms_of(ArrayRef<Object *> objects)
+  {
+    m_transform_dependencies.extend(objects);
+  }
+
+  ArrayRef<Object *> get_transform_dependencies()
+  {
+    return m_transform_dependencies;
+  }
+};
+
 class DependenciesBody : public FunctionBody {
  public:
   BLI_COMPOSITION_DECLARATION(DependenciesBody);
@@ -30,7 +67,7 @@ class DependenciesBody : public FunctionBody {
   virtual ~DependenciesBody()
   {
   }
-  virtual void dependencies(Dependencies &deps) const = 0;
+  virtual void dependencies(ExternalDependenciesBuilder &deps) const = 0;
 };
 
 } /* namespace FN */
diff --git a/source/blender/functions/backends/dependencies/fgraph_dependencies.cpp b/source/blender/functions/backends/dependencies/fgraph_dependencies.cpp
index fd0cdff2883..5d42e6c7f36 100644
--- a/source/blender/functions/backends/dependencies/fgraph_dependencies.cpp
+++ b/source/blender/functions/backends/dependencies/fgraph_dependencies.cpp
@@ -4,19 +4,57 @@ namespace FN {
 
 class FGraphDependencies : public DependenciesBody {
  private:
+  FunctionGraph m_fgraph;
   SharedDataFlowGraph m_graph;
 
  public:
-  FGraphDependencies(FunctionGraph &function_graph) : m_graph(function_graph.graph())
+  FGraphDependencies(FunctionGraph &function_graph)
+      : m_fgraph(function_graph), m_graph(m_fgraph.graph())
   {
   }
 
-  void dependencies(Dependencies &deps) const override
+  void dependencies(ExternalDependenciesBuilder &deps) const override
   {
-    for (uint node_id : m_graph->node_ids()) {
-      DependenciesBody *body = m_graph->function_of_node(node_id)->body<DependenciesBody>();
-      if (body) {
-        body->dependencies(deps);
+    SmallSetVector<Object *> transform_dependencies;
+    for (uint i = 0; i < m_fgraph.outputs().size(); i++) {
+      DFGraphSocket socket = m_fgraph.outputs()[i];
+      SmallVector<Object *> outputs = this->find_deps_and_outputs(socket, transform_dependencies);
+      deps.set_output_objects(i, outputs);
+    }
+    deps.depends_on_transforms_of(transform_dependencies);
+  }
+
+  SmallVector<Object *> find_deps_and_outputs(
+      DFGraphSocket socket, SmallSetVector<Object *> &transform_dependencies) const
+  {
+    if (m_fgraph.inputs().contains(socket)) {
+      return {};
+    }
+    else if (socket.is_input()) {
+      return this->find_deps_and_outputs(m_graph->origin_of_input(socket), transform_dependencies);
+    }
+    else {
+      uint node_id = m_graph->node_id_of_output(socket);
+      SharedFunction &fn = m_graph->function_of_node(node_id);
+      DependenciesBody *body = fn->body<DependenciesBody>();
+      if (body == nullptr) {
+        for (auto input_socket : m_graph->inputs_of_node(node_id)) {
+          this->find_deps_and_outputs(input_socket, transform_dependencies);
+        }
+        return {};
+      }
+      else {
+        SmallMultiMap<uint, Object *> inputs;
+        for (uint i = 0; i < fn->input_amount(); i++) {
+          inputs.add_multiple_new(
+              i,
+              this->find_deps_and_outputs(m_graph->socket_of_node_input(node_id, i),
+                                          transform_dependencies));
+        }
+        ExternalDependenciesBuilder builder(inputs);
+        body->dependencies(builder);
+        transform_dependencies.add_multiple(builder.get_transform_dependencies());
+        return builder.get_output_objects(m_graph->index_of_output(socket));
       }
     }
   }
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
index 662fe49147c..57a1817feac 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters.cpp
@@ -1,7 +1,10 @@
 #include "inserters.hpp"
 #include "registry.hpp"
 
+#include "FN_dependencies.hpp"
+
 #include "BLI_lazy_init.hpp"
+
 #include "DNA_node_types.h"
 
 #include "RNA_access.h"
@@ -115,6 +118,36 @@ class SocketLoaderBody : public TupleCallBody {
   }
 };
 
+class SocketLoaderDependencies : public DependenciesBody {
+ private:
+  bNodeTree *m_btree;
+  SmallVector<bNodeSocket *> m_bsockets;
+
+ public:
+  SocketLoaderDependencies(bNodeTree *btree, ArrayRef<bNodeSocket *> bsockets)
+      : m_btree(btree), m_bsockets(bsockets)
+  {
+  }
+
+  void dependencies(ExternalDependenciesBuilder &deps) const
+  {
+    for (uint i = 0; i < m_bsockets.size(); i++) {
+      bNodeSocket *bsocket = m_bsockets[i];
+      if (STREQ(bsocket->idname, "fn_ObjectSocket")) {
+        PointerRNA rna;
+        RNA_pointer_create(&m_btree->id, &RNA_NodeSocket, bsocket, &rna);
+        Object *value = (Object *)RNA_pointer_get(&rna, "value").id.data;
+        if (value != nullptr) {
+          deps.set_output_objects(i, {value});
+        }
+      }
+    }
+
+    auto objects = deps.get_input_objects(0);
+    deps.depends_on_transforms_of(objects);
+  }
+};
+
 DFGB_SocketVector GraphInserters::insert_sockets(BTreeGraphBuilder &builder,
                                                  ArrayRef<bNodeSocket *> bsockets)
 {
@@ -136,6 +169,7 @@ DFGB_SocketVector GraphInserters::insert_sockets(BTreeGraphBuilder &builder,
 
   auto fn = fn_builder.build("Input Sockets");
   fn->add_body<SocketLoaderBody>(builder.btree(), bsockets, loaders);
+  fn->add_body<SocketLoaderDependencies>(builder.btree(), bsockets);
   DFGB_Node *node = builder.insert_function(fn);
 
   DFGB_SocketVector sockets;
diff --git a/source/blender/functions/functions/lists.cpp b/source/blender/functions/functions/lists.cpp
index a7d170db2aa..25ca4b074b3 100644
--- a/source/blender/functions/functions/lists.cpp
+++ b/source/blender/functions/functions/lists.cpp
@@ -1,6 +1,7 @@
 #include "lists.hpp"
 #include "FN_types.hpp"
 #include "FN_tuple_call.hpp"
+#include "FN_dependencies.hpp"
 
 #include "BLI_lazy_init.hpp"
 
@@ -39,6 +40,14 @@ template<typename T> class CreateSingleElementList : public TupleCallBody {
   }
 };
 
+class CreateSingleElementListDependencies : public DependenciesBody {
+  void dependencies(ExternalDependenciesBuilder &deps) const
+  {
+    auto objects = deps.get_input_objects(0);
+    deps.set_output_objects(0, objects);
+  }
+};
+
 template<typename T>
 SharedFunction build_create_single_element_list_function(SharedType &base_type,
                                                          SharedType &list_type)
@@ -50,6 +59,9 @@ SharedFunction build_create_single_element_list_function(SharedType &base_type,
   std::string name = "Create " + base_type->name() + " List from Value";
   auto fn = builder.build(name);
   fn->add_body<CreateSingleElementList<T>>();
+  if (base_type == GET_TYPE_object()) {
+    fn->add_body<CreateSingleElementListDependencies>();
+  }
   return fn;
 }
 
@@ -66,6 +78,14 @@ template<typename T> class AppendToList : public TupleCallBody {
   }
 };
 
+class AppendToListDependencies : public DependenciesBody {
+  void dependencies(ExternalDependenciesBuilder &deps) const
+  {
+    deps.set_output_objects(0, deps.get_input_objects(0));
+    deps.set_output_objects(0, deps.get_input_objects(1));
+  }
+};
+
 template<typename T>
 SharedFunction build_append_function(SharedType &base_type, SharedType &list_type)
 {
@@ -77,6 +97,9 @@ SharedFunction build_append_function(SharedType &base_type, SharedType &list_typ
   std::string name = "Append " + base_type->name();
   auto fn = builder.build(name);
   fn->add_body<AppendToList<T>>();
+  if (base_type == GET_TYPE_object()) {
+    fn->add_body<AppendToListDependencies>();
+  }
   return fn;
 }
 
@@ -98,6 +121,14 @@ template<typename T> class GetListElement : public TupleCallBody {
   }
 };
 
+class GetListElementDependencies : public DependenciesBody {
+  void dependencies(ExternalDependenciesBuilder &deps) const
+  {
+    deps.set_output_objects(0, deps.get_input_objects(0));
+    deps.set_output_objects(0, deps.get_input_objects(2));
+  }
+};
+
 template<typename T>
 SharedFunction build_get_element_function(SharedType &base_type, SharedType &list_type)
 {
@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list