1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var extensions = require('@pixi/extensions');
|
6 | var settings = require('@pixi/settings');
|
7 | var AbstractMaskSystem = require('./AbstractMaskSystem.js');
|
8 |
|
9 | class 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 | }
|
78 | StencilSystem.extension = {
|
79 | type: extensions.ExtensionType.RendererSystem,
|
80 | name: "stencil"
|
81 | };
|
82 | extensions.extensions.add(StencilSystem);
|
83 |
|
84 | exports.StencilSystem = StencilSystem;
|
85 |
|