45 ParticleData() =
default;
57 [[nodiscard]]
Index size() const noexcept {
return mass_.size(); }
59 [[nodiscard]]
bool empty() const noexcept {
return mass_.empty(); }
65 [[nodiscard]]
Index capacity() const noexcept {
return mass_.capacity(); }
83 [[nodiscard]]
Vec3Span<Real> positions() noexcept {
84 return {position_x_, position_y_, position_z_};
88 return {position_x_, position_y_, position_z_};
91 [[nodiscard]] Vec3Span<Real> velocities() noexcept {
92 return {velocity_x_, velocity_y_, velocity_z_};
95 [[nodiscard]] Vec3Span<const Real> velocities() const noexcept {
96 return {velocity_x_, velocity_y_, velocity_z_};
99 [[nodiscard]] Vec3Span<Real> accelerations() noexcept {
100 return {acceleration_x_, acceleration_y_, acceleration_z_};
103 [[nodiscard]] Vec3Span<const Real> accelerations() const noexcept {
104 return {acceleration_x_, acceleration_y_, acceleration_z_};
107 [[nodiscard]] std::span<Real> masses() noexcept {
return mass_; }
109 [[nodiscard]] std::span<const Real> masses() const noexcept {
return mass_; }
112 using ComponentArray = std::vector<Real, AlignedAllocator<Real>>;
119 template<
typename Operation>
void for_each_array(Operation operation) {
120 operation(position_x_);
121 operation(position_y_);
122 operation(position_z_);
123 operation(velocity_x_);
124 operation(velocity_y_);
125 operation(velocity_z_);
126 operation(acceleration_x_);
127 operation(acceleration_y_);
128 operation(acceleration_z_);
137 static constexpr Index kInitialCapacity = 8;
139 ComponentArray position_x_;
140 ComponentArray position_y_;
141 ComponentArray position_z_;
142 ComponentArray velocity_x_;
143 ComponentArray velocity_y_;
144 ComponentArray velocity_z_;
145 ComponentArray acceleration_x_;
146 ComponentArray acceleration_y_;
147 ComponentArray acceleration_z_;
148 ComponentArray mass_;
ParticleData(Index count)
Create count particles with every component zero.
Index capacity() const noexcept
The number of particles the arrays can hold without reallocating.
Definition particle_data.hpp:65
void resize(Index count)
Change the number of particles, zero-filling any that are new.
void clear() noexcept
Remove every particle, keeping the storage for reuse.
Index add(Vec3 position, Vec3 velocity, Real mass)
Append one particle with zero acceleration and return its index.
void reserve(Index count)
Make room for count particles without changing how many there are.