@pixi/core
Version:
Core PixiJS
86 lines (81 loc) • 2.81 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var extensions = require('@pixi/extensions');
var settings = require('@pixi/settings');
var AbstractMaskSystem = require('./AbstractMaskSystem.js');
class StencilSystem extends AbstractMaskSystem.AbstractMaskSystem {
constructor(renderer) {
super(renderer);
this.glConst = settings.settings.ADAPTER.getWebGLRenderingContext().STENCIL_TEST;
}
getStackLength() {
const maskData = this.maskStack[this.maskStack.length - 1];
if (maskData) {
return maskData._stencilCounter;
}
return 0;
}
push(maskData) {
const maskObject = maskData.maskObject;
const { gl } = this.renderer;
const prevMaskCount = maskData._stencilCounter;
if (prevMaskCount === 0) {
this.renderer.framebuffer.forceStencil();
gl.clearStencil(0);
gl.clear(gl.STENCIL_BUFFER_BIT);
gl.enable(gl.STENCIL_TEST);
}
maskData._stencilCounter++;
const colorMask = maskData._colorMask;
if (colorMask !== 0) {
maskData._colorMask = 0;
gl.colorMask(false, false, false, false);
}
gl.stencilFunc(gl.EQUAL, prevMaskCount, 4294967295);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
maskObject.renderable = true;
maskObject.render(this.renderer);
this.renderer.batch.flush();
maskObject.renderable = false;
if (colorMask !== 0) {
maskData._colorMask = colorMask;
gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0);
}
this._useCurrent();
}
pop(maskObject) {
const gl = this.renderer.gl;
if (this.getStackLength() === 0) {
gl.disable(gl.STENCIL_TEST);
} else {
const maskData = this.maskStack.length !== 0 ? this.maskStack[this.maskStack.length - 1] : null;
const colorMask = maskData ? maskData._colorMask : 15;
if (colorMask !== 0) {
maskData._colorMask = 0;
gl.colorMask(false, false, false, false);
}
gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
maskObject.renderable = true;
maskObject.render(this.renderer);
this.renderer.batch.flush();
maskObject.renderable = false;
if (colorMask !== 0) {
maskData._colorMask = colorMask;
gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0);
}
this._useCurrent();
}
}
_useCurrent() {
const gl = this.renderer.gl;
gl.stencilFunc(gl.EQUAL, this.getStackLength(), 4294967295);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
}
}
StencilSystem.extension = {
type: extensions.ExtensionType.RendererSystem,
name: "stencil"
};
extensions.extensions.add(StencilSystem);
exports.StencilSystem = StencilSystem;
//# sourceMappingURL=StencilSystem.js.map