From 1b80f05e8212965c3f2835443aa3b6200ca943d5 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Thu, 20 Aug 2020 22:34:58 +0100 Subject: [PATCH] Centred particle meshes correctly --- assets/voxygen/shaders/particle-vert.glsl | 2 +- voxygen/src/render/mesh.rs | 3 +++ voxygen/src/scene/particle.rs | 17 +++++++++++------ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/assets/voxygen/shaders/particle-vert.glsl b/assets/voxygen/shaders/particle-vert.glsl index 269a3e8e41..a78551a935 100644 --- a/assets/voxygen/shaders/particle-vert.glsl +++ b/assets/voxygen/shaders/particle-vert.glsl @@ -217,7 +217,7 @@ void main() { ); } - f_pos = (inst_pos - focus_off.xyz) + ((v_pos - 0.5) * attr.scale * SCALE * mat3(attr.rot) + attr.offs); + f_pos = (inst_pos - focus_off.xyz) + (v_pos * attr.scale * SCALE * mat3(attr.rot) + attr.offs); // First 3 normals are negative, next 3 are positive // TODO: Make particle normals match orientation diff --git a/voxygen/src/render/mesh.rs b/voxygen/src/render/mesh.rs index 4ddbe65843..cd38e88ae4 100644 --- a/voxygen/src/render/mesh.rs +++ b/voxygen/src/render/mesh.rs @@ -28,6 +28,9 @@ impl Mesh

{ /// Get a slice referencing the vertices of this mesh. pub fn vertices(&self) -> &[P::Vertex] { &self.verts } + /// Get a mutable slice referencing the vertices of this mesh. + pub fn vertices_mut(&mut self) -> &mut [P::Vertex] { &mut self.verts } + /// Push a new vertex onto the end of this mesh. pub fn push(&mut self, vert: P::Vertex) { self.verts.push(vert); } diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 536c2fa9f1..2586d335a7 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -14,7 +14,7 @@ use common::{ spiral::Spiral2d, state::DeltaTime, terrain::TerrainChunk, - vol::RectRasterableVol, + vol::{RectRasterableVol, SizedVol}, }; use dot_vox::DotVoxData; use hashbrown::HashMap; @@ -367,11 +367,16 @@ fn default_cache(renderer: &mut Renderer) -> HashMap<&'static str, Model::generate_mesh( - Segment::from(vox.as_ref()), - &mut greedy, - ) - .0; + let segment = Segment::from(vox.as_ref()); + let segment_size = segment.size(); + let mut mesh = + Meshable::::generate_mesh(segment, &mut greedy).0; + // Center particle vertices around origin + for vert in mesh.vertices_mut() { + vert.pos[0] -= segment_size.x as f32 / 2.0; + vert.pos[1] -= segment_size.y as f32 / 2.0; + vert.pos[2] -= segment_size.z as f32 / 2.0; + } // NOTE: Ignoring coloring / lighting for now. drop(greedy);