Pumpkin/pumpkin-world/src/generation/noise/router.rs
Alexander Medvedev ee485056fb rename pumpkin-core to pumpkin-util
I see that there is an confusion between the pumpkin-core crate,  People often think that this is the most important one
2025-01-09 13:12:57 +01:00

797 lines
30 KiB
Rust

use std::sync::{Arc, LazyLock};
use crate::generation::{
noise::density::{
apply_blend_density,
basic::RangeFunction,
built_in_density_function::{
CAVES_ENTRANCES_OVERWORLD, CAVES_NOODLE_OVERWORLD, CONTINENTS_OVERWORLD,
CONTINENTS_OVERWORLD_LARGE_BIOME, EROSION_OVERWORLD, EROSION_OVERWORLD_LARGE_BIOME,
RIDGES_OVERWORLD, Y,
},
vertical_range_choice,
},
ore_sampler::vein_type,
};
use super::{
built_in_noise_params,
density::{
basic::{ConstantFunction, WrapperFunction, WrapperType, YClampedFunction},
built_in_density_function::{
CAVES_PILLARS_OVERWORLD, CAVES_SPAGHETTI_2D_OVERWORLD,
CAVES_SPAGHETTI_ROUGHNESS_FUNCTION_OVERWORLD, DEPTH_OVERWORLD,
DEPTH_OVERWORLD_AMPLIFIED, DEPTH_OVERWORLD_LARGE_BIOME, FACTOR_OVERWORLD,
FACTOR_OVERWORLD_AMPLIFIED, FACTOR_OVERWORLD_LARGE_BIOME, SHIFT_X, SHIFT_Z,
SLOPED_CHEESE_OVERWORLD, SLOPED_CHEESE_OVERWORLD_AMPLIFIED,
SLOPED_CHEESE_OVERWORLD_LARGE_BIOME, ZERO,
},
component_functions::{
ComponentReference, ComponentReferenceMap, ComponentReferenceMath, ConverterImpl,
DensityFunctionEnvironment, NoEnvironment, SharedComponentReference,
},
lerp_density_static_start,
noise::{InternalNoise, NoiseFunction, ShiftedNoiseFunction},
},
};
pub static OVERWORLD_NOISE_ROUTER: LazyLock<BaseRouter> =
LazyLock::new(|| BaseRouter::create_surface_noise_router(false, false));
pub static OVERWORLD_NOISE_ROUTER_LARGE: LazyLock<BaseRouter> =
LazyLock::new(|| BaseRouter::create_surface_noise_router(true, false));
pub static OVERWORLD_NOISE_ROUTER_AMPLIFIED: LazyLock<BaseRouter> =
LazyLock::new(|| BaseRouter::create_surface_noise_router(false, true));
pub struct BaseRouter {
pub(crate) barrier: SharedComponentReference,
pub(crate) fluid_level_floodedness: SharedComponentReference,
pub(crate) fluid_level_spread: SharedComponentReference,
pub(crate) lava: SharedComponentReference,
pub(crate) temperature: SharedComponentReference,
pub(crate) vegetation: SharedComponentReference,
pub(crate) continents: SharedComponentReference,
pub(crate) erosion: SharedComponentReference,
pub(crate) depth: SharedComponentReference,
pub(crate) ridges: SharedComponentReference,
pub(crate) internal_density: SharedComponentReference,
pub(crate) final_density: SharedComponentReference,
pub(crate) vein_toggle: SharedComponentReference,
pub(crate) vein_ridged: SharedComponentReference,
pub(crate) vein_gap: SharedComponentReference,
}
// TODO: This is double indirection... can we do something about that?
pub struct NoiseRouter<E: DensityFunctionEnvironment> {
pub(crate) barrier: Box<dyn ComponentReference<E>>,
pub(crate) fluid_level_floodedness: Box<dyn ComponentReference<E>>,
pub(crate) fluid_level_spread: Box<dyn ComponentReference<E>>,
pub(crate) lava: Box<dyn ComponentReference<E>>,
pub(crate) temperature: Box<dyn ComponentReference<E>>,
pub(crate) vegetation: Box<dyn ComponentReference<E>>,
pub(crate) continents: Box<dyn ComponentReference<E>>,
pub(crate) erosion: Box<dyn ComponentReference<E>>,
pub(crate) depth: Box<dyn ComponentReference<E>>,
pub(crate) ridges: Box<dyn ComponentReference<E>>,
pub(crate) internal_density: Box<dyn ComponentReference<E>>,
pub(crate) final_density: Box<dyn ComponentReference<E>>,
pub(crate) vein_toggle: Box<dyn ComponentReference<E>>,
pub(crate) vein_ridged: Box<dyn ComponentReference<E>>,
pub(crate) vein_gap: Box<dyn ComponentReference<E>>,
}
impl BaseRouter {
pub fn convert_assert_shared(
&self,
converter: &mut dyn ConverterImpl<NoEnvironment>,
) -> BaseRouter {
BaseRouter {
barrier: self.barrier.clone().convert(converter).assert_shared(),
fluid_level_floodedness: self
.fluid_level_floodedness
.clone()
.convert(converter)
.assert_shared(),
fluid_level_spread: self
.fluid_level_spread
.clone()
.convert(converter)
.assert_shared(),
lava: self.lava.clone().convert(converter).assert_shared(),
temperature: self.temperature.clone().convert(converter).assert_shared(),
vegetation: self.vegetation.clone().convert(converter).assert_shared(),
continents: self.continents.clone().convert(converter).assert_shared(),
erosion: self.erosion.clone().convert(converter).assert_shared(),
depth: self.depth.clone().convert(converter).assert_shared(),
ridges: self.ridges.clone().convert(converter).assert_shared(),
internal_density: self
.internal_density
.clone()
.convert(converter)
.assert_shared(),
final_density: self
.final_density
.clone()
.convert(converter)
.assert_shared(),
vein_toggle: self.vein_toggle.clone().convert(converter).assert_shared(),
vein_ridged: self.vein_ridged.clone().convert(converter).assert_shared(),
vein_gap: self.vein_gap.clone().convert(converter).assert_shared(),
}
}
pub fn convert<E: DensityFunctionEnvironment>(
&self,
converter: &mut dyn ConverterImpl<E>,
) -> NoiseRouter<E> {
NoiseRouter {
barrier: self.barrier.clone().convert(converter).boxed(),
fluid_level_floodedness: self
.fluid_level_floodedness
.clone()
.convert(converter)
.boxed(),
fluid_level_spread: self.fluid_level_spread.clone().convert(converter).boxed(),
lava: self.lava.clone().convert(converter).boxed(),
temperature: self.temperature.clone().convert(converter).boxed(),
vegetation: self.vegetation.clone().convert(converter).boxed(),
continents: self.continents.clone().convert(converter).boxed(),
erosion: self.erosion.clone().convert(converter).boxed(),
depth: self.depth.clone().convert(converter).boxed(),
ridges: self.ridges.clone().convert(converter).boxed(),
internal_density: self.internal_density.clone().convert(converter).boxed(),
final_density: self.final_density.clone().convert(converter).boxed(),
vein_toggle: self.vein_toggle.clone().convert(converter).boxed(),
vein_ridged: self.vein_ridged.clone().convert(converter).boxed(),
vein_gap: self.vein_gap.clone().convert(converter).boxed(),
}
}
}
impl BaseRouter {
pub fn create_surface_noise_router(large_biomes: bool, amplified: bool) -> Self {
#[cfg(debug_assertions)]
assert!(!(large_biomes && amplified));
let aquifier_barrier = NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::AQUIFER_BARRIER,
None,
)),
1f64,
0.5f64,
);
let aquifier_fluid_level_floodedness = NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::AQUIFER_FLUID_LEVEL_FLOODEDNESS,
None,
)),
1f64,
0.67f64,
);
let aquifer_fluid_level_spread = NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::AQUIFER_FLUID_LEVEL_SPREAD,
None,
)),
1f64,
0.7142857142857143f64,
);
let aquifer_lava = NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::AQUIFER_LAVA,
None,
)),
1f64,
1f64,
);
let temperature = ShiftedNoiseFunction::<
NoEnvironment,
SharedComponentReference,
SharedComponentReference,
SharedComponentReference,
>::new(
SHIFT_X.clone(),
ZERO.clone(),
SHIFT_Z.clone(),
0.25f64,
0f64,
Arc::new(InternalNoise::new(
if large_biomes {
&built_in_noise_params::TEMPERATURE_LARGE
} else {
&built_in_noise_params::TEMPERATURE
},
None,
)),
);
let vegetation = ShiftedNoiseFunction::<
NoEnvironment,
SharedComponentReference,
SharedComponentReference,
SharedComponentReference,
>::new(
SHIFT_X.clone(),
ZERO.clone(),
SHIFT_Z.clone(),
0.25f64,
0f64,
Arc::new(InternalNoise::new(
if large_biomes {
&built_in_noise_params::VEGETATION_LARGE
} else {
&built_in_noise_params::VEGETATION
},
None,
)),
);
let factor_overworld = if large_biomes {
FACTOR_OVERWORLD_LARGE_BIOME.clone()
} else if amplified {
FACTOR_OVERWORLD_AMPLIFIED.clone()
} else {
FACTOR_OVERWORLD.clone()
};
let depth_overworld = if large_biomes {
DEPTH_OVERWORLD_LARGE_BIOME.clone()
} else if amplified {
DEPTH_OVERWORLD_AMPLIFIED.clone()
} else {
DEPTH_OVERWORLD.clone()
};
let mapped_depth_overworld = ConstantFunction::new(4f64).mul(
depth_overworld
.clone()
.mul(
WrapperFunction::<NoEnvironment, SharedComponentReference>::new(
factor_overworld,
WrapperType::Cache2D,
)
.into(),
)
.quarter_negative(),
);
let sloped_cheese_overworld = if large_biomes {
SLOPED_CHEESE_OVERWORLD_LARGE_BIOME.clone()
} else if amplified {
SLOPED_CHEESE_OVERWORLD_AMPLIFIED.clone()
} else {
SLOPED_CHEESE_OVERWORLD.clone()
};
let cave_entrances_overworld = sloped_cheese_overworld
.clone()
.min(ConstantFunction::new(5f64).mul(CAVES_ENTRANCES_OVERWORLD.clone()));
let mapped_cave_entrances_overworld = RangeFunction::<
NoEnvironment,
SharedComponentReference,
SharedComponentReference,
SharedComponentReference,
>::new(
sloped_cheese_overworld.clone(),
-1000000f64,
1.5625f64,
cave_entrances_overworld,
create_caves(sloped_cheese_overworld),
);
let blended_cave_entrances_overworld = apply_blend_density(apply_surface_slides(
amplified,
mapped_cave_entrances_overworld.into(),
))
.min(CAVES_NOODLE_OVERWORLD.clone());
let i = vein_type::MIN_Y;
let j = vein_type::MAX_Y;
let ore_veininess = vertical_range_choice(
Y.clone(),
NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::ORE_VEININESS,
None,
)),
1.5f64,
1.5f64,
)
.into(),
i,
j,
0,
);
let ore_vein_a = vertical_range_choice(
Y.clone(),
NoiseFunction::new(
Arc::new(InternalNoise::new(&built_in_noise_params::ORE_VEIN_A, None)),
4f64,
4f64,
)
.into(),
i,
j,
0,
)
.abs();
let ore_vein_b = vertical_range_choice(
Y.clone(),
NoiseFunction::new(
Arc::new(InternalNoise::new(&built_in_noise_params::ORE_VEIN_B, None)),
4f64,
4f64,
)
.into(),
i,
j,
0,
)
.abs();
let ore_vein = ConstantFunction::new(-0.08f32 as f64).add(ore_vein_a.max(ore_vein_b));
let ore_gap = NoiseFunction::new(
Arc::new(InternalNoise::new(&built_in_noise_params::ORE_GAP, None)),
1f64,
1f64,
);
Self {
barrier: aquifier_barrier.into(),
fluid_level_floodedness: aquifier_fluid_level_floodedness.into(),
fluid_level_spread: aquifer_fluid_level_spread.into(),
lava: aquifer_lava.into(),
temperature: temperature.into(),
vegetation: vegetation.into(),
continents: if large_biomes {
CONTINENTS_OVERWORLD_LARGE_BIOME.clone()
} else {
CONTINENTS_OVERWORLD.clone()
},
erosion: if large_biomes {
EROSION_OVERWORLD_LARGE_BIOME.clone()
} else {
EROSION_OVERWORLD.clone()
},
depth: depth_overworld,
ridges: RIDGES_OVERWORLD.clone(),
internal_density: apply_surface_slides(
amplified,
mapped_depth_overworld
.add_const(-0.703125f64)
.clamp(-64f64, 64f64),
),
final_density: blended_cave_entrances_overworld,
vein_toggle: ore_veininess,
vein_ridged: ore_vein,
vein_gap: ore_gap.into(),
}
}
}
fn apply_surface_slides(
amplified: bool,
density: SharedComponentReference,
) -> SharedComponentReference {
apply_slides(
density,
-64,
384,
if amplified { 16 } else { 80 },
if amplified { 0 } else { 64 },
-0.078125f64,
0,
24,
if amplified { 0.4f64 } else { 0.1171875f64 },
)
}
#[allow(clippy::too_many_arguments)]
fn apply_slides(
density: SharedComponentReference,
y_min: i32,
y_max: i32,
top_rel_y_min: i32,
top_rel_y_max: i32,
top_density: f64,
bottom_rel_y_min: i32,
bottom_rel_y_max: i32,
bottom_density: f64,
) -> SharedComponentReference {
let function2 = YClampedFunction::new(
y_min + y_max - top_rel_y_min,
y_min + y_max - top_rel_y_max,
1f64,
0f64,
);
let function = lerp_density_static_start(function2.into(), top_density, density);
let function3 = YClampedFunction::new(
y_min + bottom_rel_y_min,
y_min + bottom_rel_y_max,
0f64,
1f64,
);
lerp_density_static_start(function3.into(), bottom_density, function)
}
fn create_caves(sloped_cheese: SharedComponentReference) -> SharedComponentReference {
let cave_layer = NoiseFunction::new(
Arc::new(InternalNoise::new(&built_in_noise_params::CAVE_LAYER, None)),
1f64,
8f64,
);
let scaled_cave_layer = ConstantFunction::new(4f64).mul(cave_layer.square());
let cave_cheese = NoiseFunction::new(
Arc::new(InternalNoise::new(
&built_in_noise_params::CAVE_CHEESE,
None,
)),
1f64,
0.6666666666666666f64,
);
let scaled_cave_cheese = ConstantFunction::new(0.27f64)
.add(cave_cheese.into())
.clamp(-1f64, 1f64)
.add(
ConstantFunction::new(1.5f64)
.add(ConstantFunction::new(-0.64f64).mul(sloped_cheese))
.clamp(0f64, 0.5f64),
);
let final_cave_layer = scaled_cave_layer.add(scaled_cave_cheese);
let cave_entrances = final_cave_layer.min(CAVES_ENTRANCES_OVERWORLD.clone()).min(
CAVES_SPAGHETTI_2D_OVERWORLD
.clone()
.add(CAVES_SPAGHETTI_ROUGHNESS_FUNCTION_OVERWORLD.clone()),
);
let scaled_pillars = RangeFunction::<
NoEnvironment,
SharedComponentReference,
SharedComponentReference,
SharedComponentReference,
>::new(
CAVES_PILLARS_OVERWORLD.clone(),
-1000000f64,
0.03f64,
ConstantFunction::new(-1000000f64).into(),
CAVES_PILLARS_OVERWORLD.clone(),
);
cave_entrances.max(scaled_pillars.into())
}
#[cfg(test)]
mod test {
use std::{fs, path::Path, sync::Arc};
use pumpkin_util::{
assert_eq_delta,
random::{legacy_rand::LegacyRand, xoroshiro128::Xoroshiro, RandomDeriver, RandomImpl},
};
use crate::{
generation::noise::{
config::LegacyChunkNoiseVisitor,
density::{
built_in_density_function::{EROSION_OVERWORLD, SLOPED_CHEESE_OVERWORLD},
component_functions::{
ComponentReference, ComponentReferenceImplementation, ConversionResultPre,
ConverterEnvironment, ConverterImpl, NoEnvironment, OwnedConverterEnvironment,
},
noise::InternalNoise,
NoisePos, UnblendedNoisePos,
},
perlin::DoublePerlinNoiseSampler,
router::OVERWORLD_NOISE_ROUTER,
},
read_data_from_file,
};
use super::{apply_surface_slides, create_caves};
pub struct TestConverter {
pub splitter: RandomDeriver,
}
impl ConverterImpl<NoEnvironment> for TestConverter {
fn convert_noise(&mut self, noise: &Arc<InternalNoise>) -> Option<Arc<InternalNoise>> {
let id = noise.parameters.id();
let mut rand = self.splitter.split_string(id);
let sampler = DoublePerlinNoiseSampler::new(&mut rand, noise.parameters, false);
Some(Arc::new(InternalNoise::new(
noise.parameters,
Some(sampler),
)))
}
fn convert_env_pre_internal(
&mut self,
_component: ConverterEnvironment<NoEnvironment>,
) -> ConversionResultPre<NoEnvironment> {
ConversionResultPre::Default
}
fn converts_post_internal(
&mut self,
_component: ConverterEnvironment<NoEnvironment>,
) -> bool {
false
}
fn convert_env_post_internal(
&mut self,
_component: OwnedConverterEnvironment<NoEnvironment>,
) -> ComponentReferenceImplementation<NoEnvironment> {
unreachable!()
}
}
#[test]
fn test_apply_surface_slides() {
let mut rand = LegacyRand::from_seed(0);
let splitter = rand.next_splitter();
let mut converter = TestConverter {
splitter: RandomDeriver::Legacy(splitter),
};
let converted_func = EROSION_OVERWORLD
.clone()
.convert(&mut converter)
.assert_shared();
let values = [
((-1000, -1000), -0.30208879996359317f64),
((-1000, -800), -0.1076130122697041f64),
((-1000, -600), 0.05906607850421469f64),
((-1000, -400), 0.24726986724384714f64),
((-1000, -200), 0.2706794457383526f64),
((-1000, 0), 0.2697306747800193f64),
((-1000, 200), 0.21391910117663293f64),
((-1000, 400), 0.18535143299569468f64),
((-1000, 600), 0.1294413488921486f64),
((-1000, 800), 0.061580256900142794f64),
((-1000, 1000), 0.12530753721310528f64),
((-800, -1000), -0.26334816753858103f64),
((-800, -800), -0.020687744964915544f64),
((-800, -600), 0.023225727811309105f64),
((-800, -400), 0.07746776104719977f64),
((-800, -200), 0.09992470719841956f64),
((-800, 0), 0.1146551050894824f64),
((-800, 200), 0.06564485641223794f64),
((-800, 400), 0.08848851954273917f64),
((-800, 600), 0.056160953033021266f64),
((-800, 800), 0.011045253253628817f64),
((-800, 1000), 0.015198372445202502f64),
((-600, -1000), -0.16525687371490894f64),
((-600, -800), 0.05293810125583154f64),
((-600, -600), 0.17475689197213684f64),
((-600, -400), 0.16103184321844596f64),
((-600, -200), 0.04702586800266029f64),
((-600, 0), 0.008498755101605193f64),
((-600, 200), -0.05632912234656379f64),
((-600, 400), -0.03331984537443711f64),
((-600, 600), -0.15304483622814935f64),
((-600, 800), -0.10634904956802882f64),
((-600, 1000), -0.10145702807865031f64),
((-400, -1000), 0.014509904002985907f64),
((-400, -800), 0.1617721780377955f64),
((-400, -600), 0.1538795562844772f64),
((-400, -400), 0.09291099527948621f64),
((-400, -200), 0.016032945505656093f64),
((-400, 0), -0.12944528371858455f64),
((-400, 200), -0.22407726246974746f64),
((-400, 400), -0.18164279264712324f64),
((-400, 600), -0.15374226930846258f64),
((-400, 800), -0.14225372340399312f64),
((-400, 1000), -0.1707662008691604f64),
((-200, -1000), 0.1737449324031909f64),
((-200, -800), 0.15588767399915038f64),
((-200, -600), 0.09807388580637255f64),
((-200, -400), 0.04134584798831298f64),
((-200, -200), 0.07633793620513718f64),
((-200, 0), -0.16636855652213256f64),
((-200, 200), -0.13472373172620833f64),
((-200, 400), -0.22022531422260827f64),
((-200, 600), -0.1733817125721101f64),
((-200, 800), -0.25850640558184435f64),
((-200, 1000), -0.3016979165025152f64),
((0, -1000), 0.251814304135237f64),
((0, -800), 0.13332966941629143f64),
((0, -600), 0.10348476729023426f64),
((0, -400), 0.05536479756994106f64),
((0, -200), -0.01381233701693424f64),
((0, 0), -0.19098385460723655f64),
((0, 200), -0.2404237434218891f64),
((0, 400), -0.2610517555168873f64),
((0, 600), -0.2903199404423026f64),
((0, 800), -0.3374524245257239f64),
((0, 1000), -0.46305810978001316f64),
((200, -1000), 0.28709965377682267f64),
((200, -800), 0.19268673409560028f64),
((200, -600), 0.0041189472733734744f64),
((200, -400), -0.047481063682935865f64),
((200, -200), -0.17715255198738433f64),
((200, 0), -0.2656740328018877f64),
((200, 200), -0.38846940763264115f64),
((200, 400), -0.3771208707257109f64),
((200, 600), -0.42164320098305474f64),
((200, 800), -0.45957304404559196f64),
((200, 1000), -0.3886247688972352f64),
((400, -1000), 0.2946831456942509f64),
((400, -800), 0.15366391689596104f64),
((400, -600), -0.03683895527138398f64),
((400, -400), -0.12286969762482891f64),
((400, -200), -0.279692934897965f64),
((400, 0), -0.3299116026613176f64),
((400, 200), -0.4397636078519035f64),
((400, 400), -0.5016687095505773f64),
((400, 600), -0.4593088249355858f64),
((400, 800), -0.4120918663615397f64),
((400, 1000), -0.33349227727910835f64),
((600, -1000), 0.22507430288840974f64),
((600, -800), 0.11690723489828847f64),
((600, -600), -0.07736959302795038f64),
((600, -400), -0.3103436858126015f64),
((600, -200), -0.4646135074970098f64),
((600, 0), -0.42802179309528376f64),
((600, 200), -0.5031234101517712f64),
((600, 400), -0.43980110641169434f64),
((600, 600), -0.418150522213239f64),
((600, 800), -0.2858012217898377f64),
((600, 1000), -0.2078009597778817f64),
((800, -1000), 0.02646235055281687f64),
((800, -800), -0.0025711457048024355f64),
((800, -600), -0.22091967015314884f64),
((800, -400), -0.36062363978247114f64),
((800, -200), -0.5267644629903612f64),
((800, 0), -0.5221952728781099f64),
((800, 200), -0.5583524962468077f64),
((800, 400), -0.6064703416700034f64),
((800, 600), -0.42124877767264723f64),
((800, 800), -0.41023710661537083f64),
((800, 1000), -0.31011231029109043f64),
((1000, -1000), -0.13246158771459038f64),
((1000, -800), -0.21539115619228733f64),
((1000, -600), -0.2583347168279443f64),
((1000, -400), -0.3998592325985889f64),
((1000, -200), -0.5387601014248653f64),
((1000, 0), -0.5666190345839045f64),
((1000, 200), -0.6213722075094567f64),
((1000, 400), -0.671739773000314f64),
((1000, 600), -0.6238217558734026f64),
((1000, 800), -0.49441693548204757f64),
((1000, 1000), -0.3843933568068797f64),
];
let amplified = apply_surface_slides(true, converted_func);
for ((x, z), value) in values {
let pos = &NoisePos::Unblended(UnblendedNoisePos::new(x, 60, z));
assert_eq!(amplified.sample(pos), value);
}
}
#[test]
fn test_normal_surface_functions() {
let pos = &NoisePos::Unblended(UnblendedNoisePos::new(0, 0, 0));
assert_eq!(OVERWORLD_NOISE_ROUTER.barrier.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.fluid_level_floodedness.sample(pos),
0f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.fluid_level_spread.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.lava.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.temperature.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.vegetation.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.continents.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.erosion.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.depth.sample(pos),
0.3962499722838402f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.ridges.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.internal_density.sample(pos),
8.093466727565826f64
);
assert_eq!(
OVERWORLD_NOISE_ROUTER.final_density.sample(pos),
-0.07500000000000001f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_toggle.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.vein_ridged.sample(pos),
-0.07999999821186066f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_gap.sample(pos), 0f64);
let pos = &NoisePos::Unblended(UnblendedNoisePos::new(0, 60, 0));
assert_eq!(OVERWORLD_NOISE_ROUTER.barrier.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.fluid_level_floodedness.sample(pos),
0f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.fluid_level_spread.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.lava.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.temperature.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.vegetation.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.continents.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.erosion.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.depth.sample(pos),
-0.07250002771615982f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.ridges.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.internal_density.sample(pos),
-1.105492942375168f64
);
assert_eq!(
OVERWORLD_NOISE_ROUTER.final_density.sample(pos),
-0.15607060320915436f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_toggle.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.vein_ridged.sample(pos),
-0.07999999821186066f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_gap.sample(pos), 0f64);
let pos = &NoisePos::Unblended(UnblendedNoisePos::new(0, 120, 0));
assert_eq!(OVERWORLD_NOISE_ROUTER.barrier.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.fluid_level_floodedness.sample(pos),
0f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.fluid_level_spread.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.lava.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.temperature.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.vegetation.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.continents.sample(pos), 0f64);
assert_eq!(OVERWORLD_NOISE_ROUTER.erosion.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.depth.sample(pos),
-0.5412500277161598f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.ridges.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.internal_density.sample(pos),
-3.7070088166417925f64
);
assert_eq!(
OVERWORLD_NOISE_ROUTER.final_density.sample(pos),
-0.4583333333333333f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_toggle.sample(pos), 0f64);
assert_eq!(
OVERWORLD_NOISE_ROUTER.vein_ridged.sample(pos),
-0.07999999821186066f64
);
assert_eq!(OVERWORLD_NOISE_ROUTER.vein_gap.sample(pos), 0f64);
}
#[test]
fn test_converted_cave() {
let mut rand = Xoroshiro::from_seed(0);
let mut converter =
LegacyChunkNoiseVisitor::new(RandomDeriver::Xoroshiro(rand.next_splitter()), 0);
let expected_data: Vec<(i32, i32, i32, f64)> =
read_data_from_file!("../../../assets/converted_cave_7_4.json");
let function = create_caves(SLOPED_CHEESE_OVERWORLD.clone())
.maybe_convert(&mut converter)
.unwrap()
.assert_shared();
for (x, y, z, sample) in expected_data {
let pos = NoisePos::Unblended(UnblendedNoisePos::new(x, y, z));
assert_eq_delta!(function.sample(&pos), sample, f64::EPSILON);
}
}
}