1use bevy::prelude::*;
2use std::collections::HashMap;
3use std::f32::consts::PI;
4
5#[derive(Resource)]
6pub struct ParticlePool {
7 pub available: Vec<(Entity, Handle<Mesh>, Handle<ColorMaterial>)>,
8 pub capacity: usize,
9}
10
11impl ParticlePool {
12 pub fn new(particle_count: usize) -> Self {
13 Self {
14 available: Vec::with_capacity(particle_count * 2),
15 capacity: particle_count * 2,
16 }
17 }
18}
19
20#[derive(Resource)]
21pub struct SpatialGrid {
22 pub cells: HashMap<(i32, i32), Vec<(Entity, Vec2)>>,
23 pub expected_particles_per_cell: usize,
24}
25
26impl SpatialGrid {
27 pub fn new(grid_cell_size: f32, particle_radius: f32) -> Self {
28 let cell_area = grid_cell_size * grid_cell_size;
30 let particle_area = PI * particle_radius * particle_radius;
31 let expected_per_cell = (cell_area / particle_area * 0.5) as usize; Self {
34 cells: HashMap::new(),
35 expected_particles_per_cell: expected_per_cell.max(50), }
37 }
38}
39
40#[derive(Resource, Default)]
41pub enum VisualizationMode {
42 #[default]
43 Velocity,
44 Pressure,
45 Density,
46}
47
48#[derive(Resource)]
49pub struct SimulationStats {
50 pub particle_count: usize,
51 pub fps: f32,
52 pub last_update: f32,
53}
54
55impl Default for SimulationStats {
56 fn default() -> Self {
57 Self {
58 particle_count: 0,
59 fps: 0.0,
60 last_update: 0.0,
61 }
62 }
63}