{"version":3,"file":"BulgePinchFilter.mjs","sources":["../../src/bulge-pinch/BulgePinchFilter.ts"],"sourcesContent":["import { Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './bulge-pinch.frag';\nimport source from './bulge-pinch.wgsl';\n\nimport type { FilterSystem, PointData, RenderSurface, Texture } from 'pixi.js';\n\n// This WebGPU filter has been ported from the WebGL renderer that was originally created by Julien CLEREL (@JuloxRox)\n\n/** Options for the BulgePinchFilter constructor. */\nexport interface BulgePinchFilterOptions\n{\n    /**\n     * Offset coordinates to change the position of the center of the circle of effect.\n     * @default {x:0,y:0}\n     */\n    center?: PointData | number[] | number;\n    /**\n     * The radius of the circle of effect\n     * @default 100\n     */\n    radius?: number;\n    /**\n     * A value between -1 and 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n     * @default 1\n     */\n    strength?: number;\n}\n\n/**\n * Bulges or pinches the image in a circle.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/bulge-pinch.gif)\n *\n * @class\n * @extends Filter\n */\nexport class BulgePinchFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: BulgePinchFilterOptions = {\n        center: { x: 0.5, y: 0.5 },\n        radius: 100,\n        strength: 1\n    };\n\n    public uniforms: {\n        uDimensions: Float32Array;\n        uCenter: PointData;\n        uRadius: number;\n        uStrength: number;\n    };\n\n    /**\n     * @param options - Options for the BulgePinchFilter constructor.\n     */\n    constructor(options?: BulgePinchFilterOptions)\n    {\n        options = { ...BulgePinchFilter.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        const glProgram = GlProgram.from({\n            vertex,\n            fragment,\n            name: 'bulge-pinch-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                bulgePinchUniforms: {\n                    uDimensions: { value: [0, 0], type: 'vec2<f32>' },\n                    uCenter: { value: { x: 0, y: 0 }, type: 'vec2<f32>' },\n                    uRadius: { value: options.radius, type: 'f32' },\n                    uStrength: { value: options.strength, type: 'f32' },\n                }\n            },\n        });\n\n        this.uniforms = this.resources.bulgePinchUniforms.uniforms;\n\n        Object.assign(this, options);\n    }\n\n    /**\n     * Override existing apply method in `Filter`\n     * @override\n     * @ignore\n     */\n    public apply(\n        filterManager: FilterSystem,\n        input: Texture,\n        output: RenderSurface,\n        clearMode: boolean\n    ): void\n    {\n        this.uniforms.uDimensions[0] = input.frame.width;\n        this.uniforms.uDimensions[1] = input.frame.height;\n\n        filterManager.applyFilter(this, input, output, clearMode);\n    }\n\n    /**\n     * Sets the center of the effect in normalized screen coords.\n     * { x: 0, y: 0 } means top-left and { x: 1, y: 1 } mean bottom-right\n     * @default {x:0.5,y:0.5}\n     */\n    get center(): PointData { return this.uniforms.uCenter; }\n    set center(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.uniforms.uCenter = value;\n    }\n\n    /**\n     * Sets the center of the effect in normalized screen coords on the `x` axis\n     * @default 0\n     */\n    get centerX(): number { return this.uniforms.uCenter.x; }\n    set centerX(value: number) { this.uniforms.uCenter.x = value; }\n\n    /**\n     * Sets the center of the effect in normalized screen coords on the `y` axis\n     * @default 0\n     */\n    get centerY(): number { return this.uniforms.uCenter.y; }\n    set centerY(value: number) { this.uniforms.uCenter.y = value; }\n\n    /**\n     * The radius of the circle of effect\n     * @default 100\n     */\n    get radius(): number { return this.uniforms.uRadius; }\n    set radius(value: number) { this.uniforms.uRadius = value; }\n\n    /**\n     * A value between -1 and 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n     * @default 1\n     */\n    get strength(): number { return this.uniforms.uStrength; }\n    set strength(value: number) { this.uniforms.uStrength = value; }\n}\n"],"names":[],"mappings":"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"}