From 308ee2f674b9d67cbb43b14fda6c0824f6468267 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 9 Apr 2023 15:47:42 +0100 Subject: [PATCH] Don't pessimise worldgen fast paths for rtsim resources --- world/src/canvas.rs | 12 ++++++++++++ world/src/layer/cave.rs | 2 +- world/src/layer/scatter.rs | 2 +- world/src/layer/tree.rs | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/world/src/canvas.rs b/world/src/canvas.rs index 2a1a2e36ac..edc39f4f17 100644 --- a/world/src/canvas.rs +++ b/world/src/canvas.rs @@ -159,6 +159,9 @@ impl<'a> Canvas<'a> { .unwrap_or_else(Block::empty) } + /// Set a block in the canvas chunk. Note that if the block is a resource + /// (see [`Block::get_rtsim_resource`]) then [`Canvas::map_resource`] should + /// be used instead. pub fn set(&mut self, pos: Vec3, block: Block) { if block.get_rtsim_resource().is_some() { self.rtsim_resource_blocks.push(pos); @@ -166,7 +169,16 @@ impl<'a> Canvas<'a> { let _ = self.chunk.set(pos - self.wpos(), block); } + /// Map a block in the canvas chunk. Note that if the block is a resource + /// (see [`Block::get_rtsim_resource`]) then [`Canvas::map_resource`] should + /// be used instead. pub fn map(&mut self, pos: Vec3, f: impl FnOnce(Block) -> Block) { + let _ = self.chunk.map(pos - self.wpos(), f); + } + + /// Like [`Canvas::map`], except allows marking resource-containing blocks + /// appropriately. + pub fn map_resource(&mut self, pos: Vec3, f: impl FnOnce(Block) -> Block) { let _ = self.chunk.map(pos - self.wpos(), |b| { let new_block = f(b); if new_block.get_rtsim_resource().is_some() { diff --git a/world/src/layer/cave.rs b/world/src/layer/cave.rs index 3388061553..ec9f3fbdff 100644 --- a/world/src/layer/cave.rs +++ b/world/src/layer/cave.rs @@ -553,7 +553,7 @@ fn write_column( for z in bedrock..z_range.end { let wpos = wpos2d.with_z(z); let mut try_spawn_entity = false; - canvas.map(wpos, |_block| { + canvas.map_resource(wpos, |_block| { if z < z_range.start - 4 && !void_below { Block::new(BlockKind::Lava, Rgb::new(255, 65, 0)) } else if basalt > 0.0 diff --git a/world/src/layer/scatter.rs b/world/src/layer/scatter.rs index 5ed0f832ed..f5ef44914b 100644 --- a/world/src/layer/scatter.rs +++ b/world/src/layer/scatter.rs @@ -1098,7 +1098,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti .find(|z| !is_under(canvas.get(Vec3::new(wpos2d.x, wpos2d.y, alt + z)))) }) { - canvas.map(Vec3::new(wpos2d.x, wpos2d.y, alt + solid_end), |block| { + canvas.map_resource(Vec3::new(wpos2d.x, wpos2d.y, alt + solid_end), |block| { block.with_sprite(kind) }); } diff --git a/world/src/layer/tree.rs b/world/src/layer/tree.rs index 836be68044..a784ceb663 100644 --- a/world/src/layer/tree.rs +++ b/world/src/layer/tree.rs @@ -336,7 +336,7 @@ pub fn apply_trees_to( if last_block.is_filled() { for (chance, sprite) in hanging_sprites { if dynamic_rng.gen_bool(*chance as f64) { - canvas.map(wpos, |block| block.with_sprite(*sprite)); + canvas.map_resource(wpos, |block| block.with_sprite(*sprite)); } } }