diff --git a/common/src/figure/mod.rs b/common/src/figure/mod.rs index 0be11c7bf6..12b5e05d32 100644 --- a/common/src/figure/mod.rs +++ b/common/src/figure/mod.rs @@ -2,7 +2,7 @@ pub mod cell; pub mod mat_cell; pub use mat_cell::Material; -use self::{cell::Cell, mat_cell::MatCell}; +pub use self::{cell::Cell, mat_cell::MatCell}; use crate::{ vol::{IntoFullPosIterator, IntoFullVolIterator, ReadVol, SizedVol, Vox, WriteVol}, volumes::dyna::Dyna, diff --git a/common/src/vol.rs b/common/src/vol.rs index 8740e60917..85626c37d7 100644 --- a/common/src/vol.rs +++ b/common/src/vol.rs @@ -1,4 +1,4 @@ -use crate::ray::Ray; +use crate::{ray::Ray, volumes::scaled::Scaled}; use std::fmt::Debug; use vek::*; @@ -24,6 +24,13 @@ pub trait Vox: Sized + Clone + PartialEq { pub trait BaseVol { type Vox: Vox; type Error: Debug; + + fn scaled_by(&self, scale: Vec3) -> Scaled + where + Self: Sized, + { + Scaled { inner: self, scale } + } } /// Implementing `BaseVol` for any `&'a BaseVol` makes it possible to implement @@ -159,6 +166,7 @@ where /// Unfortunately we can't just implement `IntoIterator` in this generic way /// because it's defined in another crate. That's actually the only reason why /// the trait `IntoFullVolIterator` exists. +// TODO: See whether relaxed orphan rules permit this to be replaced now impl<'a, T: 'a + SizedVol> IntoFullVolIterator<'a> for &'a T where Self: IntoVolIterator<'a>, diff --git a/common/src/volumes/mod.rs b/common/src/volumes/mod.rs index b84e75b7c8..6e8a9d6f10 100644 --- a/common/src/volumes/mod.rs +++ b/common/src/volumes/mod.rs @@ -1,4 +1,5 @@ pub mod chunk; pub mod dyna; +pub mod scaled; pub mod vol_grid_2d; pub mod vol_grid_3d; diff --git a/common/src/volumes/scaled.rs b/common/src/volumes/scaled.rs new file mode 100644 index 0000000000..4f70b45538 --- /dev/null +++ b/common/src/volumes/scaled.rs @@ -0,0 +1,47 @@ +use crate::vol::{BaseVol, ReadVol, SizedVol, Vox}; +use vek::*; + +pub struct Scaled<'a, V> { + pub inner: &'a V, + pub scale: Vec3, +} + +impl<'a, V: BaseVol> BaseVol for Scaled<'a, V> { + type Error = V::Error; + type Vox = V::Vox; +} + +impl<'a, V: ReadVol> ReadVol for Scaled<'a, V> { + #[inline(always)] + 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) + .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)) + }) + }) + .flatten() + .flatten() + .map(|offs| self.inner.get(pos + offs)) + .find(|vox| vox.as_ref().map(|v| !v.is_empty()).unwrap_or(false)) + .unwrap_or_else(|| self.inner.get(pos)) + } +} + +impl<'a, V: SizedVol> SizedVol for Scaled<'a, V> { + #[inline(always)] + fn lower_bound(&self) -> Vec3 { + self.inner + .lower_bound() + .map2(self.scale, |e, scale| (e as f32 * scale).floor() as i32) + } + + #[inline(always)] + fn upper_bound(&self) -> Vec3 { + self.inner + .upper_bound() + .map2(self.scale, |e, scale| (e as f32 * scale).floor() as i32) + } +} diff --git a/voxygen/src/mesh/mod.rs b/voxygen/src/mesh/mod.rs index 86bd6cc55c..695c1e617b 100644 --- a/voxygen/src/mesh/mod.rs +++ b/voxygen/src/mesh/mod.rs @@ -4,14 +4,14 @@ mod vol; use crate::render::{self, Mesh}; -pub trait Meshable { +pub trait Meshable<'a, P: render::Pipeline, T: render::Pipeline> { type Pipeline: render::Pipeline; type TranslucentPipeline: render::Pipeline; type Supplement; // Generate meshes - one opaque, one translucent fn generate_mesh( - &self, + &'a self, supp: Self::Supplement, ) -> (Mesh, Mesh); } diff --git a/voxygen/src/mesh/segment.rs b/voxygen/src/mesh/segment.rs index 962a6ed93e..2d8584442b 100644 --- a/voxygen/src/mesh/segment.rs +++ b/voxygen/src/mesh/segment.rs @@ -3,27 +3,43 @@ use crate::{ render::{self, FigurePipeline, Mesh, SpritePipeline}, }; use common::{ - figure::Segment, + figure::Cell, util::{linear_to_srgb, srgb_to_linear}, - vol::{IntoFullVolIterator, ReadVol, Vox}, + vol::{BaseVol, ReadVol, SizedVol, Vox}, }; use vek::*; type FigureVertex = ::Vertex; type SpriteVertex = ::Vertex; -impl Meshable for Segment { +impl<'a, V: 'a> Meshable<'a, FigurePipeline, FigurePipeline> for V +where + V: BaseVol + ReadVol + SizedVol, + /* TODO: Use VolIterator instead of manually iterating + * &'a V: IntoVolIterator<'a> + IntoFullVolIterator<'a>, + * &'a V: BaseVol, */ +{ type Pipeline = FigurePipeline; - type Supplement = Vec3; + type Supplement = (Vec3, Vec3); type TranslucentPipeline = FigurePipeline; fn generate_mesh( - &self, - offs: Self::Supplement, + &'a self, + (offs, scale): Self::Supplement, ) -> (Mesh, Mesh) { let mut mesh = Mesh::new(); - for (pos, vox) in self.full_vol_iter() { + let vol_iter = (self.lower_bound().x..self.upper_bound().x) + .map(|i| { + (self.lower_bound().y..self.upper_bound().y).map(move |j| { + (self.lower_bound().z..self.upper_bound().z).map(move |k| Vec3::new(i, j, k)) + }) + }) + .flatten() + .flatten() + .map(|pos| (pos, self.get(pos).unwrap())); + + for (pos, vox) in vol_iter { if let Some(col) = vox.get_color() { vol::push_vox_verts( &mut mesh, @@ -32,7 +48,7 @@ impl Meshable for Segment { &[[[Rgba::from_opaque(col); 3]; 3]; 3], |origin, norm, col, light, ao| { FigureVertex::new( - origin, + origin * scale, norm, linear_to_srgb(srgb_to_linear(col) * light), ao, @@ -62,18 +78,34 @@ impl Meshable for Segment { } } -impl Meshable for Segment { +impl<'a, V: 'a> Meshable<'a, SpritePipeline, SpritePipeline> for V +where + V: BaseVol + ReadVol + SizedVol, + /* TODO: Use VolIterator instead of manually iterating + * &'a V: IntoVolIterator<'a> + IntoFullVolIterator<'a>, + * &'a V: BaseVol, */ +{ type Pipeline = SpritePipeline; - type Supplement = Vec3; + type Supplement = (Vec3, Vec3); type TranslucentPipeline = SpritePipeline; fn generate_mesh( - &self, - offs: Self::Supplement, + &'a self, + (offs, scale): Self::Supplement, ) -> (Mesh, Mesh) { let mut mesh = Mesh::new(); - for (pos, vox) in self.full_vol_iter() { + let vol_iter = (self.lower_bound().x..self.upper_bound().x) + .map(|i| { + (self.lower_bound().y..self.upper_bound().y).map(move |j| { + (self.lower_bound().z..self.upper_bound().z).map(move |k| Vec3::new(i, j, k)) + }) + }) + .flatten() + .flatten() + .map(|pos| (pos, self.get(pos).unwrap())); + + for (pos, vox) in vol_iter { if let Some(col) = vox.get_color() { vol::push_vox_verts( &mut mesh, @@ -82,7 +114,7 @@ impl Meshable for Segment { &[[[Rgba::from_opaque(col); 3]; 3]; 3], |origin, norm, col, light, ao| { SpriteVertex::new( - origin, + origin * scale, norm, linear_to_srgb(srgb_to_linear(col) * light), ao, diff --git a/voxygen/src/mesh/terrain.rs b/voxygen/src/mesh/terrain.rs index fa8e94ea01..c71b959c9b 100644 --- a/voxygen/src/mesh/terrain.rs +++ b/voxygen/src/mesh/terrain.rs @@ -198,15 +198,15 @@ fn calc_light + ReadVol + Debug>( } } -impl + ReadVol + Debug> Meshable - for VolGrid2d +impl<'a, V: RectRasterableVol + ReadVol + Debug> + Meshable<'a, TerrainPipeline, FluidPipeline> for VolGrid2d { type Pipeline = TerrainPipeline; type Supplement = Aabb; type TranslucentPipeline = FluidPipeline; fn generate_mesh( - &self, + &'a self, range: Self::Supplement, ) -> (Mesh, Mesh) { let mut light = calc_light(range, self); diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 5f9762bcf3..cfd6e86dc8 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -55,7 +55,7 @@ fn graceful_load_mat_segment_flipped(mesh_name: &str) -> MatSegment { } fn generate_mesh(segment: &Segment, offset: Vec3) -> Mesh { - Meshable::::generate_mesh(segment, offset).0 + Meshable::::generate_mesh(segment, (offset, Vec3::one())).0 } pub fn load_mesh(mesh_name: &str, position: Vec3) -> Mesh { diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index b6bd3f4450..1d49269eaa 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -314,7 +314,7 @@ pub struct Terrain { mesh_todo: HashMap, ChunkMeshState>, // GPU data - sprite_models: HashMap<(BlockKind, usize), Model>, + sprite_models: HashMap<(BlockKind, usize), Vec>>, waves: Texture, phantom: PhantomData, @@ -326,16 +326,24 @@ impl Terrain { // with worker threads that are meshing chunks. let (send, recv) = channel::unbounded(); - let mut make_model = |s, offset| { - renderer - .create_model( - &Meshable::::generate_mesh( - &Segment::from(assets::load_expect::(s).as_ref()), - offset, - ) - .0, - ) - .unwrap() + let mut make_models = |s, offset| { + let scaled = [1.0, 0.75, 0.3, 0.2]; + scaled + .iter() + .map(|lod_scale| Vec3::broadcast(*lod_scale)) + .map(|lod_scale| { + renderer + .create_model( + &Meshable::::generate_mesh( + &Segment::from(assets::load_expect::(s).as_ref()) + .scaled_by(lod_scale), + (offset * lod_scale, Vec3::one() / lod_scale), + ) + .0, + ) + .unwrap() + }) + .collect::>() }; Self { @@ -347,28 +355,28 @@ impl Terrain { // Windows ( (BlockKind::Window1, 0), - make_model( + make_models( "voxygen.voxel.sprite.window.window-0", Vec3::new(-5.5, -5.5, 0.0), ), ), ( (BlockKind::Window2, 0), - make_model( + make_models( "voxygen.voxel.sprite.window.window-1", Vec3::new(-5.5, -5.5, 0.0), ), ), ( (BlockKind::Window3, 0), - make_model( + make_models( "voxygen.voxel.sprite.window.window-2", Vec3::new(-5.5, -5.5, 0.0), ), ), ( (BlockKind::Window4, 0), - make_model( + make_models( "voxygen.voxel.sprite.window.window-3", Vec3::new(-5.5, -5.5, 0.0), ), @@ -376,49 +384,49 @@ impl Terrain { // Cacti ( (BlockKind::LargeCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.large_cactus", Vec3::new(-13.5, -5.5, 0.0), ), ), ( (BlockKind::LargeCactus, 1), - make_model( + make_models( "voxygen.voxel.sprite.cacti.tall", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BarrelCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.barrel_cactus", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::RoundCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.cactus_round", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.cactus_short", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MedFlatCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.flat_cactus_med", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortFlatCactus, 0), - make_model( + make_models( "voxygen.voxel.sprite.cacti.flat_cactus_short", Vec3::new(-6.0, -6.0, 0.0), ), @@ -426,7 +434,7 @@ impl Terrain { // Fruit ( (BlockKind::Apple, 0), - make_model( + make_models( "voxygen.voxel.sprite.fruit.apple", Vec3::new(-6.0, -6.0, 0.0), ), @@ -434,140 +442,140 @@ impl Terrain { // Flowers ( (BlockKind::BlueFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 1), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 2), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 3), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 4), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 5), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_6", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::BlueFlower, 6), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_blue_7", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::PinkFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_pink_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::PinkFlower, 1), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_pink_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::PinkFlower, 2), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_pink_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::PinkFlower, 3), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_pink_4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::PurpleFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_purple_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::RedFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_red_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::RedFlower, 1), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_red_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::RedFlower, 2), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_red_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WhiteFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_white_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WhiteFlower, 1), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_white_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::YellowFlower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.flower_purple_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Sunflower, 0), - make_model( + make_models( "voxygen.voxel.sprite.flowers.sunflower_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Sunflower, 1), - make_model( + make_models( "voxygen.voxel.sprite.flowers.sunflower_2", Vec3::new(-6.0, -6.0, 0.0), ), @@ -575,315 +583,315 @@ impl Terrain { // Grass ( (BlockKind::LongGrass, 0), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 1), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 2), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 3), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 4), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 5), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_6", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::LongGrass, 6), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_long_7", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MediumGrass, 0), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_med_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MediumGrass, 1), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_med_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MediumGrass, 2), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_med_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MediumGrass, 3), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_med_4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::MediumGrass, 4), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_med_5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortGrass, 0), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_short_1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortGrass, 1), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_short_2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortGrass, 2), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_short_3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortGrass, 3), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_short_4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::ShortGrass, 4), - make_model( + make_models( "voxygen.voxel.sprite.grass.grass_short_5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 0), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 1), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 2), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 3), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 4), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 5), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 6), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-6", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 7), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-7", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 8), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-8", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 9), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-9", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Mushroom, 10), - make_model( + make_models( "voxygen.voxel.sprite.mushrooms.mushroom-10", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Liana, 0), - make_model( + make_models( "voxygen.voxel.sprite.lianas.liana-0", Vec3::new(-1.5, -0.5, -88.0), ), ), ( (BlockKind::Liana, 1), - make_model( + make_models( "voxygen.voxel.sprite.lianas.liana-1", Vec3::new(-1.0, -0.5, -55.0), ), ), ( (BlockKind::Velorite, 0), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_ore", Vec3::new(-5.0, -5.0, -5.0), ), ), ( (BlockKind::VeloriteFrag, 0), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_1", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 1), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_2", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 2), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_3", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 3), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_4", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 4), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_5", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 5), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_6", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 6), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_7", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 7), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_8", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 8), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_9", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::VeloriteFrag, 9), - make_model( + make_models( "voxygen.voxel.sprite.velorite.velorite_10", Vec3::new(-3.0, -5.0, 0.0), ), ), ( (BlockKind::Chest, 0), - make_model( + make_models( "voxygen.voxel.sprite.chests.chest", Vec3::new(-7.0, -5.0, -0.0), ), ), ( (BlockKind::Chest, 1), - make_model( + make_models( "voxygen.voxel.sprite.chests.chest_gold", Vec3::new(-7.0, -5.0, -0.0), ), ), ( (BlockKind::Chest, 2), - make_model( + make_models( "voxygen.voxel.sprite.chests.chest_dark", Vec3::new(-7.0, -5.0, -0.0), ), ), ( (BlockKind::Chest, 3), - make_model( + make_models( "voxygen.voxel.sprite.chests.chest_vines", Vec3::new(-7.0, -5.0, -0.0), ), @@ -891,7 +899,7 @@ impl Terrain { //Welwitch ( (BlockKind::Welwitch, 0), - make_model( + make_models( "voxygen.voxel.sprite.welwitch.1", Vec3::new(-15.0, -17.0, -0.0), ), @@ -899,49 +907,49 @@ impl Terrain { //Pumpkins ( (BlockKind::Pumpkin, 0), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.1", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Pumpkin, 1), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.2", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Pumpkin, 2), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.3", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Pumpkin, 3), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.4", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Pumpkin, 4), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.5", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Pumpkin, 5), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.6", Vec3::new(-7.0, -6.5, -0.0), ), ), ( (BlockKind::Pumpkin, 6), - make_model( + make_models( "voxygen.voxel.sprite.pumpkin.7", Vec3::new(-7.0, -9.5, -0.0), ), @@ -949,21 +957,21 @@ impl Terrain { //Lingonberries ( (BlockKind::LingonBerry, 0), - make_model( + make_models( "voxygen.voxel.sprite.lingonberry.1", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LingonBerry, 1), - make_model( + make_models( "voxygen.voxel.sprite.lingonberry.2", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LingonBerry, 2), - make_model( + make_models( "voxygen.voxel.sprite.lingonberry.3", Vec3::new(-6.0, -6.0, -0.0), ), @@ -971,70 +979,70 @@ impl Terrain { // Leafy Plants ( (BlockKind::LeafyPlant, 0), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.1", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 1), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.2", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 2), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.3", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 3), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.4", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 4), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.5", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 5), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.6", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 6), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.7", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 7), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.8", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 8), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.9", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::LeafyPlant, 9), - make_model( + make_models( "voxygen.voxel.sprite.leafy_plant.10", Vec3::new(-6.0, -6.0, -0.0), ), @@ -1042,77 +1050,77 @@ impl Terrain { // Ferns ( (BlockKind::Fern, 0), - make_model("voxygen.voxel.sprite.ferns.1", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.1", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 1), - make_model("voxygen.voxel.sprite.ferns.2", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.2", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 2), - make_model("voxygen.voxel.sprite.ferns.3", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.3", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 3), - make_model("voxygen.voxel.sprite.ferns.4", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.4", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 4), - make_model("voxygen.voxel.sprite.ferns.5", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.5", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 5), - make_model("voxygen.voxel.sprite.ferns.6", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.6", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 6), - make_model("voxygen.voxel.sprite.ferns.7", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.7", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 7), - make_model("voxygen.voxel.sprite.ferns.8", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.8", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 8), - make_model("voxygen.voxel.sprite.ferns.9", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.9", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 9), - make_model("voxygen.voxel.sprite.ferns.10", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.10", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 10), - make_model("voxygen.voxel.sprite.ferns.11", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.11", Vec3::new(-6.0, -6.0, -0.0)), ), ( (BlockKind::Fern, 11), - make_model("voxygen.voxel.sprite.ferns.12", Vec3::new(-6.0, -6.0, -0.0)), + make_models("voxygen.voxel.sprite.ferns.12", Vec3::new(-6.0, -6.0, -0.0)), ), // Dead Bush ( (BlockKind::DeadBush, 0), - make_model( + make_models( "voxygen.voxel.sprite.dead_bush.1", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::DeadBush, 1), - make_model( + make_models( "voxygen.voxel.sprite.dead_bush.2", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::DeadBush, 2), - make_model( + make_models( "voxygen.voxel.sprite.dead_bush.3", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::DeadBush, 3), - make_model( + make_models( "voxygen.voxel.sprite.dead_bush.4", Vec3::new(-6.0, -6.0, -0.0), ), @@ -1120,63 +1128,63 @@ impl Terrain { // Blueberries ( (BlockKind::Blueberry, 0), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.1", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 1), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.2", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 2), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.3", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 3), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.4", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 4), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.5", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 5), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.6", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 6), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.7", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 7), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.8", Vec3::new(-6.0, -6.0, -0.0), ), ), ( (BlockKind::Blueberry, 8), - make_model( + make_models( "voxygen.voxel.sprite.blueberry.9", Vec3::new(-6.0, -6.0, -0.0), ), @@ -1184,47 +1192,47 @@ impl Terrain { // Ember ( (BlockKind::Ember, 0), - make_model("voxygen.voxel.sprite.ember.1", Vec3::new(-7.0, -7.0, -2.9)), + make_models("voxygen.voxel.sprite.ember.1", Vec3::new(-7.0, -7.0, -2.9)), ), // Corn ( (BlockKind::Corn, 0), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Corn, 1), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Corn, 2), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Corn, 3), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Corn, 4), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Corn, 5), - make_model( + make_models( "voxygen.voxel.sprite.corn.corn-5", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1232,70 +1240,70 @@ impl Terrain { // Yellow Wheat ( (BlockKind::WheatYellow, 0), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 1), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 2), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 3), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 4), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 5), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 6), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-6", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 7), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-7", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 8), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-8", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatYellow, 9), - make_model( + make_models( "voxygen.voxel.sprite.wheat_yellow.wheat-9", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1303,70 +1311,70 @@ impl Terrain { // Green Wheat ( (BlockKind::WheatGreen, 0), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 1), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 2), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 3), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 4), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 5), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-5", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 6), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-6", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 7), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-7", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 8), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-8", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::WheatGreen, 9), - make_model( + make_models( "voxygen.voxel.sprite.wheat_green.wheat-9", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1374,21 +1382,21 @@ impl Terrain { // Cabbage ( (BlockKind::Cabbage, 0), - make_model( + make_models( "voxygen.voxel.sprite.cabbage.cabbage-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Cabbage, 1), - make_model( + make_models( "voxygen.voxel.sprite.cabbage.cabbage-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Cabbage, 2), - make_model( + make_models( "voxygen.voxel.sprite.cabbage.cabbage-2", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1396,42 +1404,42 @@ impl Terrain { // Flax ( (BlockKind::Flax, 0), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-0", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Flax, 1), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-1", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Flax, 2), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-2", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Flax, 3), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-3", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Flax, 4), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-4", Vec3::new(-6.0, -6.0, 0.0), ), ), ( (BlockKind::Flax, 5), - make_model( + make_models( "voxygen.voxel.sprite.flax.flax-5", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1439,98 +1447,98 @@ impl Terrain { // Carrot ( (BlockKind::Carrot, 0), - make_model( + make_models( "voxygen.voxel.sprite.carrot.0", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Carrot, 1), - make_model( + make_models( "voxygen.voxel.sprite.carrot.1", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Carrot, 2), - make_model( + make_models( "voxygen.voxel.sprite.carrot.2", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Carrot, 3), - make_model( + make_models( "voxygen.voxel.sprite.carrot.3", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Carrot, 4), - make_model( + make_models( "voxygen.voxel.sprite.carrot.4", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Carrot, 5), - make_model( + make_models( "voxygen.voxel.sprite.carrot.5", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Tomato, 0), - make_model("voxygen.voxel.sprite.tomato.0", Vec3::new(-5.5, -5.5, 0.0)), + make_models("voxygen.voxel.sprite.tomato.0", Vec3::new(-5.5, -5.5, 0.0)), ), ( (BlockKind::Tomato, 1), - make_model("voxygen.voxel.sprite.tomato.1", Vec3::new(-5.5, -5.5, 0.0)), + make_models("voxygen.voxel.sprite.tomato.1", Vec3::new(-5.5, -5.5, 0.0)), ), ( (BlockKind::Tomato, 2), - make_model("voxygen.voxel.sprite.tomato.2", Vec3::new(-5.5, -5.5, 0.0)), + make_models("voxygen.voxel.sprite.tomato.2", Vec3::new(-5.5, -5.5, 0.0)), ), ( (BlockKind::Tomato, 3), - make_model("voxygen.voxel.sprite.tomato.3", Vec3::new(-5.5, -5.5, 0.0)), + make_models("voxygen.voxel.sprite.tomato.3", Vec3::new(-5.5, -5.5, 0.0)), ), ( (BlockKind::Tomato, 4), - make_model("voxygen.voxel.sprite.tomato.4", Vec3::new(-5.5, -5.5, 0.0)), + make_models("voxygen.voxel.sprite.tomato.4", Vec3::new(-5.5, -5.5, 0.0)), ), // Radish ( (BlockKind::Radish, 0), - make_model( + make_models( "voxygen.voxel.sprite.radish.0", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Radish, 1), - make_model( + make_models( "voxygen.voxel.sprite.radish.1", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Radish, 2), - make_model( + make_models( "voxygen.voxel.sprite.radish.2", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Radish, 3), - make_model( + make_models( "voxygen.voxel.sprite.radish.3", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Radish, 4), - make_model( + make_models( "voxygen.voxel.sprite.radish.4", Vec3::new(-5.5, -5.5, -0.25), ), @@ -1538,42 +1546,42 @@ impl Terrain { // Turnip ( (BlockKind::Turnip, 0), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-0", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Turnip, 1), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-1", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Turnip, 2), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-2", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Turnip, 3), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-3", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Turnip, 4), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-4", Vec3::new(-5.5, -5.5, -0.25), ), ), ( (BlockKind::Turnip, 5), - make_model( + make_models( "voxygen.voxel.sprite.turnip.turnip-5", Vec3::new(-5.5, -5.5, -0.25), ), @@ -1581,7 +1589,7 @@ impl Terrain { // Coconut ( (BlockKind::Coconut, 0), - make_model( + make_models( "voxygen.voxel.sprite.fruit.coconut", Vec3::new(-6.0, -6.0, 0.0), ), @@ -1589,7 +1597,7 @@ impl Terrain { // Scarecrow ( (BlockKind::Scarecrow, 0), - make_model( + make_models( "voxygen.voxel.sprite.misc.scarecrow", Vec3::new(-9.5, -3.0, -0.25), ), @@ -1597,7 +1605,7 @@ impl Terrain { // Street Light ( (BlockKind::StreetLamp, 0), - make_model( + make_models( "voxygen.voxel.sprite.misc.street_lamp", Vec3::new(-4.5, -4.5, 0.0), ), @@ -1605,7 +1613,7 @@ impl Terrain { // Door ( (BlockKind::Door, 0), - make_model( + make_models( "voxygen.voxel.sprite.door.door-0", Vec3::new(-5.5, -5.5, 0.0), ), @@ -2001,16 +2009,26 @@ impl Terrain { // Terrain sprites for (pos, chunk) in chunk_iter.clone() { if chunk.visible { - const SPRITE_RENDER_DISTANCE: f32 = 128.0; + const SPRITE_RENDER_DISTANCE: f32 = 200.0; + const SPRITE_DETAIL_LOW_DISTANCE: f32 = 120.0; + const SPRITE_DETAIL_MID_DISTANCE: f32 = 64.0; + const SPRITE_DETAIL_HIGH_DISTANCE: f32 = 32.0; let chunk_center = pos.map2(V::RECT_SIZE, |e, sz: u32| (e as f32 + 0.5) * sz as f32); - if Vec2::from(focus_pos).distance_squared(chunk_center) - < SPRITE_RENDER_DISTANCE * SPRITE_RENDER_DISTANCE - { + let dist_sqrd = Vec2::from(focus_pos).distance_squared(chunk_center); + if dist_sqrd < SPRITE_RENDER_DISTANCE.powf(2.0) { for (kind, instances) in &chunk.sprite_instances { renderer.render_sprites( - &self.sprite_models[&kind], + if dist_sqrd < SPRITE_DETAIL_HIGH_DISTANCE.powf(2.0) { + &self.sprite_models[&kind][0] + } else if dist_sqrd < SPRITE_DETAIL_MID_DISTANCE.powf(2.0) { + &self.sprite_models[&kind][1] + } else if dist_sqrd < SPRITE_DETAIL_LOW_DISTANCE.powf(2.0) { + &self.sprite_models[&kind][2] + } else { + &self.sprite_models[&kind][3] + }, globals, &instances, lights,