mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Better mushroom placement
This commit is contained in:
parent
a39901d24c
commit
7353c6f02b
@ -298,6 +298,36 @@ fn tunnels_down_from<'a>(
|
|||||||
.filter_map(move |rpos| tunnel_below_from_cell(col_cell + rpos, level, land))
|
.filter_map(move |rpos| tunnel_below_from_cell(col_cell + rpos, level, land))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn tunnel_bounds_at<'a>(
|
||||||
|
wpos2d: Vec2<i32>,
|
||||||
|
info: &'a CanvasInfo,
|
||||||
|
land: &'a Land,
|
||||||
|
nz: &'a Fbm,
|
||||||
|
) -> impl Iterator<Item = (u32, Range<i32>, f64, Tunnel)> + 'a {
|
||||||
|
let col = info.col_or_gen(wpos2d);
|
||||||
|
let wposf = wpos2d.map(|e| e as f64 + 0.5);
|
||||||
|
info.col_or_gen(wpos2d).into_iter().flat_map(move |col| {
|
||||||
|
let col_alt = col.alt;
|
||||||
|
let col_water_level = col.water_level;
|
||||||
|
(1..LAYERS + 1).flat_map(move |level| {
|
||||||
|
let rand = RandomField::new(37 + level);
|
||||||
|
tunnels_at(wpos2d, level, land)
|
||||||
|
.chain(tunnels_down_from(wpos2d, level - 1, land))
|
||||||
|
.filter_map(move |tunnel| {
|
||||||
|
let (z_range, radius) = tunnel.z_range_at(wposf, nz)?;
|
||||||
|
// Avoid cave entrances intersecting water
|
||||||
|
let z_range = Lerp::lerp(
|
||||||
|
z_range.end,
|
||||||
|
z_range.start,
|
||||||
|
1.0 - (1.0 - ((col_alt - col_water_level) / 4.0).clamped(0.0, 1.0))
|
||||||
|
* (1.0 - ((col_alt - z_range.end as f32) / 8.0).clamped(0.0, 1.0)),
|
||||||
|
)..z_range.end;
|
||||||
|
Some((level, z_range, radius, tunnel))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn apply_caves_to(canvas: &mut Canvas, rng: &mut impl Rng) {
|
pub fn apply_caves_to(canvas: &mut Canvas, rng: &mut impl Rng) {
|
||||||
let nz = Fbm::new();
|
let nz = Fbm::new();
|
||||||
let info = canvas.info();
|
let info = canvas.info();
|
||||||
@ -306,44 +336,28 @@ pub fn apply_caves_to(canvas: &mut Canvas, rng: &mut impl Rng) {
|
|||||||
let wposf = wpos2d.map(|e| e as f64 + 0.5);
|
let wposf = wpos2d.map(|e| e as f64 + 0.5);
|
||||||
let land = info.land();
|
let land = info.land();
|
||||||
|
|
||||||
for level in 1..LAYERS + 1 {
|
let tunnel_bounds = tunnel_bounds_at(wpos2d, &info, &land, &nz).collect::<Vec<_>>();
|
||||||
let rand = RandomField::new(37 + level);
|
|
||||||
let tunnel_bounds = tunnels_at(wpos2d, level, &land)
|
|
||||||
.chain(tunnels_down_from(wpos2d, level - 1, &land))
|
|
||||||
.filter_map(|tunnel| {
|
|
||||||
let (z_range, radius) = tunnel.z_range_at(wposf, &nz)?;
|
|
||||||
// Avoid cave entrances intersecting water
|
|
||||||
let z_range = Lerp::lerp(
|
|
||||||
z_range.end,
|
|
||||||
z_range.start,
|
|
||||||
1.0 - (1.0 - ((col.alt - col.water_level) / 4.0).clamped(0.0, 1.0))
|
|
||||||
* (1.0 - ((col.alt - z_range.end as f32) / 8.0).clamped(0.0, 1.0)),
|
|
||||||
)..z_range.end;
|
|
||||||
Some((z_range, radius, tunnel))
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
// First, clear out tunnels
|
// First, clear out tunnels
|
||||||
for (z_range, _, tunnel) in &tunnel_bounds {
|
for (_, z_range, _, tunnel) in &tunnel_bounds {
|
||||||
for z in z_range.clone() {
|
for z in z_range.clone() {
|
||||||
canvas.set(wpos2d.with_z(z), Block::air(SpriteKind::Empty));
|
canvas.set(wpos2d.with_z(z), Block::air(SpriteKind::Empty));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (z_range, radius, tunnel) in &tunnel_bounds {
|
for (level, z_range, radius, tunnel) in tunnel_bounds {
|
||||||
write_column(
|
write_column(
|
||||||
canvas,
|
canvas,
|
||||||
col,
|
col,
|
||||||
level,
|
level,
|
||||||
wpos2d,
|
wpos2d,
|
||||||
z_range.clone(),
|
z_range.clone(),
|
||||||
tunnel,
|
tunnel,
|
||||||
*radius,
|
radius,
|
||||||
&nz,
|
&nz,
|
||||||
&mut mushroom_cache,
|
&mut mushroom_cache,
|
||||||
rng,
|
rng,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -371,7 +385,7 @@ fn write_column<R: Rng>(
|
|||||||
level: u32,
|
level: u32,
|
||||||
wpos2d: Vec2<i32>,
|
wpos2d: Vec2<i32>,
|
||||||
z_range: Range<i32>,
|
z_range: Range<i32>,
|
||||||
tunnel: &Tunnel,
|
tunnel: Tunnel,
|
||||||
radius: f64,
|
radius: f64,
|
||||||
nz: &Fbm,
|
nz: &Fbm,
|
||||||
mushroom_cache: &mut HashMap<(Vec3<i32>, Vec2<i32>), Option<Mushroom>>,
|
mushroom_cache: &mut HashMap<(Vec3<i32>, Vec2<i32>), Option<Mushroom>>,
|
||||||
@ -457,6 +471,9 @@ fn write_column<R: Rng>(
|
|||||||
let pos = wpos2d.with_z(cavern_bottom + floor);
|
let pos = wpos2d.with_z(cavern_bottom + floor);
|
||||||
if rng.gen_bool(0.5 * close(radius as f32, 64.0, 48.0) as f64)
|
if rng.gen_bool(0.5 * close(radius as f32, 64.0, 48.0) as f64)
|
||||||
&& tunnel.biome_at(pos, &info).mushroom > 0.5
|
&& tunnel.biome_at(pos, &info).mushroom > 0.5
|
||||||
|
// Ensure that we're not placing the mushroom over a void
|
||||||
|
&& !tunnel_bounds_at(pos.xy(), &info, &info.land(), nz)
|
||||||
|
.any(|(_, z_range, _, _)| z_range.contains(&(cavern_bottom - 1)))
|
||||||
// && pos.z as i32 > water_level - 2
|
// && pos.z as i32 > water_level - 2
|
||||||
{
|
{
|
||||||
let purp = rng.gen_range(0..50);
|
let purp = rng.gen_range(0..50);
|
||||||
|
Loading…
Reference in New Issue
Block a user