[Bf-blender-cvs] [aefdc1807a6] functions: cleanup emitters

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


Commit: aefdc1807a6788e2f542a8306d407defe996df90
Author: Jacques Lucke
Date:   Mon Jul 15 16:43:27 2019 +0200
Branches: functions
https://developer.blender.org/rBaefdc1807a6788e2f542a8306d407defe996df90

cleanup emitters

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

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

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

diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 1166433c3e8..28a2b02c1c0 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -20,15 +20,20 @@ static float random_float()
 void PointEmitter::emit(EmitterInterface &interface)
 {
   SmallVector<float3> new_positions(m_amount);
+  SmallVector<float> new_sizes(m_amount, 0.1f);
+  SmallVector<float> birth_times(m_amount);
 
   for (uint i = 0; i < m_amount; i++) {
     float t = i / (float)m_amount;
     float3 point = m_point.interpolate(t);
     new_positions[i] = point;
+    birth_times[i] = interface.time_span().interpolate(t);
   }
 
   auto target = interface.particle_allocator().request(m_particle_type_name, new_positions.size());
   target.set_float3("Position", new_positions);
+  target.set_float("Size", new_sizes);
+  target.set_float("Birth Time", birth_times);
 }
 
 static float3 random_point_in_triangle(float3 a, float3 b, float3 c)
diff --git a/source/blender/simulations/bparticles/emitters.hpp b/source/blender/simulations/bparticles/emitters.hpp
index de3a50e0204..323e796e4c6 100644
--- a/source/blender/simulations/bparticles/emitters.hpp
+++ b/source/blender/simulations/bparticles/emitters.hpp
@@ -11,7 +11,8 @@ namespace BParticles {
 using FN::SharedFunction;
 using FN::TupleCallBody;
 
-struct SurfaceEmitter : public Emitter {
+class SurfaceEmitter : public Emitter {
+ private:
   std::string m_particle_type_name;
   std::unique_ptr<Action> m_action;
 
@@ -22,14 +23,41 @@ struct SurfaceEmitter : public Emitter {
   float m_emitter_velocity;
   float m_size;
 
+ public:
+  SurfaceEmitter(StringRef particle_type_name,
+                 std::unique_ptr<Action> action,
+                 Object *object,
+                 InterpolatedFloat4x4 transform,
+                 float rate,
+                 float normal_velocity,
+                 float emitter_velocity,
+                 float size)
+      : m_particle_type_name(particle_type_name.to_std_string()),
+        m_action(std::move(action)),
+        m_object(object),
+        m_transform(transform),
+        m_rate(rate),
+        m_normal_velocity(normal_velocity),
+        m_emitter_velocity(emitter_velocity),
+        m_size(size)
+  {
+  }
+
   void emit(EmitterInterface &interface) override;
 };
 
 struct PointEmitter : public Emitter {
+ private:
   std::string m_particle_type_name;
   InterpolatedFloat3 m_point;
   uint m_amount;
 
+ public:
+  PointEmitter(StringRef particle_type_name, InterpolatedFloat3 point, uint amount)
+      : m_particle_type_name(particle_type_name.to_std_string()), m_point(point), m_amount(amount)
+  {
+  }
+
   void emit(EmitterInterface &interface) override;
 };
 
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 17815679a01..b7d57fecc8a 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -237,20 +237,20 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_mesh_surface(BuildContext &ctx,
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body->call__setup_execution_context(fn_in, fn_out);
 
-  auto emitter = std::unique_ptr<SurfaceEmitter>(new SurfaceEmitter());
-  emitter->m_action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
-  emitter->m_particle_type_name = particle_type_name.to_std_string();
-
-  emitter->m_object = fn_out.get<Object *>(0);
-  emitter->m_rate = fn_out.get<float>(1);
-  emitter->m_normal_velocity = fn_out.get<float>(2);
-  emitter->m_emitter_velocity = fn_out.get<float>(3);
-  emitter->m_size = fn_out.get<float>(4);
-
-  emitter->m_transform = ctx.world_state.get_interpolated_value(bnode->name,
-                                                                emitter->m_object->obmat);
-
-  return emitter;
+  auto on_birth_action = build_action(ctx, {bSocketList(bnode->outputs).get(0), bnode});
+
+  Object *object = fn_out.get<Object *>(0);
+  InterpolatedFloat4x4 transform = ctx.world_state.get_interpolated_value(bnode->name,
+                                                                          object->obmat);
+
+  return std::unique_ptr<SurfaceEmitter>(new SurfaceEmitter(particle_type_name,
+                                                            std::move(on_birth_action),
+                                                            object,
+                                                            transform,
+                                                            fn_out.get<float>(1),
+                                                            fn_out.get<float>(2),
+                                                            fn_out.get<float>(3),
+                                                            fn_out.get<float>(4)));
 }
 
 static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
@@ -264,11 +264,8 @@ static std::unique_ptr<Emitter> BUILD_EMITTER_moving_point(BuildContext &ctx,
   FN_TUPLE_CALL_ALLOC_TUPLES(body, fn_in, fn_out);
   body->call__setup_execution_context(fn_in, fn_out);
 
-  auto emitter = std::unique_ptr<PointEmitter>(new PointEmitter());
-  emitter->m_particle_type_name = particle_type_name.to_std_string();
-  emitter->m_point = ctx.world_state.get_interpolated_value(bnode->name, fn_out.get<float3>(0));
-  emitter->m_amount = 10;
-  return emitter;
+  auto point = ctx.world_state.get_interpolated_value(bnode->name, fn_out.get<float3>(0));
+  return std::unique_ptr<PointEmitter>(new PointEmitter(particle_type_name, point, 10));
 }
 
 BLI_LAZY_INIT(StringMap<ForceFromNodeCallback>, get_force_builders)



More information about the Bf-blender-cvs mailing list