'use strict'; var Extensions = require('../../../extensions/Extensions.js'); var buildInstructions = require('../../../scene/container/utils/buildInstructions.js'); var _const$1 = require('../../renderers/gl/const.js'); var _const = require('../../renderers/shared/state/const.js'); "use strict"; class StencilMaskPipe { constructor(renderer) { // used when building and also when executing.. this._maskStackHash = {}; this._maskHash = /* @__PURE__ */ new WeakMap(); this._renderer = renderer; } push(mask, _container, instructionSet) { var _a; const effect = mask; const renderer = this._renderer; renderer.renderPipes.batch.break(instructionSet); renderer.renderPipes.blendMode.setBlendMode(effect.mask, "none", instructionSet); instructionSet.add({ renderPipeId: "stencilMask", action: "pushMaskBegin", mask, canBundle: false }); const maskContainer = effect.mask; maskContainer.includeInBuild = true; if (!this._maskHash.has(effect)) { this._maskHash.set(effect, { instructionsStart: 0, instructionsLength: 0 }); } const maskData = this._maskHash.get(effect); maskData.instructionsStart = instructionSet.instructionSize; buildInstructions.collectAllRenderables( maskContainer, instructionSet, renderer ); maskContainer.includeInBuild = false; renderer.renderPipes.batch.break(instructionSet); instructionSet.add({ renderPipeId: "stencilMask", action: "pushMaskEnd", mask, canBundle: false }); const instructionsLength = instructionSet.instructionSize - maskData.instructionsStart - 1; maskData.instructionsLength = instructionsLength; const renderTargetUid = renderer.renderTarget.renderTarget.uid; (_a = this._maskStackHash)[renderTargetUid] ?? (_a[renderTargetUid] = 0); } pop(mask, _container, instructionSet) { const effect = mask; const renderer = this._renderer; renderer.renderPipes.batch.break(instructionSet); renderer.renderPipes.blendMode.setBlendMode(effect.mask, "none", instructionSet); instructionSet.add({ renderPipeId: "stencilMask", action: "popMaskBegin", canBundle: false }); const maskData = this._maskHash.get(mask); for (let i = 0; i < maskData.instructionsLength; i++) { instructionSet.instructions[instructionSet.instructionSize++] = instructionSet.instructions[maskData.instructionsStart++]; } instructionSet.add({ renderPipeId: "stencilMask", action: "popMaskEnd", canBundle: false }); } execute(instruction) { var _a; const renderer = this._renderer; const renderTargetUid = renderer.renderTarget.renderTarget.uid; let maskStackIndex = (_a = this._maskStackHash)[renderTargetUid] ?? (_a[renderTargetUid] = 0); if (instruction.action === "pushMaskBegin") { renderer.renderTarget.ensureDepthStencil(); renderer.stencil.setStencilMode(_const.STENCIL_MODES.RENDERING_MASK_ADD, maskStackIndex); maskStackIndex++; renderer.colorMask.setMask(0); } else if (instruction.action === "pushMaskEnd") { renderer.stencil.setStencilMode(_const.STENCIL_MODES.MASK_ACTIVE, maskStackIndex); renderer.colorMask.setMask(15); } else if (instruction.action === "popMaskBegin") { renderer.colorMask.setMask(0); if (maskStackIndex !== 0) { renderer.stencil.setStencilMode(_const.STENCIL_MODES.RENDERING_MASK_REMOVE, maskStackIndex); } else { renderer.renderTarget.clear(null, _const$1.CLEAR.STENCIL); renderer.stencil.setStencilMode(_const.STENCIL_MODES.DISABLED, maskStackIndex); } maskStackIndex--; } else if (instruction.action === "popMaskEnd") { renderer.stencil.setStencilMode(_const.STENCIL_MODES.MASK_ACTIVE, maskStackIndex); renderer.colorMask.setMask(15); } this._maskStackHash[renderTargetUid] = maskStackIndex; } destroy() { this._renderer = null; this._maskStackHash = null; this._maskHash = null; } } StencilMaskPipe.extension = { type: [ Extensions.ExtensionType.WebGLPipes, Extensions.ExtensionType.WebGPUPipes, Extensions.ExtensionType.CanvasPipes ], name: "stencilMask" }; exports.StencilMaskPipe = StencilMaskPipe; //# sourceMappingURL=StencilMaskPipe.js.map