From de62d17bebffaf72494d64fea158fdbac93d7756 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 31 Aug 2021 13:33:23 +0100 Subject: [PATCH] Improved grass scatter --- world/src/layer/scatter.rs | 323 +++++++++++++++++++------------------ 1 file changed, 168 insertions(+), 155 deletions(-) diff --git a/world/src/layer/scatter.rs b/world/src/layer/scatter.rs index 382722c643..3b93b17dd9 100644 --- a/world/src/layer/scatter.rs +++ b/world/src/layer/scatter.rs @@ -9,7 +9,8 @@ fn close(x: f32, tgt: f32, falloff: f32) -> f32 { (1.0 - (x - tgt).abs() / falloff).max(0.0).powf(0.125) } -const MUSH_FACT: f32 = 1.0e-4; // To balance everything around the mushroom spawning rate +const MUSH_FACT: f32 = 1.0e-4; // To balance things around the mushroom spawning rate +const GRASS_FACT: f32 = 1.0e-3; // To balance things around the grass spawning rate const DEPTH_WATER_NORM: f32 = 15.0; // Water depth at which regular underwater sprites start spawning pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { use SpriteKind::*; @@ -18,132 +19,132 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { let scatter: &[( _, bool, - fn(&SimChunk, &ColumnSample) -> (f32, Option<(f32, f32)>), + fn(&SimChunk, &ColumnSample) -> (f32, Option<(f32, f32, f32)>), )] = &[ - // (density, Option<(wavelen, threshold)>) + // (density, Option<(base_density_proportion, wavelen, threshold)>) // Flowers - (BlueFlower, false, |c, col| { + (BlueFlower, false, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.7).min(close( - c.humidity, + close(col.temp, CONFIG.temperate_temp, 0.7).min(close( + col.humidity, CONFIG.jungle_hum, 0.4, )) * col.tree_density * MUSH_FACT * 256.0, - Some((256.0, 0.25)), + Some((0.0, 256.0, 0.25)), ) }), - (PinkFlower, false, |c, col| { + (PinkFlower, false, |_, col| { ( - close(c.temp, 0.0, 0.7).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) + close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.1)), + Some((0.0, 100.0, 0.1)), ) }), - (PurpleFlower, false, |c, col| { + (PurpleFlower, false, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.7).min(close( - c.humidity, + close(col.temp, CONFIG.temperate_temp, 0.7).min(close( + col.humidity, CONFIG.jungle_hum, 0.4, )) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.1)), + Some((0.0, 100.0, 0.1)), ) }), - (RedFlower, false, |c, col| { + (RedFlower, false, |_, col| { ( - close(c.temp, CONFIG.tropical_temp, 0.7).min(close( - c.humidity, + close(col.temp, CONFIG.tropical_temp, 0.7).min(close( + col.humidity, CONFIG.jungle_hum, 0.4, )) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.1)), + Some((0.0, 100.0, 0.1)), ) }), - (WhiteFlower, false, |c, col| { + (WhiteFlower, false, |_, col| { ( - close(c.temp, 0.0, 0.7).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) + close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.1)), + Some((0.0, 100.0, 0.1)), ) }), - (YellowFlower, false, |c, col| { + (YellowFlower, false, |_, col| { ( - close(c.temp, 0.0, 0.7).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) + close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.1)), + Some((0.0, 100.0, 0.1)), ) }), - (Cotton, false, |c, col| { + (Cotton, false, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.7).min(close( - c.humidity, + close(col.temp, CONFIG.temperate_temp, 0.7).min(close( + col.humidity, CONFIG.jungle_hum, 0.4, )) * col.tree_density * MUSH_FACT * 75.0, - Some((256.0, 0.25)), + Some((0.0, 256.0, 0.25)), ) }), - (Sunflower, false, |c, col| { + (Sunflower, false, |_, col| { ( - close(c.temp, 0.0, 0.7).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) + close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) * col.tree_density * MUSH_FACT * 350.0, - Some((100.0, 0.15)), + Some((0.0, 100.0, 0.15)), ) }), - (WildFlax, false, |c, col| { + (WildFlax, false, |_, col| { ( - close(c.temp, 0.0, 0.7).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) + close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) * col.tree_density * MUSH_FACT * 600.0, - Some((100.0, 0.15)), + Some((0.0, 100.0, 0.15)), ) }), // Herbs and Spices - (LingonBerry, false, |c, _| { + (LingonBerry, false, |_, col| { ( - close(c.temp, 0.3, 0.4).min(close(c.humidity, CONFIG.jungle_hum, 0.5)) + close(col.temp, 0.3, 0.4).min(close(col.humidity, CONFIG.jungle_hum, 0.5)) * MUSH_FACT * 2.5, None, ) }), - (LeafyPlant, false, |c, _| { + (LeafyPlant, false, |_, col| { ( - close(c.temp, 0.3, 0.4).min(close(c.humidity, CONFIG.jungle_hum, 0.3)) - * MUSH_FACT + close(col.temp, 0.3, 0.4).min(close(col.humidity, CONFIG.jungle_hum, 0.3)) + * GRASS_FACT * 4.0, None, ) }), - (Fern, false, |c, _| { + (Fern, false, |_, col| { ( - close(c.temp, 0.3, 0.4).min(close(c.humidity, CONFIG.forest_hum, 0.5)) - * MUSH_FACT + close(col.temp, 0.3, 0.4).min(close(col.humidity, CONFIG.forest_hum, 0.5)) + * GRASS_FACT * 0.25, - Some((64.0, 0.2)), + Some((0.0, 64.0, 0.2)), ) }), - (Blueberry, false, |c, _| { + (Blueberry, false, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.5).min(close( - c.humidity, + close(col.temp, CONFIG.temperate_temp, 0.5).min(close( + col.humidity, CONFIG.forest_hum, 0.5, )) * MUSH_FACT @@ -151,191 +152,199 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { None, ) }), - (Pumpkin, false, |c, _| { + (Pumpkin, false, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.5).min(close( - c.humidity, + close(col.temp, CONFIG.temperate_temp, 0.5).min(close( + col.humidity, CONFIG.forest_hum, 0.5, )) * MUSH_FACT * 500.0, - Some((512.0, 0.05)), + Some((0.0, 512.0, 0.05)), ) }), // Collectable Objects // Only spawn twigs in temperate forests - (Twigs, false, |c, _| { + (Twigs, false, |_, col| { ( - (c.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * 0.75e-3, + (col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * 0.75e-3, None, ) }), - (Stones, false, |c, _| { - ((c.rockiness - 0.5).max(0.025) * 1.0e-3, None) + (Stones, false, |chunk, _| { + ((chunk.rockiness - 0.5).max(0.025) * 1.0e-3, None) }), - (Copper, false, |c, _| { - ((c.rockiness - 0.5).max(0.0) * 1.5e-3, None) + (Copper, false, |chunk, _| { + ((chunk.rockiness - 0.5).max(0.0) * 1.5e-3, None) }), - (Tin, false, |c, _| { - ((c.rockiness - 0.5).max(0.0) * 1.5e-3, None) + (Tin, false, |chunk, _| { + ((chunk.rockiness - 0.5).max(0.0) * 1.5e-3, None) }), // Don't spawn Mushrooms in snowy regions - (Mushroom, false, |c, _| { + (Mushroom, false, |_, col| { ( - close(c.temp, 0.3, 0.4).min(close(c.humidity, CONFIG.forest_hum, 0.35)) * MUSH_FACT, + close(col.temp, 0.3, 0.4).min(close(col.humidity, CONFIG.forest_hum, 0.35)) + * MUSH_FACT, None, ) }), // Grass - (ShortGrass, false, |c, _| { + (ShortGrass, false, |_, col| { ( - close(c.temp, 0.2, 0.65).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) * 0.015, - None, + close(col.temp, 0.2, 0.75).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) + * GRASS_FACT + * 150.0, + Some((0.3, 64.0, 0.3)), ) }), - (MediumGrass, false, |c, _| { + (MediumGrass, false, |_, col| { ( - close(c.temp, 0.2, 0.6).min(close(c.humidity, CONFIG.jungle_hum, 0.4)) * 0.012, - None, + close(col.temp, 0.2, 0.6).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) + * GRASS_FACT + * 120.0, + Some((0.3, 64.0, 0.3)), ) }), - (LongGrass, false, |c, _| { + (LongGrass, false, |_, col| { ( - close(c.temp, 0.3, 0.35).min(close(c.humidity, CONFIG.jungle_hum, 0.3)) * 0.15, - Some((48.0, 0.2)), + close(col.temp, 0.3, 0.35).min(close(col.humidity, CONFIG.jungle_hum, 0.3)) + * GRASS_FACT + * 150.0, + Some((0.1, 48.0, 0.3)), ) }), // Jungle Sprites // (LongGrass, false, |c, col| { // ( - // close(c.temp, CONFIG.tropical_temp, 0.4).min(close( - // c.humidity, + // close(col.temp, CONFIG.tropical_temp, 0.4).min(close( + // col.humidity, // CONFIG.jungle_hum, // 0.6, // )) * 0.08, - // Some((60.0, 5.0)), + // Some((0.0, 60.0, 5.0)), // ) // }), /*(WheatGreen, false, |c, col| { ( - close(c.temp, 0.4, 0.2).min(close(c.humidity, CONFIG.forest_hum, 0.1)) + close(col.temp, 0.4, 0.2).min(close(col.humidity, CONFIG.forest_hum, 0.1)) * MUSH_FACT * 0.001, None, ) }),*/ - (GrassSnow, false, |c, _| { + (GrassSnow, false, |_, col| { ( - close(c.temp, CONFIG.snow_temp - 0.2, 0.4).min(close( - c.humidity, + close(col.temp, CONFIG.snow_temp - 0.2, 0.4).min(close( + col.humidity, CONFIG.forest_hum, 0.5, - )) * 0.01, - Some((48.0, 0.2)), + )) * GRASS_FACT + * 100.0, + Some((0.0, 48.0, 0.2)), ) }), - (Moonbell, false, |c, _| { + (Moonbell, false, |_, col| { ( - close(c.temp, CONFIG.snow_temp - 0.2, 0.4).min(close( - c.humidity, + close(col.temp, CONFIG.snow_temp - 0.2, 0.4).min(close( + col.humidity, CONFIG.forest_hum, 0.5, )) * 0.003, - Some((48.0, 0.2)), + Some((0.0, 48.0, 0.2)), ) }), // Savanna Plants - (SavannaGrass, false, |c, _| { + (SavannaGrass, false, |_, col| { ( { - let savanna = close(c.temp, 1.0, 0.4).min(close(c.humidity, 0.2, 0.25)); - let desert = close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)); - (savanna - desert * 5.0).max(0.0) + let savanna = close(col.temp, 1.0, 0.4) * close(col.humidity, 0.2, 0.25); + let desert = close(col.temp, 1.0, 0.25) * close(col.humidity, 0.0, 0.1); + (savanna - desert * 5.0).max(0.0) * GRASS_FACT * 250.0 }, - Some((0.5, 0.2)), + Some((0.15, 64.0, 0.2)), ) }), - (TallSavannaGrass, false, |c, _| { + (TallSavannaGrass, false, |_, col| { ( { - let savanna = close(c.temp, 1.0, 0.4).min(close(c.humidity, 0.2, 0.25)); - let desert = close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)); - (savanna - desert * 5.0).max(0.0) + let savanna = close(col.temp, 1.0, 0.4) * close(col.humidity, 0.2, 0.25); + let desert = close(col.temp, 1.0, 0.25) * close(col.humidity, 0.0, 0.1); + (savanna - desert * 5.0).max(0.0) * GRASS_FACT * 150.0 }, - Some((12.5, 0.25)), + Some((0.1, 48.0, 0.2)), ) }), - (RedSavannaGrass, false, |c, _| { + (RedSavannaGrass, false, |_, col| { ( { - let savanna = close(c.temp, 1.0, 0.4).min(close(c.humidity, 0.2, 0.25)); - let desert = close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)); - (savanna - desert * 5.0).max(0.0) + let savanna = close(col.temp, 1.0, 0.4) * close(col.humidity, 0.2, 0.25); + let desert = close(col.temp, 1.0, 0.25) * close(col.humidity, 0.0, 0.1); + (savanna - desert * 5.0).max(0.0) * GRASS_FACT * 120.0 }, - Some((0.1, 0.1)), + Some((0.15, 48.0, 0.25)), ) }), - (SavannaBush, false, |c, _| { + (SavannaBush, false, |_, col| { ( { - let savanna = close(c.temp, 1.0, 0.4).min(close(c.humidity, 0.2, 0.25)); - let desert = close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)); - (savanna - desert * 5.0).max(0.0) + let savanna = close(col.temp, 1.0, 0.4) * close(col.humidity, 0.2, 0.25); + let desert = close(col.temp, 1.0, 0.25) * close(col.humidity, 0.0, 0.1); + (savanna - desert * 5.0).max(0.0) * GRASS_FACT * 40.0 }, - Some((0.08, 0.05)), + Some((0.1, 96.0, 0.15)), ) }), // Desert Plants - (DeadBush, false, |c, _| { + (DeadBush, false, |_, col| { ( - close(c.temp, 1.0, 0.95).min(close(c.humidity, 0.0, 0.3)) * MUSH_FACT * 7.5, + close(col.temp, 1.0, 0.95).min(close(col.humidity, 0.0, 0.3)) * MUSH_FACT * 7.5, None, ) }), - (Pyrebloom, false, |c, _| { + (Pyrebloom, false, |_, col| { ( - close(c.temp, 1.0, 0.95).min(close(c.humidity, 0.0, 0.3)) * MUSH_FACT * 0.35, + close(col.temp, 1.0, 0.95).min(close(col.humidity, 0.0, 0.3)) * MUSH_FACT * 0.35, None, ) }), - (LargeCactus, false, |c, _| { + (LargeCactus, false, |_, col| { ( - close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)) * MUSH_FACT * 3.5, + close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 1.5, None, ) }), - (RoundCactus, false, |c, _| { + (RoundCactus, false, |_, col| { ( - close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)) * MUSH_FACT * 5.5, + close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.5, None, ) }), - (ShortCactus, false, |c, _| { + (ShortCactus, false, |_, col| { ( - close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)) * MUSH_FACT * 5.5, + close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.5, None, ) }), - (MedFlatCactus, false, |c, _| { + (MedFlatCactus, false, |_, col| { ( - close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)) * MUSH_FACT * 5.5, + close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.5, None, ) }), - (ShortFlatCactus, false, |c, _| { + (ShortFlatCactus, false, |_, col| { ( - close(c.temp, 1.0, 0.25).min(close(c.humidity, 0.0, 0.1)) * MUSH_FACT * 5.5, + close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.5, None, ) }), - (Reed, false, |c, col| { + (Reed, false, |_, col| { ( - close(c.humidity, CONFIG.jungle_hum, 0.7) + close(col.humidity, CONFIG.jungle_hum, 0.9) * col .water_dist .map(|wd| Lerp::lerp(0.2, 0.0, (wd / 8.0).clamped(0.0, 1.0))) .unwrap_or(0.0), - Some((128.0, 0.5)), + Some((0.2, 128.0, 0.5)), ) }), // Underwater chests @@ -374,13 +383,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((100.0, 0.15)), + Some((0.0, 100.0, 0.15)), ) }), // seagrass - (Seagrass, true, |c, col| { + (Seagrass, true, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.8) + close(col.temp, CONFIG.temperate_temp, 0.8) * MUSH_FACT * 300.0 * if col.water_level < CONFIG.sea_level @@ -390,7 +399,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((150.0, 0.3)), + Some((0.0, 150.0, 0.3)), ) }), // seagrass, coastal patches @@ -403,13 +412,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((150.0, 0.4)), + Some((0.0, 150.0, 0.4)), ) }), // scattered seaweed (temperate species) - (SeaweedTemperate, true, |c, col| { + (SeaweedTemperate, true, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.8) + close(col.temp, CONFIG.temperate_temp, 0.8) * MUSH_FACT * 50.0 * if col.water_level < CONFIG.sea_level @@ -419,13 +428,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((500.0, 0.75)), + Some((0.0, 500.0, 0.75)), ) }), // scattered seaweed (tropical species) - (SeaweedTropical, true, |c, col| { + (SeaweedTropical, true, |_, col| { ( - close(c.temp, 1.0, 0.95) + close(col.temp, 1.0, 0.95) * MUSH_FACT * 50.0 * if col.water_level < CONFIG.sea_level @@ -435,7 +444,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((500.0, 0.75)), + Some((0.0, 500.0, 0.75)), ) }), // Caulerpa lentillifera algae patch @@ -450,7 +459,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((100.0, 0.15)), + Some((0.0, 100.0, 0.15)), ) }), // Caulerpa prolifera algae patch @@ -465,13 +474,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((100.0, 0.15)), + Some((0.0, 100.0, 0.15)), ) }), // Mermaids' fan algae patch - (MermaidsFan, true, |c, col| { + (MermaidsFan, true, |_, col| { ( - close(c.temp, 1.0, 0.95) + close(col.temp, 1.0, 0.95) * MUSH_FACT * 500.0 * if col.water_level < CONFIG.sea_level @@ -481,13 +490,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((50.0, 0.10)), + Some((0.0, 50.0, 0.10)), ) }), // Sea anemones - (SeaAnemone, true, |c, col| { + (SeaAnemone, true, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.8) + close(col.temp, CONFIG.temperate_temp, 0.8) * MUSH_FACT * 125.0 * if col.water_level < CONFIG.sea_level @@ -497,13 +506,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((100.0, 0.3)), + Some((0.0, 100.0, 0.3)), ) }), // Giant Kelp - (GiantKelp, true, |c, col| { + (GiantKelp, true, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.8) + close(col.temp, CONFIG.temperate_temp, 0.8) * MUSH_FACT * 220.0 * if col.water_level < CONFIG.sea_level @@ -513,13 +522,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((200.0, 0.4)), + Some((0.0, 200.0, 0.4)), ) }), // Bull Kelp - (BullKelp, true, |c, col| { + (BullKelp, true, |_, col| { ( - close(c.temp, CONFIG.temperate_temp, 0.7) + close(col.temp, CONFIG.temperate_temp, 0.7) * MUSH_FACT * 300.0 * if col.water_level < CONFIG.sea_level @@ -529,13 +538,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((75.0, 0.3)), + Some((0.0, 75.0, 0.3)), ) }), // Stony Corals - (StonyCoral, true, |c, col| { + (StonyCoral, true, |_, col| { ( - close(c.temp, 1.0, 0.9) + close(col.temp, 1.0, 0.9) * MUSH_FACT * 160.0 * if col.water_level < CONFIG.sea_level @@ -545,13 +554,13 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((120.0, 0.4)), + Some((0.0, 120.0, 0.4)), ) }), // Soft Corals - (SoftCoral, true, |c, col| { + (SoftCoral, true, |_, col| { ( - close(c.temp, 1.0, 0.9) + close(col.temp, 1.0, 0.9) * MUSH_FACT * 120.0 * if col.water_level < CONFIG.sea_level @@ -561,7 +570,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { } else { 0.0 }, - Some((120.0, 0.4)), + Some((0.0, 120.0, 0.4)), ) }), // Seashells @@ -601,9 +610,9 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { .enumerate() .find_map(|(i, (kind, is_underwater, f))| { let (density, patch) = f(canvas.chunk(), col); - let is_patch = patch - .map(|(wavelen, threshold)| { - canvas + let density = patch + .map(|(base_density_prop, wavelen, threshold)| { + if canvas .index() .noise .scatter_nz @@ -614,10 +623,14 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { ) .abs() > 1.0 - threshold as f64 + { + density + } else { + density * base_density_prop + } }) - .unwrap_or(true); + .unwrap_or(density); if density > 0.0 - && is_patch && rng.gen::() < density //RandomField::new(i as u32).chance(Vec3::new(wpos2d.x, wpos2d.y, 0), density) && underwater == *is_underwater {