{"version":3,"file":"DropShadowFilter.mjs","sources":["../../src/drop-shadow/DropShadowFilter.ts"],"sourcesContent":["import {\n    Color,\n    ColorSource,\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 './drop-shadow.frag';\nimport source from './drop-shadow.wgsl';\n\n/** Options for the DropShadowFilter constructor. */\nexport interface DropShadowFilterOptions\n{\n    /**\n     * The offset position of the drop-shadow relative to the original image.\n     * @default {x:4,y:4}\n     */\n    offset?: PointData;\n    /**\n     * The color value of shadow.\n     * @example [0.0, 0.0, 0.0] = 0x000000\n     * @default 0x000000\n     */\n    color?: ColorSource;\n    /**\n     * Coefficient for alpha multiplication.\n     * @default 1\n     */\n    alpha?: number;\n    /**\n     * Hide the contents, only show the shadow.\n     * @default false\n     */\n    shadowOnly?: boolean;\n    /**\n     * The strength of the shadow's blur.\n     * @default 2\n     */\n    blur?: number;\n    /**\n     * The quality of the Blur Filter.\n     * @default 4\n     */\n    quality?: number;\n    /**\n     * The kernel size of the blur filter.\n     * @default null\n     */\n    kernels?: number[];\n    /**\n     * The pixelSize of the Kawase Blur filter\n     * @default {x:1,y:1}\n     */\n    pixelSize?: PointData | number[] | number;\n    /**\n     * The resolution of the Kawase Blur filter\n     * @default 1\n     */\n    resolution?: number;\n}\n\n/**\n * Drop shadow filter.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/drop-shadow.png)\n * @class\n * @extends Filter\n */\nexport class DropShadowFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: DropShadowFilterOptions = {\n        offset: { x: 4, y: 4 },\n        color: 0x000000,\n        alpha: 0.5,\n        shadowOnly: false,\n        kernels: undefined,\n        blur: 2,\n        quality: 3,\n        pixelSize: { x: 1, y: 1 },\n        resolution: 1,\n    };\n\n    public uniforms: {\n        uAlpha: number;\n        uColor: Float32Array;\n        uOffset: PointData;\n    };\n\n    /**\n     * Hide the contents, only show the shadow.\n     * @default false\n     */\n    public shadowOnly = false;\n\n    private _color!: Color;\n    private _blurFilter: KawaseBlurFilter;\n    private _basePass: Filter;\n\n    /**\n     * @param options - Options for the DropShadowFilter constructor.\n     */\n    constructor(options?: DropShadowFilterOptions)\n    {\n        options = { ...DropShadowFilter.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: 'drop-shadow-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                dropShadowUniforms: {\n                    uAlpha: { value: options.alpha, type: 'f32' },\n                    uColor: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uOffset: { value: options.offset, type: 'vec2<f32>' },\n                }\n            },\n            resolution: options.resolution,\n        });\n\n        this.uniforms = this.resources.dropShadowUniforms.uniforms;\n        this._color = new Color();\n        this.color = options.color ?? 0x000000;\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        this._basePass = new Filter({\n            gpuProgram: GpuProgram.from({\n                vertex: {\n                    source: wgslVertex,\n                    entryPoint: 'mainVertex',\n                },\n                fragment: {\n                    source: `\n                    @group(0) @binding(1) var uTexture: texture_2d<f32>; \n                    @group(0) @binding(2) var uSampler: sampler;\n                    @fragment\n                    fn mainFragment(\n                        @builtin(position) position: vec4<f32>,\n                        @location(0) uv : vec2<f32>\n                    ) -> @location(0) vec4<f32> {\n                        return textureSample(uTexture, uSampler, uv);\n                    }\n                    `,\n                    entryPoint: 'mainFragment',\n                },\n            }),\n            glProgram: GlProgram.from({\n                vertex,\n                fragment: `\n                in vec2 vTextureCoord;\n                out vec4 finalColor;\n                uniform sampler2D uTexture;\n\n                void main(void){\n                    finalColor = texture(uTexture, vTextureCoord);\n                }\n                `,\n                name: 'drop-shadow-filter',\n            }),\n            resources: {},\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 renderTarget = TexturePool.getSameSizeTexture(input);\n\n        filterManager.applyFilter(this, input, renderTarget, true);\n        this._blurFilter.apply(filterManager, renderTarget, output, clearMode);\n\n        if (!this.shadowOnly)\n        {\n            filterManager.applyFilter(this._basePass, input, output, false);\n        }\n\n        TexturePool.returnTexture(renderTarget);\n    }\n\n    /**\n     * Set the offset position of the drop-shadow relative to the original image.\n     * @default [4,4]\n     */\n    public get offset(): PointData { return this.uniforms.uOffset; }\n    public set offset(value: PointData)\n    {\n        this.uniforms.uOffset = value;\n        this._updatePadding();\n    }\n\n    /**\n     * Set the offset position of the drop-shadow relative to the original image on the `x` axis\n     * @default 4\n     */\n    get offsetX(): number { return this.offset.x; }\n    set offsetX(value: number)\n    {\n        this.offset.x = value;\n        this._updatePadding();\n    }\n\n    /**\n     * Set the offset position of the drop-shadow relative to the original image on the `y` axis\n     * @default 4\n     */\n    get offsetY(): number { return this.offset.y; }\n    set offsetY(value: number)\n    {\n        this.offset.y = value;\n        this._updatePadding();\n    }\n\n    /**\n     * The color value of shadow.\n     * @example [0.0, 0.0, 0.0] = 0x000000\n     * @default 0x000000\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     * Coefficient for alpha multiplication\n     * @default 1\n     */\n    get alpha(): number { return this.uniforms.uAlpha; }\n    set alpha(value: number) { this.uniforms.uAlpha = value; }\n\n    /**\n     * The strength of the shadow's blur.\n     * @default 2\n     */\n    get blur(): number { return this._blurFilter.strength; }\n    set blur(value: number)\n    {\n        this._blurFilter.strength = value;\n        this._updatePadding();\n    }\n\n    /**\n     * Sets the quality of the Blur Filter\n     * @default 4\n     */\n    get quality(): number { return this._blurFilter.quality; }\n    set quality(value: number)\n    {\n        this._blurFilter.quality = value;\n        this._updatePadding();\n    }\n\n    /** Sets 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     * Sets the pixelSize of the Kawase Blur filter\n     * @default [1,1]\n     */\n    get pixelSize(): PointData\n    {\n        return this._blurFilter.pixelSize as PointData;\n    }\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     * Sets the pixelSize of the Kawase Blur filter on the `x` axis\n     * @default 1\n     */\n    get pixelSizeX(): number { return this._blurFilter.pixelSizeX; }\n    set pixelSizeX(value: number) { this._blurFilter.pixelSizeX = value; }\n\n    /**\n     * Sets the pixelSize of the Kawase Blur filter on the `y` axis\n     * @default 1\n     */\n    get pixelSizeY(): number { return this._blurFilter.pixelSizeY; }\n    set pixelSizeY(value: number) { this._blurFilter.pixelSizeY = value; }\n\n    /**\n     * Recalculate the proper padding amount.\n     * @private\n     */\n    private _updatePadding()\n    {\n        const offsetPadding = Math.max(\n            Math.abs(this.offsetX),\n            Math.abs(this.offsetY),\n        );\n\n        this.padding = offsetPadding + (this.blur * 2) + (this.quality * 4);\n    }\n}\n"],"names":[],"mappings":"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"}