summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-20 23:20:21 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-20 23:20:21 -0700
commit533da47f2cc03a8b60a7c6c0bb5a938a7e523a03 (patch)
treee4709c9d56954c0a9b2bd3e21f64c036490ed070 /src/main.rs
parent29575e8592f5d6d566abb0ce9beaf794fb98a4e4 (diff)
particles
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs
index e7f2084..08bc61c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,6 +4,7 @@ mod renderer;
mod sim;
use futures::executor;
+use glam::Vec2;
use rand::random_range;
use std::{collections::VecDeque, sync::Arc, time::Instant};
use winit::{
@@ -24,6 +25,7 @@ use crate::{
sim::{
cell::{cell::Cell, materials::MaterialId},
cell_sim::{sim::sim_tick, world::World},
+ particle_sim::{ParticleManager, particle::Particle},
rb_sim::{DebugRenderMode, RbSimManager, debug_ops::DebugOperator},
write_rb_entity_to_world,
},
@@ -51,6 +53,7 @@ struct Input {
is_rmb_pressed: bool,
trigger_test_1: bool,
trigger_test_2: bool,
+ trigger_test_3: bool,
// keybindings
is_up_pressed: bool,
@@ -77,6 +80,7 @@ struct App {
// physics
rb_sim_manager: Option<RbSimManager>,
+ particle_manager: Option<ParticleManager>,
// sim state
// the last/current (not yet completed) seqno
@@ -122,6 +126,24 @@ impl App {
rbsm.test_spawn_ball(lm.0, lm.1, self.config.dropper_material);
}
+ if self.input.trigger_test_3
+ && let Some(lm) = self.input.last_mouse_world_pos
+ && let Some(pm) = &mut self.particle_manager
+ {
+ self.input.trigger_test_3 = false;
+ for i in 0..100 {
+ pm.particles.push(Particle {
+ position: Vec2::new(
+ lm.0 + random_range(-25.0..25.0),
+ lm.1 + random_range(-25.0..25.0),
+ ),
+ velocity: Vec2::ZERO,
+ material: MaterialId::Sand,
+ life: 2.0,
+ })
+ }
+ }
+
// --TEST DRAWING--
if (self.input.is_lmb_pressed || self.input.is_rmb_pressed)
&& let Some(lm) = self.input.last_mouse_world_pos
@@ -227,6 +249,12 @@ impl App {
}
physics_manager.rb_tick(physics_delta_time);
}
+ // move the particles
+ if let Some(particle_manager) = &mut self.particle_manager
+ && let Some(world) = &mut self.world
+ {
+ particle_manager.particle_tick(world, physics_delta_time);
+ }
}
}
@@ -244,6 +272,7 @@ impl Default for App {
trigger_test_1: false,
trigger_test_2: false,
+ trigger_test_3: false,
is_lmb_pressed: false,
is_rmb_pressed: false,
is_up_pressed: false,
@@ -257,6 +286,7 @@ impl Default for App {
world: Some(World::from_default_size()),
rb_sim_manager: Some(RbSimManager::new()),
+ particle_manager: Some(ParticleManager::new()),
sim_seqno: 0,
sim_paused: false,
@@ -341,6 +371,11 @@ impl ApplicationHandler for App {
KeyCode::KeyS => self.input.is_down_pressed = pressed,
KeyCode::KeyD => self.input.is_right_pressed = pressed,
KeyCode::KeyC => self.world = Some(World::from_default_size()),
+ KeyCode::KeyP => {
+ self.particle_manager
+ .as_mut()
+ .map(|pm| pm.particles = Vec::new());
+ }
KeyCode::KeyV => {
if let Some(rbsm) = self.rb_sim_manager.as_mut() {
let entity_ids: Vec<u32> = rbsm.rb_entities.keys().copied().collect();
@@ -370,6 +405,7 @@ impl ApplicationHandler for App {
KeyCode::KeyX if pressed => self.ignore_pause_next_tick = true,
KeyCode::Digit1 if pressed && !repeat => self.input.trigger_test_1 = true,
KeyCode::Digit2 if pressed && !repeat => self.input.trigger_test_2 = true,
+ KeyCode::Digit3 if pressed && !repeat => self.input.trigger_test_3 = true,
_ => {}
}
}
@@ -412,14 +448,10 @@ impl ApplicationHandler for App {
puffin::profile_scope!("redraw_requested");
// compute FPS diagnostics
let now = Instant::now();
- let secs_since_last_frame = (now - self.last_render).as_secs_f32();
+ let delta_time = (now - self.last_render).as_secs_f32();
self.last_render = now;
- let delta_time = secs_since_last_frame / (1.0 / 60.0);
-
- self.diagnostics
- .frame_times
- .push_back(secs_since_last_frame);
+ self.diagnostics.frame_times.push_back(delta_time);
if self.diagnostics.frame_times.len() > 30 {
self.diagnostics.frame_times.pop_front();
@@ -475,11 +507,13 @@ impl ApplicationHandler for App {
if let Some(renderer_state) = &mut self.renderer_state
&& let Some(world) = &mut self.world
&& let Some(rb_sim_manager) = &mut self.rb_sim_manager
+ && let Some(particle_manager) = &mut self.particle_manager
&& let Some(camera) = &mut self.camera
{
renderer_state.render(
world,
rb_sim_manager,
+ particle_manager,
camera,
&mut self.config,
&self.diagnostics,