limelight/
buffer.rs

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}