[Bf-blender-cvs] [25b3b122e67] functions: experiment with remembering last point emitter position

Jacques Lucke noreply at git.blender.org
Mon Jul 15 18:12:29 CEST 2019


Commit: 25b3b122e67d1837d18cec98f66634542374f3c7
Author: Jacques Lucke
Date:   Mon Jul 15 14:39:59 2019 +0200
Branches: functions
https://developer.blender.org/rB25b3b122e67d1837d18cec98f66634542374f3c7

experiment with remembering last point emitter position

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

M	source/blender/simulations/bparticles/c_wrapper.cpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/emitters.hpp
M	source/blender/simulations/bparticles/inserters.cpp
M	source/blender/simulations/bparticles/world_state.hpp

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

diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index 4ce50f09f67..7f1e6a822a4 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -84,6 +84,7 @@ void BParticles_simulate_modifier(BParticlesModifierData *bpmd,
 
   ParticlesState &particles_state = *unwrap(particles_state_c);
   simulate_step(particles_state, *step_description);
+  world_state.current_step_is_over();
 
   auto &containers = particles_state.particle_containers();
   for (auto item : containers.items()) {
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 913ad73269f..fda8c39250d 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -17,33 +17,34 @@ static float random_float()
   return (rand() % 4096) / 4096.0f;
 }
 
-class PointEmitter : public Emitter {
+class MovingPointEmitter : public Emitter {
  private:
   std::string m_particle_type_name;
-  SharedFunction m_compute_inputs_fn;
-  TupleCallBody *m_compute_inputs_body;
+  float3 m_start, m_end;
+  uint m_amount;
 
  public:
-  PointEmitter(StringRef particle_type_name, SharedFunction &compute_inputs_fn)
+  MovingPointEmitter(StringRef particle_type_name, float3 start, float3 end, uint amount)
       : m_particle_type_name(particle_type_name.to_std_string()),
-        m_compute_inputs_fn(compute_inputs_fn)
+        m_start(start),
+        m_end(end),
+        m_amount(amount)
   {
-    m_compute_inputs_body = m_compute_inputs_fn->body<TupleCallBody>();
   }
 
   void emit(EmitterInterface &interface) override
   {
-    FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_inputs_body, fn_in, fn_out);
+    SmallVector<float3> new_positions(m_amount);
 
-    FN::ExecutionStack stack;
-    FN::ExecutionContext execution_context(stack);
-    m_compute_inputs_body->call(fn_in, fn_out, execution_context);
-    float3 point = fn_out.get<float3>(0);
+    for (uint i = 0; i < m_amount; i++) {
+      float t = i / (float)m_amount;
+      float3 point = float3::interpolate(m_start, m_end, t);
+      new_positions[i] = point;
+    }
 
-    auto target = interface.particle_allocator().request(m_particle_type_name, 1);
-    target.set_float3("Position", {point});
-    target.set_float3("Velocity", {float3{-1, -1, 0}});
-    target.fill_float("Birth Time", interface.time_span().end());
+    auto target = interface.particle_allocator().request(m_particle_type_name,
+                                                         new_positions.size());
+    target.set_float3("Position", new_positions);
   }
 };
 
@@ -169,13 +170,6 @@ class SurfaceEmitter : public Emitter {
   }
 };
 
-std::unique_ptr<Emitter> EMITTER_point(StringRef particle_type_name,
-                                       SharedFunction &compute_inputs)
-{
-  Emitter *emitter = new PointEmitter(particle_type_name, compute_inputs);
-  return std::unique_ptr<Emitter>(emitter);
-}
-
 std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
                                               SharedFunction &compute_inputs_fn,
                                               WorldState &world_state,
@@ -186,4 +180,12 @@ std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
   return std::unique_ptr<Emitter>(emitter);
 }
 
+std::unique_ptr<Emitter> EMITTER_moving_point(StringRef particle_type_name,
+                                              float3 start,
+                                              float3 end)
+{
+  Emitter *emitter = new MovingPointEmitter(particle_type_name, start, end, 10);
+  return std::unique_ptr<Emitter>(emitter);
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index 64e86f32783..41817695ed9 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -11,12 +11,13 @@ namespace BParticles {
 using FN::SharedFunction;
 using FN::TupleCallBody;
 
-std::unique_ptr<Emitter> EMITTER_point(StringRef particle_type_name,
-                                       SharedFunction &compute_inputs);
-
 std::unique_ptr<Emitter> EMITTER_mesh_surface(StringRef particle_type_name,
                                               SharedFunction &compute_inputs_fn,
                                               WorldState &world_state,
                                               std::unique_ptr<Action> action);
 
+std::unique_ptr<Emitter> EMITTER_moving_point(StringRef particle_type_name,
+                                              float3 start,
+                                              float3 end);
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index bf2d68d862c..4c4b3c9ae9f 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -222,22 +222,30 @@ static std::unique_ptr<Event> BUILD_EVENT_age_reached(BuildContext &ctx, bNode *
   return EVENT_age_reached(bnode->name, fn, std::move(action));
 }
 
-static std::unique_ptr<Emitter> BUILD_EMITTER_point(BuildContext &ctx,
-                                                    bNode *bnode,
-                                                    StringRef particle_type_name)
+static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
+                                                           bNode *bnode,
+                                                           StringRef particle_type_name)
 {
   SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
-  return EMITTER_point(particle_type_name, fn);
+
+  auto action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
+  return EMITTER_mesh_surface(particle_type_name, fn, ctx.world_state, std::move(action));
 }
 
-static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
+static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
                                                            bNode *bnode,
                                                            StringRef particle_type_name)
 {
   SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+  BLI_assert(fn->input_amount() == 0);
 
-  auto action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
-  return EMITTER_mesh_surface(particle_type_name, fn, ctx.world_state, std::move(action));
+  auto body = fn->body<TupleCallBody>();
+  FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
+  body->call__setup_execution_context(fn_in, fn_out);
+
+  float3 current_point = fn_out.get<float3>(0);
+  float3 last_point = ctx.world_state.get_last_and_store_current(bnode->name, current_point);
+  return EMITTER_moving_point(particle_type_name, last_point, current_point);
 }
 
 BLI_LAZY_INIT(StringMap<ForceFromNodeCallback>, get_force_builders)
@@ -259,7 +267,7 @@ BLI_LAZY_INIT(StringMap<EventFromNodeCallback>, get_event_builders)
 BLI_LAZY_INIT(StringMap<EmitterFromNodeCallback>, get_emitter_builders)
 {
   StringMap<EmitterFromNodeCallback> map;
-  map.add_new("bp_PointEmitterNode", BUILD_EMITTER_point);
+  map.add_new("bp_PointEmitterNode", BUILD_EMITTER_moving_point);
   map.add_new("bp_MeshEmitterNode", BUILD_EMITTER_mesh_surface);
   return map;
 }
diff --git a/source/blender/simulations/bparticles/world_state.hpp b/source/blender/simulations/bparticles/world_state.hpp
index e88997f9a21..0de960eafa4 100644
--- a/source/blender/simulations/bparticles/world_state.hpp
+++ b/source/blender/simulations/bparticles/world_state.hpp
@@ -7,6 +7,7 @@
 
 namespace BParticles {
 
+using BLI::float3;
 using BLI::float4x4;
 using BLI::SmallMap;
 using BLI::StringMap;
@@ -15,8 +16,21 @@ using BLI::StringRef;
 class WorldState {
  private:
   StringMap<float4x4> m_matrices;
+  StringMap<float3> m_last_positions;
+  StringMap<float3> m_current_positions;
 
  public:
+  float3 get_last_and_store_current(StringRef id, float3 current)
+  {
+    m_current_positions.add_override(id, current);
+    return m_last_positions.lookup_default(id, current);
+  }
+
+  void current_step_is_over()
+  {
+    m_last_positions = StringMap<float3>(m_current_positions);
+  }
+
   float4x4 update(StringRef id, float4x4 value)
   {
     std::string id_string = id.to_std_string();



More information about the Bf-blender-cvs mailing list