diff --git a/crates/common/src/chunks.rs b/crates/common/src/chunks.rs index 0f366b4..0f897f1 100644 --- a/crates/common/src/chunks.rs +++ b/crates/common/src/chunks.rs @@ -14,28 +14,6 @@ pub const CHUNK_SIZE_I32: i32 = CHUNK_SIZE as i32; pub const CHUNK_SIZE_F32: f32 = CHUNK_SIZE as f32; pub const CHUNK_SIZE_F64: f64 = CHUNK_SIZE as f64; -#[derive(Default, Clone)] -pub enum Chunk { - #[default] - Empty, - Array3(Box), -} - -impl fmt::Debug for Chunk { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Chunk::Empty => write!(f, "Chunk::Empty"), - Chunk::Array3(_) => write!(f, "Chunk::Array3"), - } - } -} - -impl From for Chunk { - fn from(chunk: Array3Chunk) -> Self { - Chunk::Array3(Box::new(chunk)) - } -} - /// Chunk represented as a 3D array of [`MappedBlockID`]. #[derive(Clone, PartialEq, Eq, Hash)] pub struct Array3Chunk { diff --git a/crates/common/src/world.rs b/crates/common/src/world.rs index 290525d..d0359b4 100644 --- a/crates/common/src/world.rs +++ b/crates/common/src/world.rs @@ -4,7 +4,7 @@ use std::num::NonZeroU8; use linearize::Linearize; use strum::EnumIter; -use crate::chunks::{Chunk, CHUNK_SIZE, CHUNK_SIZE_F32, CHUNK_SIZE_I32}; +use crate::chunks::{Array3Chunk, CHUNK_SIZE, CHUNK_SIZE_F32, CHUNK_SIZE_I32}; use crate::zoom::ZoomLevel; /// Chunks work with [`MappedBlockID`]s (u8s), which correspond to [`crate::blocks::BlockID`]s (strings). @@ -38,7 +38,8 @@ impl MappedBlockID { } pub trait WorldGen { - fn get(&self, pos: &ChunkPosition, zoom_level: ZoomLevel) -> Chunk; + /// Should return `None` for empty chunks. + fn get(&self, pos: &ChunkPosition, zoom_level: ZoomLevel) -> Option; } /// Position of a block within a chunk. diff --git a/crates/extras/src/worldgen/flat.rs b/crates/extras/src/worldgen/flat.rs index 0a34df2..c099fc8 100644 --- a/crates/extras/src/worldgen/flat.rs +++ b/crates/extras/src/worldgen/flat.rs @@ -1,5 +1,5 @@ use infinigen_common::blocks::Palette; -use infinigen_common::chunks::Chunk; +use infinigen_common::chunks::Array3Chunk; use infinigen_common::world::{ChunkPosition, MappedBlockID, WorldGen}; use infinigen_common::zoom::ZoomLevel; @@ -20,12 +20,12 @@ impl From for Flat { } impl WorldGen for Flat { - fn get(&self, pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Chunk { + fn get(&self, pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Option { // zoom level does not change anything if pos.y == -1 { - infinigen_common::chunks::top_chunk(self.dirt).into() + Some(infinigen_common::chunks::top_chunk(self.dirt)) } else { - Chunk::Empty + None } } } diff --git a/crates/extras/src/worldgen/mountain_islands.rs b/crates/extras/src/worldgen/mountain_islands.rs index 7dfb9f7..7c7721b 100644 --- a/crates/extras/src/worldgen/mountain_islands.rs +++ b/crates/extras/src/worldgen/mountain_islands.rs @@ -1,5 +1,5 @@ use infinigen_common::blocks::Palette; -use infinigen_common::chunks::{Array3Chunk, Chunk, CHUNK_SIZE, CHUNK_SIZE_F64, CHUNK_USIZE}; +use infinigen_common::chunks::{Array3Chunk, CHUNK_SIZE, CHUNK_SIZE_F64, CHUNK_USIZE}; use infinigen_common::world::{ BlockPosition, ChunkPosition, MappedBlockID, WorldGen, WorldPosition, }; @@ -81,9 +81,9 @@ const MIN_Y_HEIGHT: i32 = -6; /// Based on impl WorldGen for MountainIslands { - fn get(&self, pos: &ChunkPosition, zoom_level: ZoomLevel) -> Chunk { + fn get(&self, pos: &ChunkPosition, zoom_level: ZoomLevel) -> Option { if pos.y < MIN_Y_HEIGHT { - return Chunk::Empty; + return None; } let zoom = zoom_level.as_f64(); let sand_level = (SEA_LEVEL + (1. / zoom)).floor(); @@ -134,7 +134,7 @@ impl WorldGen for MountainIslands { } } if is_empty { - return Chunk::Empty; + return None; } let mut terrain_variances = [[0.; CHUNK_USIZE]; CHUNK_USIZE]; @@ -193,10 +193,10 @@ impl WorldGen for MountainIslands { } if is_empty { - return Chunk::Empty; + return None; } } - chunk.into() + Some(chunk) } } diff --git a/crates/extras/src/worldgen/single_block.rs b/crates/extras/src/worldgen/single_block.rs index 9509a61..a6b3801 100644 --- a/crates/extras/src/worldgen/single_block.rs +++ b/crates/extras/src/worldgen/single_block.rs @@ -1,5 +1,5 @@ use infinigen_common::blocks::Palette; -use infinigen_common::chunks::{Array3Chunk, Chunk, CHUNK_SIZE}; +use infinigen_common::chunks::{Array3Chunk, CHUNK_SIZE}; use infinigen_common::world::{BlockPosition, ChunkPosition, MappedBlockID, WorldGen}; use infinigen_common::zoom::ZoomLevel; @@ -20,7 +20,7 @@ impl From for SingleBlock { } impl WorldGen for SingleBlock { - fn get(&self, _pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Chunk { + fn get(&self, _pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Option { // TODO: implement zoom? let mut chunk = Array3Chunk::default(); chunk.insert( @@ -31,6 +31,6 @@ impl WorldGen for SingleBlock { }, self.grass, ); - chunk.into() + Some(chunk) } } diff --git a/crates/plugins/src/world/events.rs b/crates/plugins/src/world/events.rs index 62a9fdc..701e843 100644 --- a/crates/plugins/src/world/events.rs +++ b/crates/plugins/src/world/events.rs @@ -5,7 +5,7 @@ use ahash::AHashMap; use bevy::prelude::*; use bevy::tasks::{block_on, poll_once, AsyncComputeTaskPool, Task}; use infinigen_common::blocks::BlockVisibility; -use infinigen_common::chunks::{Array3Chunk, Chunk, CHUNK_SIZE}; +use infinigen_common::chunks::{Array3Chunk, CHUNK_SIZE}; use infinigen_common::mesh::faces::{extract_faces, BlockVisibilityChecker}; use infinigen_common::world::{BlockPosition, ChunkPosition, MappedBlockID, WorldGen}; use infinigen_common::zoom::ZoomLevel; @@ -72,16 +72,16 @@ pub fn generate_chunk_async( let position = position.to_owned(); task_pool.spawn(async move { let chunk = worldgen.get(&position, zoom_level); - let Chunk::Array3(mut chunk) = chunk else { + let Some(mut chunk) = chunk else { return (zoom_level, position, None); }; - let faces = extract_faces(chunk.as_ref(), *visibility_checker.clone()); + let faces = extract_faces(&chunk, *visibility_checker.clone()); let translucents = split_out_translucent(&mut chunk, *visibility_checker); ( zoom_level, position, Some(ChunkInfo { - opaque: chunk, + opaque: Box::new(chunk), faces, translucents: translucents.into_values().collect(), }), diff --git a/crates/plugins/src/world/mod.rs b/crates/plugins/src/world/mod.rs index a90bade..e843558 100644 --- a/crates/plugins/src/world/mod.rs +++ b/crates/plugins/src/world/mod.rs @@ -4,7 +4,7 @@ use ahash::AHashMap; use bevy::prelude::*; use events::{GenerateChunkRequest, GenerateChunkTask}; use infinigen_common::blocks::Palette; -use infinigen_common::chunks::{Array3Chunk, Chunk}; +use infinigen_common::chunks::Array3Chunk; use infinigen_common::mesh::shapes::ChunkFace; use infinigen_common::world::{ChunkPosition, Direction, WorldGen}; use infinigen_common::zoom::ZoomLevel; @@ -38,8 +38,8 @@ impl Default for World { fn default() -> Self { struct Empty; impl WorldGen for Empty { - fn get(&self, _pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Chunk { - Chunk::Empty + fn get(&self, _pos: &ChunkPosition, _zoom_level: ZoomLevel) -> Option { + None } } Self { @@ -50,7 +50,7 @@ impl Default for World { } impl World { - pub fn generate(&self, zoom_level: ZoomLevel, pos: &ChunkPosition) -> Chunk { + pub fn generate(&self, zoom_level: ZoomLevel, pos: &ChunkPosition) -> Option { self.generator.get(pos, zoom_level) } }