[Bf-blender-cvs] [da1524fca84] functions: new ParticleSet abstraction: attribute arrays + particle indices

Jacques Lucke noreply at git.blender.org
Fri Jun 21 14:16:22 CEST 2019


Commit: da1524fca84816180a288724aae50731090efd05
Author: Jacques Lucke
Date:   Fri Jun 21 14:09:59 2019 +0200
Branches: functions
https://developer.blender.org/rBda1524fca84816180a288724aae50731090efd05

new ParticleSet abstraction: attribute arrays + particle indices

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

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

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

diff --git a/source/blender/simulations/bparticles/actions.cpp b/source/blender/simulations/bparticles/actions.cpp
index 6e5a0fd59b7..cd81b14e665 100644
--- a/source/blender/simulations/bparticles/actions.cpp
+++ b/source/blender/simulations/bparticles/actions.cpp
@@ -3,10 +3,10 @@
 namespace BParticles {
 
 class KillAction : public Action {
-  void execute(AttributeArrays attributes, ArrayRef<uint> particle_indices) override
+  void execute(ParticleSet particles) override
   {
-    auto kill_states = attributes.get_byte("Kill State");
-    for (uint pindex : particle_indices) {
+    auto kill_states = particles.attributes().get_byte("Kill State");
+    for (uint pindex : particles.indices()) {
       kill_states[pindex] = 1;
     }
   }
@@ -21,11 +21,11 @@ class MoveAction : public BParticles::Action {
   {
   }
 
-  void execute(AttributeArrays attributes, ArrayRef<uint> particle_indices) override
+  void execute(ParticleSet particles) override
   {
-    auto positions = attributes.get_float3("Position");
+    auto positions = particles.attributes().get_float3("Position");
 
-    for (uint pindex : particle_indices) {
+    for (uint pindex : particles.indices()) {
       positions[pindex] += m_offset;
     }
   }
diff --git a/source/blender/simulations/bparticles/core.hpp b/source/blender/simulations/bparticles/core.hpp
index ffa3f9719d6..be568c46797 100644
--- a/source/blender/simulations/bparticles/core.hpp
+++ b/source/blender/simulations/bparticles/core.hpp
@@ -25,12 +25,47 @@ using BLI::SmallVector;
 using BLI::StringRef;
 using std::unique_ptr;
 
+struct ParticleSet {
+ private:
+  AttributeArrays m_attributes;
+  ArrayRef<uint> m_particle_indices;
+
+ public:
+  ParticleSet(AttributeArrays attributes, ArrayRef<uint> particle_indices)
+      : m_attributes(attributes), m_particle_indices(particle_indices)
+  {
+  }
+
+  AttributeArrays attributes()
+  {
+    return m_attributes;
+  }
+
+  ArrayRef<uint> indices()
+  {
+    return m_particle_indices;
+  }
+
+  uint pindex_of(uint i)
+  {
+    return m_particle_indices[i];
+  }
+
+  Range<uint> range()
+  {
+    return Range<uint>(0, m_particle_indices.size());
+  }
+
+  uint size()
+  {
+    return m_particle_indices.size();
+  }
+};
+
 class Force {
  public:
   virtual ~Force();
-  virtual void add_force(AttributeArrays attributes,
-                         ArrayRef<uint> particle_indices,
-                         ArrayRef<float3> dst) = 0;
+  virtual void add_force(ParticleSet particles, ArrayRef<float3> dst) = 0;
 };
 
 struct IdealOffsets {
@@ -42,8 +77,7 @@ class Event {
  public:
   virtual ~Event();
 
-  virtual void filter(AttributeArrays attributes,
-                      ArrayRef<uint> particle_indices,
+  virtual void filter(ParticleSet particles,
                       IdealOffsets &ideal_offsets,
                       ArrayRef<float> durations,
                       float end_time,
@@ -55,7 +89,7 @@ class Action {
  public:
   virtual ~Action();
 
-  virtual void execute(AttributeArrays attributes, ArrayRef<uint> particle_indices) = 0;
+  virtual void execute(ParticleSet particles) = 0;
 };
 
 class EmitterTarget {
diff --git a/source/blender/simulations/bparticles/events.cpp b/source/blender/simulations/bparticles/events.cpp
index a4c9503a400..ab47addf9f2 100644
--- a/source/blender/simulations/bparticles/events.cpp
+++ b/source/blender/simulations/bparticles/events.cpp
@@ -15,18 +15,17 @@ class AgeReachedEvent : public Event {
   {
   }
 
-  void filter(AttributeArrays attributes,
-              ArrayRef<uint> particle_indices,
+  void filter(ParticleSet particles,
               IdealOffsets &UNUSED(ideal_offsets),
               ArrayRef<float> durations,
               float end_time,
               SmallVector<uint> &r_filtered_indices,
               SmallVector<float> &r_time_factors) override
   {
-    auto birth_times = attributes.get_float("Birth Time");
+    auto birth_times = particles.attributes().get_float("Birth Time");
 
-    for (uint i = 0; i < particle_indices.size(); i++) {
-      uint pindex = particle_indices[i];
+    for (uint i : particles.range()) {
+      uint pindex = particles.pindex_of(i);
       float duration = durations[i];
       float birth_time = birth_times[pindex];
       float age = end_time - birth_time;
@@ -50,19 +49,18 @@ class MeshCollisionEvent : public Event {
   {
   }
 
-  void filter(AttributeArrays attributes,
-              ArrayRef<uint> particle_indices,
+  void filter(ParticleSet particles,
               IdealOffsets &ideal_offsets,
               ArrayRef<float> UNUSED(durations),
               float UNUSED(end_time),
               SmallVector<uint> &r_filtered_indices,
               SmallVector<float> &r_time_factors) override
   {
-    auto positions = attributes.get_float3("Position");
+    auto positions = particles.attributes().get_float3("Position");
     auto position_offsets = ideal_offsets.position_offsets;
 
-    for (uint i = 0; i < particle_indices.size(); i++) {
-      uint pindex = particle_indices[i];
+    for (uint i : particles.range()) {
+      uint pindex = particles.pindex_of(i);
 
       float3 start_position = m_ray_transform.transform_position(positions[pindex]);
       float3 direction = m_ray_transform.transform_direction(position_offsets[i]);
diff --git a/source/blender/simulations/bparticles/forces.cpp b/source/blender/simulations/bparticles/forces.cpp
index 622d7f8ba3f..a5813a43a99 100644
--- a/source/blender/simulations/bparticles/forces.cpp
+++ b/source/blender/simulations/bparticles/forces.cpp
@@ -13,11 +13,9 @@ class DirectionalForce : public Force {
   {
   }
 
-  void add_force(AttributeArrays UNUSED(attributes),
-                 ArrayRef<uint> indices_mask,
-                 ArrayRef<float3> dst) override
+  void add_force(ParticleSet particles, ArrayRef<float3> dst) override
   {
-    for (uint i = 0; i < indices_mask.size(); i++) {
+    for (uint i : particles.range()) {
       dst[i] += m_force;
     }
   };
@@ -32,13 +30,11 @@ class TurbulenceForce : public BParticles::Force {
   {
   }
 
-  void add_force(AttributeArrays attributes,
-                 ArrayRef<uint> indices_mask,
-                 ArrayRef<float3> dst) override
+  void add_force(ParticleSet particles, ArrayRef<float3> dst) override
   {
-    auto positions = attributes.get_float3("Position");
-    for (uint i = 0; i < indices_mask.size(); i++) {
-      uint pindex = indices_mask[i];
+    auto positions = particles.attributes().get_float3("Position");
+    for (uint i : particles.indices()) {
+      uint pindex = particles.pindex_of(i);
 
       float3 pos = positions[pindex];
       float value = BLI_hnoise(0.5f, pos.x, pos.y, pos.z);
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 98cf09bda52..755507b932a 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -22,8 +22,7 @@ static ArrayRef<uint> static_number_range_ref()
 /* Events
  **************************************************/
 
-BLI_NOINLINE static void find_next_event_per_particle(AttributeArrays attributes,
-                                                      ArrayRef<uint> particle_indices,
+BLI_NOINLINE static void find_next_event_per_particle(ParticleSet particles,
                                                       IdealOffsets &ideal_offsets,
                                                       ArrayRef<float> durations,
                                                       float end_time,
@@ -40,13 +39,8 @@ BLI_NOINLINE static void find_next_event_per_particle(AttributeArrays attributes
     SmallVector<float> triggered_time_factors;
 
     Event *event = events[event_index];
-    event->filter(attributes,
-                  particle_indices,
-                  ideal_offsets,
-                  durations,
-                  end_time,
-                  triggered_indices,
-                  triggered_time_factors);
+    event->filter(
+        particles, ideal_offsets, durations, end_time, triggered_indices, triggered_time_factors);
 
     for (uint i = 0; i < triggered_indices.size(); i++) {
       uint index = triggered_indices[i];
@@ -66,16 +60,13 @@ BLI_NOINLINE static void find_next_event_per_particle(AttributeArrays attributes
 }
 
 BLI_NOINLINE static void forward_particles_to_next_event(
-    AttributeArrays attributes,
-    ArrayRef<uint> particle_indices,
-    IdealOffsets &ideal_offsets,
-    ArrayRef<float> time_factors_to_next_event)
+    ParticleSet particles, IdealOffsets &ideal_offsets, ArrayRef<float> time_factors_to_next_event)
 {
-  auto positions = attributes.get_float3("Position");
-  auto velocities = attributes.get_float3("Velocity");
+  auto positions = particles.attributes().get_float3("Position");
+  auto velocities = particles.attributes().get_float3("Velocity");
 
-  for (uint i = 0; i < particle_indices.size(); i++) {
-    uint pindex = particle_indices[i];
+  for (uint i : particles.range()) {
+    uint pindex = particles.pindex_of(i);
     float time_factor = time_factors_to_next_event[i];
     positions[pindex] += time_factor * ideal_offsets.position_offsets[i];
     velocities[pindex] += time_factor * ideal_offsets.velocity_offsets[i];
@@ -125,46 +116,44 @@ BLI_NOINLINE static void run_actions(AttributeArrays attributes,
 {
   for (uint event_index = 0; event_index < events.size(); event_index++) {
     Action *action = action_per_event[event_index];
-    action->execute(attributes, particles_per_event[event_index]);
+    ParticleSet particles(attributes, particles_per_event[event_index]);
+    action->execute(particles);
   }
 }
 
 /* Evaluate Forces
  ***********************************************/
 
-BLI_NOINLINE static void compute_combined_forces_on_particles(AttributeArrays attributes,
-                                                              ArrayRef<uint> particle_indices,
+BLI_NOINLINE static void compute_combined_forces_on_particles(ParticleSet particles,
                                                               ArrayRef<Force *> forces,
                                                               ArrayRef<float3> r_force_vectors)
 {
- 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list