{"version":3,"file":"BlurFilterPass.mjs","sources":["../../../../src/filters/defaults/blur/BlurFilterPass.ts"],"sourcesContent":["import { TexturePool } from '../../../rendering/renderers/shared/texture/TexturePool';\nimport { RendererType } from '../../../rendering/renderers/types';\nimport { Filter } from '../../Filter';\nimport { generateBlurGlProgram } from './gl/generateBlurGlProgram';\nimport { generateBlurProgram } from './gpu/generateBlurProgram';\n\nimport type { RenderSurface } from '../../../rendering/renderers/shared/renderTarget/RenderTargetSystem';\nimport type { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport type { FilterSystem } from '../../FilterSystem';\nimport type { BlurFilterOptions } from './BlurFilter';\n\n/**\n * Options for BlurFilterPass\n * @memberof filters\n */\nexport interface BlurFilterPassOptions extends BlurFilterOptions\n{\n    /** Do pass along the x-axis (`true`) or y-axis (`false`). */\n    horizontal: boolean;\n}\n\n/**\n * The BlurFilterPass applies a horizontal or vertical Gaussian blur to an object.\n * @memberof filters\n */\nexport class BlurFilterPass extends Filter\n{\n    /** Default blur filter pass options */\n    public static defaultOptions: Partial<BlurFilterPassOptions> = {\n        /** The strength of the blur filter. */\n        strength: 8,\n        /** The quality of the blur filter. */\n        quality: 4,\n        /** The kernelSize of the blur filter.Options: 5, 7, 9, 11, 13, 15. */\n        kernelSize: 5,\n    };\n\n    /** Do pass along the x-axis (`true`) or y-axis (`false`). */\n    public horizontal: boolean;\n    /** The number of passes to run the filter. */\n    public passes!: number;\n    /** The strength of the blur filter. */\n    public strength!: number;\n\n    private _quality: number;\n    private readonly _uniforms: any;\n\n    /**\n     * @param options\n     * @param options.horizontal - Do pass along the x-axis (`true`) or y-axis (`false`).\n     * @param options.strength - The strength of the blur filter.\n     * @param options.quality - The quality of the blur filter.\n     * @param options.kernelSize - The kernelSize of the blur filter.Options: 5, 7, 9, 11, 13, 15.\n     */\n    constructor(options: BlurFilterPassOptions)\n    {\n        options = { ...BlurFilterPass.defaultOptions, ...options };\n\n        const glProgram = generateBlurGlProgram(options.horizontal, options.kernelSize);\n        const gpuProgram = generateBlurProgram(options.horizontal, options.kernelSize);\n\n        super({\n            glProgram,\n            gpuProgram,\n            resources: {\n                blurUniforms: {\n                    uStrength: { value: 0, type: 'f32' },\n                }\n            },\n            ...options\n        });\n\n        this.horizontal = options.horizontal;\n\n        this._quality = 0;\n\n        this.quality = options.quality;\n\n        this.blur = options.strength;\n\n        this._uniforms = this.resources.blurUniforms.uniforms;\n    }\n\n    /**\n     * Applies the filter.\n     * @param filterManager - The manager.\n     * @param input - The input target.\n     * @param output - The output target.\n     * @param clearMode - How to clear\n     */\n    public apply(\n        filterManager: FilterSystem,\n        input: Texture,\n        output: RenderSurface,\n        clearMode: boolean\n    ): void\n    {\n        this._uniforms.uStrength = this.strength / this.passes;\n\n        if (this.passes === 1)\n        {\n            filterManager.applyFilter(this, input, output, clearMode);\n        }\n        else\n        {\n            const tempTexture = TexturePool.getSameSizeTexture(input);\n\n            let flip = input;\n            let flop = tempTexture;\n\n            this._state.blend = false;\n\n            for (let i = 0; i < this.passes - 1; i++)\n            {\n                filterManager.applyFilter(this, flip, flop, filterManager.renderer.type === RendererType.WEBGPU);\n\n                const temp = flop;\n\n                flop = flip;\n                flip = temp;\n            }\n\n            this._state.blend = true;\n            filterManager.applyFilter(this, flip, output, clearMode);\n            TexturePool.returnTexture(tempTexture);\n        }\n    }\n\n    /**\n     * Sets the strength of both the blur.\n     * @default 16\n     */\n    get blur(): number\n    {\n        return this.strength;\n    }\n\n    set blur(value: number)\n    {\n        this.padding = 1 + (Math.abs(value) * 2);\n        this.strength = value;\n    }\n\n    /**\n     * Sets the quality of the blur by modifying the number of passes. More passes means higher\n     * quality blurring but the lower the performance.\n     * @default 4\n     */\n    get quality(): number\n    {\n        return this._quality;\n    }\n\n    set quality(value: number)\n    {\n        this._quality = value;\n        this.passes = value;\n    }\n}\n"],"names":[],"mappings":"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"}