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}