From d05308e7170be8fcaa0df9fa1b384ead2c600080 Mon Sep 17 00:00:00 2001 From: mars Date: Mon, 9 May 2022 14:02:42 -0600 Subject: [PATCH] Rasterize skinned meshes --- src/pass/mesh.rs | 46 ++++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/src/pass/mesh.rs b/src/pass/mesh.rs index 062d1bd..ccbb55f 100644 --- a/src/pass/mesh.rs +++ b/src/pass/mesh.rs @@ -1,7 +1,7 @@ use super::*; -use crate::storage::GpuVec; -use crate::storage::mesh::*; use crate::shader::{ShaderHandle, ShaderStore}; +use crate::storage::mesh::*; +use crate::storage::GpuVec; use crate::viewport::ViewportInfo; use crate::RenderLayouts; @@ -490,47 +490,37 @@ impl RenderPass for MeshPass { multiview: None, }); - let meshes = &[&self.example_mesh, &self.example_mesh]; - // yikes - let mesh_bindings: Vec<(MeshLayoutBindings, Vec<(&&MeshHandle, MeshAllocInfos)>)> = self - .mesh_pool - .iter_meshes(self.mesh_layout_id, meshes.iter(), |v| v) - .unwrap() - .into_iter() + let mesh_bindings: Vec<(MeshLayoutBindings, &Vec)> = data + .frame_data + .groups + .iter() .map( - |MeshLayoutInstances { - bindings, - instances, - }| (self.mesh_pool.get_bindings(bindings), instances), + |MeshGroupCommands { + binding_indices, + meshes, + .. + }| (self.mesh_pool.get_bindings(binding_indices.clone()), meshes), ) .collect(); cmds.set_pipeline(pipeline); cmds.set_bind_group(0, data.bind_viewport, &[]); - for (bindings, instances) in mesh_bindings.iter() { - let vertices_pool = bindings.get(self.vertex_attr_id).unwrap(); + for (bindings, meshes) in mesh_bindings.iter() { let indices_pool = bindings.get(self.index_attr_id).unwrap(); - cmds.set_vertex_buffer(0, vertices_pool.get_buffer().slice(..)); + cmds.set_vertex_buffer(0, data.frame_data.skinned_vertices.as_ref().slice(..)); cmds.set_index_buffer( indices_pool.get_buffer().slice(..), wgpu::IndexFormat::Uint32, ); - for (mesh, infos) in instances { - let vertices = infos.iter().find(|i| i.0 == self.vertex_attr_id).unwrap().1; - let indices = infos.iter().find(|i| i.0 == self.index_attr_id).unwrap().1; - - let is_start = indices.offset as u32; - let is_end = is_start + indices.count as u32; - - cmds.draw_indexed(is_start..is_end, vertices.offset as i32, 0..1); - println!( - "drew a mesh! {}..{} + {}", - is_start, is_end, vertices.offset - ); + for mesh in meshes.iter() { + let is_start = mesh.index_offset as u32; + let is_end = is_start + mesh.index_count as u32; + let vs_offset = mesh.skinned_offset as i32; + cmds.draw_indexed(is_start..is_end, vs_offset, 0..1); } }