diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 46 |
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, |
