{"version":3,"file":"GlowFilter.mjs","sources":["../../src/glow/GlowFilter.ts"],"sourcesContent":["import { Color, ColorSource, Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './glow.frag';\nimport source from './glow.wgsl';\n\n/**\n * Options for the GlowFilter constructor.\n */\nexport interface GlowFilterOptions\n{\n    /**\n     * The distance of the glow\n     * @default 10\n     */\n    distance?: number;\n    /**\n     * The strength of the glow outward from the edge of the sprite\n     * @default 4\n     */\n    outerStrength?: number;\n    /**\n     * The strength of the glow inward from the edge of the sprite\n     * @default 0\n     */\n    innerStrength?: number;\n    /**\n     * The color of the glow\n     * @default 0xffffff\n     */\n    color?: ColorSource;\n    /**\n     * The alpha of the glow\n     * @default 1\n     */\n    alpha?: number;\n    /**\n     * A number between 0 and 1 that describes the quality of the glow. The higher the number the less performant\n     * @default 0.1\n     */\n    quality?: number;\n    /**\n     * Toggle to hide the contents and only show glow\n     * @default false\n     */\n    knockout?: boolean;\n}\n\n/**\n * GlowFilter, originally by mishaa\n * [codepen]{@link http://codepen.io/mishaa/pen/raKzrm}.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/glow.png)\n * @class\n *\n * @extends Filter\n *\n * @example\n *  someSprite.filters = [\n *      new GlowFilter({ distance: 15, outerStrength: 2 })\n *  ];\n */\nexport class GlowFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: GlowFilterOptions = {\n        distance: 10,\n        outerStrength: 4,\n        innerStrength: 0,\n        color: 0xffffff,\n        alpha: 1,\n        quality: 0.1,\n        knockout: false,\n    };\n\n    public uniforms: {\n        uDistance: number;\n        uStrength: Float32Array;\n        uColor: Float32Array;\n        uAlpha: number;\n        uQuality: number;\n        uKnockout: number;\n    };\n\n    private _color!: Color;\n\n    /**\n     * @param options - Options for the GlowFilter constructor.\n     */\n    constructor(options?: GlowFilterOptions)\n    {\n        options = { ...GlowFilter.DEFAULT_OPTIONS, ...options };\n\n        const distance = options.distance ?? 10;\n        const quality = options.quality ?? 0.1;\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        // Altering uDistance and uQuality won't have any affect on WebGL\n        // since we hard-assign them during creation to allow\n        // for the values to be used in GLSL loops\n        const glProgram = GlProgram.from({\n            vertex,\n            fragment: fragment\n                .replace(/__ANGLE_STEP_SIZE__/gi, `${(1 / quality / distance).toFixed(7)}`)\n                .replace(/__DIST__/gi, `${distance.toFixed(0)}.0`),\n            name: 'glow-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                glowUniforms: {\n                    uDistance: { value: distance, type: 'f32' },\n                    uStrength: { value: [options.innerStrength, options.outerStrength], type: 'vec2<f32>' },\n                    uColor: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uAlpha: { value: options.alpha, type: 'f32' },\n                    uQuality: { value: quality, type: 'f32' },\n                    uKnockout: { value: (options?.knockout ?? false) ? 1 : 0, type: 'f32' },\n                }\n            },\n            padding: distance,\n        });\n\n        this.uniforms = this.resources.glowUniforms.uniforms;\n        this._color = new Color();\n        this.color = options.color ?? 0xffffff;\n    }\n\n    /**\n     * Only draw the glow, not the texture itself\n     * @default false\n     */\n    get distance(): number { return this.uniforms.uDistance; }\n    set distance(value: number) { this.uniforms.uDistance = this.padding = value; }\n\n    /**\n    * The strength of the glow inward from the edge of the sprite.\n    * @default 0\n    */\n    get innerStrength(): number { return this.uniforms.uStrength[0]; }\n    set innerStrength(value: number) { this.uniforms.uStrength[0] = value; }\n\n    /**\n    * The strength of the glow outward from the edge of the sprite.\n    * @default 4\n    */\n    get outerStrength(): number { return this.uniforms.uStrength[1]; }\n    set outerStrength(value: number) { this.uniforms.uStrength[1] = value; }\n\n    /**\n    * The color of the glow.\n    * @default 0xFFFFFF\n    */\n    get color(): ColorSource { return this._color.value as ColorSource; }\n    set color(value: ColorSource)\n    {\n        this._color.setValue(value);\n        const [r, g, b] = this._color.toArray();\n\n        this.uniforms.uColor[0] = r;\n        this.uniforms.uColor[1] = g;\n        this.uniforms.uColor[2] = b;\n    }\n\n    /**\n    * The alpha of the glow\n    * @default 1\n    */\n    get alpha(): number { return this.uniforms.uAlpha; }\n    set alpha(value: number) { this.uniforms.uAlpha = value; }\n\n    /**\n    * A number between 0 and 1 that describes the quality of the glow. The higher the number the less performant\n    * @default 0.1\n    */\n    get quality(): number { return this.uniforms.uQuality; }\n    set quality(value: number) { this.uniforms.uQuality = value; }\n\n    /**\n    * Only draw the glow, not the texture itself\n    * @default false\n    */\n    get knockout(): boolean { return this.uniforms.uKnockout === 1; }\n    set knockout(value: boolean) { this.uniforms.uKnockout = value ? 1 : 0; }\n}\n"],"names":[],"mappings":"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"}