97 lines
No EOL
2.1 KiB
JavaScript
97 lines
No EOL
2.1 KiB
JavaScript
/**
|
|
* @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} TODO-Alvin
|
|
*/
|
|
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);
|
|
};
|
|
|
|
/**
|
|
* TODO-Alvin
|
|
* @method destroy
|
|
*/
|
|
PIXI.WebGLMaskManager.prototype.destroy = function()
|
|
{
|
|
this.maskStack = null;
|
|
this.gl = null;
|
|
}; |