[Bf-blender-cvs] [f9edcf46b38] functions: improved change direction action

Jacques Lucke noreply at git.blender.org
Fri Jul 5 12:26:58 CEST 2019


Commit: f9edcf46b38fa4e7d089e4dc26da65e02838cf5b
Author: Jacques Lucke
Date:   Fri Jul 5 12:23:45 2019 +0200
Branches: functions
https://developer.blender.org/rBf9edcf46b38fa4e7d089e4dc26da65e02838cf5b

improved change direction action

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

M	source/blender/blenlib/BLI_math.hpp
M	source/blender/simulations/bparticles/actions.cpp
M	source/blender/simulations/bparticles/core.cpp
M	source/blender/simulations/bparticles/core.hpp
M	source/blender/simulations/bparticles/events.cpp
M	source/blender/simulations/bparticles/simulate.cpp

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

diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index 965ca949400..38a9aed7b26 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -14,6 +14,14 @@ struct float3 {
   {
   }
 
+  explicit float3(float value) : x(value), y(value), z(value)
+  {
+  }
+
+  explicit float3(int value) : x(value), y(value), z(value)
+  {
+  }
+
   float3(float x, float y, float z) : x{x}, y{y}, z{z}
   {
   }
diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index 3427a6d2ec1..05341418435 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -30,16 +30,21 @@ class ChangeDirectionAction : public Action {
   {
     ParticleSet particles = interface.particles();
     auto velocities = particles.attributes().get_float3("Velocity");
+    auto position_offsets = interface.attribute_offsets().get_float3("Position");
+    auto velocity_offsets = interface.attribute_offsets().get_float3("Velocity");
 
     FN_TUPLE_CALL_ALLOC_TUPLES(m_compute_direction_body, fn_in, fn_out);
 
     FN::ExecutionStack stack;
     FN::ExecutionContext execution_context(stack);
 
-    for (uint pindex : particles.indices()) {
+    for (uint i : particles.range()) {
+      uint pindex = particles.get_particle_index(i);
       m_compute_direction_body->call(fn_in, fn_out, execution_context);
       float3 direction = fn_out.get<float3>(0);
       velocities[pindex] = direction;
+      position_offsets[pindex] = direction * interface.remaining_time_in_step(i);
+      velocity_offsets[pindex] = float3(0);
     }
   }
 };
diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp
index e063e853f94..70606e742bb 100644
--- a/source/blender/simulations/bparticles/core.cpp
+++ b/source/blender/simulations/bparticles/core.cpp
@@ -343,13 +343,15 @@ EventExecuteInterface::EventExecuteInterface(ParticleSet particles,
                                              BlockAllocator &block_allocator,
                                              ArrayRef<float> current_times,
                                              EventStorage &event_storage,
-                                             AttributeArrays attribute_offsets)
+                                             AttributeArrays attribute_offsets,
+                                             float step_end_time)
     : m_particles(particles),
       m_block_allocator(block_allocator),
       m_current_times(current_times),
       m_kill_states(m_particles.attributes().get_byte("Kill State")),
       m_event_storage(event_storage),
-      m_attribute_offsets(attribute_offsets)
+      m_attribute_offsets(attribute_offsets),
+      m_step_end_time(step_end_time)
 {
 }
 
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index aafc63ed5eb..ed6f3f03b94 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -539,13 +539,15 @@ class EventExecuteInterface {
   ArrayRef<uint8_t> m_kill_states;
   EventStorage &m_event_storage;
   AttributeArrays m_attribute_offsets;
+  float m_step_end_time;
 
  public:
   EventExecuteInterface(ParticleSet particles,
                         BlockAllocator &block_allocator,
                         ArrayRef<float> current_times,
                         EventStorage &event_storage,
-                        AttributeArrays attribute_offsets);
+                        AttributeArrays attribute_offsets,
+                        float step_end_time);
 
   ~EventExecuteInterface();
 
@@ -559,6 +561,16 @@ class EventExecuteInterface {
    */
   ArrayRef<float> current_times();
 
+  /**
+   * Get the end time of the current step.
+   */
+  float step_end_time();
+
+  /**
+   * Get the remaining time a particle in the current step.
+   */
+  float remaining_time_in_step(uint index);
+
   /**
    * Get the data stored in the Event->filter() function for a particle index.
    */
@@ -883,6 +895,16 @@ inline ArrayRef<float> EventExecuteInterface::current_times()
   return m_current_times;
 }
 
+inline float EventExecuteInterface::step_end_time()
+{
+  return m_step_end_time;
+}
+
+inline float EventExecuteInterface::remaining_time_in_step(uint index)
+{
+  return m_step_end_time - m_current_times[index];
+}
+
 template<typename T> inline T &EventExecuteInterface::get_storage(uint pindex)
 {
   return m_event_storage.get<T>(pindex);
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index 4e0ca1df4e6..fce104ca43d 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -27,11 +27,14 @@ class AgeReachedEvent : public EventFilter {
 
     for (uint i : particles.range()) {
       uint pindex = particles.get_particle_index(i);
-      float duration = interface.durations()[i];
+      TimeSpan time_span = interface.time_span(i);
+
       float birth_time = birth_times[pindex];
-      float age = end_time - birth_time;
-      if (age >= m_age && age - duration < m_age) {
-        float time_factor = TimeSpan(end_time - duration, duration).get_factor(birth_time + m_age);
+      float age_at_end = end_time - birth_time;
+      float age_at_start = age_at_end - time_span.duration();
+
+      if (age_at_end >= m_age && age_at_start < m_age) {
+        float time_factor = time_span.get_factor(birth_time + m_age);
         interface.trigger_particle(i, time_factor);
       }
     }
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 8d06406926a..9dbed3eb6ad 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -196,7 +196,8 @@ BLI_NOINLINE static void execute_events(BlockAllocator &block_allocator,
                                         ArrayRef<SmallVector<float>> current_time_per_particle,
                                         ArrayRef<Event *> events,
                                         EventStorage &event_storage,
-                                        AttributeArrays attribute_offsets)
+                                        AttributeArrays attribute_offsets,
+                                        float end_time)
 {
   BLI_assert(events.size() == particle_indices_per_event.size());
   BLI_assert(events.size() == current_time_per_particle.size());
@@ -212,7 +213,8 @@ BLI_NOINLINE static void execute_events(BlockAllocator &block_allocator,
                                     block_allocator,
                                     current_time_per_particle[event_index],
                                     event_storage,
-                                    attribute_offsets);
+                                    attribute_offsets,
+                                    end_time);
     event->execute(interface);
   }
 }
@@ -281,7 +283,8 @@ BLI_NOINLINE static void simulate_to_next_event(FixedArrayAllocator &array_alloc
                  current_time_per_particle,
                  events,
                  event_storage,
-                 attribute_offsets);
+                 attribute_offsets,
+                 end_time);
 
   find_unfinished_particles(indices_with_event,
                             particles.indices(),
@@ -443,7 +446,7 @@ BLI_NOINLINE static void simulate_block(FixedArrayAllocator &array_allocator,
     uint *indices_array = array_allocator.allocate_array<uint>();
     VectorAdaptor<uint> unfinished_particle_indices(indices_array, amount);
 
-    simulate_with_max_n_events(10,
+    simulate_with_max_n_events(1,
                                array_allocator,
                                block_allocator,
                                block,



More information about the Bf-blender-cvs mailing list