From 393dce8a7373a1d43088cc4aa581e66913121843 Mon Sep 17 00:00:00 2001 From: Guilherme Werner Date: Fri, 15 Mar 2024 11:27:35 -0300 Subject: [PATCH] Update model.rs --- src/model.rs | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/model.rs b/src/model.rs index b4fedcd..934fec1 100644 --- a/src/model.rs +++ b/src/model.rs @@ -61,11 +61,25 @@ pub struct Model { } pub trait DrawModel<'a> { - fn draw_mesh(&mut self, mesh: &'a Mesh); + fn draw_mesh( + &mut self, + mesh: &'a Mesh, + material: &'a Material, + camera_bind_group: &'a wgpu::BindGroup, + ); fn draw_mesh_instanced( &mut self, mesh: &'a Mesh, + material: &'a Material, instances: Range, + camera_bind_group: &'a wgpu::BindGroup, + ); + fn draw_model(&mut self, model: &'a Model, camera_bind_group: &'a wgpu::BindGroup); + fn draw_model_instanced( + &mut self, + model: &'a Model, + instances: Range, + camera_bind_group: &'a wgpu::BindGroup, ); } @@ -73,17 +87,42 @@ impl<'a, 'b> DrawModel<'b> for wgpu::RenderPass<'a> where 'b: 'a, { - fn draw_mesh(&mut self, mesh: &'b Mesh) { - self.draw_mesh_instanced(mesh, 0..1); + fn draw_mesh( + &mut self, + mesh: &'b Mesh, + material: &'b Material, + camera_bind_group: &'b wgpu::BindGroup, + ) { + self.draw_mesh_instanced(mesh, material, 0..1, camera_bind_group); } fn draw_mesh_instanced( &mut self, mesh: &'b Mesh, + material: &'b Material, instances: Range, - ){ + camera_bind_group: &'b wgpu::BindGroup, + ) { self.set_vertex_buffer(0, mesh.vertex_buffer.slice(..)); self.set_index_buffer(mesh.index_buffer.slice(..), wgpu::IndexFormat::Uint32); + self.set_bind_group(0, &material.bind_group, &[]); + self.set_bind_group(1, camera_bind_group, &[]); self.draw_indexed(0..mesh.num_elements, 0, instances); } + + fn draw_model(&mut self, model: &'b Model, camera_bind_group: &'b wgpu::BindGroup) { + self.draw_model_instanced(model, 0..1, camera_bind_group); + } + + fn draw_model_instanced( + &mut self, + model: &'b Model, + instances: Range, + camera_bind_group: &'b wgpu::BindGroup, + ) { + for mesh in &model.meshes { + let material = &model.materials[mesh.material]; + self.draw_mesh_instanced(mesh, material, instances.clone(), camera_bind_group); + } + } }