webgl-rc 0.1.12

WebGL wrapper with resources reference counting
Documentation
use crate::{Gl, GlError, Settings};
use std::rc::Rc;
use web_sys::{WebGlRenderbuffer, WebGlRenderingContext};

#[derive(Clone, Debug)]
struct DepthBufferInfo {
    gl: Gl,
    handle: WebGlRenderbuffer,
    width: u32,
    height: u32,
}

impl Drop for DepthBufferInfo {
    fn drop(&mut self) {
        self.gl.context().delete_renderbuffer(Some(&self.handle));
    }
}

#[derive(Clone, Debug)]
pub struct DepthBuffer {
    data: Rc<DepthBufferInfo>,
}

impl PartialEq for DepthBuffer {
    fn eq(&self, other: &Self) -> bool {
        self.data.handle == other.data.handle
    }
}

impl Eq for DepthBuffer {}

impl DepthBuffer {
    pub fn new(gl: Gl, width: u32, height: u32) -> Result<DepthBuffer, GlError> {
        let handle = gl
            .context()
            .create_renderbuffer()
            .ok_or(GlError::DepthBufferError)?;
        let buffer = DepthBuffer {
            data: Rc::new(DepthBufferInfo {
                gl: gl.clone(),
                handle,
                width,
                height,
            }),
        };
        gl.apply(Gl::settings().depth_buffer(buffer.clone()), || {
            gl.context().renderbuffer_storage(
                WebGlRenderingContext::RENDERBUFFER,
                WebGlRenderingContext::DEPTH_COMPONENT16,
                width as i32,
                height as i32,
            )
        });
        Ok(buffer)
    }

    pub fn width(&self) -> u32 {
        self.data.width
    }
    pub fn height(&self) -> u32 {
        self.data.height
    }

    pub(crate) fn handle(&self) -> &WebGlRenderbuffer {
        &self.data.handle
    }
}