chore: parse double perlin noise samplers amplitude at compile time

This commit is contained in:
Alexander Medvedev 2026-04-29 16:08:21 +02:00
parent fdf8ff5fd8
commit 427df56935
10 changed files with 413 additions and 146 deletions

View File

@ -641,8 +641,6 @@ pub struct Block {
pub states: Vec<BlockState>, pub states: Vec<BlockState>,
/// Experience points dropped when the block is mined, if any. /// Experience points dropped when the block is mined, if any.
pub experience: Option<Experience>, pub experience: Option<Experience>,
/// Calculated property descriptors for the block.
pub property_descriptors: Vec<TokenStream>,
} }
impl ToTokens for Block { impl ToTokens for Block {
@ -685,7 +683,6 @@ impl ToTokens for Block {
} else { } else {
quote! { None } quote! { None }
}; };
let property_descriptors = &self.property_descriptors;
tokens.extend(quote! { tokens.extend(quote! {
Block { Block {
id: #id, id: #id,
@ -698,7 +695,6 @@ impl ToTokens for Block {
item_id: #item_id, item_id: #item_id,
default_state: &#default_state, default_state: &#default_state,
states: &[#(#states),*], states: &[#(#states),*],
properties: &[#(#property_descriptors),*],
flammable: #flammable, flammable: #flammable,
loot_table: #loot_table, loot_table: #loot_table,
experience: #experience, experience: #experience,
@ -898,11 +894,11 @@ pub fn build() -> TokenStream {
let id_lit = LitInt::new(&block.id.to_string(), Span::call_site()); let id_lit = LitInt::new(&block.id.to_string(), Span::call_site());
let item_id = block.item_id; let item_id = block.item_id;
let mut block_with_descriptors = block.clone(); // let mut block_with_descriptors = block.clone();
block_with_descriptors.property_descriptors = property_descriptors; // block_with_descriptors.property_descriptors = property_descriptors;
constants_list.push(quote! { constants_list.push(quote! {
pub const #const_ident: Block = #block_with_descriptors; pub const #const_ident: Block = #block;
}); });
type_from_raw_id_array.push((block.id, quote! { &Self::#const_ident })); type_from_raw_id_array.push((block.id, quote! { &Self::#const_ident }));

View File

@ -860,10 +860,24 @@ fn value_to_dpnp(v: &Value) -> TokenStream {
.as_array() .as_array()
.map(|a| a.iter().filter_map(|x| x.as_f64()).collect()) .map(|a| a.iter().filter_map(|x| x.as_f64()).collect())
.unwrap_or_default(); .unwrap_or_default();
let mut min_octave = i32::MAX;
let mut max_octave = i32::MIN;
for (index, amp) in amplitudes.iter().enumerate() {
if *amp != 0.0 {
min_octave = i32::min(min_octave, index as i32);
max_octave = i32::max(max_octave, index as i32);
}
}
let octaves = max_octave - min_octave;
let create_amp_val = 0.1f64 * (1.0f64 + 1.0f64 / (octaves + 1) as f64);
let final_amplitude = 0.16666666666666666f64 / create_amp_val;
quote! { quote! {
DoublePerlinNoiseParametersCodec { DoublePerlinNoiseParametersCodec {
first_octave: #first_octave, first_octave: #first_octave,
amplitudes: vec![#(#amplitudes),*], amplitudes: vec![#(#amplitudes),*],
amplitude: #final_amplitude,
} }
} }
} }

View File

@ -4,35 +4,55 @@ use proc_macro2::TokenStream;
use pumpkin_util::DoublePerlinNoiseParametersCodec; use pumpkin_util::DoublePerlinNoiseParametersCodec;
use quote::{format_ident, quote}; use quote::{format_ident, quote};
/// Generates the `TokenStream` for `DoublePerlinNoiseParameters` constants and its `id_to_parameters` lookup.
pub fn build() -> TokenStream { pub fn build() -> TokenStream {
let json: BTreeMap<String, DoublePerlinNoiseParametersCodec> = let json: BTreeMap<String, DoublePerlinNoiseParametersCodec> =
serde_json::from_str(&fs::read_to_string("../assets/noise_parameters.json").unwrap()) serde_json::from_str(&fs::read_to_string("../assets/noise_parameters.json").unwrap())
.expect("Failed to parse noise_parameters.json"); .expect("Failed to parse noise_parameters.json");
let mut variants = TokenStream::new(); let mut variants = TokenStream::new();
let mut match_variants = TokenStream::new(); let mut match_variants = TokenStream::new();
for (i, (raw_name, parameter)) in json.iter().enumerate() { for (i, (raw_name, parameter)) in json.iter().enumerate() {
let name = raw_name let name = raw_name.strip_prefix("minecraft:").unwrap().replace("/", "_");
.strip_prefix("minecraft:")
.unwrap()
.replace("/", "_");
let simple_id = name.clone();
let name_ident = format_ident!("{}", name.to_uppercase()); let name_ident = format_ident!("{}", name.to_uppercase());
let first_octave = parameter.first_octave;
// 1. MD5 Pre-calculation
let hash = md5::compute(raw_name.as_bytes());
let lo = u64::from_be_bytes(hash[0..8].try_into().unwrap());
let hi = u64::from_be_bytes(hash[8..16].try_into().unwrap());
// 2. Amplitude Pre-calculation
let amplitudes = &parameter.amplitudes; let amplitudes = &parameter.amplitudes;
let mut min_octave = i32::MAX;
let mut max_octave = i32::MIN;
for (index, amp) in amplitudes.iter().enumerate() {
if *amp != 0.0 {
min_octave = i32::min(min_octave, index as i32);
max_octave = i32::max(max_octave, index as i32);
}
}
// Equivalent to your create_amplitude logic
let octaves = max_octave - min_octave;
let create_amp_val = 0.1f64 * (1.0f64 + 1.0f64 / (octaves + 1) as f64);
let final_amplitude = 0.16666666666666666f64 / create_amp_val;
let first_octave = parameter.first_octave;
variants.extend([quote! { variants.extend([quote! {
pub const #name_ident: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const #name_ident: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
#i, #i,
#first_octave, #first_octave,
&[#(#amplitudes),*], &[#(#amplitudes),*],
#raw_name #lo,
#hi,
#final_amplitude
); );
}]); }]);
match_variants.extend([quote! { match_variants.extend([quote! {
#simple_id => &Self::#name_ident, #name => &Self::#name_ident,
}]); }]);
} }
let count = json.len(); let count = json.len();
@ -42,27 +62,28 @@ pub fn build() -> TokenStream {
pub id: usize, pub id: usize,
pub first_octave: i32, pub first_octave: i32,
pub amplitudes: &'static [f64], pub amplitudes: &'static [f64],
name: &'static str, pub lo: u64,
pub hi: u64,
pub amplitude: f64,
} }
impl DoublePerlinNoiseParameters { impl DoublePerlinNoiseParameters {
pub const COUNT: usize = #count; pub const COUNT: usize = #count;
pub const fn new(id: usize, first_octave: i32, amplitudes: &'static [f64], name: &'static str) -> Self { pub const fn new(
Self { id: usize,
id, first_octave: i32,
first_octave, amplitudes: &'static [f64],
amplitudes, lo: u64,
name hi: u64,
} amplitude: f64,
) -> Self {
Self { id, first_octave, amplitudes, lo, hi, amplitude }
} }
pub const fn name(&self) -> &'static str { pub fn id_to_parameters(id: &str) -> Option<&'static DoublePerlinNoiseParameters> {
self.name let id = id.strip_prefix("minecraft:").unwrap_or(id).replace("/", "_");
} Some(match id.as_str() {
pub fn id_to_parameters(id: &str) -> Option<&DoublePerlinNoiseParameters> {
Some(match id {
#match_variants #match_variants
_ => return None, _ => return None,
}) })
@ -70,6 +91,5 @@ pub fn build() -> TokenStream {
#variants #variants
} }
} }
} }

View File

@ -1868,6 +1868,7 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
noise: DoublePerlinNoiseParametersCodec { noise: DoublePerlinNoiseParametersCodec {
first_octave: 0i32, first_octave: 0i32,
amplitudes: vec![1f64], amplitudes: vec![1f64],
amplitude: 0.8333333333333333f64,
}, },
scale: 0.020833334f32, scale: 0.020833334f32,
}, },
@ -1898,6 +1899,7 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
noise: DoublePerlinNoiseParametersCodec { noise: DoublePerlinNoiseParametersCodec {
first_octave: -3i32, first_octave: -3i32,
amplitudes: vec![1f64], amplitudes: vec![1f64],
amplitude: 0.8333333333333333f64,
}, },
scale: 1f32, scale: 1f32,
}, },
@ -1924,6 +1926,7 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
slow_noise: DoublePerlinNoiseParametersCodec { slow_noise: DoublePerlinNoiseParametersCodec {
first_octave: -10i32, first_octave: -10i32,
amplitudes: vec![1f64], amplitudes: vec![1f64],
amplitude: 0.8333333333333333f64,
}, },
slow_scale: 1f64, slow_scale: 1f64,
}), }),
@ -1948,6 +1951,7 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
noise: DoublePerlinNoiseParametersCodec { noise: DoublePerlinNoiseParametersCodec {
first_octave: 0i32, first_octave: 0i32,
amplitudes: vec![1f64], amplitudes: vec![1f64],
amplitude: 0.8333333333333333f64,
}, },
scale: 0.005f32, scale: 0.005f32,
}, },

View File

@ -3,7 +3,9 @@ pub struct DoublePerlinNoiseParameters {
pub id: usize, pub id: usize,
pub first_octave: i32, pub first_octave: i32,
pub amplitudes: &'static [f64], pub amplitudes: &'static [f64],
name: &'static str, pub lo: u64,
pub hi: u64,
pub amplitude: f64,
} }
impl DoublePerlinNoiseParameters { impl DoublePerlinNoiseParameters {
pub const COUNT: usize = 62usize; pub const COUNT: usize = 62usize;
@ -11,20 +13,25 @@ impl DoublePerlinNoiseParameters {
id: usize, id: usize,
first_octave: i32, first_octave: i32,
amplitudes: &'static [f64], amplitudes: &'static [f64],
name: &'static str, lo: u64,
hi: u64,
amplitude: f64,
) -> Self { ) -> Self {
Self { Self {
id, id,
first_octave, first_octave,
amplitudes, amplitudes,
name, lo,
hi,
amplitude,
} }
} }
pub const fn name(&self) -> &'static str { pub fn id_to_parameters(id: &str) -> Option<&'static DoublePerlinNoiseParameters> {
self.name let id = id
} .strip_prefix("minecraft:")
pub fn id_to_parameters(id: &str) -> Option<&DoublePerlinNoiseParameters> { .unwrap_or(id)
Some(match id { .replace("/", "_");
Some(match id.as_str() {
"aquifer_barrier" => &Self::AQUIFER_BARRIER, "aquifer_barrier" => &Self::AQUIFER_BARRIER,
"aquifer_fluid_level_floodedness" => &Self::AQUIFER_FLUID_LEVEL_FLOODEDNESS, "aquifer_fluid_level_floodedness" => &Self::AQUIFER_FLUID_LEVEL_FLOODEDNESS,
"aquifer_fluid_level_spread" => &Self::AQUIFER_FLUID_LEVEL_SPREAD, "aquifer_fluid_level_spread" => &Self::AQUIFER_FLUID_LEVEL_SPREAD,
@ -90,89 +97,143 @@ impl DoublePerlinNoiseParameters {
_ => return None, _ => return None,
}) })
} }
pub const AQUIFER_BARRIER: DoublePerlinNoiseParameters = pub const AQUIFER_BARRIER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
DoublePerlinNoiseParameters::new(0usize, -3i32, &[1f64], "minecraft:aquifer_barrier"); 0usize,
-3i32,
&[1f64],
16244762748638791999u64,
1391399305011792652u64,
0.8333333333333333f64,
);
pub const AQUIFER_FLUID_LEVEL_FLOODEDNESS: DoublePerlinNoiseParameters = pub const AQUIFER_FLUID_LEVEL_FLOODEDNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
1usize, 1usize,
-7i32, -7i32,
&[1f64], &[1f64],
"minecraft:aquifer_fluid_level_floodedness", 1971819648764795038u64,
2506222294934710214u64,
0.8333333333333333f64,
); );
pub const AQUIFER_FLUID_LEVEL_SPREAD: DoublePerlinNoiseParameters = pub const AQUIFER_FLUID_LEVEL_SPREAD: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
2usize, 2usize,
-5i32, -5i32,
&[1f64], &[1f64],
"minecraft:aquifer_fluid_level_spread", 644356645385251490u64,
3919847117419490415u64,
0.8333333333333333f64,
);
pub const AQUIFER_LAVA: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
3usize,
-1i32,
&[1f64],
1031642243090684786u64,
2820617609049802170u64,
0.8333333333333333f64,
); );
pub const AQUIFER_LAVA: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(3usize, -1i32, &[1f64], "minecraft:aquifer_lava");
pub const BADLANDS_PILLAR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const BADLANDS_PILLAR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
4usize, 4usize,
-2i32, -2i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:badlands_pillar", 13493758258311752636u64,
3411659937350140381u64,
1.3333333333333333f64,
);
pub const BADLANDS_PILLAR_ROOF: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
5usize,
-8i32,
&[1f64],
7795723110176986287u64,
4566391624864518557u64,
0.8333333333333333f64,
); );
pub const BADLANDS_PILLAR_ROOF: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(5usize, -8i32, &[1f64], "minecraft:badlands_pillar_roof");
pub const BADLANDS_SURFACE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const BADLANDS_SURFACE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
6usize, 6usize,
-6i32, -6i32,
&[1f64, 1f64, 1f64], &[1f64, 1f64, 1f64],
"minecraft:badlands_surface", 18228034071625356340u64,
8308134076163360455u64,
1.25f64,
); );
pub const CALCITE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const CALCITE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
7usize, 7usize,
-9i32, -9i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:calcite", 4904593190305397776u64,
1211164448996192585u64,
1.3333333333333333f64,
); );
pub const CAVE_CHEESE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const CAVE_CHEESE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
8usize, 8usize,
-8i32, -8i32,
&[0.5f64, 1f64, 2f64, 1f64, 2f64, 1f64, 0f64, 2f64, 0f64], &[0.5f64, 1f64, 2f64, 1f64, 2f64, 1f64, 0f64, 2f64, 0f64],
"minecraft:cave_cheese", 12779255569999112784u64,
6029128391830109216u64,
1.4814814814814814f64,
); );
pub const CAVE_ENTRANCE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const CAVE_ENTRANCE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
9usize, 9usize,
-7i32, -7i32,
&[0.4f64, 0.5f64, 1f64], &[0.4f64, 0.5f64, 1f64],
"minecraft:cave_entrance", 17366031995758287461u64,
13627013544070811296u64,
1.25f64,
);
pub const CAVE_LAYER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
10usize,
-8i32,
&[1f64],
5620043451534219907u64,
6506268541312725510u64,
0.8333333333333333f64,
);
pub const CLAY_BANDS_OFFSET: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
11usize,
-8i32,
&[1f64],
7256644037753960286u64,
11158743614211970085u64,
0.8333333333333333f64,
); );
pub const CAVE_LAYER: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(10usize, -8i32, &[1f64], "minecraft:cave_layer");
pub const CLAY_BANDS_OFFSET: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(11usize, -8i32, &[1f64], "minecraft:clay_bands_offset");
pub const CONTINENTALNESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const CONTINENTALNESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
12usize, 12usize,
-9i32, -9i32,
&[1f64, 1f64, 2f64, 2f64, 2f64, 1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 2f64, 2f64, 2f64, 1f64, 1f64, 1f64, 1f64],
"minecraft:continentalness", 9477944837549565538u64,
12656866088844454061u64,
1.4999999999999998f64,
); );
pub const CONTINENTALNESS_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const CONTINENTALNESS_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
13usize, 13usize,
-11i32, -11i32,
&[1f64, 1f64, 2f64, 2f64, 2f64, 1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 2f64, 2f64, 2f64, 1f64, 1f64, 1f64, 1f64],
"minecraft:continentalness_large", 11114692157640599772u64,
17162581654990867885u64,
1.4999999999999998f64,
); );
pub const EROSION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const EROSION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
14usize, 14usize,
-9i32, -9i32,
&[1f64, 1f64, 0f64, 1f64, 1f64], &[1f64, 1f64, 0f64, 1f64, 1f64],
"minecraft:erosion", 14998273076172386264u64,
5157273775208757888u64,
1.3888888888888888f64,
); );
pub const EROSION_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const EROSION_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
15usize, 15usize,
-11i32, -11i32,
&[1f64, 1f64, 0f64, 1f64, 1f64], &[1f64, 1f64, 0f64, 1f64, 1f64],
"minecraft:erosion_large", 10130929960551098705u64,
16922189808605746015u64,
1.3888888888888888f64,
); );
pub const GRAVEL: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const GRAVEL: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
16usize, 16usize,
-8i32, -8i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:gravel", 1153479925840222391u64,
7756889976470315235u64,
1.3333333333333333f64,
); );
pub const GRAVEL_LAYER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const GRAVEL_LAYER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
17usize, 17usize,
@ -188,27 +249,41 @@ impl DoublePerlinNoiseParameters {
0f64, 0f64,
0.013333333333333334f64, 0.013333333333333334f64,
], ],
"minecraft:gravel_layer", 3700753923770560088u64,
5824949440647379577u64,
1.4999999999999998f64,
); );
pub const ICE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const ICE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
18usize, 18usize,
-4i32, -4i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:ice", 7994092977778472105u64,
16301997149661018038u64,
1.3333333333333333f64,
); );
pub const ICEBERG_PILLAR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const ICEBERG_PILLAR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
19usize, 19usize,
-6i32, -6i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:iceberg_pillar", 15167922125944621777u64,
9215064124946046309u64,
1.3333333333333333f64,
);
pub const ICEBERG_PILLAR_ROOF: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
20usize,
-3i32,
&[1f64],
6714001469876891169u64,
17524238621251302951u64,
0.8333333333333333f64,
); );
pub const ICEBERG_PILLAR_ROOF: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(20usize, -3i32, &[1f64], "minecraft:iceberg_pillar_roof");
pub const ICEBERG_SURFACE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const ICEBERG_SURFACE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
21usize, 21usize,
-6i32, -6i32,
&[1f64, 1f64, 1f64], &[1f64, 1f64, 1f64],
"minecraft:iceberg_surface", 13536647331807014343u64,
8721275689436799325u64,
1.25f64,
); );
pub const JAGGED: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const JAGGED: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
22usize, 22usize,
@ -217,89 +292,177 @@ impl DoublePerlinNoiseParameters {
1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64, 1f64,
1f64, 1f64, 1f64, 1f64,
], ],
"minecraft:jagged", 17943115692276099476u64,
8209175272455791875u64,
1.568627450980392f64,
); );
pub const NETHER_TEMPERATURE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const NETHER_TEMPERATURE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
23usize, 23usize,
-7i32, -7i32,
&[1f64, 1f64], &[1f64, 1f64],
"minecraft:nether/temperature", 4494007131265727292u64,
3789417001435421350u64,
1.111111111111111f64,
); );
pub const NETHER_VEGETATION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const NETHER_VEGETATION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
24usize, 24usize,
-7i32, -7i32,
&[1f64, 1f64], &[1f64, 1f64],
"minecraft:nether/vegetation", 10190642735749408132u64,
11065819044765107400u64,
1.111111111111111f64,
); );
pub const NETHER_STATE_SELECTOR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const NETHER_STATE_SELECTOR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
25usize, 25usize,
-4i32, -4i32,
&[1f64], &[1f64],
"minecraft:nether_state_selector", 5940456273400029989u64,
11258616162249557280u64,
0.8333333333333333f64,
); );
pub const NETHER_WART: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const NETHER_WART: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
26usize, 26usize,
-3i32, -3i32,
&[1f64, 0f64, 0f64, 0.9f64], &[1f64, 0f64, 0f64, 0.9f64],
"minecraft:nether_wart", 17703200590926175663u64,
17214184263581656775u64,
1.3333333333333333f64,
); );
pub const NETHERRACK: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const NETHERRACK: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
27usize, 27usize,
-3i32, -3i32,
&[1f64, 0f64, 0f64, 0.35f64], &[1f64, 0f64, 0f64, 0.35f64],
"minecraft:netherrack", 10355412640456601864u64,
11182414268062555835u64,
1.3333333333333333f64,
);
pub const NOODLE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
28usize,
-8i32,
&[1f64],
15149230821572338763u64,
7399974921363027187u64,
0.8333333333333333f64,
);
pub const NOODLE_RIDGE_A: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
29usize,
-7i32,
&[1f64],
9662238534792077350u64,
5361047657610944607u64,
0.8333333333333333f64,
);
pub const NOODLE_RIDGE_B: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
30usize,
-7i32,
&[1f64],
16943433826535595665u64,
224869257309605468u64,
0.8333333333333333f64,
);
pub const NOODLE_THICKNESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
31usize,
-8i32,
&[1f64],
3433040058802586130u64,
6882284535972731025u64,
0.8333333333333333f64,
); );
pub const NOODLE: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(28usize, -8i32, &[1f64], "minecraft:noodle");
pub const NOODLE_RIDGE_A: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(29usize, -7i32, &[1f64], "minecraft:noodle_ridge_a");
pub const NOODLE_RIDGE_B: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(30usize, -7i32, &[1f64], "minecraft:noodle_ridge_b");
pub const NOODLE_THICKNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(31usize, -8i32, &[1f64], "minecraft:noodle_thickness");
pub const OFFSET: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const OFFSET: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
32usize, 32usize,
-3i32, -3i32,
&[1f64, 1f64, 1f64, 0f64], &[1f64, 1f64, 1f64, 0f64],
"minecraft:offset", 577895406318539652u64,
4557074653038767061u64,
1.25f64,
);
pub const ORE_GAP: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
33usize,
-5i32,
&[1f64],
11262595240165106875u64,
13644046979728391006u64,
0.8333333333333333f64,
);
pub const ORE_VEIN_A: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
34usize,
-7i32,
&[1f64],
5537411705652647497u64,
14832111794027820525u64,
0.8333333333333333f64,
);
pub const ORE_VEIN_B: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
35usize,
-7i32,
&[1f64],
7720896042651600585u64,
12540131182595714753u64,
0.8333333333333333f64,
);
pub const ORE_VEININESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
36usize,
-8i32,
&[1f64],
7748099570268139889u64,
15600382243457734180u64,
0.8333333333333333f64,
); );
pub const ORE_GAP: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(33usize, -5i32, &[1f64], "minecraft:ore_gap");
pub const ORE_VEIN_A: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(34usize, -7i32, &[1f64], "minecraft:ore_vein_a");
pub const ORE_VEIN_B: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(35usize, -7i32, &[1f64], "minecraft:ore_vein_b");
pub const ORE_VEININESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(36usize, -8i32, &[1f64], "minecraft:ore_veininess");
pub const PACKED_ICE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const PACKED_ICE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
37usize, 37usize,
-7i32, -7i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:packed_ice", 6678935034624176163u64,
7587755929013049282u64,
1.3333333333333333f64,
); );
pub const PATCH: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const PATCH: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
38usize, 38usize,
-5i32, -5i32,
&[1f64, 0f64, 0f64, 0f64, 0f64, 0.013333333333333334f64], &[1f64, 0f64, 0f64, 0f64, 0f64, 0.013333333333333334f64],
"minecraft:patch", 17102750654369557799u64,
2432978389120904123u64,
1.4285714285714284f64,
);
pub const PILLAR: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
39usize,
-7i32,
&[1f64, 1f64],
15338975643228066631u64,
14751109933046868508u64,
1.111111111111111f64,
);
pub const PILLAR_RARENESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
40usize,
-8i32,
&[1f64],
10222445372526765264u64,
325922074234395002u64,
0.8333333333333333f64,
);
pub const PILLAR_THICKNESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
41usize,
-8i32,
&[1f64],
1884979804952342669u64,
14176101322839234188u64,
0.8333333333333333f64,
); );
pub const PILLAR: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(39usize, -7i32, &[1f64, 1f64], "minecraft:pillar");
pub const PILLAR_RARENESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(40usize, -8i32, &[1f64], "minecraft:pillar_rareness");
pub const PILLAR_THICKNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(41usize, -8i32, &[1f64], "minecraft:pillar_thickness");
pub const POWDER_SNOW: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const POWDER_SNOW: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
42usize, 42usize,
-6i32, -6i32,
&[1f64, 1f64, 1f64, 1f64], &[1f64, 1f64, 1f64, 1f64],
"minecraft:powder_snow", 8439957600881366575u64,
7128508063779685469u64,
1.3333333333333333f64,
); );
pub const RIDGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const RIDGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
43usize, 43usize,
-7i32, -7i32,
&[1f64, 2f64, 1f64, 0f64, 0f64, 0f64], &[1f64, 2f64, 1f64, 0f64, 0f64, 0f64],
"minecraft:ridge", 17278323085305457460u64,
2012804684704589034u64,
1.25f64,
); );
pub const SOUL_SAND_LAYER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const SOUL_SAND_LAYER: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
44usize, 44usize,
@ -315,85 +478,149 @@ impl DoublePerlinNoiseParameters {
0f64, 0f64,
0.013333333333333334f64, 0.013333333333333334f64,
], ],
"minecraft:soul_sand_layer", 12961541884992915651u64,
3334122176816136683u64,
1.4999999999999998f64,
);
pub const SPAGHETTI_2D: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
45usize,
-7i32,
&[1f64],
3779800575929599095u64,
3026987529072654797u64,
0.8333333333333333f64,
); );
pub const SPAGHETTI_2D: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(45usize, -7i32, &[1f64], "minecraft:spaghetti_2d");
pub const SPAGHETTI_2D_ELEVATION: DoublePerlinNoiseParameters = pub const SPAGHETTI_2D_ELEVATION: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
46usize, 46usize,
-8i32, -8i32,
&[1f64], &[1f64],
"minecraft:spaghetti_2d_elevation", 3016672669024775629u64,
6607299245856183467u64,
0.8333333333333333f64,
); );
pub const SPAGHETTI_2D_MODULATOR: DoublePerlinNoiseParameters = pub const SPAGHETTI_2D_MODULATOR: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
47usize, 47usize,
-11i32, -11i32,
&[1f64], &[1f64],
"minecraft:spaghetti_2d_modulator", 10799755704108864802u64,
158433782627262445u64,
0.8333333333333333f64,
); );
pub const SPAGHETTI_2D_THICKNESS: DoublePerlinNoiseParameters = pub const SPAGHETTI_2D_THICKNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
48usize, 48usize,
-11i32, -11i32,
&[1f64], &[1f64],
"minecraft:spaghetti_2d_thickness", 4027848931106223304u64,
16564638782843236028u64,
0.8333333333333333f64,
);
pub const SPAGHETTI_3D_1: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
49usize,
-7i32,
&[1f64],
11890980020316756032u64,
9461961156268492727u64,
0.8333333333333333f64,
);
pub const SPAGHETTI_3D_2: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
50usize,
-7i32,
&[1f64],
13377439611599507183u64,
15428434919931579075u64,
0.8333333333333333f64,
);
pub const SPAGHETTI_3D_RARITY: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
51usize,
-11i32,
&[1f64],
17169833707525350457u64,
13710596865147759916u64,
0.8333333333333333f64,
); );
pub const SPAGHETTI_3D_1: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(49usize, -7i32, &[1f64], "minecraft:spaghetti_3d_1");
pub const SPAGHETTI_3D_2: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(50usize, -7i32, &[1f64], "minecraft:spaghetti_3d_2");
pub const SPAGHETTI_3D_RARITY: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(51usize, -11i32, &[1f64], "minecraft:spaghetti_3d_rarity");
pub const SPAGHETTI_3D_THICKNESS: DoublePerlinNoiseParameters = pub const SPAGHETTI_3D_THICKNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
52usize, 52usize,
-8i32, -8i32,
&[1f64], &[1f64],
"minecraft:spaghetti_3d_thickness", 9907390455466502951u64,
17587734509872338347u64,
0.8333333333333333f64,
);
pub const SPAGHETTI_ROUGHNESS: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
53usize,
-5i32,
&[1f64],
8857832787093054865u64,
15318329311263287229u64,
0.8333333333333333f64,
); );
pub const SPAGHETTI_ROUGHNESS: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(53usize, -5i32, &[1f64], "minecraft:spaghetti_roughness");
pub const SPAGHETTI_ROUGHNESS_MODULATOR: DoublePerlinNoiseParameters = pub const SPAGHETTI_ROUGHNESS_MODULATOR: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new( DoublePerlinNoiseParameters::new(
54usize, 54usize,
-8i32, -8i32,
&[1f64], &[1f64],
"minecraft:spaghetti_roughness_modulator", 16254484819590729386u64,
14613561992896323587u64,
0.8333333333333333f64,
);
pub const SURFACE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
55usize,
-6i32,
&[1f64, 1f64, 1f64],
5417997184927261100u64,
17624099743590321640u64,
1.25f64,
); );
pub const SURFACE: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(55usize, -6i32, &[1f64, 1f64, 1f64], "minecraft:surface");
pub const SURFACE_SECONDARY: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const SURFACE_SECONDARY: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
56usize, 56usize,
-6i32, -6i32,
&[1f64, 1f64, 0f64, 1f64], &[1f64, 1f64, 0f64, 1f64],
"minecraft:surface_secondary", 2051559389371867033u64,
2317317634050931280u64,
1.3333333333333333f64,
);
pub const SURFACE_SWAMP: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
57usize,
-2i32,
&[1f64],
14388971182144335831u64,
1415522856927288170u64,
0.8333333333333333f64,
); );
pub const SURFACE_SWAMP: DoublePerlinNoiseParameters =
DoublePerlinNoiseParameters::new(57usize, -2i32, &[1f64], "minecraft:surface_swamp");
pub const TEMPERATURE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const TEMPERATURE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
58usize, 58usize,
-10i32, -10i32,
&[1.5f64, 0f64, 1f64, 0f64, 0f64, 0f64], &[1.5f64, 0f64, 1f64, 0f64, 0f64, 0f64],
"minecraft:temperature", 6664882324328353151u64,
17859146487254174088u64,
1.25f64,
); );
pub const TEMPERATURE_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const TEMPERATURE_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
59usize, 59usize,
-12i32, -12i32,
&[1.5f64, 0f64, 1f64, 0f64, 0f64, 0f64], &[1.5f64, 0f64, 1f64, 0f64, 0f64, 0f64],
"minecraft:temperature_large", 10685635038780148187u64,
5761303799458311062u64,
1.25f64,
); );
pub const VEGETATION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const VEGETATION: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
60usize, 60usize,
-8i32, -8i32,
&[1f64, 1f64, 0f64, 0f64, 0f64, 0f64], &[1f64, 1f64, 0f64, 0f64, 0f64, 0f64],
"minecraft:vegetation", 9348150263868561038u64,
17422373889327170509u64,
1.111111111111111f64,
); );
pub const VEGETATION_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new( pub const VEGETATION_LARGE: DoublePerlinNoiseParameters = DoublePerlinNoiseParameters::new(
61usize, 61usize,
-10i32, -10i32,
&[1f64, 1f64, 0f64, 0f64, 0f64, 0f64], &[1f64, 1f64, 0f64, 0f64, 0f64, 0f64],
"minecraft:vegetation_large", 8194488175179944705u64,
13502879989887892011u64,
1.111111111111111f64,
); );
} }

View File

@ -203,6 +203,8 @@ pub struct DoublePerlinNoiseParametersCodec {
pub first_octave: i32, pub first_octave: i32,
/// Amplitude values for each octave, determining the weight of each frequency layer. /// Amplitude values for each octave, determining the weight of each frequency layer.
pub amplitudes: Vec<f64>, pub amplitudes: Vec<f64>,
#[serde(skip)]
pub amplitude: f64,
} }
impl<T> IndexMut<usize> for MutableSplitSlice<'_, T> { impl<T> IndexMut<usize> for MutableSplitSlice<'_, T> {

View File

@ -147,6 +147,7 @@ impl DualNoiseBlockStateProvider {
&mut RandomGenerator::Legacy(LegacyRand::from_seed(self.base.base.seed as u64)), &mut RandomGenerator::Legacy(LegacyRand::from_seed(self.base.base.seed as u64)),
self.slow_noise.first_octave, self.slow_noise.first_octave,
&self.slow_noise.amplitudes, &self.slow_noise.amplitudes,
self.slow_noise.amplitude,
false, false,
); );
let slow_noise = let slow_noise =
@ -208,6 +209,7 @@ impl NoiseBlockStateProviderBase {
&mut RandomGenerator::Legacy(LegacyRand::from_seed(self.seed as u64)), &mut RandomGenerator::Legacy(LegacyRand::from_seed(self.seed as u64)),
self.noise.first_octave, self.noise.first_octave,
&self.noise.amplitudes, &self.noise.amplitudes,
self.noise.amplitude,
false, false,
); );
sampler.sample( sampler.sample(

View File

@ -18,12 +18,18 @@ use std::cmp::Ordering;
struct NormalNoise(crate::generation::noise::perlin::DoublePerlinNoiseSampler); struct NormalNoise(crate::generation::noise::perlin::DoublePerlinNoiseSampler);
impl NormalNoise { impl NormalNoise {
fn create(rand: &mut RandomGenerator, first_octave: i32, amplitudes: &[f64]) -> Self { fn create(
rand: &mut RandomGenerator,
first_octave: i32,
amplitudes: &[f64],
amplitude: f64,
) -> Self {
Self( Self(
crate::generation::noise::perlin::DoublePerlinNoiseSampler::new( crate::generation::noise::perlin::DoublePerlinNoiseSampler::new(
rand, rand,
first_octave, first_octave,
amplitudes, amplitudes,
amplitude,
true, true,
), ),
) )
@ -105,7 +111,7 @@ impl GeodeFeature {
) -> bool { ) -> bool {
let origin = pos; let origin = pos;
let num_points = self.distribution_points.get(random); let num_points = self.distribution_points.get(random);
let noise = NormalNoise::create(random, -4, &[1.0]); let noise = NormalNoise::create(random, -4, &[1.0], 0.8333333333333333f64);
// Precompute sets of raw block ids for fast lookups // Precompute sets of raw block ids for fast lookups
let mut invalid_raw_ids: HashSet<u16> = HashSet::new(); let mut invalid_raw_ids: HashSet<u16> = HashSet::new();

View File

@ -23,29 +23,25 @@ impl DoublePerlinNoiseSampler {
parameters: &DoublePerlinNoiseParameters, parameters: &DoublePerlinNoiseParameters,
legacy: bool, legacy: bool,
) -> Self { ) -> Self {
Self::new(rand, parameters.first_octave, parameters.amplitudes, legacy) Self::new(
rand,
parameters.first_octave,
parameters.amplitudes,
parameters.amplitude,
legacy,
)
} }
pub fn new( pub fn new(
rand: &mut impl RandomImpl, rand: &mut impl RandomImpl,
first_octave: i32, first_octave: i32,
amplitudes: &[f64], amplitudes: &[f64],
amplitude: f64,
legacy: bool, legacy: bool,
) -> Self { ) -> Self {
let first_sampler = OctavePerlinNoiseSampler::new(rand, first_octave, amplitudes, legacy); let first_sampler = OctavePerlinNoiseSampler::new(rand, first_octave, amplitudes, legacy);
let second_sampler = OctavePerlinNoiseSampler::new(rand, first_octave, amplitudes, legacy); let second_sampler = OctavePerlinNoiseSampler::new(rand, first_octave, amplitudes, legacy);
let mut j = i32::MAX;
let mut k = i32::MIN;
for (index, amplitude) in amplitudes.iter().enumerate() {
if *amplitude != 0f64 {
j = i32::min(j, index as i32);
k = i32::max(k, index as i32);
}
}
let amplitude = 0.16666666666666666f64 / Self::create_amplitude(k - j);
let max_value = (first_sampler.max_value() + second_sampler.max_value()) * amplitude; let max_value = (first_sampler.max_value() + second_sampler.max_value()) * amplitude;
Self { Self {
@ -80,7 +76,7 @@ mod double_perlin_noise_sampler_test {
assert_eq!(rand.next_i32(), -1302745855); assert_eq!(rand.next_i32(), -1302745855);
let mut rand_gen = RandomGenerator::Legacy(rand); let mut rand_gen = RandomGenerator::Legacy(rand);
let params = DoublePerlinNoiseParameters::new(0, 0, &[4f64], ""); let params = DoublePerlinNoiseParameters::new(0, 0, &[4f64], 1, 1, 1.0);
let sampler = DoublePerlinNoiseSampler::from_params(&mut rand_gen, &params, true); let sampler = DoublePerlinNoiseSampler::from_params(&mut rand_gen, &params, true);
let values = [ let values = [
@ -178,7 +174,7 @@ mod double_perlin_noise_sampler_test {
let mut rand_gen = RandomGenerator::Xoroshiro(rand); let mut rand_gen = RandomGenerator::Xoroshiro(rand);
let params = DoublePerlinNoiseParameters::new(0, 1, &[2f64, 4f64], ""); let params = DoublePerlinNoiseParameters::new(0, 1, &[2f64, 4f64], 1, 1, 1.0);
let sampler = DoublePerlinNoiseSampler::from_params(&mut rand_gen, &params, false); let sampler = DoublePerlinNoiseSampler::from_params(&mut rand_gen, &params, false);

View File

@ -72,7 +72,7 @@ impl DoublePerlinNoiseBuilder {
base_random_deriver: &XoroshiroSplitter, base_random_deriver: &XoroshiroSplitter,
parameters: &DoublePerlinNoiseParameters, parameters: &DoublePerlinNoiseParameters,
) -> DoublePerlinNoiseSampler { ) -> DoublePerlinNoiseSampler {
let mut random = base_random_deriver.split_string(parameters.name()); let mut random = base_random_deriver.from_lo_and_hi(parameters.lo, parameters.hi);
DoublePerlinNoiseSampler::from_params(&mut random, parameters, false) DoublePerlinNoiseSampler::from_params(&mut random, parameters, false)
} }
} }
@ -245,8 +245,8 @@ impl ProtoNoiseRouters {
// NETHER_TEMPERATURE and NETHER_VEGETATION always use NormalNoise.createLegacyNetherBiome with // NETHER_TEMPERATURE and NETHER_VEGETATION always use NormalNoise.createLegacyNetherBiome with
// LegacyRandomSource(seed + 0) and LegacyRandomSource(seed + 1) // LegacyRandomSource(seed + 0) and LegacyRandomSource(seed + 1)
// respectively, regardless of useLegacyRandomSource. // respectively, regardless of useLegacyRandomSource.
let sampler = match data.noise_id.name() { let sampler = match data.noise_id.id {
"minecraft:nether/temperature" => { id if id == DoublePerlinNoiseParameters::NETHER_TEMPERATURE.id => {
let mut legacy_rand = let mut legacy_rand =
LegacyRand::from_seed(random_config.seed.wrapping_add(0)); LegacyRand::from_seed(random_config.seed.wrapping_add(0));
DoublePerlinNoiseSampler::from_params( DoublePerlinNoiseSampler::from_params(
@ -255,7 +255,7 @@ impl ProtoNoiseRouters {
true, true,
) )
} }
"minecraft:nether/vegetation" => { id if id == DoublePerlinNoiseParameters::NETHER_VEGETATION.id => {
let mut legacy_rand = let mut legacy_rand =
LegacyRand::from_seed(random_config.seed.wrapping_add(1)); LegacyRand::from_seed(random_config.seed.wrapping_add(1));
DoublePerlinNoiseSampler::from_params( DoublePerlinNoiseSampler::from_params(