var WebGLManager = require('./WebGLManager'), utils = require('../../../utils'); /** * @class * @memberof PIXI * @param renderer {PIXI.WebGLRenderer} The renderer this manager works for. */ function WebGLMaskManager(renderer) { WebGLManager.call(this, renderer); this.stencilMaskStack = null; } WebGLMaskManager.prototype = Object.create(WebGLManager.prototype); WebGLMaskManager.prototype.constructor = WebGLMaskManager; module.exports = WebGLMaskManager; /** * Changes the mask stack that is used by this manager. * * @param stencilMaskStack {PIXI.StencilMaskStack} The mask stack */ WebGLMaskManager.prototype.setMaskStack = function ( stencilMaskStack ) { this.stencilMaskStack = stencilMaskStack; var gl = this.renderer.gl; if (stencilMaskStack.stencilStack.length === 0) { gl.disable(gl.STENCIL_TEST); } else { gl.enable(gl.STENCIL_TEST); } }; /** * Applies the Mask and adds it to the current filter stack. @alvin * * @param graphics {PIXI.Graphics} * @param webGLData {any[]} */ WebGLMaskManager.prototype.pushStencil = function (graphics) { this.renderer._activeRenderTarget.attachStencilBuffer(); var gl = this.renderer.gl, sms = this.stencilMaskStack; if (sms.stencilStack.length === 0) { gl.enable(gl.STENCIL_TEST); gl.clear(gl.STENCIL_BUFFER_BIT); sms.reverse = true; sms.count = 0; } sms.stencilStack.push(graphics); gl.colorMask(false, false, false, false); gl.stencilFunc(gl.ALWAYS,1,1); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); this.renderer.plugins.graphics.render(graphics) gl.stencilFunc(gl.NOTEQUAL,0, sms.stencilStack.length); gl.colorMask(true, true, true, true); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); sms.count++; }; /** * TODO @alvin * @param graphics {PIXI.Graphics} * @param webGLData {any[]} */ WebGLMaskManager.prototype.popStencil = function (graphics) { var gl = this.renderer.gl, sms = this.stencilMaskStack; sms.stencilStack.pop(); sms.count--; if (sms.stencilStack.length === 0) { // the stack is empty! gl.disable(gl.STENCIL_TEST); } else { var level = sms.count; gl.colorMask(false, false, false, false); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); this.renderer.plugins.graphics.render(graphics) gl.stencilFunc(gl.NOTEQUAL,0,sms.stencilStack.length); gl.colorMask(true, true, true, true); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); } }; /** * Destroys the mask stack. * */ WebGLMaskManager.prototype.destroy = function () { WebGLManager.prototype.destroy.call(this); this.stencilMaskStack.stencilStack = null; }; /** * Applies the Mask and adds it to the current filter stack. * * @param maskData {any[]} The mask data structure to use */ WebGLMaskManager.prototype.pushMask = function (maskData) { this.renderer.setObjectRenderer(this.renderer.plugins.graphics); this.pushStencil(maskData) }; /** * Removes the last filter from the filter stack and doesn't return it. * * @param maskData {any[]} */ WebGLMaskManager.prototype.popMask = function (maskData) { this.popStencil(maskData) };