[Bf-blender-cvs] [878028d385c] functions: make it easier for emitters to specify birth moments

Jacques Lucke noreply at git.blender.org
Thu Jun 27 15:50:08 CEST 2019


Commit: 878028d385cb8ec44d80af2882964777cc3d0423
Author: Jacques Lucke
Date:   Thu Jun 27 15:07:39 2019 +0200
Branches: functions
https://developer.blender.org/rB878028d385cb8ec44d80af2882964777cc3d0423

make it easier for emitters to specify birth moments

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

M	source/blender/simulations/bparticles/core.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/emitters.cpp
M	source/blender/simulations/bparticles/simulate.cpp

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

diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index b9e67a81f85..3ca4f9c22fd 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -62,9 +62,16 @@ ParticlesBlock &BlockAllocator::get_non_full_block(uint particle_type_id)
   return block;
 }
 
-/* EmitterInterface
+/* Emitter Interface
  ******************************************/
 
+EmitterInterface::~EmitterInterface()
+{
+  for (EmitTarget *target : m_targets) {
+    delete target;
+  }
+}
+
 EmitTarget &EmitterInterface::request(uint particle_type_id, uint size)
 {
   SmallVector<ParticlesBlock *> blocks;
@@ -90,8 +97,8 @@ EmitTarget &EmitterInterface::request(uint particle_type_id, uint size)
   }
 
   ParticlesContainer &container = m_state.particle_container(particle_type_id);
-  m_targets.append(EmitTarget(particle_type_id, container.attributes_info(), blocks, ranges));
-  return m_targets.last();
+  m_targets.append(new EmitTarget(particle_type_id, container.attributes_info(), blocks, ranges));
+  return *m_targets.last();
 }
 
 /* EmitTarget
@@ -200,4 +207,17 @@ void EmitTarget::fill_float3(StringRef name, float3 value)
   this->fill_float3(index, value);
 }
 
+void EmitTarget::set_birth_moment(float time_factor)
+{
+  BLI_assert(time_factor >= 0.0 && time_factor <= 1.0f);
+  m_birth_moments.fill(time_factor);
+}
+
+void EmitTarget::set_randomized_birth_moments()
+{
+  for (float &birth_moment : m_birth_moments) {
+    birth_moment = (rand() % 10000) / 10000.0f;
+  }
+}
+
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e3071f4547f..945b49ec42d 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -64,6 +64,7 @@ class EmitTarget {
   AttributesInfo &m_attributes_info;
   SmallVector<ParticlesBlock *> m_blocks;
   SmallVector<Range<uint>> m_ranges;
+  SmallVector<float> m_birth_moments;
   uint m_size = 0;
 
  public:
@@ -80,8 +81,11 @@ class EmitTarget {
     for (auto range : ranges) {
       m_size += range.size();
     }
+    m_birth_moments = SmallVector<float>(m_size, 1.0f);
   }
 
+  EmitTarget(EmitTarget &other) = delete;
+
   void set_byte(uint index, ArrayRef<uint8_t> data);
   void set_byte(StringRef name, ArrayRef<uint8_t> data);
   void set_float(uint index, ArrayRef<float> data);
@@ -96,6 +100,9 @@ class EmitTarget {
   void fill_float3(uint index, float3 value);
   void fill_float3(StringRef name, float3 value);
 
+  void set_birth_moment(float time_factor);
+  void set_randomized_birth_moments();
+
   ArrayRef<ParticlesBlock *> blocks()
   {
     return m_blocks;
@@ -106,6 +113,11 @@ class EmitTarget {
     return m_ranges;
   }
 
+  ArrayRef<float> birth_moments()
+  {
+    return m_birth_moments;
+  }
+
   uint part_amount()
   {
     return m_ranges.size();
@@ -130,7 +142,7 @@ class EmitterInterface {
  private:
   ParticlesState &m_state;
   BlockAllocator &m_allocator;
-  SmallVector<EmitTarget> m_targets;
+  SmallVector<EmitTarget *> m_targets;
 
  public:
   EmitterInterface(ParticlesState &state, BlockAllocator &allocator)
@@ -138,7 +150,9 @@ class EmitterInterface {
   {
   }
 
-  ArrayRef<EmitTarget> targets()
+  ~EmitterInterface();
+
+  ArrayRef<EmitTarget *> targets()
   {
     return m_targets;
   }
diff --git a/source/blender/simulations/bparticles/emitters.cpp b/source/blender/simulations/bparticles/emitters.cpp
index 34a788be04d..aaeeb225b04 100644
--- a/source/blender/simulations/bparticles/emitters.cpp
+++ b/source/blender/simulations/bparticles/emitters.cpp
@@ -22,10 +22,10 @@ class PointEmitter : public Emitter {
 
   void emit(EmitterInterface &interface) override
   {
-    auto attributes = interface.request(0, 1);
-    attributes.set_float3("Position", {m_point});
-    attributes.set_float3("Velocity", {float3{-1, -1, 0}});
-    attributes.fill_float("Birth Factor", 1.0f);
+    EmitTarget &target = interface.request(0, 1);
+    target.set_float3("Position", {m_point});
+    target.set_float3("Velocity", {float3{-1, -1, 0}});
+    target.set_birth_moment(1.0f);
   }
 };
 
@@ -70,10 +70,10 @@ class SurfaceEmitter : public Emitter {
       velocities.append(m_transform.transform_direction(normal * m_normal_velocity));
     }
 
-    auto target = interface.request(m_particle_type_id, positions.size());
+    EmitTarget &target = interface.request(m_particle_type_id, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", velocities);
-    target.fill_float("Birth Factor", 1.0f);
+    target.set_randomized_birth_moments();
   }
 };
 
@@ -102,10 +102,10 @@ class PathEmitter : public Emitter {
       }
     }
 
-    auto target = interface.request(0, positions.size());
+    EmitTarget &target = interface.request(0, positions.size());
     target.set_float3("Position", positions);
     target.set_float3("Velocity", SmallVector<float3>(positions.size()));
-    target.fill_float("Birth Factor", 1.0f);
+    target.set_birth_moment(1.0f);
   }
 };
 
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 696d9f6b8fc..94190642264 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -380,18 +380,23 @@ BLI_NOINLINE static void emit_new_particles_from_emitter(StepDescription &descri
   EmitterInterface interface(state, block_allocator);
   emitter.emit(interface);
 
-  for (EmitTarget &target : interface.targets()) {
+  for (EmitTarget *target_ptr : interface.targets()) {
+    EmitTarget &target = *target_ptr;
+
     ParticleType &particle_type = description.particle_type(target.particle_type_id());
+    ArrayRef<float> all_birth_moments = target.birth_moments();
+    uint particle_count = 0;
+
     for (uint part = 0; part < target.part_amount(); part++) {
       ParticlesBlock &block = *target.blocks()[part];
       Range<uint> range = target.ranges()[part];
       AttributeArrays attributes = block.slice(range);
 
-      auto birth_times = attributes.get_float("Birth Time");
-      auto birth_factors = attributes.get_float("Birth Factor");
+      ArrayRef<float> birth_moments = all_birth_moments.slice(particle_count, range.size());
 
-      for (uint i = 0; i < birth_factors.size(); i++) {
-        birth_times[i] = time_span.interpolate(birth_factors[i]);
+      auto birth_times = attributes.get_float("Birth Time");
+      for (uint i = 0; i < birth_moments.size(); i++) {
+        birth_times[i] = time_span.interpolate(birth_moments[i]);
       }
 
       SmallVector<float> initial_step_durations;
@@ -402,6 +407,8 @@ BLI_NOINLINE static void emit_new_particles_from_emitter(StepDescription &descri
       ParticleSet emitted_particles(block, static_number_range_ref(range));
       step_individual_particles(
           emitted_particles, initial_step_durations, time_span.end(), particle_type);
+
+      particle_count += emitted_particles.size();
     }
   }
 }
@@ -438,8 +445,7 @@ BLI_NOINLINE static void ensure_required_containers_exist(
 BLI_NOINLINE static AttributesInfo build_attribute_info_for_type(ParticleType &UNUSED(type),
                                                                  AttributesInfo &UNUSED(last_info))
 {
-  AttributesInfo new_info{
-      {"Kill State"}, {"Birth Time", "Birth Factor"}, {"Position", "Velocity"}};
+  AttributesInfo new_info{{"Kill State"}, {"Birth Time"}, {"Position", "Velocity"}};
   return new_info;
 }



More information about the Bf-blender-cvs mailing list