diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2026-08-22 15:00:35 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2026-08-22 15:00:35 -0700 |
| commit | 1a515237afb7ad09353a65f5fbc6e98a7c29ce8e (patch) | |
| tree | 48cd4b4bcf8f8e357811f905f22607838d7c1f96 /src/sim/cell_manager/manager.rs | |
| parent | 6350e4ffca8ce1e46465284ef3d7559e0f40229b (diff) | |
sim manager refactor
Diffstat (limited to 'src/sim/cell_manager/manager.rs')
| -rw-r--r-- | src/sim/cell_manager/manager.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/sim/cell_manager/manager.rs b/src/sim/cell_manager/manager.rs new file mode 100644 index 0000000..094f345 --- /dev/null +++ b/src/sim/cell_manager/manager.rs @@ -0,0 +1,76 @@ +use fxhash::FxHashMap; + +use crate::{ + config::CHUNK_SIZE, + sim::{ + cell::cell::Cell, + cell_manager::{chunk::Chunk, sim::sim_tick}, + }, +}; + +pub struct CellManager { + pub seqno: u64, + pub chunks: Vec<Chunk>, + // TODO FxFxHashMap? + pub chunk_position_to_chunk_idx: FxHashMap<(i32, i32), usize>, +} + +impl CellManager { + #[inline] + pub fn split_game_position(x: i32, y: i32) -> ((i32, i32), (u8, u8)) { + ( + (x.div_euclid(CHUNK_SIZE), y.div_euclid(CHUNK_SIZE)), + ( + x.rem_euclid(CHUNK_SIZE) as u8, + y.rem_euclid(CHUNK_SIZE) as u8, + ), + ) + } + + // VERY EXPENSIVE + pub fn get_cell_from_game_position(&self, x: i32, y: i32) -> Option<Cell> { + let ((cx, cy), (dx, dy)) = CellManager::split_game_position(x, y); + self.chunk_position_to_chunk_idx + .get(&(cx, cy)) + .map(|&idx| self.chunks[idx].get_cell_at_local_position(dx, dy)) + } + + // VERY EXPENSIVE + pub fn set_cell_from_game_position(&mut self, x: i32, y: i32, cell: Cell, sleeping: bool) { + let ((cx, cy), (dx, dy)) = CellManager::split_game_position(x, y); + if let Some(&idx) = self.chunk_position_to_chunk_idx.get(&(cx, cy)) { + self.chunks[idx].set_cell_at_local_position(dx, dy, cell); + // this is a temporary hack + self.chunks[idx].sleeping = sleeping; + self.chunks[idx].needs_texture_update = true; + } + } + + pub fn insert(&mut self, x: i32, y: i32, chunk: Chunk) { + self.chunk_position_to_chunk_idx + .insert((x, y), self.chunks.len()); + self.chunks.push(chunk); + } + + pub fn tick(&mut self, use_threading: bool) { + let seqno = self.seqno; + sim_tick(self, seqno, use_threading); + self.seqno += 1; + } + + pub fn from_default_size() -> Self { + let mut world = CellManager { + seqno: 0, + chunks: Vec::new(), + chunk_position_to_chunk_idx: FxHashMap::default(), + }; + + for y in -10..1 { + for x in -100..100 { + world.insert(x, y, Chunk::void()); + } + } + + world + } +} |
