use crate::define_store;
use wgpu::BufferUsages;
use wgpu::util::{BufferInitDescriptor, DeviceExt};
define_store!(Mesh);
pub struct Mesh {
pub(crate) vertex_buffer: wgpu::Buffer,
pub(crate) index_buffer: Option<wgpu::Buffer>,
pub(crate) num_vertices: usize,
pub(crate) num_indices: usize,
}
impl Mesh {
pub fn non_indexed<T: bytemuck::Pod + bytemuck::Zeroable>(
device: &wgpu::Device,
vertices: &[T],
) -> Mesh {
let num_vertices = vertices.len();
let vertex_buffer = device.create_buffer_init(&BufferInitDescriptor {
label: Some(&format!("Vertex Buffer (len: {num_vertices})")),
contents: bytemuck::cast_slice(vertices),
usage: BufferUsages::VERTEX,
});
Self {
vertex_buffer,
index_buffer: None,
num_vertices,
num_indices: 0usize,
}
}
pub fn indexed<T: bytemuck::Pod + bytemuck::Zeroable>(device: &wgpu::Device, vertices: &[T], indices: &[u16]) -> Mesh {
let num_vertices = vertices.len();
let num_indices = indices.len();
let vertex_buffer = device.create_buffer_init(&BufferInitDescriptor {
label: Some(&format!("Vertex Buffer (len: {num_vertices})")),
contents: bytemuck::cast_slice(vertices),
usage: BufferUsages::VERTEX,
});
let index_buffer = device.create_buffer_init(&BufferInitDescriptor {
label: Some(&format!("Index Buffer (len: {num_indices})")),
contents: bytemuck::cast_slice(indices),
usage: BufferUsages::INDEX,
});
Self {
vertex_buffer,
index_buffer: Some(index_buffer),
num_vertices,
num_indices,
}
}
pub fn is_indexed(&self) -> bool {
self.index_buffer.is_some()
}
pub fn vertex_count(&self) -> usize {
self.num_vertices
}
pub fn index_count(&self) -> usize {
self.num_indices
}
#[allow(unused)]
pub(crate) fn vertex_buffer(&self) -> &wgpu::Buffer {
&self.vertex_buffer
}
#[allow(unused)]
pub(crate) fn index_buffer(&self) -> Option<&wgpu::Buffer> {
self.index_buffer.as_ref()
}
}