{"version":3,"file":"MeshMaterial.mjs","sources":["../src/MeshMaterial.ts"],"sourcesContent":["import { Matrix, Program, Shader, TextureMatrix, utils } from 'pixijs/core';\nimport fragment from './shader/mesh.frag';\nimport vertex from './shader/mesh.vert';\n\nimport type { Texture } from 'pixijs/core';\n\nexport interface IMeshMaterialOptions\n{\n    alpha?: number;\n    tint?: number;\n    pluginName?: string;\n    program?: Program;\n    uniforms?: utils.Dict<unknown>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MeshMaterial extends GlobalMixins.MeshMaterial {}\n\n/**\n * Slightly opinionated default shader for PixiJS 2D objects.\n * @memberof PIXI\n */\nexport class MeshMaterial extends Shader\n{\n    /**\n     * TextureMatrix instance for this Mesh, used to track Texture changes.\n     * @readonly\n     */\n    public readonly uvMatrix: TextureMatrix;\n\n    /**\n     * `true` if shader can be batch with the renderer's batch system.\n     * @default true\n     */\n    public batchable: boolean;\n\n    /**\n     * Renderer plugin for batching.\n     * @default 'batch'\n     */\n    public pluginName: string;\n\n    // Internal-only properties\n    _tintRGB: number;\n\n    /**\n     * Only do update if tint or alpha changes.\n     * @private\n     * @default false\n     */\n    private _colorDirty: boolean;\n    private _alpha: number;\n    private _tint: number;\n\n    /**\n     * @param uSampler - Texture that material uses to render.\n     * @param options - Additional options\n     * @param {number} [options.alpha=1] - Default alpha.\n     * @param {number} [options.tint=0xFFFFFF] - Default tint.\n     * @param {string} [options.pluginName='batch'] - Renderer plugin for batching.\n     * @param {PIXI.Program} [options.program=0xFFFFFF] - Custom program.\n     * @param {object} [options.uniforms] - Custom uniforms.\n     */\n    constructor(uSampler: Texture, options?: IMeshMaterialOptions)\n    {\n        const uniforms = {\n            uSampler,\n            alpha: 1,\n            uTextureMatrix: Matrix.IDENTITY,\n            uColor: new Float32Array([1, 1, 1, 1]),\n        };\n\n        // Set defaults\n        options = Object.assign({\n            tint: 0xFFFFFF,\n            alpha: 1,\n            pluginName: 'batch',\n        }, options);\n\n        if (options.uniforms)\n        {\n            Object.assign(uniforms, options.uniforms);\n        }\n\n        super(options.program || Program.from(vertex, fragment), uniforms);\n\n        this._colorDirty = false;\n\n        this.uvMatrix = new TextureMatrix(uSampler);\n        this.batchable = options.program === undefined;\n        this.pluginName = options.pluginName;\n\n        this.tint = options.tint;\n        this.alpha = options.alpha;\n    }\n\n    /** Reference to the texture being rendered. */\n    get texture(): Texture\n    {\n        return this.uniforms.uSampler;\n    }\n    set texture(value: Texture)\n    {\n        if (this.uniforms.uSampler !== value)\n        {\n            if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode)\n            {\n                this._colorDirty = true;\n            }\n\n            this.uniforms.uSampler = value;\n            this.uvMatrix.texture = value;\n        }\n    }\n\n    /**\n     * This gets automatically set by the object using this.\n     * @default 1\n     */\n    set alpha(value: number)\n    {\n        if (value === this._alpha) return;\n\n        this._alpha = value;\n        this._colorDirty = true;\n    }\n    get alpha(): number\n    {\n        return this._alpha;\n    }\n\n    /**\n     * Multiply tint for the material.\n     * @default 0xFFFFFF\n     */\n    set tint(value: number)\n    {\n        if (value === this._tint) return;\n\n        this._tint = value;\n        this._tintRGB = (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);\n        this._colorDirty = true;\n    }\n    get tint(): number\n    {\n        return this._tint;\n    }\n\n    /** Gets called automatically by the Mesh. Intended to be overridden for custom {@link MeshMaterial} objects. */\n    public update(): void\n    {\n        if (this._colorDirty)\n        {\n            this._colorDirty = false;\n            const baseTexture = this.texture.baseTexture;\n\n            utils.premultiplyTintToRgba(\n                this._tint, this._alpha, this.uniforms.uColor, (baseTexture.alphaMode as unknown as boolean)\n            );\n        }\n        if (this.uvMatrix.update())\n        {\n            this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord;\n        }\n    }\n}\n"],"names":[],"mappings":"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"}