diff --git a/src/game/mod.rs b/src/game/mod.rs index 5ff5bed..1403fde 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -82,30 +82,36 @@ impl Game { // Chunk position if self.prev_chunk_pos == None || self.prev_chunk_pos != Some(chunk_pos) { renderer.get_ui().set_text("World", 2, format!("Chunk: {}, {}, {}", chunk_pos.x, chunk_pos.y, chunk_pos.z)); - - let dir = chunk_pos - self.prev_chunk_pos.unwrap_or(chunk_pos); //TODO: clamp to -1,1 - if dir.x != 0 || dir.y != 0 || dir.z != 0 { + // Wait for previous chunks to be loaded before loading new ones + if !self.world.is_busy() { + let prev_chunk_pos = self.prev_chunk_pos.unwrap_or(chunk_pos); + let mut dir = chunk_pos - prev_chunk_pos; + dir.x = dir.x.clamp(-1, 1); + dir.y = dir.y.clamp(-1, 1); + dir.z = dir.z.clamp(-1, 1); - // Shift world - renderer.shift(dir * world::chunk::SIZE as i32); - - // Load chunks at the edge - let center = chunk_pos.clone() + RENDER_DIST*dir; - let mask = Vector3{x: dir.x.abs(), y: dir.y.abs(), z: dir.z.abs()}; - println!("Load at {:?}", center); - - for a in -RENDER_DIST..RENDER_DIST+1 { - let pos = center + Vector3{x: mask.z*a, y: 0, z: mask.x*a}; - self.world.load_chunk(pos); + if dir.x != 0 || dir.y != 0 || dir.z != 0 { + // Shift world + renderer.shift(dir * world::chunk::SIZE as i32); + // Load chunks at the edge + let center = chunk_pos.clone() + RENDER_DIST*dir; + let mask = Vector3{x: dir.x.abs(), y: dir.y.abs(), z: dir.z.abs()}; + for a in -RENDER_DIST..RENDER_DIST+1 { + let pos = center + Vector3{x: mask.z*a, y: 0, z: mask.x*a}; + self.world.load_chunk(pos); + } } + + self.prev_chunk_pos = Some(prev_chunk_pos+dir); } - self.prev_chunk_pos = Some(chunk_pos); } + // Receives chunks from workers + self.world.update(); + // Send dirty chunks to renderer // TODO: Unload chunks above certain radius - self.world.update(); for (pos, chunk) in self.world.all_chunks() { if chunk.dirty { chunk.write_to(renderer, pos * world::chunk::SIZE as i32); diff --git a/src/game/world/mod.rs b/src/game/world/mod.rs index 041a4c7..5177e3c 100644 --- a/src/game/world/mod.rs +++ b/src/game/world/mod.rs @@ -22,6 +22,7 @@ pub struct World { data: WorldData, loader: ChunkLoader, chunks: HashMap, WorldChunk>, + busy: u32 } impl World { @@ -31,18 +32,24 @@ impl World { data: WorldData { name: name.clone(), ..Default::default() }, loader: ChunkLoader::new(name.clone()), chunks: HashMap::new(), + busy: 0, }; instance.load_metadata(); instance.save_all(); instance } + pub fn is_busy(&self) -> bool { + self.busy > 0 + } + /* * Receives loaded chunks from ChunkLoader */ pub fn update(&mut self) { for (pos, chunk) in self.loader.receive() { self.chunks.insert(pos, chunk); + self.busy -= 1; } } @@ -51,6 +58,7 @@ impl World { */ pub fn load_chunk(&mut self, pos: Vector3) { self.loader.load(pos); + self.busy += 1; } /*