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