1use crate::{shadow_gpu::BufferHandle, webgl::buffer::BufferUsageHint, Attribute};
2use std::marker::PhantomData;
3
4#[allow(clippy::len_without_is_empty)]
5pub trait BufferLike<T: Attribute> {
6 fn get_buffer(&self) -> Option<BufferHandle>;
7
8 fn len(&self) -> usize;
9}
10
11#[derive(Clone)]
12pub struct Buffer<T: Attribute> {
13 handle: BufferHandle,
14 _ph: PhantomData<T>,
15}
16
17impl<T: Attribute> Buffer<T> {
18 pub fn new(data: Vec<T>, usage_hint: BufferUsageHint) -> Self {
19 let handle = BufferHandle::new(usage_hint);
20 handle.set_data(data);
21
22 Buffer {
23 handle,
24 _ph: PhantomData::default(),
25 }
26 }
27
28 pub fn new_empty(usage_hint: BufferUsageHint) -> Self {
29 Self::new(Vec::new(), usage_hint)
30 }
31
32 pub fn set_data(&self, data: Vec<T>) {
33 self.handle.set_data(data);
34 }
35}
36
37impl<T: Attribute> BufferLike<T> for Buffer<T> {
38 fn get_buffer(&self) -> Option<BufferHandle> {
39 Some(self.handle.clone())
40 }
41
42 fn len(&self) -> usize {
43 self.handle.len()
44 }
45}
46
47pub struct DummyBuffer {
48 size: usize,
49}
50
51impl DummyBuffer {
52 pub fn new(size: usize) -> Self {
53 DummyBuffer { size }
54 }
55}
56
57impl BufferLike<()> for DummyBuffer {
58 fn len(&self) -> usize {
59 self.size
60 }
61
62 fn get_buffer(&self) -> Option<BufferHandle> {
63 None
64 }
65}