/** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLMaskManager * @constructor * @param gl {WebGLContext} the current WebGL drawing context * @private */ PIXI.WebGLMaskManager = function(gl) { this.maskStack = []; this.maskPosition = 0; this.setContext(gl); }; /** * Sets the drawing context to the one given in parameter * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLMaskManager.prototype.setContext = function(gl) { this.gl = gl; }; /** * Applies the Mask and adds it to the current filter stack * @method pushMask * @param maskData {Array} * @param renderSession {RenderSession} */ PIXI.WebGLMaskManager.prototype.pushMask = function(maskData, renderSession) { var gl = this.gl; if(this.maskStack.length === 0) { gl.enable(gl.STENCIL_TEST); gl.stencilFunc(gl.ALWAYS,1,1); } // maskData.visible = false; this.maskStack.push(maskData); gl.colorMask(false, false, false, true); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); PIXI.WebGLGraphics.renderGraphics(maskData, renderSession); gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL,0, this.maskStack.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); }; /** * Removes the last filter from the filter stack and doesn't return it * @method popMask * * @param renderSession {RenderSession} an object containing all the useful parameters */ PIXI.WebGLMaskManager.prototype.popMask = function(renderSession) { var gl = this.gl; var maskData = this.maskStack.pop(); if(maskData) { gl.colorMask(false, false, false, false); //gl.stencilFunc(gl.ALWAYS,1,1); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); PIXI.WebGLGraphics.renderGraphics(maskData, renderSession); gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL,0,this.maskStack.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); } if(this.maskStack.length === 0)gl.disable(gl.STENCIL_TEST); }; /** * Destroys the mask stack * @method destroy */ PIXI.WebGLMaskManager.prototype.destroy = function() { this.maskStack = null; this.gl = null; };