use single seeder instance

This commit is contained in:
griffi-gh 2024-05-04 13:50:58 +02:00
parent b665d1c004
commit 877e603fed
7 changed files with 16 additions and 18 deletions

View file

@ -48,7 +48,7 @@ impl SeedThingy {
} }
} }
trait WorldGenStep { trait WorldGenStep {
fn initialize(generator: &WorldGenerator) -> Self; fn initialize(generator: &WorldGenerator, seeder: &mut SeedThingy) -> Self;
fn generate(&mut self, generator: &mut WorldGenerator); fn generate(&mut self, generator: &mut WorldGenerator);
} }
@ -67,11 +67,12 @@ macro_rules! run_steps {
if _chkabt() { return false } if _chkabt() { return false }
let mut _seeder = $crate::worldgen::SeedThingy::new($gen.seed);
$({ $({
let _ensure_ref: &mut $crate::worldgen::WorldGenerator = $gen; let _ensure_ref: &mut $crate::worldgen::WorldGenerator = $gen;
struct _Ensure0<T: $crate::worldgen::WorldGenStep>(T); struct _Ensure0<T: $crate::worldgen::WorldGenStep>(T);
type _Ensure1 = _Ensure0<$step>; type _Ensure1 = _Ensure0<$step>;
let mut step: _Ensure1 = _Ensure0(<$step>::initialize(&*_ensure_ref)); let mut step: _Ensure1 = _Ensure0(<$step>::initialize(&*_ensure_ref, &mut _seeder));
if _chkabt() { return false } if _chkabt() { return false }
step.0.generate(_ensure_ref); step.0.generate(_ensure_ref);
if _chkabt() { return false } if _chkabt() { return false }

View file

@ -8,8 +8,7 @@ pub struct TerrainStep {
} }
impl WorldGenStep for TerrainStep { impl WorldGenStep for TerrainStep {
fn initialize(generator: &WorldGenerator) -> Self { fn initialize(_: &WorldGenerator, seeder: &mut SeedThingy) -> Self {
let mut seeder = SeedThingy::new(generator.seed);
let mut noise = FastNoiseLite::with_seed(seeder.next_seed()); let mut noise = FastNoiseLite::with_seed(seeder.next_seed());
noise.set_fractal_type(Some(FractalType::FBm)); noise.set_fractal_type(Some(FractalType::FBm));
noise.set_fractal_octaves(Some(4)); noise.set_fractal_octaves(Some(4));

View file

@ -1,5 +1,5 @@
use glam::ivec3; use glam::ivec3;
use crate::{block::Block, chunk::CHUNK_SIZE}; use crate::{block::Block, chunk::CHUNK_SIZE, worldgen::SeedThingy};
use super::super::{WorldGenerator, WorldGenStep}; use super::super::{WorldGenerator, WorldGenStep};
pub const WATER_LEVEL: i32 = 0; pub const WATER_LEVEL: i32 = 0;
@ -7,7 +7,7 @@ pub const WATER_LEVEL: i32 = 0;
pub struct WaterStep; pub struct WaterStep;
impl WorldGenStep for WaterStep { impl WorldGenStep for WaterStep {
fn initialize(_: &WorldGenerator) -> Self { Self } fn initialize(_: &WorldGenerator, _: &mut SeedThingy) -> Self { Self }
fn generate(&mut self, gen: &mut WorldGenerator) { fn generate(&mut self, gen: &mut WorldGenerator) {
for x in 0..CHUNK_SIZE as i32 { for x in 0..CHUNK_SIZE as i32 {
for z in 0..CHUNK_SIZE as i32 { for z in 0..CHUNK_SIZE as i32 {

View file

@ -9,9 +9,7 @@ pub struct CaveStep {
} }
impl WorldGenStep for CaveStep { impl WorldGenStep for CaveStep {
fn initialize(gen: &WorldGenerator) -> Self { fn initialize(_: &WorldGenerator, seeder: &mut SeedThingy) -> Self {
let mut seeder = SeedThingy::new(gen.seed);
let mut a = FastNoiseLite::with_seed(seeder.next_seed()); let mut a = FastNoiseLite::with_seed(seeder.next_seed());
a.set_fractal_type(Some(FractalType::FBm)); a.set_fractal_type(Some(FractalType::FBm));
a.set_fractal_octaves(Some(2)); a.set_fractal_octaves(Some(2));

View file

@ -1,5 +1,6 @@
use fastnoise_lite::FastNoiseLite;
use glam::ivec3; use glam::ivec3;
use crate::{block::Block, chunk::CHUNK_SIZE}; use crate::{block::Block, chunk::CHUNK_SIZE, worldgen::SeedThingy};
use super::{ use super::{
_02_water::WATER_LEVEL, _02_water::WATER_LEVEL,
super::{WorldGenStep, WorldGenerator} super::{WorldGenStep, WorldGenerator}
@ -8,7 +9,7 @@ use super::{
pub struct LayersStep; pub struct LayersStep;
impl WorldGenStep for LayersStep { impl WorldGenStep for LayersStep {
fn initialize(_: &WorldGenerator) -> Self { Self } fn initialize(_: &WorldGenerator, _: &mut SeedThingy) -> Self { Self }
fn generate(&mut self, gen: &mut WorldGenerator) { fn generate(&mut self, gen: &mut WorldGenerator) {
for x in 0..CHUNK_SIZE as i32 { for x in 0..CHUNK_SIZE as i32 {
@ -17,7 +18,7 @@ impl WorldGenStep for LayersStep {
// Dirt layer height, naturally gets thinner as height gets deeper // Dirt layer height, naturally gets thinner as height gets deeper
let mut dirt_layer_height = (((terrain_height as f32 + 15.) / 20.).clamp(0., 1.) * 8.).round() as i32; let mut dirt_layer_height = (((terrain_height as f32 + 15.) / 20.).clamp(0., 1.) * 8.).round() as i32;
dirt_layer_height -= (gen.seeded_hash((x, z, 1)) & 1) as i32; //+ (gen.seeded_hash((x, z, 0xbau8)) & 1) as i32; dirt_layer_height -= (gen.seeded_hash((x, z, 0x040)) & 1) as i32; //+ (gen.seeded_hash((x, z, 0x041)) & 1) as i32;
// Place dirt layer // Place dirt layer
for y in gen.local_height(terrain_height - dirt_layer_height)..gen.local_height(terrain_height) { for y in gen.local_height(terrain_height - dirt_layer_height)..gen.local_height(terrain_height) {

View file

@ -1,5 +1,5 @@
use glam::ivec3; use glam::ivec3;
use crate::{block::Block, chunk::CHUNK_SIZE}; use crate::{block::Block, chunk::CHUNK_SIZE, worldgen::SeedThingy};
use super::{ use super::{
_02_water::WATER_LEVEL, _02_water::WATER_LEVEL,
super::{WorldGenStep, WorldGenerator}, super::{WorldGenStep, WorldGenerator},
@ -8,7 +8,7 @@ use super::{
pub struct DecorateStep; pub struct DecorateStep;
impl WorldGenStep for DecorateStep { impl WorldGenStep for DecorateStep {
fn initialize(_: &WorldGenerator) -> Self { Self } fn initialize(_: &WorldGenerator, _: &mut SeedThingy) -> Self { Self }
fn generate(&mut self, gen: &mut WorldGenerator) { fn generate(&mut self, gen: &mut WorldGenerator) {
for x in 0..CHUNK_SIZE as i32 { for x in 0..CHUNK_SIZE as i32 {
@ -20,7 +20,7 @@ impl WorldGenStep for DecorateStep {
//Place tall grass //Place tall grass
if terrain_height >= WATER_LEVEL { if terrain_height >= WATER_LEVEL {
if let Some(local_y) = gen.local_y_position(terrain_height) { if let Some(local_y) = gen.local_y_position(terrain_height) {
if (gen.seeded_hash((global_xz.x, global_xz.z)) & 0xf) == 0xf { if (gen.seeded_hash((global_xz.x, global_xz.z, 0x050)) & 0xf) == 0xf {
gen.place_if_empty(ivec3(x, local_y, z), Block::TallGrass); gen.place_if_empty(ivec3(x, local_y, z), Block::TallGrass);
} }
} }

View file

@ -13,8 +13,7 @@ pub struct TreesStep {
} }
impl WorldGenStep for TreesStep { impl WorldGenStep for TreesStep {
fn initialize(gen: &WorldGenerator) -> Self { fn initialize(_: &WorldGenerator, seeder: &mut SeedThingy) -> Self {
let mut seeder = SeedThingy::new(gen.seed.rotate_left(5));
let mut density_noise = FastNoiseLite::with_seed(seeder.next_seed()); let mut density_noise = FastNoiseLite::with_seed(seeder.next_seed());
density_noise.set_noise_type(Some(NoiseType::OpenSimplex2)); density_noise.set_noise_type(Some(NoiseType::OpenSimplex2));
density_noise.set_frequency(Some(0.008)); density_noise.set_frequency(Some(0.008));
@ -30,7 +29,7 @@ impl WorldGenStep for TreesStep {
let global_xz = gen.global_position(ivec3(x, 0, z)); let global_xz = gen.global_position(ivec3(x, 0, z));
let mut density = self.density_noise.get_noise_2d(global_xz.x as f64, global_xz.z as f64) * 0.5 + 0.5; let mut density = self.density_noise.get_noise_2d(global_xz.x as f64, global_xz.z as f64) * 0.5 + 0.5;
density = density.powi(3); density = density.powi(3);
if gen.seeded_hash((global_xz.x, global_xz.z, 0xfef)) & 0xff >= (density * 7.).round() as u64 { if gen.seeded_hash((global_xz.x, global_xz.z, 0x060)) & 0xff >= (density * 7.).round() as u64 {
continue continue
} }