{"version":3,"file":"GodrayFilter.mjs","sources":["../../src/godray/GodrayFilter.ts"],"sourcesContent":["import { DEG_TO_RAD, Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './god-ray.frag';\nimport source from './god-ray.wgsl';\nimport perlin from './perlin.frag';\nimport sourcePerlin from './perlin.wgsl';\n\nimport type { FilterSystem, PointData, RenderSurface, Texture } from 'pixi.js';\n\n/** Options for the GodrayFilter constructor. */\nexport interface GodrayFilterOptions\n{\n    /**\n     * The angle/light-source of the rays in degrees. For instance,\n     * a value of 0 is vertical rays, values of 90 or -90 produce horizontal rays.\n     * @default 30\n     */\n    angle?: number;\n    /**\n     * `true` if light rays are parallel (uses angle), `false` to use the focal `center` point\n     * @default true\n     */\n    parallel?: boolean;\n    /**\n     * Focal point for non-parallel rays, to use this `parallel` must be set to `false`.\n     * This should be a size 2 array or an object containing `x` and `y` values, you cannot change types\n     * once defined in the constructor\n     * @default {x:0,y:0}\n     */\n    center?: PointData | number[];\n    /**\n     * General intensity of the effect. A value closer to 1 will produce a more intense effect,\n     * where a value closer to 0 will produce a subtler effect.\n     * @default 0.5\n     */\n    gain?: number;\n    /**\n     * The density of the fractal noise\n     * @default 2.5\n     */\n    lacunarity?: number;\n    /**\n     * The current time position\n     * @default 0\n     */\n    time?: number;\n    /**\n     * The alpha (opacity) of the rays.  0 is fully transparent, 1 is fully opaque.\n     * @default 1\n     */\n    alpha?: number;\n}\n\n/**\n * GordayFilter, {@link https://codepen.io/alaingalvan originally} by Alain Galvan\n *\n *\n *\n * ![original](../screenshots/original.png)![filter](../screenshots/godray.gif)\n * @class\n * @extends Filter\n *\n * @example\n *  displayObject.filters = [new GodrayFilter()];\n */\nexport class GodrayFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: GodrayFilterOptions = {\n        angle: 30,\n        gain: 0.5,\n        lacunarity: 2.5,\n        parallel: true,\n        time: 0,\n        center: { x: 0, y: 0 },\n        alpha: 1,\n    };\n\n    public uniforms: {\n        uLight: Float32Array;\n        uParallel: number;\n        uAspect: number;\n        uTime: number;\n        uRay: Float32Array;\n        uDimensions: Float32Array;\n    };\n\n    /**\n     * The current time position\n     * @default 0\n     */\n    public time = 0;\n\n    private _angleLight: [number, number] = [0, 0];\n    private _angle = 0;\n    private _center!: PointData;\n\n    /**\n     * @param options - Options for the GodrayFilter constructor.\n     */\n    constructor(options?: GodrayFilterOptions)\n    {\n        options = { ...GodrayFilter.DEFAULT_OPTIONS, ...options };\n\n        const gpuProgram = GpuProgram.from({\n            vertex: {\n                source: wgslVertex,\n                entryPoint: 'mainVertex',\n            },\n            fragment: {\n                source: source.replace('${PERLIN}', sourcePerlin),\n                entryPoint: 'mainFragment',\n            },\n        });\n        const glProgram = GlProgram.from({\n            vertex,\n            fragment: fragment.replace('${PERLIN}', perlin),\n            name: 'god-ray-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                godrayUniforms: {\n                    uLight: { value: new Float32Array(2), type: 'vec2<f32>' },\n                    uParallel: { value: 0, type: 'f32' },\n                    uAspect: { value: 0, type: 'f32' },\n                    uTime: { value: options.time, type: 'f32' },\n                    uRay: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uDimensions: { value: new Float32Array(2), type: 'vec2<f32>' },\n                }\n            },\n        });\n\n        this.uniforms = this.resources.godrayUniforms.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        const width = input.frame.width;\n        const height = input.frame.height;\n\n        this.uniforms.uLight[0] = this.parallel ? this._angleLight[0] : this._center.x;\n        this.uniforms.uLight[1] = this.parallel ? this._angleLight[1] : this._center.y;\n        this.uniforms.uDimensions[0] = width;\n        this.uniforms.uDimensions[1] = height;\n        this.uniforms.uAspect = height / width;\n        this.uniforms.uTime = this.time;\n\n        // draw the filter...\n        filterManager.applyFilter(this, input, output, clearMode);\n    }\n\n    /**\n     * The angle/light-source of the rays in degrees. For instance,\n     * a value of 0 is vertical rays, values of 90 or -90 produce horizontal rays\n     * @default 30\n     */\n    get angle(): number { return this._angle; }\n    set angle(value: number)\n    {\n        this._angle = value;\n\n        const radians = value * DEG_TO_RAD;\n\n        this._angleLight[0] = Math.cos(radians);\n        this._angleLight[1] = Math.sin(radians);\n    }\n\n    /**\n     * `true` if light rays are parallel (uses angle), `false` to use the focal `center` point\n     * @default true\n     */\n    get parallel(): boolean { return this.uniforms.uParallel > 0.5; }\n    set parallel(value: boolean) { this.uniforms.uParallel = value ? 1 : 0; }\n\n    /**\n     * Focal point for non-parallel rays, to use this `parallel` must be set to `false`.\n     * @default {x:0,y:0}\n     */\n    get center(): PointData { return this._center; }\n    set center(value: PointData | number[])\n    {\n        if (Array.isArray(value))\n        {\n            value = { x: value[0], y: value[1] };\n        }\n\n        this._center = value;\n    }\n\n    /**\n     * Focal point for non-parallel rays on the `x` axis, to use this `parallel` must be set to `false`.\n     * @default 0\n     */\n    get centerX(): number { return this.center.x; }\n    set centerX(value: number) { this.center.x = value; }\n\n    /**\n     * Focal point for non-parallel rays on the `y` axis, to use this `parallel` must be set to `false`.\n     * @default 0\n     */\n    get centerY(): number { return this.center.y; }\n    set centerY(value: number) { this.center.y = value; }\n\n    /**\n     * General intensity of the effect. A value closer to 1 will produce a more intense effect,\n     * where a value closer to 0 will produce a subtler effect\n     * @default 0.5\n     */\n    get gain(): number { return this.uniforms.uRay[0]; }\n    set gain(value: number) { this.uniforms.uRay[0] = value; }\n\n    /**\n     * The density of the fractal noise.\n     * A higher amount produces more rays and a smaller amount produces fewer waves\n     * @default 2.5\n     */\n    get lacunarity(): number { return this.uniforms.uRay[1]; }\n    set lacunarity(value: number) { this.uniforms.uRay[1] = value; }\n\n    /**\n     * The alpha (opacity) of the rays.  0 is fully transparent, 1 is fully opaque.\n     * @default 1\n     */\n    get alpha(): number { return this.uniforms.uRay[2]; }\n    set alpha(value: number) { this.uniforms.uRay[2] = value; }\n}\n"],"names":[],"mappings":"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"}