[Bf-blender-cvs] [105353359c3] functions: improve birth time handling in action interface

Jacques Lucke noreply at git.blender.org
Fri Jun 28 13:50:01 CEST 2019


Commit: 105353359c3f82572fde6bf111c345ab25869acd
Author: Jacques Lucke
Date:   Fri Jun 28 13:49:47 2019 +0200
Branches: functions
https://developer.blender.org/rB105353359c3f82572fde6bf111c345ab25869acd

improve birth time handling in action interface

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

M	source/blender/simulations/bparticles/actions.cpp
M	source/blender/simulations/bparticles/core.cpp
M	source/blender/simulations/bparticles/core.hpp

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

diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index d432fa218b1..b0531331268 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -43,19 +43,18 @@ class SpawnAction : public Action {
 
     SmallVector<float3> new_positions;
     SmallVector<float3> new_velocities;
-    SmallVector<float> new_birth_times;
+    SmallVector<uint> original_indices;
 
     for (uint i : particles.range()) {
       uint pindex = particles.get_particle_index(i);
       new_positions.append(positions[pindex] + float3(20, 0, 0));
       new_velocities.append(float3(1, 1, 10));
-      new_birth_times.append(interface.current_times()[i]);
+      original_indices.append(i);
     }
 
-    auto &target = interface.request_emit_target(0, particles.size());
+    auto &target = interface.request_emit_target(0, original_indices);
     target.set_float3("Position", new_positions);
     target.set_float3("Velocity", new_velocities);
-    target.set_float("Birth Time", new_birth_times);
   }
 };
 
@@ -72,11 +71,10 @@ class ExplodeAction : public Action {
 
     auto positions = particles.attributes().get_float3("Position");
     auto kill_states = particles.attributes().get_byte("Kill State");
-    auto current_times = interface.current_times();
 
     SmallVector<float3> new_positions;
     SmallVector<float3> new_velocities;
-    SmallVector<float> new_birth_times;
+    SmallVector<uint> original_indices;
 
     uint parts_amount = 100;
 
@@ -85,16 +83,16 @@ class ExplodeAction : public Action {
 
       kill_states[pindex] = 1;
       new_positions.append_n_times(positions[pindex], parts_amount);
-      new_birth_times.append_n_times(current_times[i], parts_amount);
+      original_indices.append_n_times(i, parts_amount);
+
       for (uint j = 0; j < parts_amount; j++) {
         new_velocities.append(random_direction() * 4);
       }
     }
 
-    auto &target = interface.request_emit_target(1, new_positions.size());
+    auto &target = interface.request_emit_target(1, original_indices);
     target.set_float3("Position", new_positions);
     target.set_float3("Velocity", new_velocities);
-    target.set_float("Birth Time", new_birth_times);
   }
 };
 
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index 47fcacd3c00..669f67e1f2c 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -126,8 +126,11 @@ ActionInterface::~ActionInterface()
   }
 }
 
-InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id, uint size)
+InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id,
+                                                        ArrayRef<uint> original_indices)
 {
+  uint size = original_indices.size();
+
   SmallVector<ParticlesBlock *> blocks;
   SmallVector<Range<uint>> ranges;
   m_block_allocator.allocate_block_ranges(particle_type_id, size, blocks, ranges);
@@ -135,6 +138,13 @@ InstantEmitTarget &ActionInterface::request_emit_target(uint particle_type_id, u
 
   auto *target = new InstantEmitTarget(particle_type_id, attributes_info, blocks, ranges);
   m_emit_targets.append(target);
+
+  SmallVector<float> birth_times(size);
+  for (uint i = 0; i < size; i++) {
+    birth_times[i] = m_current_times[original_indices[i]];
+  }
+  target->set_float("Birth Time", birth_times);
+
   return *target;
 }
 
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index e8489496934..17676fa980a 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -366,7 +366,7 @@ class ActionInterface {
     return m_particles;
   }
 
-  InstantEmitTarget &request_emit_target(uint particle_type_id, uint size);
+  InstantEmitTarget &request_emit_target(uint particle_type_id, ArrayRef<uint> original_indices);
 
   ArrayRef<InstantEmitTarget *> emit_targets()
   {



More information about the Bf-blender-cvs mailing list