[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