{"version":3,"file":"AdvancedBloomFilter.mjs","sources":["../../src/advanced-bloom/AdvancedBloomFilter.ts"],"sourcesContent":["import {\n    Filter,\n    FilterSystem,\n    GlProgram,\n    GpuProgram,\n    PointData,\n    RenderSurface,\n    Texture,\n    TexturePool,\n} from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport { KawaseBlurFilter } from '../kawase-blur/KawaseBlurFilter';\nimport fragment from './advanced-bloom.frag';\nimport source from './advanced-bloom.wgsl';\nimport { ExtractBrightnessFilter } from './ExtractBrightnessFilter';\n\n/** Options for the AdvancedBloomFilter constructor. */\nexport interface AdvancedBloomFilterOptions\n{\n    /**\n     * Defines how bright a color needs to be to affect bloom.\n     * @default 1\n     */\n    threshold?: number,\n    /**\n     * To adjust the strength of the bloom. Higher values is more intense brightness.\n     * @default 1\n     */\n    bloomScale?: number,\n    /**\n     * The brightness, lower value is more subtle brightness, higher value is blown-out.\n     * @default 1\n     */\n    brightness?: number,\n    /** The strength of the Blur properties simultaneously */\n    blur?: number,\n    /**\n     * The kernel size of the blur filter.\n     */\n    kernels?: number[],\n    /** The quality of the Blur filter. */\n    quality?: number,\n    /**\n     * The pixel size of the blur filter. Large size is blurrier. For advanced usage.\n     * @default {x:1,y:1}\n     */\n    pixelSize?: PointData | number[] | number,\n}\n\n/**\n * The AdvancedBloomFilter applies a Bloom Effect to an object. Unlike the normal BloomFilter\n * this had some advanced controls for adjusting the look of the bloom. Note: this filter\n * is slower than normal BloomFilter.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/advanced-bloom.png)\n *\n * @class\n * @extends Filter\n */\nexport class AdvancedBloomFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: AdvancedBloomFilterOptions = {\n        threshold: 0.5,\n        bloomScale: 1,\n        brightness: 1,\n        blur: 8,\n        quality: 4,\n        pixelSize: { x: 1, y: 1 },\n    };\n\n    public uniforms: {\n        uBloomScale: number;\n        uBrightness: number;\n    };\n\n    /** To adjust the strength of the bloom. Higher values is more intense brightness. */\n    public bloomScale = 1;\n\n    /** The brightness, lower value is more subtle brightness, higher value is blown-out. */\n    public brightness = 1;\n\n    private _extractFilter: ExtractBrightnessFilter;\n    private _blurFilter: KawaseBlurFilter;\n\n    /**\n     * @param options - Options for the AdvancedBloomFilter constructor.\n     */\n    constructor(options?: AdvancedBloomFilterOptions)\n    {\n        options = { ...AdvancedBloomFilter.DEFAULT_OPTIONS, ...options };\n\n        const gpuProgram = GpuProgram.from({\n            vertex: {\n                source: wgslVertex,\n                entryPoint: 'mainVertex',\n            },\n            fragment: {\n                source,\n                entryPoint: 'mainFragment',\n            },\n        });\n\n        const glProgram = GlProgram.from({\n            vertex,\n            fragment,\n            name: 'advanced-bloom-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                advancedBloomUniforms: {\n                    uBloomScale: { value: options.bloomScale, type: 'f32' },\n                    uBrightness: { value: options.brightness, type: 'f32' },\n                },\n                uMapTexture: Texture.WHITE,\n            },\n        });\n\n        this.uniforms = this.resources.advancedBloomUniforms.uniforms;\n\n        this._extractFilter = new ExtractBrightnessFilter({\n            threshold: options.threshold\n        });\n\n        this._blurFilter = new KawaseBlurFilter({\n            strength: options.kernels as [number, number] ?? options.blur,\n            quality: options.kernels ? undefined : options.quality,\n        });\n\n        Object.assign(this, options);\n    }\n\n    /**\n     * Override existing apply method in `Filter`\n     * @override\n     * @ignore\n     */\n    public override apply(\n        filterManager: FilterSystem,\n        input: Texture,\n        output: RenderSurface,\n        clearMode: boolean\n    ): void\n    {\n        const brightTarget = TexturePool.getSameSizeTexture(input);\n\n        this._extractFilter.apply(filterManager, input, brightTarget, true);\n\n        const bloomTarget = TexturePool.getSameSizeTexture(input);\n\n        this._blurFilter.apply(filterManager, brightTarget, bloomTarget, true);\n\n        this.uniforms.uBloomScale = this.bloomScale;\n        this.uniforms.uBrightness = this.brightness;\n\n        this.resources.uMapTexture = bloomTarget.source;\n\n        filterManager.applyFilter(this, input, output, clearMode);\n\n        TexturePool.returnTexture(bloomTarget);\n        TexturePool.returnTexture(brightTarget);\n    }\n\n    /**\n     * Defines how bright a color needs to be extracted.\n     * @default 0.5\n     */\n    get threshold(): number { return this._extractFilter.threshold; }\n    set threshold(value: number) { this._extractFilter.threshold = value; }\n\n    /** The kernels of the Blur Filter */\n    get kernels(): number[] { return this._blurFilter.kernels; }\n    set kernels(value: number[]) { this._blurFilter.kernels = value; }\n\n    /**\n     * The strength of the Blur properties simultaneously\n     * @default 2\n     */\n    get blur(): number { return this._blurFilter.strength; }\n    set blur(value: number) { this._blurFilter.strength = value; }\n\n    /**\n     * The quality of the Blur Filter\n     * @default 4\n     */\n    get quality(): number { return this._blurFilter.quality; }\n    set quality(value: number) { this._blurFilter.quality = value; }\n\n    /**\n     * The pixel size of the Kawase Blur filter\n     * @default {x:1,y:1}\n     */\n    get pixelSize(): PointData { return this._blurFilter.pixelSize; }\n    set pixelSize(value: PointData | number[] | number)\n    {\n        if (typeof value === 'number')\n        {\n            value = { x: value, y: value };\n        }\n\n        if (Array.isArray(value))\n        {\n            value = { x: value[0], y: value[1] };\n        }\n\n        this._blurFilter.pixelSize = value;\n    }\n\n    /**\n     * The horizontal pixelSize of the Kawase Blur filter\n     * @default 1\n     */\n    get pixelSizeX(): number { return this._blurFilter.pixelSizeX; }\n    set pixelSizeX(value: number) { this._blurFilter.pixelSizeX = value; }\n\n    /**\n     * The vertical pixel size of the Kawase Blur filter\n     * @default 1\n     */\n    get pixelSizeY(): number { return this._blurFilter.pixelSizeY; }\n    set pixelSizeY(value: number) { this._blurFilter.pixelSizeY = value; }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA0DO,MAAM,oBAAA,GAAN,MAAM,oBAAA,SAA4B,MACzC,CAAA;AAAA;AAAA;AAAA;AAAA,EA4BI,YAAY,OACZ,EAAA;AACI,IAAA,OAAA,GAAU,EAAE,GAAG,oBAAoB,CAAA,eAAA,EAAiB,GAAG,OAAQ,EAAA,CAAA;AAE/D,IAAM,MAAA,UAAA,GAAa,WAAW,IAAK,CAAA;AAAA,MAC/B,MAAQ,EAAA;AAAA,QACJ,MAAQ,EAAA,UAAA;AAAA,QACR,UAAY,EAAA,YAAA;AAAA,OAChB;AAAA,MACA,QAAU,EAAA;AAAA,QACN,MAAA;AAAA,QACA,UAAY,EAAA,cAAA;AAAA,OAChB;AAAA,KACH,CAAA,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,UAAU,IAAK,CAAA;AAAA,MAC7B,MAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAM,EAAA,uBAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,KAAA,CAAA;AAAA,MACF,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAW,EAAA;AAAA,QACP,qBAAuB,EAAA;AAAA,UACnB,aAAa,EAAE,KAAA,EAAO,OAAQ,CAAA,UAAA,EAAY,MAAM,KAAM,EAAA;AAAA,UACtD,aAAa,EAAE,KAAA,EAAO,OAAQ,CAAA,UAAA,EAAY,MAAM,KAAM,EAAA;AAAA,SAC1D;AAAA,QACA,aAAa,OAAQ,CAAA,KAAA;AAAA,OACzB;AAAA,KACH,CAAA,CAAA;AAhDL,IAAO,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAMP;AAAA,IAAA,aAAA,CAAA,IAAA,EAAO,YAAa,EAAA,CAAA,CAAA,CAAA;AAGpB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAO,YAAa,EAAA,CAAA,CAAA,CAAA;AAEpB,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAsCJ,IAAK,IAAA,CAAA,QAAA,GAAW,IAAK,CAAA,SAAA,CAAU,qBAAsB,CAAA,QAAA,CAAA;AAErD,IAAK,IAAA,CAAA,cAAA,GAAiB,IAAI,uBAAwB,CAAA;AAAA,MAC9C,WAAW,OAAQ,CAAA,SAAA;AAAA,KACtB,CAAA,CAAA;AAED,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,gBAAiB,CAAA;AAAA,MACpC,QAAA,EAAU,OAAQ,CAAA,OAAA,IAA+B,OAAQ,CAAA,IAAA;AAAA,MACzD,OAAS,EAAA,OAAA,CAAQ,OAAU,GAAA,KAAA,CAAA,GAAY,OAAQ,CAAA,OAAA;AAAA,KAClD,CAAA,CAAA;AAED,IAAO,MAAA,CAAA,MAAA,CAAO,MAAM,OAAO,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOgB,KACZ,CAAA,aAAA,EACA,KACA,EAAA,MAAA,EACA,SAEJ,EAAA;AACI,IAAM,MAAA,YAAA,GAAe,WAAY,CAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAEzD,IAAA,IAAA,CAAK,cAAe,CAAA,KAAA,CAAM,aAAe,EAAA,KAAA,EAAO,cAAc,IAAI,CAAA,CAAA;AAElE,IAAM,MAAA,WAAA,GAAc,WAAY,CAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAExD,IAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,aAAe,EAAA,YAAA,EAAc,aAAa,IAAI,CAAA,CAAA;AAErE,IAAK,IAAA,CAAA,QAAA,CAAS,cAAc,IAAK,CAAA,UAAA,CAAA;AACjC,IAAK,IAAA,CAAA,QAAA,CAAS,cAAc,IAAK,CAAA,UAAA,CAAA;AAEjC,IAAK,IAAA,CAAA,SAAA,CAAU,cAAc,WAAY,CAAA,MAAA,CAAA;AAEzC,IAAA,aAAA,CAAc,WAAY,CAAA,IAAA,EAAM,KAAO,EAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AAExD,IAAA,WAAA,CAAY,cAAc,WAAW,CAAA,CAAA;AACrC,IAAA,WAAA,CAAY,cAAc,YAAY,CAAA,CAAA;AAAA,GAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAoB,GAAA;AAAE,IAAA,OAAO,KAAK,cAAe,CAAA,SAAA,CAAA;AAAA,GAAW;AAAA,EAChE,IAAI,UAAU,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,eAAe,SAAY,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA,EAGtE,IAAI,OAAoB,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,OAAA,CAAA;AAAA,GAAS;AAAA,EAC3D,IAAI,QAAQ,KAAiB,EAAA;AAAE,IAAA,IAAA,CAAK,YAAY,OAAU,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjE,IAAI,IAAe,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,QAAA,CAAA;AAAA,GAAU;AAAA,EACvD,IAAI,KAAK,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,YAAY,QAAW,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7D,IAAI,OAAkB,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,OAAA,CAAA;AAAA,GAAS;AAAA,EACzD,IAAI,QAAQ,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,YAAY,OAAU,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/D,IAAI,SAAuB,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,SAAA,CAAA;AAAA,GAAW;AAAA,EAChE,IAAI,UAAU,KACd,EAAA;AACI,IAAI,IAAA,OAAO,UAAU,QACrB,EAAA;AACI,MAAA,KAAA,GAAQ,EAAE,CAAA,EAAG,KAAO,EAAA,CAAA,EAAG,KAAM,EAAA,CAAA;AAAA,KACjC;AAEA,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CACvB,EAAA;AACI,MAAQ,KAAA,GAAA,EAAE,GAAG,KAAM,CAAA,CAAC,GAAG,CAAG,EAAA,KAAA,CAAM,CAAC,CAAE,EAAA,CAAA;AAAA,KACvC;AAEA,IAAA,IAAA,CAAK,YAAY,SAAY,GAAA,KAAA,CAAA;AAAA,GACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAqB,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,UAAA,CAAA;AAAA,GAAY;AAAA,EAC/D,IAAI,WAAW,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,YAAY,UAAa,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrE,IAAI,UAAqB,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,UAAA,CAAA;AAAA,GAAY;AAAA,EAC/D,IAAI,WAAW,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,YAAY,UAAa,GAAA,KAAA,CAAA;AAAA,GAAO;AACzE,CAAA,CAAA;AAAA;AAlKI,aAAA,CAHS,sBAGc,iBAA8C,EAAA;AAAA,EACjE,SAAW,EAAA,GAAA;AAAA,EACX,UAAY,EAAA,CAAA;AAAA,EACZ,UAAY,EAAA,CAAA;AAAA,EACZ,IAAM,EAAA,CAAA;AAAA,EACN,OAAS,EAAA,CAAA;AAAA,EACT,SAAW,EAAA,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAE,EAAA;AAC5B,CAAA,CAAA,CAAA;AAVG,IAAM,mBAAN,GAAA;;;;"}