UNPKG

@smoud/tiny

Version:

Fast and tiny JavaScript library for HTML5 game and playable ads creation.

124 lines (103 loc) 3.4 kB
import { SCALE_MODES } from '../../../constants'; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class FrameBuffer * @constructor * @param gl {WebGLContext} the current WebGL drawing context * @param width {Number} the horizontal range of the filter * @param height {Number} the vertical range of the filter * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}SCALE_MODES{{/crossLink}} for possible values */ var FrameBuffer = function (gl, width, height, scaleMode) { /** * @property gl * @type WebGLContext */ this.gl = gl; // next time to create a frame buffer and texture /** * @property frameBuffer * @type Any */ this.frameBuffer = gl.createFramebuffer(); /** * @property texture * @type Any */ this.texture = gl.createTexture(); /** * @property scaleMode * @type Number */ scaleMode = scaleMode || 0; gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, scaleMode === SCALE_MODES.LINEAR ? gl.LINEAR : gl.NEAREST ); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer); gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); // required for masking a mask?? this.renderBuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, this.renderBuffer ); this.resize(width, height); }; FrameBuffer.prototype.constructor = FrameBuffer; /** * Clears the filter texture. * * @method clear */ FrameBuffer.prototype.clear = function () { var gl = this.gl; gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); }; /** * Resizes the texture to the specified width and height * * @method resize * @param width {Number} the new width of the texture * @param height {Number} the new height of the texture */ FrameBuffer.prototype.resize = function (width, height) { if (this.width === width && this.height === height) return; this.width = width; this.height = height; var gl = this.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // update the stencil buffer width and height gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); }; /** * Destroys the filter texture. * * @method destroy */ FrameBuffer.prototype.destroy = function () { var gl = this.gl; gl.deleteFramebuffer(this.frameBuffer); gl.deleteTexture(this.texture); this.frameBuffer = null; this.texture = null; }; export { FrameBuffer };