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 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<MeshCommand>)> = 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);
}
}