webgl_rc/
depth_buffer.rs

1use crate::{Gl, GlError, Settings};
2use std::rc::Rc;
3use web_sys::{WebGlRenderbuffer, WebGlRenderingContext};
4
5#[derive(Clone, Debug)]
6struct DepthBufferInfo {
7    gl: Gl,
8    handle: WebGlRenderbuffer,
9    width: u32,
10    height: u32,
11}
12
13impl Drop for DepthBufferInfo {
14    fn drop(&mut self) {
15        self.gl.context().delete_renderbuffer(Some(&self.handle));
16    }
17}
18
19#[derive(Clone, Debug)]
20pub struct DepthBuffer {
21    data: Rc<DepthBufferInfo>,
22}
23
24impl PartialEq for DepthBuffer {
25    fn eq(&self, other: &Self) -> bool {
26        self.data.handle == other.data.handle
27    }
28}
29
30impl Eq for DepthBuffer {}
31
32impl DepthBuffer {
33    pub fn new(gl: Gl, width: u32, height: u32) -> Result<DepthBuffer, GlError> {
34        let handle = gl
35            .context()
36            .create_renderbuffer()
37            .ok_or(GlError::DepthBufferError)?;
38        let buffer = DepthBuffer {
39            data: Rc::new(DepthBufferInfo {
40                gl: gl.clone(),
41                handle,
42                width,
43                height,
44            }),
45        };
46        gl.apply(Gl::settings().depth_buffer(buffer.clone()), || {
47            gl.context().renderbuffer_storage(
48                WebGlRenderingContext::RENDERBUFFER,
49                WebGlRenderingContext::DEPTH_COMPONENT16,
50                width as i32,
51                height as i32,
52            )
53        });
54        Ok(buffer)
55    }
56
57    pub fn width(&self) -> u32 {
58        self.data.width
59    }
60    pub fn height(&self) -> u32 {
61        self.data.height
62    }
63
64    pub(crate) fn handle(&self) -> &WebGlRenderbuffer {
65        &self.data.handle
66    }
67}