5#ifndef PARTICLE_SYSTEM_H
6#define PARTICLE_SYSTEM_H
12#include "src/system/ext/random8.h"
20using LampTy = hardware::LampTy;
36 occupiedSpacesSet.clear();
37 for (
size_t i = 0; i < ParticleSystem::maxParticuleCount; ++i)
39 isAllocated[i] =
false;
49 particuleCount = std::min<uint16_t>(ParticleSystem::maxParticuleCount, _particleCount);
57 void init_particules(
const std::function<int16_t(
size_t)>& positionGeneratorFunction)
59 occupiedSpacesSet.clear();
60 for (
size_t i = 0; i < particuleCount; ++i)
62 isAllocated[i] =
false;
73 const std::function<int16_t(
size_t)>& positionGeneratorFunction)
75 for (
size_t i = 0; i < particuleCount and maxParticlesToPop > 0; ++i)
94 const float deltaTime_s,
95 const bool shouldContrain =
true)
97 for (
size_t i = 0; i < particuleCount; ++i)
100 if (not isAllocated[i])
116 const float deltaTime_s,
117 const bool shouldContrain =
true)
119 for (
size_t i = 0; i < particuleCount; ++i)
122 if (not isAllocated[i])
133 if (newLedIndex != ledIndex)
138 occupiedSpacesSet.erase(ledIndex);
139 occupiedSpacesSet.insert(newLedIndex);
164 uint16_t particleCount = 0;
165 for (
size_t i = 0; i < particuleCount; ++i)
168 if (not isAllocated[i])
171 auto& parti = particules[i];
172 if (shouldDepopFunction(parti))
174 isAllocated[i] =
false;
175 occupiedSpacesSet.erase(parti._savedLampIndex);
182 return particleCount;
192 uint16_t particleCount = 0;
193 for (
size_t i = 0; i < particuleCount; ++i)
196 if (not isAllocated[i])
198 const auto& particle = particules[i];
205 return particleCount;
211 uint16_t particleCount = 0;
212 for (
size_t i = 0; i < particuleCount; ++i)
215 if (not isAllocated[i])
219 return particleCount;
224 bool is_position_taken(
const int16_t pos)
const {
return occupiedSpacesSet.find(pos) != occupiedSpacesSet.cend(); }
231 void spawn_particule(
const size_t index,
const std::function<int16_t(
size_t)>& positionGeneratorFunction)
233 int16_t pos = positionGeneratorFunction(index);
237 pos = positionGeneratorFunction(index);
242 particules[index] =
Particle(
utils::vec3d {helixCoordinates.
x, helixCoordinates.y, helixCoordinates.z});
243 occupiedSpacesSet.insert(pos);
244 isAllocated[index] =
true;
248 static constexpr uint16_t maxParticuleCount = 512;
249 Particle particules[maxParticuleCount];
250 bool isAllocated[maxParticuleCount];
252 std::set<int16_t> occupiedSpacesSet;
255 uint16_t particuleCount;
Define a particle system ALL PARTICLE SYSTEM SHARE THE SAME PÄRTICLE SUBSET.
Definition: particle_system.hpp:27
void spawn_particule(const size_t index, const std::function< int16_t(size_t)> &positionGeneratorFunction)
Spawn a particle.
Definition: particle_system.hpp:231
uint16_t get_number_of_active() const
Return the number of active particles.
Definition: particle_system.hpp:209
uint16_t show(const std::function< uint32_t(int16_t, const Particle &)> sample_color, LampTy &lamp)
Display this particle system.
Definition: particle_system.hpp:190
bool is_position_taken(const int16_t pos) const
Return True if the position is already occupied.
Definition: particle_system.hpp:224
void iterate_no_collisions(const utils::vec3d &accelerationCartesian, const float deltaTime_s, const bool shouldContrain=true)
Advance the particle simulation, ignoring collisions.
Definition: particle_system.hpp:93
void set_max_particle_count(const uint16_t _particleCount)
Call when you want to change the particle count of the simulation Can be called once when starting th...
Definition: particle_system.hpp:47
uint16_t depop_particules(const std::function< bool(const Particle &)> &shouldDepopFunction)
Filter particles depending on condition.
Definition: particle_system.hpp:162
void init_deferred_particules(uint8_t maxParticlesToPop, const std::function< int16_t(size_t)> &positionGeneratorFunction)
Init the particles from a initialization function, in a timed defered way.
Definition: particle_system.hpp:72
void init_particules(const std::function< int16_t(size_t)> &positionGeneratorFunction)
Init the particles from a initialization function.
Definition: particle_system.hpp:57
void reset()
reset system to zero count
Definition: particle_system.hpp:34
void iterate_with_collisions(const utils::vec3d &accelerationCartesian, const float deltaTime_s, const bool shouldContrain=true)
Advance the particle simulation, taking collisions in account.
Definition: particle_system.hpp:115
Define the main led strip interaction object.
Contains basic interface types to implement custom user modes.
Definition: control_fixed_modes.hpp:12
hardware::LampTy LampTy
Define a particle in cylindrical space, and movement equations on the cylinder surface.
Definition: particle.hpp:22
static constexpr bool is_led_index_valid(const int16_t ledIndex)
True if the given strip index is a valid one.
Definition: lamp_type.hpp:1189
static constexpr HelixXYZTy strip_to_helix_unconstraint(const int16_t n)
convert strip index to 3D coordinates, without checks on led index. This allows to use 3D coordinates...
Definition: lamp_type.hpp:1178
Define a single particle for a particle system.
Define a particle in 3D space. it has a position and speed.
Definition: particle.hpp:37
void apply_acceleration(const utils::vec3d &accelerationCartesian_m, const float deltaTime_s, const bool shouldContrain=true)
apply a cartesian acceleration to this particulate
Definition: particle.hpp:94
int16_t _savedLampIndex
optimization
Definition: particle.hpp:207
Particle simulate_after_acceleration(const utils::vec3d &accelerationCartesian_m, const float deltaTime_s, const bool shouldContrain=true) const
Simulate this particle movement as a new particle.
Definition: particle.hpp:136
float thetaSpeed_radS
angular speed, in radian/seconds
Definition: particle.hpp:200
float zSpeed_mS
linear speed, in meter/seconds
Definition: particle.hpp:201
Main interface between the user and the hardware of the lamp.
Definition: lamp_type.hpp:114
void LMBD_INLINE setPixelColor(uint16_t n, uint32_t color)
(indexable) Set the n-th LED color
Definition: lamp_type.hpp:874
float x
x coordinate in 2D
Definition: vector_math.h:16
3d vector in any space
Definition: vector_math.h:54