use crate::vertex::*;
use std::ops::Range;
use bytemuck::cast_slice;
use wgpu::{
util::{BufferInitDescriptor, DeviceExt},
*
};
pub const INDEX_FORMAT: IndexFormat = IndexFormat::Uint32;
pub struct Mesh {
vertices: Buffer,
indices: Buffer,
index_count: u32
}
impl Mesh {
pub fn new<V: Vertex>(device: &Device, vertex_data: &[V], index_data: &[Index]) -> Self {
let vertices = device.create_buffer_init(&BufferInitDescriptor {
label: Some("Mesh Vertices"),
contents: cast_slice(vertex_data),
usage: BufferUsages::VERTEX
});
let indices = device.create_buffer_init(&BufferInitDescriptor {
label: Some("Mesh Indices"),
contents: cast_slice(index_data),
usage: BufferUsages::INDEX
});
let index_count = index_data.len() as u32;
Self {
vertices,
indices,
index_count
}
}
pub fn draw<'m: 'p, 'p>(&'m self, pass: &mut RenderPass<'p>) {
self.draw_instanced(pass, 0..1);
}
pub fn draw_instanced<'m: 'p, 'p>(&'m self, pass: &mut RenderPass<'p>, instances: Range<u32>) {
self.bind(pass, 0);
pass.draw_indexed(0..self.index_count, 0, instances);
}
pub fn bind<'m: 'p, 'p>(&'m self, pass: &mut RenderPass<'p>, slot: u32) {
pass.set_vertex_buffer(slot, self.vertices.slice(..));
pass.set_index_buffer(self.indices.slice(..), INDEX_FORMAT);
}
pub fn vertices(&self) -> &Buffer {
&self.vertices
}
pub fn indices(&self) -> &Buffer {
&self.indices
}
}