wrend/framebuffers/
framebuffer_link.rs

1use crate::{FramebufferCreateCallback, FramebufferCreateContext, Id, IdDefault};
2use std::fmt::Debug;
3use std::hash::Hash;
4use web_sys::{WebGl2RenderingContext, WebGlFramebuffer, WebGlTexture};
5
6#[derive(Clone)]
7pub struct FramebufferLink<FramebufferId: Id, TextureId: Id = IdDefault> {
8    framebuffer_id: FramebufferId,
9    texture_id: Option<TextureId>,
10    framebuffer_create_callback: FramebufferCreateCallback,
11}
12
13impl<FramebufferId: Id, TextureId: Id> FramebufferLink<FramebufferId, TextureId> {
14    pub fn new(
15        framebuffer_id: FramebufferId,
16        framebuffer_create_callback: impl Into<FramebufferCreateCallback>,
17        texture_id: Option<TextureId>,
18    ) -> Self {
19        Self {
20            framebuffer_id,
21            framebuffer_create_callback: framebuffer_create_callback.into(),
22            texture_id,
23        }
24    }
25
26    pub fn framebuffer_id(&self) -> &FramebufferId {
27        &self.framebuffer_id
28    }
29
30    pub fn texture_id(&self) -> Option<TextureId> {
31        self.texture_id.clone()
32    }
33
34    pub fn create_framebuffer(
35        &self,
36        gl: WebGl2RenderingContext,
37        now: f64,
38        texture: Option<WebGlTexture>,
39    ) -> WebGlFramebuffer {
40        let framebuffer_create_context = FramebufferCreateContext::new(gl, now, texture);
41        self.framebuffer_create_callback
42            .call_with_into_js_arg_and_return(&framebuffer_create_context)
43    }
44}
45
46impl<FramebufferId: Id, TextureId: Id> Debug for FramebufferLink<FramebufferId, TextureId> {
47    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48        f.debug_struct("FramebufferLink")
49            .field("framebuffer_id", &self.framebuffer_id)
50            .finish()
51    }
52}
53
54impl<FramebufferId: Id, TextureId: Id> Hash for FramebufferLink<FramebufferId, TextureId> {
55    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
56        self.framebuffer_id.hash(state);
57    }
58}
59
60impl<FramebufferId: Id, TextureId: Id> PartialEq for FramebufferLink<FramebufferId, TextureId> {
61    fn eq(&self, other: &Self) -> bool {
62        self.framebuffer_id == other.framebuffer_id
63    }
64}
65
66impl<FramebufferId: Id, TextureId: Id> Eq for FramebufferLink<FramebufferId, TextureId> {}