{"version":3,"file":"GlitchFilter.mjs","sources":["../../src/glitch/GlitchFilter.ts"],"sourcesContent":["import { DEG_TO_RAD, Filter, GlProgram, GpuProgram, ImageSource, Texture } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './glitch.frag';\nimport source from './glitch.wgsl';\n\nimport type { FilterSystem, PointData, RenderSurface } from 'pixi.js';\n\nenum FILL_MODES\n    {\n    TRANSPARENT = 0,\n    ORIGINAL = 1,\n    LOOP = 2,\n    CLAMP = 3,\n    MIRROR = 4,\n}\n\n/** Options for the GlitchFilter constructor. */\nexport interface GlitchFilterOptions\n{\n    /**\n     * The count of glitch slices.\n     * @default 5\n     */\n    slices?: number;\n    /**\n     * The maximum offset amount of slices.\n     * @default 100\n     */\n    offset?: number;\n    /**\n     * The angle in degree of the offset of slices.\n     * @default 0\n     */\n    direction?: number;\n    /**\n     * The fill mode of the space after the offset.\n     * @default FILL_MODES.TRANSPARENT\n     */\n    fillMode?: number;\n    /**\n     * A seed value for randomizing glitch effect.\n     * @default 0\n     */\n    seed?: number;\n    /**\n     * `true` will divide the bands roughly based on equal amounts\n     * where as setting to `false` will vary the band sizes dramatically (more random looking).\n     * @default false\n     */\n    average?: boolean;\n    /**\n     * Minimum size of slices as a portion of the `sampleSize`\n     * @default 8\n     */\n    minSize?: number;\n    /**\n     * Height of the displacement map canvas.\n     * @default 512\n     */\n    sampleSize?: number;\n    /**\n     * Red channel offset.\n     * @default {x:0,y:0}\n     */\n    red?: PointData | number[];\n    /**\n     * Green channel offset.\n     * @default {x:0,y:0}\n     */\n    green?: PointData | number[];\n    /**\n     * Blue offset.\n     * @default {x:0,y:0}\n     */\n    blue?: PointData | number[];\n}\n\n/**\n * The GlitchFilter applies a glitch effect to an object.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/glitch.png)\n *\n * @class\n * @extends Filter\n */\nexport class GlitchFilter extends Filter\n{\n    /** Default constructor options. */\n    public static readonly defaults: GlitchFilterOptions = {\n        slices: 5,\n        offset: 100,\n        direction: 0,\n        fillMode: 0,\n        average: false,\n        seed: 0,\n        red: { x: 0, y: 0 },\n        green: { x: 0, y: 0 },\n        blue: { x: 0, y: 0 },\n        minSize: 8,\n        sampleSize: 512,\n    };\n\n    public uniforms: {\n        uSeed: number\n        uDimensions: Float32Array,\n        uAspect: number,\n        uFillMode: number,\n        uOffset: number,\n        uDirection: number,\n        uRed: PointData,\n        uGreen: PointData,\n        uBlue: PointData,\n    };\n\n    /**\n     * `true` will divide the bands roughly based on equal amounts\n     * where as setting to `false` will vary the band sizes dramatically (more random looking).\n     */\n    public average = false;\n\n    /** Minimum size of slices as a portion of the `sampleSize` */\n    public minSize = 8;\n\n    /** Height of the displacement map canvas. */\n    public sampleSize = 512;\n\n    /** Internally generated canvas. */\n    private _canvas: HTMLCanvasElement;\n\n    /**\n     * The displacement map is used to generate the bands.\n     * If using your own texture, `slices` will be ignored.\n     *\n     * @member {Texture}\n     * @readonly\n     */\n    public texture: Texture;\n\n    /** Internal number of slices */\n    private _slices = 0;\n\n    private _sizes: Float32Array = new Float32Array(1);\n    private _offsets: Float32Array = new Float32Array(1);\n\n    /**\n     * @param options - Options for the GlitchFilter constructor.\n     */\n    constructor(options?: GlitchFilterOptions)\n    {\n        options = { ...GlitchFilter.defaults, ...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: 'glitch-filter',\n        });\n\n        const canvas = document.createElement('canvas');\n\n        canvas.width = 4;\n        canvas.height = options.sampleSize ?? 512;\n\n        const texture = new Texture({\n            source: new ImageSource({ resource: canvas })\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                glitchUniforms: {\n                    uSeed: { value: options?.seed ?? 0, type: 'f32' },\n                    uDimensions: { value: new Float32Array(2), type: 'vec2<f32>' },\n                    uAspect: { value: 1, type: 'f32' },\n                    uFillMode: { value: options?.fillMode ?? 0, type: 'f32' },\n                    uOffset: { value: options?.offset ?? 100, type: 'f32' },\n                    uDirection: { value: options?.direction ?? 0, type: 'f32' },\n                    uRed: { value: { x: 0, y: 0 }, type: 'vec2<f32>' },\n                    uGreen: { value: { x: 0, y: 0 }, type: 'vec2<f32>' },\n                    uBlue: { value: { x: 0, y: 0 }, type: 'vec2<f32>' },\n                },\n                uDisplacementMap: texture.source,\n                uDisplacementSampler: texture.source.style,\n            },\n        });\n\n        this.uniforms = this.resources.glitchUniforms.uniforms;\n\n        this._canvas = canvas;\n        this.texture = texture;\n\n        Object.assign(this, options);\n    }\n\n    /**\n     * Override existing apply method in Filter\n     * @private\n     */\n    apply(\n        filterManager: FilterSystem,\n        input: Texture,\n        output: RenderSurface,\n        clearMode: boolean\n    ): void\n    {\n        const { width, height } = input.frame;\n\n        this.uniforms.uDimensions[0] = width;\n        this.uniforms.uDimensions[1] = height;\n        this.uniforms.uAspect = height / width;\n\n        filterManager.applyFilter(this, input, output, clearMode);\n    }\n\n    /**\n     * Randomize the slices size (heights).\n     *\n     * @private\n     */\n    private _randomizeSizes()\n    {\n        const arr = this._sizes;\n        const last = this._slices - 1;\n        const size = this.sampleSize;\n        const min = Math.min(this.minSize / size, 0.9 / this._slices);\n\n        if (this.average)\n        {\n            const count = this._slices;\n            let rest = 1;\n\n            for (let i = 0; i < last; i++)\n            {\n                const averageWidth = rest / (count - i);\n                const w = Math.max(averageWidth * (1 - (Math.random() * 0.6)), min);\n\n                arr[i] = w;\n                rest -= w;\n            }\n            arr[last] = rest;\n        }\n        else\n        {\n            let rest = 1;\n            const ratio = Math.sqrt(1 / this._slices);\n\n            for (let i = 0; i < last; i++)\n            {\n                const w = Math.max(ratio * rest * Math.random(), min);\n\n                arr[i] = w;\n                rest -= w;\n            }\n            arr[last] = rest;\n        }\n\n        this.shuffle();\n    }\n\n    /**\n     * Shuffle the sizes of the slices, advanced usage.\n     */\n    shuffle(): void\n    {\n        const arr = this._sizes;\n        const last = this._slices - 1;\n\n        // shuffle\n        for (let i = last; i > 0; i--)\n        {\n            const rand = (Math.random() * i) >> 0;\n            const temp = arr[i];\n\n            arr[i] = arr[rand];\n            arr[rand] = temp;\n        }\n    }\n\n    /**\n     * Randomize the values for offset from -1 to 1\n     *\n     * @private\n     */\n    private _randomizeOffsets(): void\n    {\n        for (let i = 0; i < this._slices; i++)\n        {\n            this._offsets[i] = Math.random() * (Math.random() < 0.5 ? -1 : 1);\n        }\n    }\n\n    /**\n     * Regenerating random size, offsets for slices.\n     */\n    refresh(): void\n    {\n        this._randomizeSizes();\n        this._randomizeOffsets();\n        this.redraw();\n    }\n\n    /**\n     * Redraw displacement bitmap texture, advanced usage.\n     */\n    redraw(): void\n    {\n        const size = this.sampleSize;\n        const texture = this.texture;\n        const ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\n        ctx.clearRect(0, 0, 8, size);\n\n        let offset;\n        let y = 0;\n\n        for (let i = 0; i < this._slices; i++)\n        {\n            offset = Math.floor(this._offsets[i] * 256);\n            const height = this._sizes[i] * size;\n            const red = offset > 0 ? offset : 0;\n            const green = offset < 0 ? -offset : 0;\n\n            ctx.fillStyle = `rgba(${red}, ${green}, 0, 1)`;\n            ctx.fillRect(0, y >> 0, size, height + 1 >> 0);\n            y += height;\n        }\n\n        texture.source.update();\n    }\n\n    /**\n     * Manually custom slices size (height) of displacement bitmap\n     *\n     * @member {number[]|Float32Array}\n     */\n    set sizes(sizes: Float32Array)\n    {\n        const len = Math.min(this._slices, sizes.length);\n\n        for (let i = 0; i < len; i++)\n        {\n            this._sizes[i] = sizes[i];\n        }\n    }\n    get sizes(): Float32Array\n    {\n        return this._sizes;\n    }\n\n    /**\n     * Manually set custom slices offset of displacement bitmap, this is\n     * a collection of values from -1 to 1. To change the max offset value\n     * set `offset`.\n     *\n     * @member {number[]|Float32Array}\n     */\n    set offsets(offsets: Float32Array)\n    {\n        const len = Math.min(this._slices, offsets.length);\n\n        for (let i = 0; i < len; i++)\n        {\n            this._offsets[i] = offsets[i];\n        }\n    }\n    get offsets(): Float32Array { return this._offsets; }\n\n    /**\n     * The count of slices.\n     * @default 5\n     */\n    get slices(): number { return this._slices; }\n    set slices(value: number)\n    {\n        if (this._slices === value) return;\n        this._slices = value;\n        this._sizes = new Float32Array(value);\n        this._offsets = new Float32Array(value);\n        this.refresh();\n    }\n\n    /**\n     * The maximum offset amount of slices.\n     * @default 100\n     */\n    get offset(): number { return this.uniforms.uOffset; }\n    set offset(value: number) { this.uniforms.uOffset = value; }\n\n    /**\n     * A seed value for randomizing glitch effect.\n     * @default 0\n     */\n    get seed(): number { return this.uniforms.uSeed; }\n    set seed(value: number) { this.uniforms.uSeed = value; }\n\n    /**\n     * The fill mode of the space after the offset.\n     * @default FILL_MODES.TRANSPARENT\n     */\n    get fillMode(): FILL_MODES { return this.uniforms.uFillMode; }\n    set fillMode(value: FILL_MODES) { this.uniforms.uFillMode = value; }\n\n    /**\n     * The angle in degree of the offset of slices.\n     * @default 0\n     */\n    get direction(): number { return this.uniforms.uDirection / DEG_TO_RAD; }\n    set direction(value: number) { this.uniforms.uDirection = value * DEG_TO_RAD; }\n\n    /**\n     * Red channel offset.\n     * @default {x:0,y:0}\n     */\n    get red(): PointData { return this.uniforms.uRed; }\n    set red(value: PointData | number[])\n    {\n        if (Array.isArray(value))\n        {\n            value = { x: value[0], y: value[1] };\n        }\n\n        this.uniforms.uRed = value;\n    }\n\n    /**\n     * Green channel offset.\n     * @default {x:0,y:0}\n     */\n    get green(): PointData { return this.uniforms.uGreen; }\n    set green(value: PointData | number[])\n    {\n        if (Array.isArray(value))\n        {\n            value = { x: value[0], y: value[1] };\n        }\n\n        this.uniforms.uGreen = value;\n    }\n\n    /**\n     * Blue offset.\n     * @default {x:0,y:0}\n     */\n    get blue(): PointData { return this.uniforms.uBlue; }\n    set blue(value: PointData | number[])\n    {\n        if (Array.isArray(value))\n        {\n            value = { x: value[0], y: value[1] };\n        }\n\n        this.uniforms.uBlue = value;\n    }\n\n    /**\n     * Removes all references\n     */\n    destroy(): void\n    {\n        this.texture?.destroy(true);\n        this.texture\n        = this._canvas\n        = this.red\n        = this.green\n        = this.blue\n        = this._sizes\n        = this._offsets = null as any;\n    }\n}\n"],"names":[],"mappings":"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"}