{"version":3,"file":"AlphaMaskPipe.mjs","sources":["../../../../src/rendering/mask/alpha/AlphaMaskPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { FilterEffect } from '../../../filters/FilterEffect';\nimport { MaskFilter } from '../../../filters/mask/MaskFilter';\nimport { Bounds } from '../../../scene/container/bounds/Bounds';\nimport { getGlobalBounds } from '../../../scene/container/bounds/getGlobalBounds';\nimport { Sprite } from '../../../scene/sprite/Sprite';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { Texture } from '../../renderers/shared/texture/Texture';\nimport { TexturePool } from '../../renderers/shared/texture/TexturePool';\nimport { RendererType } from '../../renderers/types';\n\nimport type { Container } from '../../../scene/container/Container';\nimport type { Effect } from '../../../scene/container/Effect';\nimport type { PoolItem } from '../../../utils/pool/Pool';\nimport type { Instruction } from '../../renderers/shared/instructions/Instruction';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { RenderTarget } from '../../renderers/shared/renderTarget/RenderTarget';\nimport type { Renderer } from '../../renderers/types';\nimport type { AlphaMask } from './AlphaMask';\n\ntype MaskMode = 'pushMaskBegin' | 'pushMaskEnd' | 'popMaskBegin' | 'popMaskEnd';\n\nconst tempBounds = new Bounds();\n\n/** @internal */\nclass AlphaMaskEffect extends FilterEffect implements PoolItem\n{\n    constructor()\n    {\n        super();\n\n        this.filters = [new MaskFilter({\n            sprite: new Sprite(Texture.EMPTY),\n            inverse: false,\n            resolution: 'inherit',\n            antialias: 'inherit'\n        })];\n    }\n\n    get sprite(): Sprite\n    {\n        return (this.filters[0] as MaskFilter).sprite;\n    }\n\n    set sprite(value: Sprite)\n    {\n        (this.filters[0] as MaskFilter).sprite = value;\n    }\n\n    get inverse(): boolean\n    {\n        return (this.filters[0] as MaskFilter).inverse;\n    }\n\n    set inverse(value: boolean)\n    {\n        (this.filters[0] as MaskFilter).inverse = value;\n    }\n\n    public init: () => void;\n}\n\n/** @internal */\nexport interface AlphaMaskInstruction extends Instruction\n{\n    renderPipeId: 'alphaMask',\n    action: MaskMode,\n    mask: AlphaMask,\n    inverse: boolean;\n    maskedContainer: Container,\n    renderMask: boolean,\n}\n\n/** @internal */\nexport interface AlphaMaskData\n{\n    filterEffect: AlphaMaskEffect,\n    maskedContainer: Container,\n    previousRenderTarget?: RenderTarget,\n    filterTexture?: Texture,\n}\n\n/** @internal */\nexport class AlphaMaskPipe implements InstructionPipe<AlphaMaskInstruction>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'alphaMask',\n    } as const;\n\n    private _renderer: Renderer;\n    private _activeMaskStage: AlphaMaskData[] = [];\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public push(mask: Effect, maskedContainer: Container, instructionSet: InstructionSet): void\n    {\n        const renderer = this._renderer;\n\n        renderer.renderPipes.batch.break(instructionSet);\n\n        instructionSet.add({\n            renderPipeId: 'alphaMask',\n            action: 'pushMaskBegin',\n            mask,\n            inverse: maskedContainer._maskOptions.inverse,\n            canBundle: false,\n            maskedContainer\n        } as AlphaMaskInstruction);\n\n        (mask as AlphaMask).inverse = maskedContainer._maskOptions.inverse;\n\n        if ((mask as AlphaMask).renderMaskToTexture)\n        {\n            const maskContainer = (mask as AlphaMask).mask;\n\n            maskContainer.includeInBuild = true;\n\n            maskContainer.collectRenderables(\n                instructionSet,\n                renderer,\n                null\n            );\n\n            maskContainer.includeInBuild = false;\n        }\n\n        renderer.renderPipes.batch.break(instructionSet);\n\n        instructionSet.add({\n            renderPipeId: 'alphaMask',\n            action: 'pushMaskEnd',\n            mask,\n            maskedContainer,\n            inverse: maskedContainer._maskOptions.inverse,\n            canBundle: false,\n        } as AlphaMaskInstruction);\n    }\n\n    public pop(mask: Effect, _maskedContainer: Container, instructionSet: InstructionSet): void\n    {\n        const renderer = this._renderer;\n\n        renderer.renderPipes.batch.break(instructionSet);\n\n        instructionSet.add({\n            renderPipeId: 'alphaMask',\n            action: 'popMaskEnd',\n            mask,\n            inverse: _maskedContainer._maskOptions.inverse,\n            canBundle: false,\n        } as AlphaMaskInstruction);\n    }\n\n    public execute(instruction: AlphaMaskInstruction)\n    {\n        const renderer = this._renderer;\n        const renderMask = instruction.mask.renderMaskToTexture;\n\n        if (instruction.action === 'pushMaskBegin')\n        {\n            const filterEffect = BigPool.get(AlphaMaskEffect);\n\n            filterEffect.inverse = instruction.inverse;\n\n            if (renderMask)\n            {\n                instruction.mask.mask.measurable = true;\n\n                const bounds = getGlobalBounds(instruction.mask.mask, true, tempBounds);\n\n                instruction.mask.mask.measurable = false;\n\n                bounds.ceil();\n\n                const colorTextureSource = renderer.renderTarget.renderTarget.colorTexture.source;\n                const filterTexture = TexturePool.getOptimalTexture(\n                    bounds.width,\n                    bounds.height,\n                    colorTextureSource._resolution,\n                    colorTextureSource.antialias\n                );\n\n                renderer.renderTarget.push(filterTexture, true);\n\n                renderer.globalUniforms.push({\n                    offset: bounds,\n                    worldColor: 0xFFFFFFFF\n                });\n\n                const sprite = filterEffect.sprite;\n\n                sprite.texture = filterTexture;\n\n                sprite.worldTransform.tx = bounds.minX;\n                sprite.worldTransform.ty = bounds.minY;\n\n                this._activeMaskStage.push({\n                    filterEffect,\n                    maskedContainer: instruction.maskedContainer,\n                    filterTexture,\n                });\n            }\n            else\n            {\n                filterEffect.sprite = instruction.mask.mask as Sprite;\n\n                this._activeMaskStage.push({\n                    filterEffect,\n                    maskedContainer: instruction.maskedContainer,\n                });\n            }\n        }\n        else if (instruction.action === 'pushMaskEnd')\n        {\n            const maskData = this._activeMaskStage[this._activeMaskStage.length - 1];\n\n            if (renderMask)\n            {\n                // WebGPU blit's automatically, but WebGL does not!\n                if (renderer.type === RendererType.WEBGL)\n                {\n                    renderer.renderTarget.finishRenderPass();\n                }\n\n                renderer.renderTarget.pop();\n                renderer.globalUniforms.pop();\n            }\n\n            renderer.filter.push({\n                renderPipeId: 'filter',\n                action: 'pushFilter',\n                container: maskData.maskedContainer,\n                filterEffect: maskData.filterEffect,\n                canBundle: false,\n            });\n        }\n        else if (instruction.action === 'popMaskEnd')\n        {\n            renderer.filter.pop();\n\n            const maskData = this._activeMaskStage.pop();\n\n            if (renderMask)\n            {\n                TexturePool.returnTexture(maskData.filterTexture);\n            }\n\n            BigPool.return(maskData.filterEffect);\n        }\n    }\n\n    public destroy(): void\n    {\n        this._renderer = null;\n        this._activeMaskStage = null;\n    }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,MAAM,UAAA,GAAa,IAAI,MAAA,EAAO;AAG9B,MAAM,wBAAwB,YAAA,CAC9B;AAAA,EACI,WAAA,GACA;AACI,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,IAAI,UAAA,CAAW;AAAA,MAC3B,MAAA,EAAQ,IAAI,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,MAChC,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACd,CAAC,CAAA;AAAA,EACN;AAAA,EAEA,IAAI,MAAA,GACJ;AACI,IAAA,OAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAiB,MAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAO,KAAA,EACX;AACI,IAAC,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAiB,MAAA,GAAS,KAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,OAAA,GACJ;AACI,IAAA,OAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAiB,OAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,QAAQ,KAAA,EACZ;AACI,IAAC,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAiB,OAAA,GAAU,KAAA;AAAA,EAC9C;AAGJ;AAuBO,MAAM,aAAA,CACb;AAAA,EAcI,YAAY,QAAA,EACZ;AAHA,IAAA,IAAA,CAAQ,mBAAoC,EAAC;AAIzC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAAA,EACrB;AAAA,EAEO,IAAA,CAAK,IAAA,EAAc,eAAA,EAA4B,cAAA,EACtD;AACI,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AAEtB,IAAA,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAE/C,IAAA,cAAA,CAAe,GAAA,CAAI;AAAA,MACf,YAAA,EAAc,WAAA;AAAA,MACd,MAAA,EAAQ,eAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,gBAAgB,YAAA,CAAa,OAAA;AAAA,MACtC,SAAA,EAAW,KAAA;AAAA,MACX;AAAA,KACqB,CAAA;AAEzB,IAAC,IAAA,CAAmB,OAAA,GAAU,eAAA,CAAgB,YAAA,CAAa,OAAA;AAE3D,IAAA,IAAK,KAAmB,mBAAA,EACxB;AACI,MAAA,MAAM,gBAAiB,IAAA,CAAmB,IAAA;AAE1C,MAAA,aAAA,CAAc,cAAA,GAAiB,IAAA;AAE/B,MAAA,aAAA,CAAc,kBAAA;AAAA,QACV,cAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACJ;AAEA,MAAA,aAAA,CAAc,cAAA,GAAiB,KAAA;AAAA,IACnC;AAEA,IAAA,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAE/C,IAAA,cAAA,CAAe,GAAA,CAAI;AAAA,MACf,YAAA,EAAc,WAAA;AAAA,MACd,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA,EAAS,gBAAgB,YAAA,CAAa,OAAA;AAAA,MACtC,SAAA,EAAW;AAAA,KACU,CAAA;AAAA,EAC7B;AAAA,EAEO,GAAA,CAAI,IAAA,EAAc,gBAAA,EAA6B,cAAA,EACtD;AACI,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AAEtB,IAAA,QAAA,CAAS,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAE/C,IAAA,cAAA,CAAe,GAAA,CAAI;AAAA,MACf,YAAA,EAAc,WAAA;AAAA,MACd,MAAA,EAAQ,YAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,iBAAiB,YAAA,CAAa,OAAA;AAAA,MACvC,SAAA,EAAW;AAAA,KACU,CAAA;AAAA,EAC7B;AAAA,EAEO,QAAQ,WAAA,EACf;AACI,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AACtB,IAAA,MAAM,UAAA,GAAa,YAAY,IAAA,CAAK,mBAAA;AAEpC,IAAA,IAAI,WAAA,CAAY,WAAW,eAAA,EAC3B;AACI,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAEhD,MAAA,YAAA,CAAa,UAAU,WAAA,CAAY,OAAA;AAEnC,MAAA,IAAI,UAAA,EACJ;AACI,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,UAAA,GAAa,IAAA;AAEnC,QAAA,MAAM,SAAS,eAAA,CAAgB,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,MAAM,UAAU,CAAA;AAEtE,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,UAAA,GAAa,KAAA;AAEnC,QAAA,MAAA,CAAO,IAAA,EAAK;AAEZ,QAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,YAAA,CAAa,YAAA,CAAa,YAAA,CAAa,MAAA;AAC3E,QAAA,MAAM,gBAAgB,WAAA,CAAY,iBAAA;AAAA,UAC9B,MAAA,CAAO,KAAA;AAAA,UACP,MAAA,CAAO,MAAA;AAAA,UACP,kBAAA,CAAmB,WAAA;AAAA,UACnB,kBAAA,CAAmB;AAAA,SACvB;AAEA,QAAA,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,aAAA,EAAe,IAAI,CAAA;AAE9C,QAAA,QAAA,CAAS,eAAe,IAAA,CAAK;AAAA,UACzB,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY;AAAA,SACf,CAAA;AAED,QAAA,MAAM,SAAS,YAAA,CAAa,MAAA;AAE5B,QAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AAEjB,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,MAAA,CAAO,IAAA;AAClC,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,MAAA,CAAO,IAAA;AAElC,QAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK;AAAA,UACvB,YAAA;AAAA,UACA,iBAAiB,WAAA,CAAY,eAAA;AAAA,UAC7B;AAAA,SACH,CAAA;AAAA,MACL,CAAA,MAEA;AACI,QAAA,YAAA,CAAa,MAAA,GAAS,YAAY,IAAA,CAAK,IAAA;AAEvC,QAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK;AAAA,UACvB,YAAA;AAAA,UACA,iBAAiB,WAAA,CAAY;AAAA,SAChC,CAAA;AAAA,MACL;AAAA,IACJ,CAAA,MAAA,IACS,WAAA,CAAY,MAAA,KAAW,aAAA,EAChC;AACI,MAAA,MAAM,WAAW,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAEvE,MAAA,IAAI,UAAA,EACJ;AAEI,QAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,CAAa,KAAA,EACnC;AACI,UAAA,QAAA,CAAS,aAAa,gBAAA,EAAiB;AAAA,QAC3C;AAEA,QAAA,QAAA,CAAS,aAAa,GAAA,EAAI;AAC1B,QAAA,QAAA,CAAS,eAAe,GAAA,EAAI;AAAA,MAChC;AAEA,MAAA,QAAA,CAAS,OAAO,IAAA,CAAK;AAAA,QACjB,YAAA,EAAc,QAAA;AAAA,QACd,MAAA,EAAQ,YAAA;AAAA,QACR,WAAW,QAAA,CAAS,eAAA;AAAA,QACpB,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,SAAA,EAAW;AAAA,OACd,CAAA;AAAA,IACL,CAAA,MAAA,IACS,WAAA,CAAY,MAAA,KAAW,YAAA,EAChC;AACI,MAAA,QAAA,CAAS,OAAO,GAAA,EAAI;AAEpB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAI;AAE3C,MAAA,IAAI,UAAA,EACJ;AACI,QAAA,WAAA,CAAY,aAAA,CAAc,SAAS,aAAa,CAAA;AAAA,MACpD;AAEA,MAAA,OAAA,CAAQ,MAAA,CAAO,SAAS,YAAY,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEO,OAAA,GACP;AACI,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC5B;AACJ;AAAA;AAtLa,aAAA,CAGK,SAAA,GAAY;AAAA,EACtB,IAAA,EAAM;AAAA,IACF,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,WAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAClB;AAAA,EACA,IAAA,EAAM;AACV,CAAA;;;;"}