From e498d78b6c859a563548d3e83dcb7407e1963a80 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Fri, 24 Apr 2020 16:01:24 +0100 Subject: [PATCH] Fixed boundary meshing issue for scaled terrain sprites --- common/src/volumes/scaled.rs | 13 +++++++------ voxygen/src/mesh/segment.rs | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/common/src/volumes/scaled.rs b/common/src/volumes/scaled.rs index e650024f1e..c951d5c04c 100644 --- a/common/src/volumes/scaled.rs +++ b/common/src/volumes/scaled.rs @@ -16,10 +16,11 @@ impl<'a, V: ReadVol> ReadVol for Scaled<'a, V> { fn get(&self, pos: Vec3) -> Result<&Self::Vox, Self::Error> { let pos = pos.map2(self.scale, |e, scale| (e as f32 / scale).trunc() as i32); let search_size = (Vec3::one() / self.scale).map(|e: f32| e.ceil() as i32); - (-search_size.x / 2..search_size.x / 2) + let range_iter = |x| std::iter::successors(Some(0), |x| Some(if *x < 0 { -*x } else { -(*x + 1) })).take(x as usize * 2 + 1); + range_iter(search_size.x / 2) .map(|i| { - (-search_size.y / 2..search_size.y / 2).map(move |j| { - (-search_size.z / 2..search_size.z / 2).map(move |k| Vec3::new(i, j, k)) + range_iter(search_size.y / 2).map(move |j| { + range_iter(search_size.z / 2).map(move |k| Vec3::new(i, j, k)) }) }) .flatten() @@ -40,8 +41,8 @@ impl<'a, V: SizedVol> SizedVol for Scaled<'a, V> { #[inline(always)] fn upper_bound(&self) -> Vec3 { - self.inner - .upper_bound() - .map2(self.scale, |e, scale| ((e as f32 - 1.0) * scale).floor() as i32 + 1) + self.inner.upper_bound().map2(self.scale, |e, scale| { + (e as f32 * scale).ceil() as i32 + 1 + }) } } diff --git a/voxygen/src/mesh/segment.rs b/voxygen/src/mesh/segment.rs index 2d8584442b..fff654f888 100644 --- a/voxygen/src/mesh/segment.rs +++ b/voxygen/src/mesh/segment.rs @@ -37,7 +37,7 @@ where }) .flatten() .flatten() - .map(|pos| (pos, self.get(pos).unwrap())); + .map(|pos| (pos, self.get(pos).map(|x| *x).unwrap_or(Vox::empty()))); for (pos, vox) in vol_iter { if let Some(col) = vox.get_color() { @@ -103,7 +103,7 @@ where }) .flatten() .flatten() - .map(|pos| (pos, self.get(pos).unwrap())); + .map(|pos| (pos, self.get(pos).map(|x| *x).unwrap_or(Vox::empty()))); for (pos, vox) in vol_iter { if let Some(col) = vox.get_color() {