@smoud/tiny
Version:
Fast and tiny JavaScript library for HTML5 game and playable ads creation.
124 lines (103 loc) • 3.4 kB
JavaScript
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 };