UNPKG

@pixi/core

Version:
86 lines (81 loc) 2.81 kB
'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