From 9306dff82ea4287924ea80c0d89f13161b0edf06 Mon Sep 17 00:00:00 2001 From: copygirl Date: Wed, 26 Mar 2025 20:46:41 +0100 Subject: [PATCH] Add simplex based noise generation --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/bloxel/worldgen/mod.rs | 20 ++++++++++++-------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0938636..7315946 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,6 +315,7 @@ version = "0.1.0" dependencies = [ "bevy", "bitvec", + "noise-functions", "overload", "rand 0.9.0", "zorder", @@ -2836,6 +2837,12 @@ dependencies = [ "libc", ] +[[package]] +name = "noise-functions" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3420c74fd988a5c7da54fad9b8dba218f15431833817913d252dc59002c199c5" + [[package]] name = "nom" version = "7.1.3" diff --git a/Cargo.toml b/Cargo.toml index f079b61..f6d6f42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ opt-level = 3 [dependencies] bevy = { version = "0.15.3", features = [ "file_watcher", "embedded_watcher" ] } bitvec = "1.0.1" +noise-functions = "0.8.1" overload = "0.1.1" rand = "0.9.0" zorder = "0.2.2" diff --git a/src/bloxel/worldgen/mod.rs b/src/bloxel/worldgen/mod.rs index a9a14bf..15ffccc 100644 --- a/src/bloxel/worldgen/mod.rs +++ b/src/bloxel/worldgen/mod.rs @@ -1,5 +1,5 @@ use bevy::prelude::*; -use rand::prelude::*; +use noise_functions::{Noise, Simplex}; use crate::{ bloxel::{ @@ -111,9 +111,6 @@ fn generate_terrain( return; }; - let mut rng = rand::rng(); - let random_blocks = [terrain.grass, terrain.dirt, terrain.rock, terrain.sand]; - for (entity, chunk_pos) in chunks_without_data.iter() { let mut data = ChunkData::new(terrain.air); let size = data.size().as_ivec3(); @@ -122,10 +119,17 @@ fn generate_terrain( for x in 0..size.x { let relative = IVec3::new(x, y, z); let block_pos = chunk_pos.to_block_pos(relative); - let chance = (-block_pos.y as f64 / 32.).clamp(0., 1.); - if rng.random_bool(chance) { - let block = *random_blocks.choose(&mut rng).unwrap(); - data.set(relative, block); + let float_pos = Into::::into(block_pos).as_vec3(); + + let bias = ((float_pos.y + 32.) / 64.).clamp(-0.25, 1.); + let sample = Simplex + .fbm(3, 0.65, 2.0) + .weighted(0.4) + .frequency(0.01) + .sample3(float_pos); + + if sample > bias { + data.set(relative, terrain.rock); } } }