1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//! WebGLRenderbuffer and methods
use glenum::{Attachment, FramebufferKind, RenderbufferKind};
use rendering_context::WebGL2RenderingContext;
use wasm_bindgen::prelude::*;

impl WebGL2RenderingContext {
    /// Creates and initializes WebGLRSRenderbuffer object.
    pub fn create_renderbuffer(&self) -> WebGLRSRenderbuffer {
        WebGLRSRenderbuffer {
            context: self,
            inner: self._create_renderbuffer(),
        }
    }
}

/// The `WebGLRenderbuffer` interface is represents a buffer that can contain an image, or can be source
/// or target of an rendering operation.
#[derive(Clone)]
pub struct WebGLRSRenderbuffer<'ctx> {
    context: &'ctx WebGL2RenderingContext,
    inner: WebGLRenderbuffer,
}

impl<'ctx> WebGLRSRenderbuffer<'ctx> {
    /// Deletes the `WebGLRSRenderbuffer` object
    pub fn delete(self) {
        self.context._delete_renderbuffer(self.inner);
    }

    /// Returns true if the `WebGLRSRenderbuffer` object is valid and false otherwise.
    pub fn is_valid(&self) -> bool {
        self.context._is_renderbuffer(&self.inner)
    }

    /// Binds the `WebGLRSRenderbuffer` object to the given target.
    ///
    /// # Arguments
    /// * `target` - specifying the binding point.
    pub fn bind(&self, target: RenderbufferKind) {
        self.context._bind_renderbuffer(target, &self.inner);
    }

    /// Attaches this `WebGLRSRenderbuffer` object to a framebuffer.
    ///
    /// # Arguments
    /// * `fb_target` - specifying the binding point (target) for the framebuffer.
    /// * `attachment` - specifying the attachment point for the render buffer.
    /// * `rb_target` - specifying the binding point (target) for the render buffer.
    pub fn attach_framebuffer(
        &self,
        fb_target: FramebufferKind,
        attachment: Attachment,
        rb_target: RenderbufferKind,
    ) {
        self.context
            ._framebuffer_renderbuffer(fb_target, attachment, rb_target, &self.inner);
    }
}

/// Bindings for WebGLRenderbuffer
#[wasm_bindgen]
#[derive(Clone, Copy)]
extern "C" {
    #[derive(Clone)]
    type WebGLRenderbuffer;
    /// Binding for `WebGLRenderingContext.createRenderbuffer()`
    #[wasm_bindgen(method, js_name = createRenderbuffer)]
    fn _create_renderbuffer(this: &WebGL2RenderingContext) -> WebGLRenderbuffer;

    /// The `WebGLRenderingContext.framebufferRenderbuffer()` method of the WebGL API attaches a WebGLRenderbuffer object
    /// to a WebGLFramebuffer object.
    #[wasm_bindgen(method, js_name = framebufferRenderbuffer)]
    fn _framebuffer_renderbuffer(
        this: &WebGL2RenderingContext,
        target: FramebufferKind,
        attachment: Attachment,
        renderbuffertarget: RenderbufferKind,
        renderbuffer: &WebGLRenderbuffer,
    );

    /// The `WebGLRenderingContext.bindRenderbuffer()` method of the WebGL API binds a given WebGLRenderbuffer
    /// to a target, which must be `gl.RENDERBUFFER`.
    #[wasm_bindgen(method, js_name = bindRenderbuffer)]
    fn _bind_renderbuffer(
        this: &WebGL2RenderingContext,
        target: RenderbufferKind,
        renderbuffer: &WebGLRenderbuffer,
    );

    /// The `WebGLRenderingContext.deleteRenderbuffer()` method of the WebGL API deletes a given WebGLRenderbuffer
    /// object. This method has no effect if the render buffer has already been deleted.
    #[wasm_bindgen(method, js_name = deleteRenderbuffer)]
    fn _delete_renderbuffer(this: &WebGL2RenderingContext, renderbuffer: WebGLRenderbuffer);

    /// The `WebGLRenderingContext.isRenderbuffer()` method of the WebGL API returns true if the passed
    /// WebGLRenderbuffer is valid and false otherwise.
    #[wasm_bindgen(method, js_name = isRenderbuffer)]
    fn _is_renderbuffer(this: &WebGL2RenderingContext, renderbuffer: &WebGLRenderbuffer) -> bool;

}