diff --git a/voxygen/src/mesh/terrain.rs b/voxygen/src/mesh/terrain.rs index a9157419e7..50c4ea7667 100644 --- a/voxygen/src/mesh/terrain.rs +++ b/voxygen/src/mesh/terrain.rs @@ -4,8 +4,8 @@ use vek::*; // Project use common::{ terrain::Block, - vol::{ReadVol, SizedVol, Vox}, - volumes::dyna::Dyna, + vol::{ReadVol, SizedVol, VolSize, Vox}, + volumes::{dyna::Dyna, vol_map::VolMap}, }; // Crate @@ -43,3 +43,38 @@ impl Meshable for Dyna { mesh } } + +impl Meshable for VolMap { + type Pipeline = TerrainPipeline; + type Supplement = Aabb; + + fn generate_mesh(&self, range: Self::Supplement) -> Mesh { + let mut mesh = Mesh::new(); + + let mut last_chunk_pos = self.pos_key(range.min); + let mut last_chunk = self.get_key(last_chunk_pos); + + let size = range.max - range.min; + for x in 1..(size.x - 1) { + for y in 1..(size.y - 1) { + for z in 1..(size.z - 1) { + let pos = Vec3::new(x, y, z); + + let new_chunk_pos = self.pos_key(range.min + pos); + if last_chunk_pos != new_chunk_pos { + last_chunk = self.get_key(new_chunk_pos); + last_chunk_pos = new_chunk_pos; + } + let offs = pos.map(|e| e as f32 - 1.0); + if let Some(col) = self.get(pos).ok().and_then(|vox| vox.get_color()) { + let col = col.map(|e| e as f32 / 255.0); + + vol::push_vox_verts(&mut mesh, self, pos, offs, col, TerrainVertex::new); + } + } + } + } + + mesh + } +} diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 40f943ad6c..f15d730d72 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -38,10 +38,11 @@ fn mesh_worker( pos: Vec3, started_tick: u64, volume: ::Sample, + supplement: Aabb, ) -> MeshWorkerResponse { MeshWorkerResponse { pos, - mesh: volume.generate_mesh(()), + mesh: volume.generate_mesh(supplement), started_tick, } } @@ -146,7 +147,7 @@ impl Terrain { // Queue the worker thread client.thread_pool().execute(move || { - send.send(mesh_worker(pos, current_tick, volume)) + send.send(mesh_worker(pos, current_tick, volume, aabb)) .expect("Failed to send chunk mesh to main thread"); }); todo.active_worker = true;