diff --git a/Cargo.toml b/Cargo.toml index ed02bf1..4650fbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ env_logger = "0.10" strum = { version = "0.24", features = ["derive"] } glam = { version = "0.22", features = ["debug-glam-assert", "mint", "fast-math"] } hashbrown = "0.13" -simdnoise = "3.1" +noise = "0.8" rayon = "1.6" [features] diff --git a/src/game/world/thread/world_gen.rs b/src/game/world/thread/world_gen.rs index faac7b2..34a403f 100644 --- a/src/game/world/thread/world_gen.rs +++ b/src/game/world/thread/world_gen.rs @@ -1,32 +1,34 @@ -use glam::IVec2; -use simdnoise::NoiseBuilder; +use glam::{Vec2, DVec2, IVec2}; +use noise::{NoiseFn, Perlin, Simplex, Fbm, Seedable}; use crate::game::{ world::chunk::{ChunkData, CHUNK_SIZE, CHUNK_HEIGHT}, blocks::Block }; -const TERRAIN_HEIGHT_MIN: f32 = 64.; -const TERRAIN_HEIGHT_MAX: f32 = 80.; +const HEIGHTMAP_SCALE: f64 = 0.004; +const TERRAIN_HEIGHT_MIN: f64 = 64.; +const TERRAIN_HEIGHT_MAX: f64 = 80.; pub fn generate_chunk(position: IVec2, seed: u32) -> ChunkData { let world_xz = position.as_vec2() * CHUNK_SIZE as f32; let mut chunk = Box::new([[[Block::Air; CHUNK_SIZE]; CHUNK_HEIGHT]; CHUNK_SIZE]); //generate noises - let height_noise = NoiseBuilder::fbm_2d_offset(world_xz.x, CHUNK_SIZE, world_xz.y, CHUNK_SIZE) - .with_freq(0.025) - .with_octaves(4) - .with_seed(seed as i32) - .generate_scaled(TERRAIN_HEIGHT_MIN, TERRAIN_HEIGHT_MAX); - + let mut terrain_base_fbm: Fbm = Fbm::new(seed); + terrain_base_fbm.octaves = 6; + //put everything together for x in 0..CHUNK_SIZE { for z in 0..CHUNK_SIZE { - let heightmap = height_noise[x + z * CHUNK_SIZE] as usize; - for y in 0..heightmap { + let point = world_xz.as_dvec2() + DVec2::from_array([x as f64, z as f64]); + + let heightmap = (terrain_base_fbm.get((point * HEIGHTMAP_SCALE).to_array()) + 1.) / 2.; + //generate basic terrain + let terain_height = (TERRAIN_HEIGHT_MIN + (heightmap * TERRAIN_HEIGHT_MAX)).floor() as usize; + for y in 0..terain_height { chunk[x][y][z] = Block::Dirt; } - chunk[x][heightmap][z] = Block::Grass; + chunk[x][terain_height][z] = Block::Grass; } }