Skip to main content

sph_plugin/
resources.rs

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        // Calculate expected particles per cell based on density and cell size
29        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; // 50% packing density
32
33        Self {
34            cells: HashMap::new(),
35            expected_particles_per_cell: expected_per_cell.max(50), // At least 50 particles
36        }
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}