Rasterize skinned meshes

This commit is contained in:
mars 2022-05-09 14:02:42 -06:00
parent b06a8c7982
commit d05308e717
1 changed files with 18 additions and 28 deletions

View File

@ -1,7 +1,7 @@
use super::*; use super::*;
use crate::storage::GpuVec;
use crate::storage::mesh::*;
use crate::shader::{ShaderHandle, ShaderStore}; use crate::shader::{ShaderHandle, ShaderStore};
use crate::storage::mesh::*;
use crate::storage::GpuVec;
use crate::viewport::ViewportInfo; use crate::viewport::ViewportInfo;
use crate::RenderLayouts; use crate::RenderLayouts;
@ -490,47 +490,37 @@ impl RenderPass for MeshPass {
multiview: None, multiview: None,
}); });
let meshes = &[&self.example_mesh, &self.example_mesh];
// yikes // yikes
let mesh_bindings: Vec<(MeshLayoutBindings, Vec<(&&MeshHandle, MeshAllocInfos)>)> = self let mesh_bindings: Vec<(MeshLayoutBindings, &Vec<MeshCommand>)> = data
.mesh_pool .frame_data
.iter_meshes(self.mesh_layout_id, meshes.iter(), |v| v) .groups
.unwrap() .iter()
.into_iter()
.map( .map(
|MeshLayoutInstances { |MeshGroupCommands {
bindings, binding_indices,
instances, meshes,
}| (self.mesh_pool.get_bindings(bindings), instances), ..
}| (self.mesh_pool.get_bindings(binding_indices.clone()), meshes),
) )
.collect(); .collect();
cmds.set_pipeline(pipeline); cmds.set_pipeline(pipeline);
cmds.set_bind_group(0, data.bind_viewport, &[]); cmds.set_bind_group(0, data.bind_viewport, &[]);
for (bindings, instances) in mesh_bindings.iter() { for (bindings, meshes) in mesh_bindings.iter() {
let vertices_pool = bindings.get(self.vertex_attr_id).unwrap();
let indices_pool = bindings.get(self.index_attr_id).unwrap(); 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( cmds.set_index_buffer(
indices_pool.get_buffer().slice(..), indices_pool.get_buffer().slice(..),
wgpu::IndexFormat::Uint32, wgpu::IndexFormat::Uint32,
); );
for (mesh, infos) in instances { for mesh in meshes.iter() {
let vertices = infos.iter().find(|i| i.0 == self.vertex_attr_id).unwrap().1; let is_start = mesh.index_offset as u32;
let indices = infos.iter().find(|i| i.0 == self.index_attr_id).unwrap().1; let is_end = is_start + mesh.index_count as u32;
let vs_offset = mesh.skinned_offset as i32;
let is_start = indices.offset as u32; cmds.draw_indexed(is_start..is_end, vs_offset, 0..1);
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
);
} }
} }