[Bf-blender-cvs] [63a9949c278] functions: compute particle functions more centrally for events

Jacques Lucke noreply at git.blender.org
Thu Jul 25 15:10:35 CEST 2019


Commit: 63a9949c278a8e681c240ab77988af49730f8ff4
Author: Jacques Lucke
Date:   Thu Jul 25 10:18:22 2019 +0200
Branches: functions
https://developer.blender.org/rB63a9949c278a8e681c240ab77988af49730f8ff4

compute particle functions more centrally for events

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

M	source/blender/simulations/bparticles/inserters.cpp
M	source/blender/simulations/bparticles/inserters.hpp
M	source/blender/simulations/bparticles/node_frontend.cpp
M	source/blender/simulations/bparticles/particle_function.hpp

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

diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 8326687b864..bdbe7466728 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -101,8 +101,8 @@ ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vn
   return create_function__action_inputs(force_vnode, data_graph);
 }
 
-static ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vnode,
-                                                                  VTreeDataGraph &data_graph)
+ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vnode,
+                                                           VTreeDataGraph &data_graph)
 {
   return create_function__action_inputs(event_vnode, data_graph);
 }
@@ -238,7 +238,8 @@ static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &UNUSED(ctx),
   return std::unique_ptr<Force>(new TurbulenceForce(std::move(compute_inputs_fn)));
 }
 
-static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(
+    BuildContext &ctx, VirtualNode *vnode, ParticleFunction UNUSED(compute_inputs_fn))
 {
   PointerRNA rna = vnode->rna();
   Object *object = (Object *)RNA_pointer_get(&rna, "object").id.data;
@@ -250,29 +251,27 @@ static std::unique_ptr<Event> BUILD_EVENT_mesh_collision(BuildContext &ctx, Virt
   return std::unique_ptr<Event>(new MeshCollisionEvent(vnode->name(), object, std::move(action)));
 }
 
-static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx,
+                                                      VirtualNode *vnode,
+                                                      ParticleFunction compute_inputs_fn)
 {
-  auto fn_or_error = create_function__event_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
-    return {};
-  }
-
-  SharedFunction fn = fn_or_error.extract_value();
   auto action = build_action_for_trigger(ctx, vnode->output(0));
   return std::unique_ptr<Event>(
-      new AgeReachedEvent(vnode->name(), ParticleFunction(fn), std::move(action)));
+      new AgeReachedEvent(vnode->name(), std::move(compute_inputs_fn), std::move(action)));
 }
 
-static std::unique_ptr<Event> BUILD_EVENT_close_by_points(BuildContext &ctx, VirtualNode *vnode)
+static std::unique_ptr<Event> BUILD_EVENT_close_by_points(BuildContext &ctx,
+                                                          VirtualNode *vnode,
+                                                          ParticleFunction compute_inputs)
 {
-  auto fn_or_error = create_function__event_inputs(vnode, ctx.data_graph);
-  if (fn_or_error.is_error()) {
+  if (compute_inputs.depends_on_particle()) {
     return {};
   }
 
-  SharedFunction fn = fn_or_error.extract_value();
   auto action = build_action_for_trigger(ctx, vnode->output(0));
 
+  SharedFunction &fn = compute_inputs.function();
+  BLI_assert(fn->input_amount() == 0);
   TupleCallBody &body = fn->body<TupleCallBody>();
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body.call__setup_execution_context(fn_in, fn_out);
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index cb56f3fae4a..7148e0578b5 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -42,11 +42,14 @@ ValueOrError<SharedFunction> create_function__offset_handler_inputs(
 ValueOrError<SharedFunction> create_function__force_inputs(VirtualNode *force_vnode,
                                                            VTreeDataGraph &data_graph);
 
+ValueOrError<SharedFunction> create_function__event_inputs(VirtualNode *event_vnode,
+                                                           VTreeDataGraph &data_graph);
+
 using ForceFromNodeCallback = std::function<std::unique_ptr<Force>(
     BuildContext &ctx, VirtualNode *vnode, ParticleFunction compute_inputs_fn)>;
 
-using EventFromNodeCallback =
-    std::function<std::unique_ptr<Event>(BuildContext &ctx, VirtualNode *vnode)>;
+using EventFromNodeCallback = std::function<std::unique_ptr<Event>(
+    BuildContext &ctx, VirtualNode *vnode, ParticleFunction compute_inputs_fn)>;
 
 using EmitterFromNodeCallback = std::function<std::unique_ptr<Emitter>(
     BuildContext &ctx, VirtualNode *vnode, StringRef particle_type_name)>;
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 1b0564b279d..871c6d2c1eb 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -110,7 +110,14 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
     for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
       for (VirtualSocket *linked : vnode->input(0)->links()) {
         if (is_particle_type_node(linked->vnode())) {
-          auto event = item.value(ctx, vnode);
+          auto fn_or_error = create_function__event_inputs(vnode, data_graph);
+          if (fn_or_error.is_error()) {
+            continue;
+          }
+
+          ParticleFunction fn(fn_or_error.extract_value());
+
+          auto event = item.value(ctx, vnode, std::move(fn));
           if (event) {
             events.add(linked->vnode()->name(), event.release());
           }
diff --git a/source/blender/simulations/bparticles/particle_function.hpp b/source/blender/simulations/bparticles/particle_function.hpp
index f6c1166c9c6..203e1dce93e 100644
--- a/source/blender/simulations/bparticles/particle_function.hpp
+++ b/source/blender/simulations/bparticles/particle_function.hpp
@@ -70,6 +70,16 @@ class ParticleFunction {
     BLI_assert(m_body != nullptr);
   }
 
+  bool depends_on_particle()
+  {
+    return m_fn->input_amount() > 0;
+  }
+
+  SharedFunction &function()
+  {
+    return m_fn;
+  }
+
   std::unique_ptr<ParticleFunctionResult> compute(ActionInterface &interface);
   std::unique_ptr<ParticleFunctionResult> compute(OffsetHandlerInterface &interface);
   std::unique_ptr<ParticleFunctionResult> compute(ForceInterface &interface);



More information about the Bf-blender-cvs mailing list