1use bytemuck::Pod;
2use wgpu::util::{BufferInitDescriptor, DeviceExt};
3use wgpu::{Buffer, BufferSlice, BufferUsages, Device};
4
5pub struct BufferCreator<'a, T: Pod> {
7 data: Vec<T>,
8 device: &'a Device,
9 usage: BufferUsages,
10
11 label: &'a str,
12}
13
14impl<'a> BufferCreator<'a, i32> {
15 pub fn indices(device: &'a Device) -> BufferCreator<'a, i32> {
19 BufferCreator {
20 data: vec![],
21 device,
22 usage: BufferUsages::INDEX,
23 label: "Indices Buffer",
24 }
25 }
26}
27
28impl<'a, T: Pod> BufferCreator<'a, T> {
29 pub fn vertex(device: &'a Device) -> BufferCreator<'a, T> {
31 BufferCreator {
32 data: vec![],
33 device,
34 usage: BufferUsages::VERTEX,
35 label: "Vertex Buffer",
36 }
37 }
38
39 pub fn label(mut self, label: &'a str) -> Self {
41 self.label = label;
42
43 self
44 }
45
46 pub fn data(mut self, data: Vec<T>) -> Self {
50 self.data = data;
51 self
52 }
53
54 pub fn add_data(&mut self, data: T) -> &mut Self {
56 self.data.push(data);
57
58 self
59 }
60
61 pub fn append_data(&mut self, data: &mut Vec<T>) -> &mut Self {
63 self.data.append(data);
64
65 self
66 }
67
68 pub fn build(&self) -> SimpleBuffer {
70 SimpleBuffer {
71 buffer: self.device.create_buffer_init(&BufferInitDescriptor {
72 label: Some(self.label),
73 contents: bytemuck::cast_slice(&self.data),
74 usage: self.usage,
75 }),
76
77 size: self.data.len() as u32,
78 }
79 }
80}
81
82pub struct SimpleBuffer {
84 buffer: Buffer,
85 size: u32,
86}
87
88impl SimpleBuffer {
89 pub fn size(&self) -> u32 {
90 self.size
91 }
92
93 pub fn slice(&self) -> BufferSlice {
94 self.buffer.slice(..)
95 }
96}