Add simplex based noise generation

main
copygirl 6 days ago
parent aaab14f0f4
commit 9306dff82e
  1. 7
      Cargo.lock
  2. 1
      Cargo.toml
  3. 20
      src/bloxel/worldgen/mod.rs

7
Cargo.lock generated

@ -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"

@ -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"

@ -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::<IVec3>::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);
}
}
}

Loading…
Cancel
Save