wrend/buffers/
buffer_link.rs1use super::buffer_create_context::BufferCreateContext;
2use crate::{BufferCreateCallback, Id};
3use std::fmt::Debug;
4use std::hash::Hash;
5use web_sys::{WebGl2RenderingContext, WebGlBuffer};
6
7#[derive(Clone)]
8pub struct BufferLink<BufferId: Id> {
9 buffer_id: BufferId,
10 buffer_create_callback: BufferCreateCallback,
11}
12
13impl<BufferId: Id> BufferLink<BufferId> {
14 pub fn new(
15 buffer_id: impl Into<BufferId>,
16 buffer_create_callback: impl Into<BufferCreateCallback>,
17 ) -> Self {
18 Self {
19 buffer_id: buffer_id.into(),
20 buffer_create_callback: buffer_create_callback.into(),
21 }
22 }
23
24 pub fn buffer_id(&self) -> &BufferId {
25 &self.buffer_id
26 }
27
28 pub fn create_buffer(&self, gl: WebGl2RenderingContext, now: f64) -> WebGlBuffer {
29 let buffer_create_context = BufferCreateContext::new(gl, now);
30 self.buffer_create_callback
31 .call_with_into_js_arg_and_return(&buffer_create_context)
32 }
33}
34
35impl<BufferId: Id> Debug for BufferLink<BufferId> {
36 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37 f.debug_struct("BufferLink")
38 .field("buffer_id", &self.buffer_id)
39 .finish()
40 }
41}
42
43impl<BufferId: Id> Hash for BufferLink<BufferId> {
44 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
45 self.buffer_id.hash(state);
46 }
47}
48
49impl<BufferId: Id> PartialEq for BufferLink<BufferId> {
50 fn eq(&self, other: &Self) -> bool {
51 self.buffer_id == other.buffer_id
52 }
53}
54
55impl<BufferId: Id> Eq for BufferLink<BufferId> {}