From e6ec217c7cf3146bfab2df9c02e34669933a6bd5 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 29 Aug 2021 20:09:48 +0100 Subject: [PATCH] Snow on spots --- world/src/canvas.rs | 24 ++++++++++++++++++++---- world/src/layer/spot.rs | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/world/src/canvas.rs b/world/src/canvas.rs index 222cd5f0b3..fe91f422f1 100644 --- a/world/src/canvas.rs +++ b/world/src/canvas.rs @@ -9,7 +9,7 @@ use crate::{ }; use common::{ generation::EntityInfo, - terrain::{Block, Structure, TerrainChunk, TerrainChunkSize}, + terrain::{Block, BlockKind, Structure, TerrainChunk, TerrainChunkSize}, vol::{ReadVol, RectVolSize, WriteVol}, }; use std::{borrow::Cow, ops::Deref}; @@ -199,16 +199,19 @@ impl<'a> Canvas<'a> { structure: &Structure, seed: u32, units: Vec2>, + with_snow: bool, ) { let info = self.info(); self.foreach_col(|canvas, wpos2d, col| { let rpos2d = wpos2d - origin.xy(); let rpos2d = units.x * rpos2d.x + units.y * rpos2d.y; - for z in structure.get_bounds().min.z..structure.get_bounds().max.z { + let mut above = true; + for z in (structure.get_bounds().min.z..structure.get_bounds().max.z).rev() { if let Ok(sblock) = structure.get(rpos2d.with_z(z)) { + let mut add_snow = false; let _ = canvas.map(wpos2d.with_z(origin.z + z), |block| { - if let Some(block) = block_from_structure( + if let Some(new_block) = block_from_structure( info.index, *sblock, wpos2d.with_z(origin.z + z), @@ -217,11 +220,24 @@ impl<'a> Canvas<'a> { col, |sprite| block.with_sprite(sprite), ) { - block + if !new_block.is_air() { + if with_snow && col.snow_cover && above { + add_snow = true; + } + above = false; + } + new_block } else { block } }); + + if add_snow { + let _ = canvas.set( + wpos2d.with_z(origin.z + z + 1), + Block::new(BlockKind::Snow, Rgb::new(210, 210, 255)), + ); + } } } }); diff --git a/world/src/layer/spot.rs b/world/src/layer/spot.rs index 932424e356..f90fc5759a 100644 --- a/world/src/layer/spot.rs +++ b/world/src/layer/spot.rs @@ -405,7 +405,7 @@ pub fn apply_spots_to(canvas: &mut Canvas, _dynamic_rng: &mut impl Rng) { .map(|c| c.alt as i32) .unwrap_or(0), ); - canvas.blit_structure(origin, &structure, seed, units); + canvas.blit_structure(origin, &structure, seed, units, true); } // Spawn entities