{"version":3,"file":"BevelFilter.mjs","sources":["../../src/bevel/BevelFilter.ts"],"sourcesContent":["import { Color, ColorSource, DEG_TO_RAD, Filter, GlProgram, GpuProgram } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './bevel.frag';\nimport source from './bevel.wgsl';\n\n/** Options for the BevelFilter constructor. */\nexport interface BevelFilterOptions\n{\n    /**\n     * The angle of the light in degrees\n     * @default 45\n     */\n    rotation?: number,\n    /**\n     * The thickness of the bevel\n     * @default 2\n     */\n    thickness?: number,\n    /**\n     * The color value of the left & top bevel.\n     * @example [1.0, 1.0, 1.0] = 0xffffff\n     * @default 0xffffff\n     */\n    lightColor?: ColorSource,\n    /**\n     * The alpha value of the left & top bevel.\n     * @default 0.7\n     */\n    lightAlpha?: number,\n    /**\n     * The color value of the right & bottom bevel.\n     * @example [1.0, 1.0, 1.0] = 0xffffff\n     * @default 0x000000\n     */\n    shadowColor?: ColorSource,\n    /**\n     * The alpha value of the right & bottom bevel.\n     * @default 0.7\n     */\n    shadowAlpha?: number,\n}\n\n/**\n * Bevel Filter.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/bevel.png)\n *\n * @class\n * @extends Filter\n */\nexport class BevelFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: BevelFilterOptions = {\n        rotation: 45,\n        thickness: 2,\n        lightColor: 0xffffff,\n        lightAlpha: 0.7,\n        shadowColor: 0x000000,\n        shadowAlpha: 0.7,\n    };\n\n    public uniforms: {\n        uLightColor: Float32Array;\n        uLightAlpha: number;\n        uShadowColor: Float32Array;\n        uShadowAlpha: number;\n        uTransform: Float32Array;\n    };\n\n    private _thickness!: number;\n    private _rotation!: number;\n    private _lightColor: Color;\n    private _shadowColor: Color;\n\n    /**\n     * @param options - Options for the BevelFilter constructor.\n     */\n    constructor(options?: BevelFilterOptions)\n    {\n        options = { ...BevelFilter.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: 'bevel-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                bevelUniforms: {\n                    uLightColor: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uLightAlpha: { value: options.lightAlpha, type: 'f32' },\n                    uShadowColor: { value: new Float32Array(3), type: 'vec3<f32>' },\n                    uShadowAlpha: { value: options.shadowAlpha, type: 'f32' },\n                    uTransform: { value: new Float32Array(2), type: 'vec2<f32>' },\n                }\n            },\n            // Workaround: https://github.com/pixijs/filters/issues/230\n            // applies correctly only if there is at least a single-pixel padding with alpha=0 around an image\n            // To solve this problem, a padding of 1 put on the filter should suffice\n            padding: 1,\n        });\n\n        this.uniforms = this.resources.bevelUniforms.uniforms;\n        this._lightColor = new Color();\n        this._shadowColor = new Color();\n        this.lightColor = options.lightColor ?? 0xffffff;\n        this.shadowColor = options.shadowColor ?? 0x000000;\n\n        Object.assign(this, options);\n    }\n\n    /**\n     * The angle of the light in degrees\n     * @default 45\n     */\n    get rotation(): number { return this._rotation / DEG_TO_RAD; }\n    set rotation(value: number)\n    {\n        this._rotation = value * DEG_TO_RAD;\n        this._updateTransform();\n    }\n\n    /**\n     * The thickness of the bevel\n     * @default 2\n     */\n    get thickness(): number { return this._thickness; }\n    set thickness(value: number)\n    {\n        this._thickness = value;\n        this._updateTransform();\n    }\n\n    /**\n     * The color value of the left & top bevel.\n     * @example [1.0, 1.0, 1.0] = 0xffffff\n     * @default 0xffffff\n     */\n    get lightColor(): ColorSource { return this._lightColor.value as ColorSource; }\n    set lightColor(value: ColorSource)\n    {\n        this._lightColor.setValue(value);\n        const [r, g, b] = this._lightColor.toArray();\n\n        this.uniforms.uLightColor[0] = r;\n        this.uniforms.uLightColor[1] = g;\n        this.uniforms.uLightColor[2] = b;\n    }\n\n    /**\n     * The alpha value of the left & top bevel.\n     * @default 0.7\n     */\n    get lightAlpha(): number { return this.uniforms.uLightAlpha; }\n    set lightAlpha(value: number) { this.uniforms.uLightAlpha = value; }\n\n    /**\n     * The color value of the right & bottom bevel.\n     * @default 0xffffff\n     */\n    get shadowColor(): ColorSource { return this._shadowColor.value as ColorSource; }\n    set shadowColor(value: ColorSource)\n    {\n        this._shadowColor.setValue(value);\n        const [r, g, b] = this._shadowColor.toArray();\n\n        this.uniforms.uShadowColor[0] = r;\n        this.uniforms.uShadowColor[1] = g;\n        this.uniforms.uShadowColor[2] = b;\n    }\n\n    /**\n     * The alpha value of the right & bottom bevel.\n     * @default 0.7\n     */\n    get shadowAlpha(): number { return this.uniforms.uShadowAlpha; }\n    set shadowAlpha(value: number) { this.uniforms.uShadowAlpha = value; }\n\n    /**\n     * Update the transform matrix of offset angle.\n     * @private\n     */\n    private _updateTransform()\n    {\n        this.uniforms.uTransform[0] = this.thickness * Math.cos(this._rotation);\n        this.uniforms.uTransform[1] = this.thickness * Math.sin(this._rotation);\n    }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAiDO,MAAM,YAAA,GAAN,MAAM,YAAA,SAAoB,MACjC,CAAA;AAAA;AAAA;AAAA;AAAA,EA2BI,YAAY,OACZ,EAAA;AACI,IAAA,OAAA,GAAU,EAAE,GAAG,YAAY,CAAA,eAAA,EAAiB,GAAG,OAAQ,EAAA,CAAA;AAEvD,IAAM,MAAA,UAAA,GAAa,WAAW,IAAK,CAAA;AAAA,MAC/B,MAAQ,EAAA;AAAA,QACJ,MAAQ,EAAA,UAAA;AAAA,QACR,UAAY,EAAA,YAAA;AAAA,OAChB;AAAA,MACA,QAAU,EAAA;AAAA,QACN,MAAA;AAAA,QACA,UAAY,EAAA,cAAA;AAAA,OAChB;AAAA,KACH,CAAA,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,UAAU,IAAK,CAAA;AAAA,MAC7B,MAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAM,EAAA,cAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,KAAA,CAAA;AAAA,MACF,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAW,EAAA;AAAA,QACP,aAAe,EAAA;AAAA,UACX,WAAA,EAAa,EAAE,KAAO,EAAA,IAAI,aAAa,CAAC,CAAA,EAAG,MAAM,WAAY,EAAA;AAAA,UAC7D,aAAa,EAAE,KAAA,EAAO,OAAQ,CAAA,UAAA,EAAY,MAAM,KAAM,EAAA;AAAA,UACtD,YAAA,EAAc,EAAE,KAAO,EAAA,IAAI,aAAa,CAAC,CAAA,EAAG,MAAM,WAAY,EAAA;AAAA,UAC9D,cAAc,EAAE,KAAA,EAAO,OAAQ,CAAA,WAAA,EAAa,MAAM,KAAM,EAAA;AAAA,UACxD,UAAA,EAAY,EAAE,KAAO,EAAA,IAAI,aAAa,CAAC,CAAA,EAAG,MAAM,WAAY,EAAA;AAAA,SAChE;AAAA,OACJ;AAAA;AAAA;AAAA;AAAA,MAIA,OAAS,EAAA,CAAA;AAAA,KACZ,CAAA,CAAA;AArDL,IAAO,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAQP,IAAQ,aAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA,CAAA;AA4CJ,IAAK,IAAA,CAAA,QAAA,GAAW,IAAK,CAAA,SAAA,CAAU,aAAc,CAAA,QAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,KAAM,EAAA,CAAA;AAC7B,IAAK,IAAA,CAAA,YAAA,GAAe,IAAI,KAAM,EAAA,CAAA;AAC9B,IAAK,IAAA,CAAA,UAAA,GAAa,QAAQ,UAAc,IAAA,QAAA,CAAA;AACxC,IAAK,IAAA,CAAA,WAAA,GAAc,QAAQ,WAAe,IAAA,CAAA,CAAA;AAE1C,IAAO,MAAA,CAAA,MAAA,CAAO,MAAM,OAAO,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAmB,GAAA;AAAE,IAAA,OAAO,KAAK,SAAY,GAAA,UAAA,CAAA;AAAA,GAAY;AAAA,EAC7D,IAAI,SAAS,KACb,EAAA;AACI,IAAA,IAAA,CAAK,YAAY,KAAQ,GAAA,UAAA,CAAA;AACzB,IAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAoB,GAAA;AAAE,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AAAA,GAAY;AAAA,EAClD,IAAI,UAAU,KACd,EAAA;AACI,IAAA,IAAA,CAAK,UAAa,GAAA,KAAA,CAAA;AAClB,IAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAA0B,GAAA;AAAE,IAAA,OAAO,KAAK,WAAY,CAAA,KAAA,CAAA;AAAA,GAAsB;AAAA,EAC9E,IAAI,WAAW,KACf,EAAA;AACI,IAAK,IAAA,CAAA,WAAA,CAAY,SAAS,KAAK,CAAA,CAAA;AAC/B,IAAA,MAAM,CAAC,CAAG,EAAA,CAAA,EAAG,CAAC,CAAI,GAAA,IAAA,CAAK,YAAY,OAAQ,EAAA,CAAA;AAE3C,IAAK,IAAA,CAAA,QAAA,CAAS,WAAY,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,QAAA,CAAS,WAAY,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,QAAA,CAAS,WAAY,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAAA,GACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAqB,GAAA;AAAE,IAAA,OAAO,KAAK,QAAS,CAAA,WAAA,CAAA;AAAA,GAAa;AAAA,EAC7D,IAAI,WAAW,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,SAAS,WAAc,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnE,IAAI,WAA2B,GAAA;AAAE,IAAA,OAAO,KAAK,YAAa,CAAA,KAAA,CAAA;AAAA,GAAsB;AAAA,EAChF,IAAI,YAAY,KAChB,EAAA;AACI,IAAK,IAAA,CAAA,YAAA,CAAa,SAAS,KAAK,CAAA,CAAA;AAChC,IAAA,MAAM,CAAC,CAAG,EAAA,CAAA,EAAG,CAAC,CAAI,GAAA,IAAA,CAAK,aAAa,OAAQ,EAAA,CAAA;AAE5C,IAAK,IAAA,CAAA,QAAA,CAAS,YAAa,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAChC,IAAK,IAAA,CAAA,QAAA,CAAS,YAAa,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAChC,IAAK,IAAA,CAAA,QAAA,CAAS,YAAa,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAAA,GACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAsB,GAAA;AAAE,IAAA,OAAO,KAAK,QAAS,CAAA,YAAA,CAAA;AAAA,GAAc;AAAA,EAC/D,IAAI,YAAY,KAAe,EAAA;AAAE,IAAA,IAAA,CAAK,SAAS,YAAe,GAAA,KAAA,CAAA;AAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7D,gBACR,GAAA;AACI,IAAK,IAAA,CAAA,QAAA,CAAS,WAAW,CAAC,CAAA,GAAI,KAAK,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACtE,IAAK,IAAA,CAAA,QAAA,CAAS,WAAW,CAAC,CAAA,GAAI,KAAK,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,GAC1E;AACJ,CAAA,CAAA;AAAA;AArJI,aAAA,CAHS,cAGc,iBAAsC,EAAA;AAAA,EACzD,QAAU,EAAA,EAAA;AAAA,EACV,SAAW,EAAA,CAAA;AAAA,EACX,UAAY,EAAA,QAAA;AAAA,EACZ,UAAY,EAAA,GAAA;AAAA,EACZ,WAAa,EAAA,CAAA;AAAA,EACb,WAAa,EAAA,GAAA;AACjB,CAAA,CAAA,CAAA;AAVG,IAAM,WAAN,GAAA;;;;"}