[Bf-blender-cvs] [9c7c2d0de35] functions: support for multiple events per particle per time step

Jacques Lucke noreply at git.blender.org
Thu Jun 20 15:51:24 CEST 2019


Commit: 9c7c2d0de35495b6de81f68bcb5407acad5ff014
Author: Jacques Lucke
Date:   Thu Jun 20 14:34:09 2019 +0200
Branches: functions
https://developer.blender.org/rB9c7c2d0de35495b6de81f68bcb5407acad5ff014

support for multiple events per particle per time step

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

M	source/blender/simulations/bparticles/simulate.cpp

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

diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 507eb7fb5ba..9221c3fa6bf 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -88,12 +88,14 @@ static void find_unfinished_particles(ArrayRef<uint> particle_indices,
                                       ArrayRef<int> next_event_indices,
                                       ArrayRef<float> time_factors_to_next_event,
                                       ArrayRef<float> durations,
+                                      ArrayRef<uint8_t> kill_states,
                                       SmallVector<uint> &r_unfinished_particle_indices,
                                       SmallVector<float> &r_remaining_durations)
 {
+
   for (uint i = 0; i < particle_indices.size(); i++) {
     uint pindex = particle_indices[i];
-    if (next_event_indices[i] != -1) {
+    if (next_event_indices[i] != -1 && kill_states[pindex] == 0) {
       float time_factor = time_factors_to_next_event[i];
       float remaining_duration = durations[i] * (1.0f - time_factor);
 
@@ -198,6 +200,7 @@ static void simulate_to_next_event(AttributeArrays attributes,
                             next_event_indices,
                             time_factors_to_next_event,
                             durations,
+                            attributes.get_byte("Kill State"),
                             r_unfinished_particle_indices,
                             r_remaining_durations);
 }
@@ -232,14 +235,28 @@ static void step_individual_particles(AttributeArrays attributes,
 {
   SmallVector<uint> unfinished_particle_indices;
   SmallVector<float> remaining_durations;
-  simulate_to_next_event(attributes,
-                         particle_indices,
-                         durations,
-                         end_time,
-                         influences,
-                         unfinished_particle_indices,
-                         remaining_durations);
-  BLI_assert(unfinished_particle_indices.size() == remaining_durations.size());
+
+  const uint max_events_per_particle = 10;
+  for (uint iteration = 0; iteration < max_events_per_particle; iteration++) {
+    unfinished_particle_indices.clear();
+    remaining_durations.clear();
+
+    simulate_to_next_event(attributes,
+                           particle_indices,
+                           durations,
+                           end_time,
+                           influences,
+                           unfinished_particle_indices,
+                           remaining_durations);
+    BLI_assert(unfinished_particle_indices.size() == remaining_durations.size());
+
+    if (unfinished_particle_indices.size() == 0) {
+      break;
+    }
+
+    particle_indices = unfinished_particle_indices;
+    durations = remaining_durations;
+  }
 
   simulate_ignoring_events(
       attributes, unfinished_particle_indices, remaining_durations, influences);



More information about the Bf-blender-cvs mailing list