{"version":3,"file":"ReflectionFilter.mjs","sources":["../../src/reflection/ReflectionFilter.ts"],"sourcesContent":["import { Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './reflection.frag';\nimport source from './reflection.wgsl';\n\nimport type { FilterSystem, RenderSurface, Texture } from 'pixi.js';\n\n/** [MIN, MAX] */\ntype Range = [number, number] | Float32Array;\n\n/** Options for the ReflectionFilter constructor. */\nexport interface ReflectionFilterOptions\n{\n    /**\n     * `true` to reflect the image, `false` for waves-only\n     * @default true\n     */\n    mirror?: boolean;\n    /**\n     * Vertical position of the reflection point, `0.5` equates to the middle\n     * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection\n     * @default 0.5\n     */\n    boundary?: number;\n    /**\n     * Starting and ending amplitude of waves\n     * @default [0,20]\n     */\n    amplitude?: Range;\n    /**\n     * Starting and ending length of waves\n     * @default [30,100]\n     */\n    waveLength?: Range;\n    /**\n     * Starting and ending alpha values\n     * @default [1,1]\n     */\n    alpha?: Range;\n    /**\n     * Time for animating position of waves\n     * @default 0\n     */\n    time?: number;\n}\n\n/**\n * Applies a reflection effect to simulate the reflection on water with waves.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/reflection.png)\n *\n * @class\n * @extends Filter\n */\nexport class ReflectionFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: ReflectionFilterOptions = {\n        mirror: true,\n        boundary: 0.5,\n        amplitude: [0, 20],\n        waveLength: [30, 100],\n        alpha: [1, 1],\n        time: 0,\n    };\n\n    public uniforms: {\n        uMirror: number;\n        uBoundary: number;\n        uAmplitude: Float32Array;\n        uWavelength: Float32Array;\n        uAlpha: Float32Array;\n        uTime: number;\n        uDimensions: Float32Array;\n    };\n\n    /**\n     * Time for animating position of waves\n     * @default 0\n     */\n    public time = 0;\n\n    /**\n     * @param options - Options for the ReflectionFilter constructor.\n     */\n    constructor(options?: ReflectionFilterOptions)\n    {\n        options = { ...ReflectionFilter.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: 'reflection-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                reflectionUniforms: {\n                    uMirror: { value: options.mirror ? 1 : 0, type: 'f32' },\n                    uBoundary: { value: options.boundary, type: 'f32' },\n                    uAmplitude: { value: options.amplitude, type: 'vec2<f32>' },\n                    uWavelength: { value: options.waveLength, type: 'vec2<f32>' },\n                    uAlpha: { value: options.alpha, type: 'vec2<f32>' },\n                    uTime: { value: options.time, type: 'f32' },\n                    uDimensions: { value: new Float32Array(2), type: 'vec2<f32>' },\n                }\n            },\n        });\n\n        this.uniforms = this.resources.reflectionUniforms.uniforms;\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        this.uniforms.uDimensions[0] = input.frame.width;\n        this.uniforms.uDimensions[1] = input.frame.height;\n\n        this.uniforms.uTime = this.time;\n\n        filterManager.applyFilter(this, input, output, clearMode);\n    }\n\n    /**\n     * `true` to reflect the image, `false` for waves-only\n     * @default true\n     */\n    get mirror(): boolean { return this.uniforms.uMirror > 0.5; }\n    set mirror(value: boolean) { this.uniforms.uMirror = value ? 1 : 0; }\n\n    /**\n     * Vertical position of the reflection point, default is 50% (middle)\n     * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.\n     * @default 0.5\n     */\n    get boundary(): number { return this.uniforms.uBoundary; }\n    set boundary(value: number) { this.uniforms.uBoundary = value; }\n\n    /**\n     * Starting and ending amplitude of waves\n     * @default [0,20]\n     */\n    get amplitude(): Range { return Array.from(this.uniforms.uAmplitude) as Range; }\n    set amplitude(value: Range)\n    {\n        this.uniforms.uAmplitude[0] = value[0];\n        this.uniforms.uAmplitude[1] = value[1];\n    }\n\n    /**\n     * Starting amplitude of waves\n     * @default 0\n     */\n    get amplitudeStart(): number { return this.uniforms.uAmplitude[0]; }\n    set amplitudeStart(value: number) { this.uniforms.uAmplitude[0] = value; }\n\n    /**\n     * Starting amplitude of waves\n     * @default 20\n     */\n    get amplitudeEnd(): number { return this.uniforms.uAmplitude[1]; }\n    set amplitudeEnd(value: number) { this.uniforms.uAmplitude[1] = value; }\n\n    /**\n     * Starting and ending length of waves\n     * @default [30,100]\n     */\n    get waveLength(): Range { return Array.from(this.uniforms.uWavelength) as Range; }\n    set waveLength(value: Range)\n    {\n        this.uniforms.uWavelength[0] = value[0];\n        this.uniforms.uWavelength[1] = value[1];\n    }\n\n    /**\n     * Starting wavelength of waves\n     * @default 30\n     */\n    get wavelengthStart(): number { return this.uniforms.uWavelength[0]; }\n    set wavelengthStart(value: number) { this.uniforms.uWavelength[0] = value; }\n\n    /**\n     * Starting wavelength of waves\n     * @default 100\n     */\n    get wavelengthEnd(): number { return this.uniforms.uWavelength[1]; }\n    set wavelengthEnd(value: number) { this.uniforms.uWavelength[1] = value; }\n\n    /**\n     * Starting and ending alpha values\n     * @default [1,1]\n     */\n    get alpha(): Range { return Array.from(this.uniforms.uAlpha) as Range; }\n    set alpha(value: Range)\n    {\n        this.uniforms.uAlpha[0] = value[0];\n        this.uniforms.uAlpha[1] = value[1];\n    }\n\n    /**\n     * Starting wavelength of waves\n     * @default 1\n     */\n    get alphaStart(): number { return this.uniforms.uAlpha[0]; }\n    set alphaStart(value: number) { this.uniforms.uAlpha[0] = value; }\n\n    /**\n     * Starting wavelength of waves\n     * @default 1\n     */\n    get alphaEnd(): number { return this.uniforms.uAlpha[1]; }\n    set alphaEnd(value: number) { this.uniforms.uAlpha[1] = value; }\n}\n"],"names":[],"mappings":"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"}