use crate::vertex::{InstanceData, Vertex};
pub struct GeometryBuffers {
pub vertex_buffer: wgpu::Buffer,
pub index_buffer: wgpu::Buffer,
pub instance_buffer: wgpu::Buffer,
pub max_vertices: usize,
pub max_indices: usize,
}
impl GeometryBuffers {
pub fn forge(device: &wgpu::Device, max_vertices: usize, max_indices: usize) -> Self {
let vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Surtr Vertex Anvil"),
size: (max_vertices * std::mem::size_of::<Vertex>()) as u64,
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
let index_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Surtr Index Anvil"),
size: (max_indices * std::mem::size_of::<u32>()) as u64,
usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
let instance_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Surtr Instance Anvil"),
size: (max_vertices / 4 * std::mem::size_of::<InstanceData>()) as u64,
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
Self {
vertex_buffer,
index_buffer,
instance_buffer,
max_vertices,
max_indices,
}
}
pub fn vram_bytes(&self) -> u64 {
let vertex_bytes = self.max_vertices * std::mem::size_of::<Vertex>();
let index_bytes = self.max_indices * std::mem::size_of::<u32>();
let instance_bytes = (self.max_vertices / 4) * std::mem::size_of::<InstanceData>();
(vertex_bytes + index_bytes + instance_bytes) as u64
}
pub fn grow_vertex_buffer(
&mut self,
device: &wgpu::Device,
min_capacity: usize,
max_capacity: usize,
) -> bool {
let current = self.vertex_buffer.size() as usize / std::mem::size_of::<Vertex>();
if min_capacity <= current {
return false;
}
let new_size = (min_capacity.min(max_capacity)) * std::mem::size_of::<Vertex>();
self.vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Vertex Buffer (Grown)"),
size: new_size as u64,
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
true
}
pub fn grow_index_buffer(
&mut self,
device: &wgpu::Device,
min_capacity: usize,
max_capacity: usize,
) -> bool {
let current = self.index_buffer.size() as usize / std::mem::size_of::<u32>();
if min_capacity <= current {
return false;
}
let new_size = (min_capacity.min(max_capacity)) * std::mem::size_of::<u32>();
self.index_buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Index Buffer (Grown)"),
size: new_size as u64,
usage: wgpu::BufferUsages::INDEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
true
}
}