[Bf-blender-cvs] [3a0cfed4aae] functions: first time using the function nodes within bparticle nodes

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:46:16 CEST 2019


Commit: 3a0cfed4aae6c37b30cfd6d2b1d3c92368d897e9
Author: Jacques Lucke
Date:   Thu Jul 4 15:57:38 2019 +0200
Branches: functions
https://developer.blender.org/rB3a0cfed4aae6c37b30cfd6d2b1d3c92368d897e9

first time using the function nodes within bparticle nodes

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

M	release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
M	source/blender/functions/FN_data_flow_nodes.hpp
M	source/blender/simulations/CMakeLists.txt
M	source/blender/simulations/bparticles/c_wrapper.cpp
M	tests/gtests/functions/CMakeLists.txt

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py b/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
index e9311c4964f..39e74390110 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
@@ -7,10 +7,6 @@ class AgeReachedEventNode(bpy.types.Node, BParticlesNode):
     bl_idname = "bp_AgeReachedEventNode"
     bl_label = "Age Reached Event"
 
-    age: FloatProperty(name="Age", default=3)
-
     def declaration(self, builder : SocketBuilder):
         builder.event_input("events", "Event")
-
-    def draw(self, layout):
-        layout.prop(self, "age", text="Age")
+        builder.fixed_input("age", "Age", "Float")
diff --git a/source/blender/functions/FN_data_flow_nodes.hpp b/source/blender/functions/FN_data_flow_nodes.hpp
index ca20e45d5bd..aafe6478b1f 100644
--- a/source/blender/functions/FN_data_flow_nodes.hpp
+++ b/source/blender/functions/FN_data_flow_nodes.hpp
@@ -2,3 +2,4 @@
 
 #include "FN_data_flow_nodes-c.h"
 #include "frontends/data_flow_nodes/function_generation.hpp"
+#include "frontends/data_flow_nodes/graph_generation.hpp"
diff --git a/source/blender/simulations/CMakeLists.txt b/source/blender/simulations/CMakeLists.txt
index eca93184e7b..bd8f5aa8ee2 100644
--- a/source/blender/simulations/CMakeLists.txt
+++ b/source/blender/simulations/CMakeLists.txt
@@ -5,6 +5,7 @@ set(INC
   ../makesrna
   ../blenkernel
   ../depsgraph
+  ../functions
   ../../../intern/guardedalloc
 )
 
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 59fb5412058..cd6856d2fef 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -26,6 +26,9 @@
 
 #include "RNA_access.h"
 
+#include "FN_tuple_call.hpp"
+#include "FN_data_flow_nodes.hpp"
+
 #define WRAPPERS(T1, T2) \
   inline T1 unwrap(T2 value) \
   { \
@@ -270,6 +273,7 @@ typedef std::function<void(
     EmitterInserter;
 
 typedef std::function<void(bNode *bnode,
+                           FN::DataFlowNodes::GeneratedGraph &generated_graph,
                            IndexedBParticlesTree &bparticles_tree,
                            ModifierStepDescription &step_description)>
     EventInserter;
@@ -324,13 +328,49 @@ static void INSERT_EMITTER_point(bNode *emitter_node,
   }
 }
 
+class OldKillEvent : public Event {
+ private:
+  FN::SharedFunction m_compute_age_fn;
+
+ public:
+  OldKillEvent(FN::SharedFunction compute_age_fn) : m_compute_age_fn(compute_age_fn)
+  {
+  }
+
+  void filter(EventFilterInterface &interface) override
+  {
+    auto *body = m_compute_age_fn->body<FN::TupleCallBody>();
+    FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+
+    FN::ExecutionStack stack;
+    FN::ExecutionContext execution_context(stack);
+    body->call(fn_in, fn_out, execution_context);
+
+    float age = fn_out.get<float>(0);
+    EventFilter *filter = EVENT_age_reached(age);
+    filter->filter(interface);
+    delete filter;
+  }
+
+  void execute(EventExecuteInterface &interface) override
+  {
+    interface.kill(interface.particles().indices());
+  }
+};
+
 static void INSERT_EVENT_age_reached(bNode *event_node,
+                                     FN::DataFlowNodes::GeneratedGraph &generated_graph,
                                      IndexedBParticlesTree &bparticles_tree,
                                      ModifierStepDescription &step_description)
 {
   BLI_assert(STREQ(event_node->idname, "bp_AgeReachedEventNode"));
   bNodeSocket *event_input = (bNodeSocket *)event_node->inputs.first;
 
+  FN::DFGraphSocket age_input_socket = generated_graph.lookup_socket(event_input->next);
+  FN::FunctionGraph function_graph(generated_graph.graph(), {}, {age_input_socket});
+  FN::SharedFunction compute_age_function = function_graph.new_function("Compute Age");
+  FN::fgraph_add_TupleCallBody(compute_age_function, function_graph);
+
   for (SocketWithNode linked : bparticles_tree.base().linked(event_input)) {
     if (!bparticles_tree.is_particle_type_node(linked.node)) {
       continue;
@@ -338,12 +378,7 @@ static void INSERT_EVENT_age_reached(bNode *event_node,
 
     bNode *type_node = linked.node;
 
-    PointerRNA rna = bparticles_tree.base().get_rna(event_node);
-    float age = RNA_float_get(&rna, "age");
-
-    EventFilter *event_filter = EVENT_age_reached(age);
-    Action *action = ACTION_kill();
-    Event *event = new EventActionTest(event_filter, action);
+    Event *event = new OldKillEvent(compute_age_function);
     step_description.m_types.lookup_ref(type_node->name)->m_events.append(event);
   }
 }
@@ -364,6 +399,8 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
   IndexedNodeTree indexed_tree(btree);
   IndexedBParticlesTree bparticles_tree(indexed_tree);
 
+  auto generated_graph = FN::DataFlowNodes::generate_graph(indexed_tree).value();
+
   auto type_nodes = bparticles_tree.type_nodes();
   for (uint i = 0; i < type_nodes.size(); i++) {
     bNode *particle_type_node = type_nodes[i];
@@ -384,7 +421,7 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
 
   for (auto item : event_inserters.items()) {
     for (bNode *event_node : indexed_tree.nodes_with_idname(item.key)) {
-      item.value(event_node, bparticles_tree, *step_description);
+      item.value(event_node, generated_graph, bparticles_tree, *step_description);
     }
   }
 
diff --git a/tests/gtests/functions/CMakeLists.txt b/tests/gtests/functions/CMakeLists.txt
index 9467433f147..81df84370fe 100644
--- a/tests/gtests/functions/CMakeLists.txt
+++ b/tests/gtests/functions/CMakeLists.txt
@@ -22,6 +22,8 @@ set(INC
   .
   ..
   ../../../source/blender/blenlib
+  ../../../source/blender/blenkernel
+  ../../../source/blender/makesrna
   ../../../source/blender/functions
   ../../../source/blender/makesdna
   ../../../intern/guardedalloc



More information about the Bf-blender-cvs mailing list