summaryrefslogtreecommitdiff
path: root/src/sim/cell_sim/world.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-16 17:29:42 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-16 17:29:42 -0700
commitf177cc716c5f2aa5b50b14ccbb421de89e3a7854 (patch)
treedb06f9f44251d6d90e5e9709d47e6cc4397b9443 /src/sim/cell_sim/world.rs
parent40e9d818195824749293dff3afcfdd5c1432adbe (diff)
wip
Diffstat (limited to 'src/sim/cell_sim/world.rs')
-rw-r--r--src/sim/cell_sim/world.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/sim/cell_sim/world.rs b/src/sim/cell_sim/world.rs
new file mode 100644
index 0000000..924639a
--- /dev/null
+++ b/src/sim/cell_sim/world.rs
@@ -0,0 +1,69 @@
+use fxhash::FxHashMap;
+
+use crate::{
+ config::CHUNK_SIZE,
+ sim::{cell::cell::Cell, cell_sim::chunk::Chunk},
+};
+
+pub struct World {
+ pub chunks: Vec<Chunk>,
+ // TODO FxFxHashMap?
+ pub chunk_position_to_chunk_idx: FxHashMap<(i32, i32), usize>,
+}
+
+impl World {
+ #[inline]
+ pub fn split_game_position(x: i32, y: i32) -> ((i32, i32), (u8, u8)) {
+ (
+ (
+ // TODO is this cast expensive?
+ 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)) = World::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)) = World::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 from_default_size() -> Self {
+ let mut world = World {
+ 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
+ }
+}