Commit: 393f220f4884a304b15a06b04cb39f0e2aacfdd4
Author: Jacques Lucke
Date:   Tue Feb 12 14:32:14 2019 +0100
Branches: functions
https://developer.blender.org/rB393f220f4884a304b15a06b04cb39f0e2aacfdd4

setup object dependencies correctly

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

M       source/blender/functions/CMakeLists.txt
M       source/blender/functions/FN_functions.h
M       source/blender/functions/c_wrapper.cpp
M       source/blender/functions/core/cpu.hpp
A       source/blender/functions/core/dependencies.cpp
A       source/blender/functions/core/dependencies.hpp
M       source/blender/functions/core/graph_to_function.cpp
M       source/blender/functions/function_nodes/function_nodes.cpp
M       source/blender/modifiers/intern/MOD_functiondeform.c

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

diff --git a/source/blender/functions/CMakeLists.txt 
b/source/blender/functions/CMakeLists.txt
index 7ef027faec7..880a5df1bd1 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -4,6 +4,7 @@ set(INC
        ../makesdna
        ../makesrna
        ../blenkernel
+       ../depsgraph
 )
 
 set(INC_SYS
@@ -14,10 +15,12 @@ set(SRC
        c_wrapper.cpp
 
        core/core.hpp
-       core/data_flow_graph.hpp
        core/cpu.hpp
        core/cpu.cpp
+       core/data_flow_graph.hpp
        core/data_flow_graph.cpp
+       core/dependencies.hpp
+       core/dependencies.cpp
        core/dot_export.cpp
        core/graph_to_function.hpp
        core/graph_to_function.cpp
diff --git a/source/blender/functions/FN_functions.h 
b/source/blender/functions/FN_functions.h
index 0ea3d0defa5..658696a7eba 100644
--- a/source/blender/functions/FN_functions.h
+++ b/source/blender/functions/FN_functions.h
@@ -42,6 +42,11 @@ FnFunction FN_get_generated_function(void);
 
 FnFunction FN_testing(bNodeTree *bnodetree);
 
+struct DepsNodeHandle;
+void FN_function_update_dependencies(
+       FnFunction fn,
+       struct DepsNodeHandle *deps_node);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/functions/c_wrapper.cpp 
b/source/blender/functions/c_wrapper.cpp
index 4ae3989c9ee..6c734b8e0a5 100644
--- a/source/blender/functions/c_wrapper.cpp
+++ b/source/blender/functions/c_wrapper.cpp
@@ -216,4 +216,14 @@ FnFunction FN_testing(bNodeTree *bnodetree)
        BLI::RefCounted<FN::Function> *fn_ref = fn.refcounter();
        fn_ref->incref();
        return wrap(fn_ref);
+}
+
+void FN_function_update_dependencies(
+       FnFunction fn,
+       struct DepsNodeHandle *deps_node)
+{
+       BLI::RefCounted<FN::Function> *fn_ref = unwrap(fn);
+       FN::Dependencies dependencies;
+       fn_ref->ptr()->body<FN::TupleCallBody>()->dependencies(dependencies);
+       dependencies.update_depsgraph(deps_node);
 }
\ No newline at end of file
diff --git a/source/blender/functions/core/cpu.hpp 
b/source/blender/functions/core/cpu.hpp
index 46754180723..1c45ae638ba 100644
--- a/source/blender/functions/core/cpu.hpp
+++ b/source/blender/functions/core/cpu.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "core.hpp"
+#include "dependencies.hpp"
 
 namespace FN {
 
@@ -16,6 +17,7 @@ namespace FN {
                virtual ~TupleCallBody() {};
 
                virtual void call(const Tuple &fn_in, Tuple &fn_out) const = 0;
+               virtual void dependencies(Dependencies &UNUSED(deps)) const {}
        };
 
        class CPPTypeInfo {
diff --git a/source/blender/functions/core/dependencies.cpp 
b/source/blender/functions/core/dependencies.cpp
new file mode 100644
index 00000000000..f5dd0ff4db4
--- /dev/null
+++ b/source/blender/functions/core/dependencies.cpp
@@ -0,0 +1,14 @@
+#include "dependencies.hpp"
+
+#include "DEG_depsgraph_build.h"
+
+namespace FN {
+
+       void Dependencies::update_depsgraph(DepsNodeHandle *deps_node)
+       {
+               for (struct Object *ob : m_transform_dependencies) {
+                       DEG_add_object_relation(deps_node, ob, 
DEG_OB_COMP_TRANSFORM, __func__);
+               }
+       }
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/core/dependencies.hpp 
b/source/blender/functions/core/dependencies.hpp
new file mode 100644
index 00000000000..29ab9a4d585
--- /dev/null
+++ b/source/blender/functions/core/dependencies.hpp
@@ -0,0 +1,22 @@
+#include "BLI_small_set.hpp"
+
+struct Object;
+struct DepsNodeHandle;
+
+namespace FN {
+       using namespace BLI;
+
+       class Dependencies {
+       private:
+               SmallSet<struct Object *> m_transform_dependencies;
+
+       public:
+               void add_object_transform_dependency(struct Object *object)
+               {
+                       m_transform_dependencies.add(object);
+               }
+
+               void update_depsgraph(DepsNodeHandle *deps_node);
+       };
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/core/graph_to_function.cpp 
b/source/blender/functions/core/graph_to_function.cpp
index 7b5aba05beb..bb686942276 100644
--- a/source/blender/functions/core/graph_to_function.cpp
+++ b/source/blender/functions/core/graph_to_function.cpp
@@ -15,6 +15,14 @@ namespace FN {
                          m_inputs(function_graph.inputs()),
                          m_outputs(function_graph.outputs()) {}
 
+               void dependencies(Dependencies &deps) const override
+               {
+                       for (const Node *node : m_graph->all_nodes()) {
+                               const TupleCallBody *body = 
node->function()->body<TupleCallBody>();
+                               if (body) body->dependencies(deps);
+                       }
+               }
+
                void call(const Tuple &fn_in, Tuple &fn_out) const override
                {
                        for (uint i = 0; i < m_outputs.size(); i++) {
diff --git a/source/blender/functions/function_nodes/function_nodes.cpp 
b/source/blender/functions/function_nodes/function_nodes.cpp
index 509b339b432..215a3299b64 100644
--- a/source/blender/functions/function_nodes/function_nodes.cpp
+++ b/source/blender/functions/function_nodes/function_nodes.cpp
@@ -114,6 +114,11 @@ namespace FN::FunctionNodes {
                                fn_out.set<Vector>(0, Vector());
                        }
                }
+
+               void dependencies(Dependencies &deps) const override
+               {
+                       deps.add_object_transform_dependency(m_object);
+               }
        };
 
 
diff --git a/source/blender/modifiers/intern/MOD_functiondeform.c 
b/source/blender/modifiers/intern/MOD_functiondeform.c
index aa2cd241a0f..79b93ac4bfb 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform.c
+++ b/source/blender/modifiers/intern/MOD_functiondeform.c
@@ -56,12 +56,17 @@ static bNodeTree *get_node_tree(void)
        return (bNodeTree *)G.main->nodetree.first;
 }
 
+static FnFunction get_current_function(void)
+{
+       return FN_testing(get_node_tree());
+}
+
 static void do_deformation(
         FunctionDeformModifierData *fdmd,
         float (*vertexCos)[3],
         int numVerts)
 {
-       FnFunction fn = FN_testing(get_node_tree());
+       FnFunction fn = get_current_function();
        // FnFunction fn = FN_get_generated_function();
        FnCallable fn_call = FN_function_get_callable(fn);
        BLI_assert(fn_call);
@@ -117,9 +122,12 @@ static bool dependsOnTime(ModifierData *UNUSED(md))
        return true;
 }
 
-static void updateDepsgraph(ModifierData *md, const 
ModifierUpdateDepsgraphContext *UNUSED(ctx))
+static void updateDepsgraph(ModifierData *md, const 
ModifierUpdateDepsgraphContext *ctx)
 {
        FunctionDeformModifierData *UNUSED(fdmd) = (FunctionDeformModifierData 
*)md;
+
+       FnFunction fn = get_current_function();
+       FN_function_update_dependencies(fn, ctx->node);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to