From 0ed53eb50107395f795e91206fe75de54ca5925f Mon Sep 17 00:00:00 2001 From: sakitam-fdd Date: Thu, 2 Jun 2022 23:12:30 +0800 Subject: [PATCH] feat(core): RenderBuffer --- src/core/RenderBuffer.ts | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/core/RenderBuffer.ts diff --git a/src/core/RenderBuffer.ts b/src/core/RenderBuffer.ts new file mode 100644 index 00000000..cdb3fbea --- /dev/null +++ b/src/core/RenderBuffer.ts @@ -0,0 +1,64 @@ +import Resource from './Resource'; +import Renderer from './Renderer'; + +export interface RenderBufferOptions { + width: number; + height: number; + + format: GLenum; +} + +export default class RenderBuffer extends Resource { + public width: number; + + public height: number; + + #internalFormat: GLenum; + + constructor (renderer: Renderer, options: RenderBufferOptions = {} as RenderBufferOptions) { + super(renderer, { + ...options, + format: options.format || renderer.gl.DEPTH_COMPONENT16, + }); + + this.#internalFormat = this.options.format as GLenum; + + this.width = this.options.width as number; + this.height = this.options.height as number; + + console.assert( + this.width > 0 && this.height > 0, + 'Renderbuffer object requires valid width and height greater than zero' + ); + this.bind(); + renderer.gl.renderbufferStorage(renderer.gl.RENDERBUFFER, this.#internalFormat, this.width, this.height); + } + + resize (width, height) { + if (width === this.width && height === this.height) return; + this.bind(); + this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.#internalFormat, width, height); + this.unbind(); + } + + bind () { + this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.handle); + } + + unbind () { + this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, null); + } + + destroy () { + this.unbind(); + this.deleteHandle(); + } + + createHandle () { + return this.gl.createRenderbuffer(); + } + + deleteHandle () { + this.handle && this.gl.deleteRenderbuffer(this.handle); + } +}