chunkgen 0.2.0

Minecraft world generation library
Documentation
use crate::util::rng::RandomSource;

use super::noise_stack::{Noise, NoiseStack};
use super::perlin_noise::PerlinNoise;

pub fn create_for_legacy_nether_biome(
    random: &mut RandomSource,
    first_octave: i32,
    amplitudes: &[f64],
) -> NoiseStack {
    let octaves = amplitudes.len() as i32;
    let zero_octave_index = -first_octave;
    let mut noise_levels: Vec<Option<PerlinNoise>> = vec![None; octaves as usize];
    let zero_octave = PerlinNoise::new(random);
    if zero_octave_index >= 0 && zero_octave_index < octaves {
        let amplitude = amplitudes[zero_octave_index as usize];
        if amplitude != 0.0 {
            noise_levels[zero_octave_index as usize] = Some(zero_octave);
        }
    }

    let mut i = zero_octave_index - 1;
    while i >= 0 {
        if i < octaves {
            if amplitudes[i as usize] != 0.0 {
                noise_levels[i as usize] = Some(PerlinNoise::new(random));
            } else {
                random.consume_count(262);
            }
        } else {
            random.consume_count(262);
        }
        i -= 1;
    }

    assert!(
        noise_levels.iter().filter(|n| n.is_some()).count()
            == amplitudes.iter().filter(|a| **a != 0.0).count(),
        "Failed to create correct number of noise levels for given non-zero amplitudes"
    );
    assert!(
        zero_octave_index >= octaves - 1,
        "Positive octaves are temporarily disabled"
    );

    let mut factor = 2.0f64.powf(-f64::from(zero_octave_index));
    let mut value_factor =
        2.0f64.powf(f64::from(octaves - 1)) / (2.0f64.powf(f64::from(octaves)) - 1.0);
    let mut stack = NoiseStack::builder();
    for (i, noise) in noise_levels.into_iter().enumerate() {
        if let Some(noise) = noise {
            stack = stack.add(
                Noise::Perlin(noise),
                factor,
                (value_factor * amplitudes[i]) as f32,
            );
        }
        factor *= 2.0;
        value_factor /= 2.0;
    }
    stack.build()
}