{"version":3,"file":"CRTFilter.mjs","sources":["../../src/crt/CRTFilter.ts"],"sourcesContent":["import { Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './crt.frag';\nimport source from './crt.wgsl';\n\nimport type { FilterSystem, RenderSurface, Texture } from 'pixi.js';\n\n/** Options for the CRTFilter constructor. */\nexport interface CRTFilterOptions\n{\n    /**\n     * Bend of interlaced lines, higher value means more bend\n     * @default 1\n     */\n    curvature?: number,\n    /**\n     * Width of the interlaced lines\n     * @default 1\n     */\n    lineWidth?: number,\n    /**\n     * Contrast of interlaced lines\n     * @default 0.25\n     */\n    lineContrast?: number,\n    /**\n     * The orientation of the line:\n     *\n     * `true` create vertical lines, `false` creates horizontal lines\n     * @default false\n     */\n    verticalLine?: boolean,\n    /**\n     * For animating interlaced lines\n     * @default 0\n     */\n    time?: number,\n    /**\n     * Opacity/intensity of the noise effect between `0` and `1`\n     * @default 0.3\n     */\n    noise?: number,\n    /**\n     * The size of the noise particles\n     * @default 1\n     */\n    noiseSize?: number,\n    /**\n     * A seed value to apply to the random noise generation\n     * @default 0\n     */\n    seed?: number,\n    /**\n     * The radius of the vignette effect, smaller values produces a smaller vignette\n     * @default 0.3\n     */\n    vignetting?: number,\n    /**\n     * Amount of opacity on the vignette\n     * @default 1\n     */\n    vignettingAlpha?: number,\n    /**\n     * Blur intensity of the vignette\n     * @default 0.3\n     */\n    vignettingBlur?: number,\n}\n\n/**\n * The CRTFilter applies a CRT effect to an object.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/crt.png)\n *\n * @class\n * @extends Filter\n */\nexport class CRTFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: CRTFilterOptions = {\n        curvature: 1.0,\n        lineWidth: 1.0,\n        lineContrast: 0.25,\n        verticalLine: false,\n        noise: 0.0,\n        noiseSize: 1.0,\n        vignetting: 0.3,\n        vignettingAlpha: 1.0,\n        vignettingBlur: 0.3,\n        time: 0.0,\n        seed: 0.0,\n    };\n\n    public uniforms: {\n        uLine: Float32Array;\n        uNoise: Float32Array;\n        uVignette: Float32Array;\n        uSeed: number;\n        uTime: number;\n        uDimensions: Float32Array;\n    };\n\n    /**\n     * A seed value to apply to the random noise generation\n     * @default 0\n     */\n    public seed!: number;\n\n    /**\n     * Opacity/intensity of the noise effect between `0` and `1`\n     * @default 0.3\n     */\n    public time!: number;\n\n    /**\n     * @param options - Options for the CRTFilter constructor.\n     */\n    constructor(options?: CRTFilterOptions)\n    {\n        options = { ...CRTFilter.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: 'crt-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                crtUniforms: {\n                    uLine: { value: new Float32Array(4), type: 'vec4<f32>' },\n                    uNoise: { value: new Float32Array(2), type: 'vec2<f32>' },\n                    uVignette: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uSeed: { value: options.seed, type: '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.crtUniforms.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.uSeed = this.seed;\n        this.uniforms.uTime = this.time;\n\n        filterManager.applyFilter(this, input, output, clearMode);\n    }\n\n    /**\n     * Bend of interlaced lines, higher value means more bend\n     * @default 1\n     */\n    get curvature(): number { return this.uniforms.uLine[0]; }\n    set curvature(value: number) { this.uniforms.uLine[0] = value; }\n\n    /**\n     * Width of interlaced lines\n     * @default 1\n     */\n    get lineWidth(): number { return this.uniforms.uLine[1]; }\n    set lineWidth(value: number) { this.uniforms.uLine[1] = value; }\n\n    /**\n     * Contrast of interlaced lines\n     * @default 0.25\n     */\n    get lineContrast(): number { return this.uniforms.uLine[2]; }\n    set lineContrast(value: number) { this.uniforms.uLine[2] = value; }\n\n    /**\n     * The orientation of the line:\n     *\n     * `true` create vertical lines, `false` creates horizontal lines\n     * @default false\n     */\n    get verticalLine(): boolean { return this.uniforms.uLine[3] > 0.5; }\n    set verticalLine(value: boolean) { this.uniforms.uLine[3] = value ? 1 : 0; }\n\n    /**\n     * Opacity/intensity of the noise effect between `0` and `1`\n     * @default 0.3\n     */\n    get noise(): number { return this.uniforms.uNoise[0]; }\n    set noise(value: number) { this.uniforms.uNoise[0] = value; }\n\n    /**\n     * The size of the noise particles\n     * @default 0\n     */\n    get noiseSize(): number { return this.uniforms.uNoise[1]; }\n    set noiseSize(value: number) { this.uniforms.uNoise[1] = value; }\n\n    /**\n     * The radius of the vignette effect, smaller values produces a smaller vignette\n     * @default 0.3\n     */\n    get vignetting(): number { return this.uniforms.uVignette[0]; }\n    set vignetting(value: number) { this.uniforms.uVignette[0] = value; }\n\n    /**\n     * Amount of opacity of vignette\n     * @default 1\n     */\n    get vignettingAlpha(): number { return this.uniforms.uVignette[1]; }\n    set vignettingAlpha(value: number) { this.uniforms.uVignette[1] = value; }\n\n    /**\n     * Blur intensity of the vignette\n     * @default 0.3\n     */\n    get vignettingBlur(): number { return this.uniforms.uVignette[2]; }\n    set vignettingBlur(value: number) { this.uniforms.uVignette[2] = value; }\n}\n"],"names":[],"mappings":"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"}