{"version":3,"file":"GpuStencilSystem.mjs","sources":["../../../../src/rendering/renderers/gpu/GpuStencilSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { STENCIL_MODES } from '../shared/state/const';\n\nimport type { RenderTarget } from '../shared/renderTarget/RenderTarget';\nimport type { System } from '../shared/system/System';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\n/**\n * This manages the stencil buffer. Used primarily for masking\n * @category rendering\n * @advanced\n */\nexport class GpuStencilSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'stencil',\n    } as const;\n\n    private readonly _renderer: WebGPURenderer;\n\n    private _renderTargetStencilState: Record<number, {\n        stencilMode: STENCIL_MODES;\n        stencilReference: number;\n    }> = Object.create(null);\n\n    private _activeRenderTarget: RenderTarget;\n\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n\n        renderer.renderTarget.onRenderTargetChange.add(this);\n    }\n\n    protected onRenderTargetChange(renderTarget: RenderTarget)\n    {\n        let stencilState = this._renderTargetStencilState[renderTarget.uid];\n\n        if (!stencilState)\n        {\n            stencilState = this._renderTargetStencilState[renderTarget.uid] = {\n                stencilMode: STENCIL_MODES.DISABLED,\n                stencilReference: 0,\n            };\n        }\n\n        this._activeRenderTarget = renderTarget;\n\n        this.setStencilMode(stencilState.stencilMode, stencilState.stencilReference);\n    }\n\n    public setStencilMode(stencilMode: STENCIL_MODES, stencilReference: number)\n    {\n        const stencilState = this._renderTargetStencilState[this._activeRenderTarget.uid];\n\n        stencilState.stencilMode = stencilMode;\n        stencilState.stencilReference = stencilReference;\n\n        const renderer = this._renderer;\n\n        renderer.pipeline.setStencilMode(stencilMode);\n        renderer.encoder.renderPassEncoder.setStencilReference(stencilReference);\n    }\n\n    public destroy()\n    {\n        this._renderer.renderTarget.onRenderTargetChange.remove(this);\n\n        (this._renderer as null) = null;\n\n        this._activeRenderTarget = null;\n        this._renderTargetStencilState = null;\n    }\n}\n"],"names":[],"mappings":";;;;AAYO,MAAM,gBAAA,CACb;AAAA,EAkBI,YAAY,QAAA,EACZ;AARA,IAAA,IAAA,CAAQ,yBAAA,mBAGH,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAMnB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAEjB,IAAA,QAAA,CAAS,YAAA,CAAa,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA;AAAA,EACvD;AAAA,EAEU,qBAAqB,YAAA,EAC/B;AACI,IAAA,IAAI,YAAA,GAAe,IAAA,CAAK,yBAAA,CAA0B,YAAA,CAAa,GAAG,CAAA;AAElE,IAAA,IAAI,CAAC,YAAA,EACL;AACI,MAAA,YAAA,GAAe,IAAA,CAAK,yBAAA,CAA0B,YAAA,CAAa,GAAG,CAAA,GAAI;AAAA,QAC9D,aAAa,aAAA,CAAc,QAAA;AAAA,QAC3B,gBAAA,EAAkB;AAAA,OACtB;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB,YAAA;AAE3B,IAAA,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,WAAA,EAAa,YAAA,CAAa,gBAAgB,CAAA;AAAA,EAC/E;AAAA,EAEO,cAAA,CAAe,aAA4B,gBAAA,EAClD;AACI,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,yBAAA,CAA0B,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAEhF,IAAA,YAAA,CAAa,WAAA,GAAc,WAAA;AAC3B,IAAA,YAAA,CAAa,gBAAA,GAAmB,gBAAA;AAEhC,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AAEtB,IAAA,QAAA,CAAS,QAAA,CAAS,eAAe,WAAW,CAAA;AAC5C,IAAA,QAAA,CAAS,OAAA,CAAQ,iBAAA,CAAkB,mBAAA,CAAoB,gBAAgB,CAAA;AAAA,EAC3E;AAAA,EAEO,OAAA,GACP;AACI,IAAA,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAA;AAE5D,IAAC,KAAK,SAAA,GAAqB,IAAA;AAE3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AAAA,EACrC;AACJ;AAAA;AAjEa,gBAAA,CAGK,SAAA,GAAY;AAAA,EACtB,IAAA,EAAM;AAAA,IACF,aAAA,CAAc;AAAA,GAClB;AAAA,EACA,IAAA,EAAM;AACV,CAAA;;;;"}