[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