From 37c83ffb7f64cf56623652ca7a91db0c77f20059 Mon Sep 17 00:00:00 2001 From: copygirl Date: Tue, 3 Jun 2025 00:07:40 +0200 Subject: [PATCH] Worldgen consts and slices --- src/bloxel/worldgen/mod.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/bloxel/worldgen/mod.rs b/src/bloxel/worldgen/mod.rs index 9e84fdb..24a3980 100644 --- a/src/bloxel/worldgen/mod.rs +++ b/src/bloxel/worldgen/mod.rs @@ -10,6 +10,10 @@ use crate::{ TerrainBlocks, }; +const LOAD_DISTANCE: usize = 12; +const UNLOAD_DISTANCE: usize = 16; +const CHUNKS_PER_ITERATION: usize = 12; + pub struct WorldGenPlugin; impl Plugin for WorldGenPlugin { @@ -52,13 +56,14 @@ fn create_chunks_around_camera( create_chunk(&mut octree, chunk_pos); } + let sqr_load_distance = (LOAD_DISTANCE * LOAD_DISTANCE) as i32; let to_create = octree .find(|node, exist| { (exist != Existing::All).then(|| -node.region().distance_to_squared(chunk_pos)) }) - .take_while(|(_, _, neg_sqr_distance)| *neg_sqr_distance > -(12 * 12)) + .take_while(|(_, _, neg_sqr_distance)| *neg_sqr_distance > -sqr_load_distance) .map(|(chunk_pos, _, _)| chunk_pos) - .take(12) // Create up to 12 chunks per system iteration. + .take(CHUNKS_PER_ITERATION) // Create up to this many chunks per system iteration. .collect::>(); for chunk_pos in to_create { @@ -82,9 +87,10 @@ fn destroy_chunks_away_from_camera( a.max(b) }; + let sqr_unload_distance = (UNLOAD_DISTANCE * UNLOAD_DISTANCE) as i32; let to_destroy = octree .find(|node, exist| (exist != Existing::None).then(|| distance(node))) - .take_while(|(_, _, neg_sqr_distance)| *neg_sqr_distance > 16 * 16) + .take_while(|(_, _, sqr_distance)| *sqr_distance > sqr_unload_distance) .map(|(chunk_pos, _, _)| chunk_pos) .collect::>(); @@ -111,6 +117,8 @@ fn generate_terrain( return; }; + let slices = [terrain.rock, terrain.dirt, terrain.grass, terrain.sand]; + for (entity, chunk_pos) in chunks_without_data.iter() { let mut data = ChunkData::new(terrain.air); data.update(|relative, _| { @@ -125,7 +133,7 @@ fn generate_terrain( .sample3(float_pos); if sample > bias { - terrain.rock + slices[relative.y as usize % slices.len()] } else { terrain.air }