wrend 0.3.6

A WebGL2 rendering library for Rust/Wasm & JS
Documentation
use crate::{FramebufferCreateCallback, FramebufferCreateContext, Id, IdDefault};
use std::fmt::Debug;
use std::hash::Hash;
use web_sys::{WebGl2RenderingContext, WebGlFramebuffer, WebGlTexture};

#[derive(Clone)]
pub struct FramebufferLink<FramebufferId: Id, TextureId: Id = IdDefault> {
    framebuffer_id: FramebufferId,
    texture_id: Option<TextureId>,
    framebuffer_create_callback: FramebufferCreateCallback,
}

impl<FramebufferId: Id, TextureId: Id> FramebufferLink<FramebufferId, TextureId> {
    pub fn new(
        framebuffer_id: FramebufferId,
        framebuffer_create_callback: impl Into<FramebufferCreateCallback>,
        texture_id: Option<TextureId>,
    ) -> Self {
        Self {
            framebuffer_id,
            framebuffer_create_callback: framebuffer_create_callback.into(),
            texture_id,
        }
    }

    pub fn framebuffer_id(&self) -> &FramebufferId {
        &self.framebuffer_id
    }

    pub fn texture_id(&self) -> Option<TextureId> {
        self.texture_id.clone()
    }

    pub fn create_framebuffer(
        &self,
        gl: WebGl2RenderingContext,
        now: f64,
        texture: Option<WebGlTexture>,
    ) -> WebGlFramebuffer {
        let framebuffer_create_context = FramebufferCreateContext::new(gl, now, texture);
        self.framebuffer_create_callback
            .call_with_into_js_arg_and_return(&framebuffer_create_context)
    }
}

impl<FramebufferId: Id, TextureId: Id> Debug for FramebufferLink<FramebufferId, TextureId> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("FramebufferLink")
            .field("framebuffer_id", &self.framebuffer_id)
            .finish()
    }
}

impl<FramebufferId: Id, TextureId: Id> Hash for FramebufferLink<FramebufferId, TextureId> {
    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
        self.framebuffer_id.hash(state);
    }
}

impl<FramebufferId: Id, TextureId: Id> PartialEq for FramebufferLink<FramebufferId, TextureId> {
    fn eq(&self, other: &Self) -> bool {
        self.framebuffer_id == other.framebuffer_id
    }
}

impl<FramebufferId: Id, TextureId: Id> Eq for FramebufferLink<FramebufferId, TextureId> {}