UNPKG

2.81 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var extensions = require('@pixi/extensions');
6var settings = require('@pixi/settings');
7var AbstractMaskSystem = require('./AbstractMaskSystem.js');
8
9class StencilSystem extends AbstractMaskSystem.AbstractMaskSystem {
10 constructor(renderer) {
11 super(renderer);
12 this.glConst = settings.settings.ADAPTER.getWebGLRenderingContext().STENCIL_TEST;
13 }
14 getStackLength() {
15 const maskData = this.maskStack[this.maskStack.length - 1];
16 if (maskData) {
17 return maskData._stencilCounter;
18 }
19 return 0;
20 }
21 push(maskData) {
22 const maskObject = maskData.maskObject;
23 const { gl } = this.renderer;
24 const prevMaskCount = maskData._stencilCounter;
25 if (prevMaskCount === 0) {
26 this.renderer.framebuffer.forceStencil();
27 gl.clearStencil(0);
28 gl.clear(gl.STENCIL_BUFFER_BIT);
29 gl.enable(gl.STENCIL_TEST);
30 }
31 maskData._stencilCounter++;
32 const colorMask = maskData._colorMask;
33 if (colorMask !== 0) {
34 maskData._colorMask = 0;
35 gl.colorMask(false, false, false, false);
36 }
37 gl.stencilFunc(gl.EQUAL, prevMaskCount, 4294967295);
38 gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
39 maskObject.renderable = true;
40 maskObject.render(this.renderer);
41 this.renderer.batch.flush();
42 maskObject.renderable = false;
43 if (colorMask !== 0) {
44 maskData._colorMask = colorMask;
45 gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0);
46 }
47 this._useCurrent();
48 }
49 pop(maskObject) {
50 const gl = this.renderer.gl;
51 if (this.getStackLength() === 0) {
52 gl.disable(gl.STENCIL_TEST);
53 } else {
54 const maskData = this.maskStack.length !== 0 ? this.maskStack[this.maskStack.length - 1] : null;
55 const colorMask = maskData ? maskData._colorMask : 15;
56 if (colorMask !== 0) {
57 maskData._colorMask = 0;
58 gl.colorMask(false, false, false, false);
59 }
60 gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
61 maskObject.renderable = true;
62 maskObject.render(this.renderer);
63 this.renderer.batch.flush();
64 maskObject.renderable = false;
65 if (colorMask !== 0) {
66 maskData._colorMask = colorMask;
67 gl.colorMask((colorMask & 1) !== 0, (colorMask & 2) !== 0, (colorMask & 4) !== 0, (colorMask & 8) !== 0);
68 }
69 this._useCurrent();
70 }
71 }
72 _useCurrent() {
73 const gl = this.renderer.gl;
74 gl.stencilFunc(gl.EQUAL, this.getStackLength(), 4294967295);
75 gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
76 }
77}
78StencilSystem.extension = {
79 type: extensions.ExtensionType.RendererSystem,
80 name: "stencil"
81};
82extensions.extensions.add(StencilSystem);
83
84exports.StencilSystem = StencilSystem;
85//# sourceMappingURL=StencilSystem.js.map