use crate::GpuDevice;
use std::{marker::PhantomData, ops::Range};
use wgpu::{Queue, util::DeviceExt};
#[derive(Default, Debug)]
pub struct BufferStore {
pub store: Vec<u8>,
pub indexs: Vec<u8>,
pub changed: bool,
pub store_pos: Range<usize>,
pub index_pos: Range<usize>,
}
impl BufferStore {
pub fn new(store_size: usize, index_size: usize) -> Self {
let mut store = Vec::with_capacity(store_size);
let mut indexs = Vec::with_capacity(index_size);
store.resize_with(store_size, || 0);
indexs.resize_with(index_size, || 0);
Self {
store,
indexs,
changed: false,
store_pos: Range::default(),
index_pos: Range::default(),
}
}
}
pub struct BufferPass<'a> {
pub vertex_buffer: &'a wgpu::Buffer,
pub index_buffer: &'a wgpu::Buffer,
}
pub trait AsBufferPass<'a> {
fn as_buffer_pass(&'a self) -> BufferPass<'a>;
}
#[derive(Default)]
pub struct BufferData {
pub vertexs: Vec<u8>,
pub indexs: Vec<u8>,
}
#[derive(Debug)]
pub struct Buffer<K: BufferLayout> {
pub buffer: wgpu::Buffer,
pub count: usize,
pub len: usize,
pub max: usize,
phantom_data: PhantomData<K>,
}
impl<K: BufferLayout> Buffer<K> {
pub fn new(
gpu_device: &GpuDevice,
contents: &[u8],
usage: wgpu::BufferUsages,
label: Option<&str>,
) -> Self {
Self {
buffer: gpu_device.device().create_buffer_init(
&wgpu::util::BufferInitDescriptor {
label,
contents,
usage,
},
),
count: 0,
len: 0,
max: contents.len(),
phantom_data: PhantomData,
}
}
pub fn write(&self, queue: &Queue, data: &[u8], pos: u64) {
if !data.is_empty() {
queue.write_buffer(&self.buffer, pos, data);
}
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn buffer_slice(&self, range: Range<u64>) -> wgpu::BufferSlice<'_> {
self.buffer.slice(range)
}
}
pub trait BufferLayout {
fn attributes() -> Vec<wgpu::VertexAttribute>;
fn default_buffer() -> BufferData;
fn stride() -> usize;
fn with_capacity(
vertex_capacity: usize,
index_capacity: usize,
) -> BufferData;
}