diff options
Diffstat (limited to 'src/sim/sim_manager')
| -rw-r--r-- | src/sim/sim_manager/mod.rs | 19 | ||||
| -rw-r--r-- | src/sim/sim_manager/utils.rs | 6 |
2 files changed, 12 insertions, 13 deletions
diff --git a/src/sim/sim_manager/mod.rs b/src/sim/sim_manager/mod.rs index 74c21fa..be75eeb 100644 --- a/src/sim/sim_manager/mod.rs +++ b/src/sim/sim_manager/mod.rs @@ -3,7 +3,7 @@ use std::time::Instant; use fxhash::FxHashMap; use crate::{ - Config, + Config, InputManager, config::{PHYSICS_DELTA_TIME, PHYSICS_FPS, SIM_FPS}, sim::{ cell_manager::manager::CellManager, @@ -37,6 +37,7 @@ pub struct SimManager { } pub struct SimCtx<'a> { + pub input_manager: &'a InputManager, pub cell_manager: &'a mut CellManager, pub rb_manager: &'a mut RbManager, pub particle_manager: &'a mut ParticleManager, @@ -91,7 +92,7 @@ impl SimManager { } } - fn cell_update(&mut self, config: &Config, delta_time: f32) { + fn cell_update(&mut self, config: &Config, input_manager: &InputManager, delta_time: f32) { // before we tick, write all the entities into the sim world let cells_written_by_entity = write_entities_to_world(self); @@ -103,6 +104,7 @@ impl SimManager { for id in entity_ids { let entity = self.entities.get_mut(&id); let mut ctx = SimCtx { + input_manager, cell_manager: &mut self.cell_manager, rb_manager: &mut self.rb_manager, particle_manager: &mut self.particle_manager, @@ -121,11 +123,12 @@ impl SimManager { read_back_entities_from_world(self, cells_written_by_entity); } - fn physics_update(&mut self, delta_time: f32) { + fn physics_update(&mut self, input_manager: &InputManager, delta_time: f32) { let entity_ids: Vec<EntityId> = self.entities.keys().cloned().collect(); for id in entity_ids { let entity = self.entities.get_mut(&id); let mut ctx = SimCtx { + input_manager, cell_manager: &mut self.cell_manager, rb_manager: &mut self.rb_manager, particle_manager: &mut self.particle_manager, @@ -162,21 +165,21 @@ impl SimManager { .tick(&mut self.cell_manager, delta_time); } - pub fn update(&mut self, config: &Config, delta_time: f32) { + pub fn update(&mut self, config: &Config, input_manager: &InputManager, delta_time: f32) { let now = Instant::now(); let secs_since_last_cell_update = (now - self.last_cell_update).as_secs_f32(); let expected_secs_since_last_cell_update = 1.0 / SIM_FPS as f32; self.last_cell_update = now; if self.paused && self.ignore_pause_next_tick { - self.cell_update(config, delta_time); + self.cell_update(config, input_manager, delta_time); } else if !self.paused { self.cell_updates_due += secs_since_last_cell_update / expected_secs_since_last_cell_update; let mut cell_updates_done = 0; // don't ever update more than 3 times per frame, or else we can get a pseudo deadlock while self.cell_updates_due >= 1.0 && cell_updates_done < 3 { - self.cell_update(config, delta_time); + self.cell_update(config, input_manager, delta_time); self.cell_updates_due -= 1.0; cell_updates_done += 1; } @@ -189,14 +192,14 @@ impl SimManager { self.last_physics_update = now; if self.paused && self.ignore_pause_next_tick { - self.physics_update(PHYSICS_DELTA_TIME); + self.physics_update(input_manager, PHYSICS_DELTA_TIME); } else if !self.paused { self.physics_updates_due += secs_since_last_physics_update / expected_secs_since_last_physics_update; let mut updates_done = 0; // don't ever update more than 3 times per frame, or else we can get a pseudo deadlock while self.physics_updates_due >= 1.0 && updates_done < 3 { - self.physics_update(PHYSICS_DELTA_TIME); + self.physics_update(input_manager, PHYSICS_DELTA_TIME); self.physics_updates_due -= 1.0; updates_done += 1; } diff --git a/src/sim/sim_manager/utils.rs b/src/sim/sim_manager/utils.rs index 413e709..506844c 100644 --- a/src/sim/sim_manager/utils.rs +++ b/src/sim/sim_manager/utils.rs @@ -9,11 +9,7 @@ fn write_entity_to_world(sim: &mut SimManager, entity_id: EntityId) -> Vec<(u8, let mut cells_written: Vec<(u8, u8, i32, i32)> = Vec::new(); if let Some(entity) = sim.entities.get(&entity_id) && let Some(cells) = &entity.data.cells - && let Some((pos, (cos, sin))) = entity.data.transform(&super::SimCtx { - cell_manager: &mut sim.cell_manager, - rb_manager: &mut sim.rb_manager, - particle_manager: &mut sim.particle_manager, - }) + && let Some((pos, (cos, sin))) = entity.data._transform(&sim.rb_manager) { let (half_size_x, half_size_y) = (cells.size.x as f32 / 2.0, cells.size.y as f32 / 2.0); // half-extent of the rotated grid's axis-aligned bounding box, plus a cell of margin |
