{"version":3,"file":"ColorMaskPipe.mjs","sources":["../../../../src/rendering/mask/color/ColorMaskPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\n\nimport type { Container } from '../../../scene/container/Container';\nimport type { Effect } from '../../../scene/container/Effect';\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 { Renderer } from '../../renderers/types';\nimport type { ColorMask } from './ColorMask';\n\nexport interface ColorMaskInstruction extends Instruction\n{\n    renderPipeId: 'colorMask',\n    colorMask: number,\n}\n\nexport class ColorMaskPipe implements InstructionPipe<ColorMaskInstruction>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'colorMask',\n    } as const;\n\n    private readonly _renderer: Renderer;\n    private _colorStack: number[] = [];\n    private _colorStackIndex = 0;\n    private _currentColor = 0;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public buildStart()\n    {\n        this._colorStack[0] = 0xF;\n        this._colorStackIndex = 1;\n        this._currentColor = 0xF;\n    }\n\n    public push(mask: Effect, _container: Container, instructionSet: InstructionSet): void\n    {\n        const renderer = this._renderer;\n\n        renderer.renderPipes.batch.break(instructionSet);\n\n        const colorStack = this._colorStack;\n\n        colorStack[this._colorStackIndex] = colorStack[this._colorStackIndex - 1] & (mask as ColorMask).mask;\n\n        const currentColor = this._colorStack[this._colorStackIndex];\n\n        if (currentColor !== this._currentColor)\n        {\n            this._currentColor = currentColor;\n            instructionSet.add({\n                renderPipeId: 'colorMask',\n                colorMask: currentColor,\n                canBundle: false,\n            } as ColorMaskInstruction);\n        }\n\n        this._colorStackIndex++;\n    }\n\n    public pop(_mask: Effect, _container: Container, instructionSet: InstructionSet): void\n    {\n        const renderer = this._renderer;\n\n        renderer.renderPipes.batch.break(instructionSet);\n\n        const colorStack = this._colorStack;\n\n        this._colorStackIndex--;\n\n        const currentColor = colorStack[this._colorStackIndex - 1];\n\n        if (currentColor !== this._currentColor)\n        {\n            this._currentColor = currentColor;\n\n            instructionSet.add({\n                renderPipeId: 'colorMask',\n                colorMask: currentColor,\n                canBundle: false,\n            } as ColorMaskInstruction);\n        }\n    }\n\n    public execute(instruction: ColorMaskInstruction)\n    {\n        const renderer = this._renderer;\n\n        renderer.colorMask.setMask(instruction.colorMask);\n    }\n\n    public destroy()\n    {\n        this._colorStack = null;\n    }\n}\n"],"names":[],"mappings":";;;AAgBO,MAAM,aACb,CAAA;AAAA,EAgBI,YAAY,QACZ,EAAA;AALA,IAAA,IAAA,CAAQ,cAAwB,EAAC,CAAA;AACjC,IAAA,IAAA,CAAQ,gBAAmB,GAAA,CAAA,CAAA;AAC3B,IAAA,IAAA,CAAQ,aAAgB,GAAA,CAAA,CAAA;AAIpB,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAAA,GACrB;AAAA,EAEO,UACP,GAAA;AACI,IAAK,IAAA,CAAA,WAAA,CAAY,CAAC,CAAI,GAAA,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,gBAAmB,GAAA,CAAA,CAAA;AACxB,IAAA,IAAA,CAAK,aAAgB,GAAA,EAAA,CAAA;AAAA,GACzB;AAAA,EAEO,IAAA,CAAK,IAAc,EAAA,UAAA,EAAuB,cACjD,EAAA;AACI,IAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAA;AAEtB,IAAS,QAAA,CAAA,WAAA,CAAY,KAAM,CAAA,KAAA,CAAM,cAAc,CAAA,CAAA;AAE/C,IAAA,MAAM,aAAa,IAAK,CAAA,WAAA,CAAA;AAExB,IAAW,UAAA,CAAA,IAAA,CAAK,gBAAgB,CAAI,GAAA,UAAA,CAAW,KAAK,gBAAmB,GAAA,CAAC,IAAK,IAAmB,CAAA,IAAA,CAAA;AAEhG,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AAE3D,IAAI,IAAA,YAAA,KAAiB,KAAK,aAC1B,EAAA;AACI,MAAA,IAAA,CAAK,aAAgB,GAAA,YAAA,CAAA;AACrB,MAAA,cAAA,CAAe,GAAI,CAAA;AAAA,QACf,YAAc,EAAA,WAAA;AAAA,QACd,SAAW,EAAA,YAAA;AAAA,QACX,SAAW,EAAA,KAAA;AAAA,OACU,CAAA,CAAA;AAAA,KAC7B;AAEA,IAAK,IAAA,CAAA,gBAAA,EAAA,CAAA;AAAA,GACT;AAAA,EAEO,GAAA,CAAI,KAAe,EAAA,UAAA,EAAuB,cACjD,EAAA;AACI,IAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAA;AAEtB,IAAS,QAAA,CAAA,WAAA,CAAY,KAAM,CAAA,KAAA,CAAM,cAAc,CAAA,CAAA;AAE/C,IAAA,MAAM,aAAa,IAAK,CAAA,WAAA,CAAA;AAExB,IAAK,IAAA,CAAA,gBAAA,EAAA,CAAA;AAEL,IAAA,MAAM,YAAe,GAAA,UAAA,CAAW,IAAK,CAAA,gBAAA,GAAmB,CAAC,CAAA,CAAA;AAEzD,IAAI,IAAA,YAAA,KAAiB,KAAK,aAC1B,EAAA;AACI,MAAA,IAAA,CAAK,aAAgB,GAAA,YAAA,CAAA;AAErB,MAAA,cAAA,CAAe,GAAI,CAAA;AAAA,QACf,YAAc,EAAA,WAAA;AAAA,QACd,SAAW,EAAA,YAAA;AAAA,QACX,SAAW,EAAA,KAAA;AAAA,OACU,CAAA,CAAA;AAAA,KAC7B;AAAA,GACJ;AAAA,EAEO,QAAQ,WACf,EAAA;AACI,IAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAA;AAEtB,IAAS,QAAA,CAAA,SAAA,CAAU,OAAQ,CAAA,WAAA,CAAY,SAAS,CAAA,CAAA;AAAA,GACpD;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AAAA,GACvB;AACJ,CAAA;AAAA;AAzFa,aAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,UAAA;AAAA,IACd,aAAc,CAAA,WAAA;AAAA,IACd,aAAc,CAAA,WAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,WAAA;AACV,CAAA;;;;"}