{"version":3,"file":"State.mjs","sources":["../../../../../src/rendering/renderers/shared/state/State.ts"],"sourcesContent":["import type { BLEND_MODES, CULL_MODES } from './const';\n\nconst blendModeIds = {\n    normal: 0,\n    add: 1,\n    multiply: 2,\n    screen: 3,\n    overlay: 4,\n    erase: 5,\n    'normal-npm': 6,\n    'add-npm': 7,\n    'screen-npm': 8,\n    min: 9,\n    max: 10,\n};\nconst BLEND = 0;\nconst OFFSET = 1;\nconst CULLING = 2;\nconst DEPTH_TEST = 3;\nconst WINDING = 4;\nconst DEPTH_MASK = 5;\n\n/**\n * This is a WebGL state, and is is passed to {@link GlStateSystem}.\n *\n * Each mesh rendered may require WebGL to be in a different state.\n * For example you may want different blend mode or to enable polygon offsets\n * @category rendering\n * @advanced\n */\nexport class State\n{\n    /**\n     * The data is a unique number based on the states settings.\n     * This lets us quickly compare states with a single number rather than looking\n     * at all the individual settings.\n     */\n    public data: number;\n    /** @internal */\n    public _blendModeId: number;\n    private _blendMode: BLEND_MODES;\n    private _polygonOffset: number;\n\n    constructor()\n    {\n        this.data = 0;\n\n        this.blendMode = 'normal';\n        this.polygonOffset = 0;\n\n        this.blend = true;\n        this.depthMask = true;\n    }\n\n    /**\n     * Activates blending of the computed fragment color values.\n     * @default true\n     */\n    get blend(): boolean\n    {\n        return !!(this.data & (1 << BLEND));\n    }\n\n    set blend(value: boolean)\n    {\n        if (!!(this.data & (1 << BLEND)) !== value)\n        {\n            this.data ^= (1 << BLEND);\n        }\n    }\n\n    /**\n     * Activates adding an offset to depth values of polygon's fragments\n     * @default false\n     */\n    get offsets(): boolean\n    {\n        return !!(this.data & (1 << OFFSET));\n    }\n\n    set offsets(value: boolean)\n    {\n        if (!!(this.data & (1 << OFFSET)) !== value)\n        {\n            this.data ^= (1 << OFFSET);\n        }\n    }\n\n    /** The culling settings for this state none - No culling back - Back face culling front - Front face culling */\n    set cullMode(value: CULL_MODES)\n    {\n        if (value === 'none')\n        {\n            this.culling = false;\n\n            return;\n        }\n\n        this.culling = true;\n        this.clockwiseFrontFace = value === 'front';\n    }\n\n    get cullMode(): CULL_MODES\n    {\n        if (!this.culling)\n        {\n            return 'none';\n        }\n\n        return this.clockwiseFrontFace ? 'front' : 'back';\n    }\n\n    /**\n     * Activates culling of polygons.\n     * @default false\n     */\n    get culling(): boolean\n    {\n        return !!(this.data & (1 << CULLING));\n    }\n\n    set culling(value: boolean)\n    {\n        if (!!(this.data & (1 << CULLING)) !== value)\n        {\n            this.data ^= (1 << CULLING);\n        }\n    }\n\n    /**\n     * Activates depth comparisons and updates to the depth buffer.\n     * @default false\n     */\n    get depthTest(): boolean\n    {\n        return !!(this.data & (1 << DEPTH_TEST));\n    }\n\n    set depthTest(value: boolean)\n    {\n        if (!!(this.data & (1 << DEPTH_TEST)) !== value)\n        {\n            this.data ^= (1 << DEPTH_TEST);\n        }\n    }\n\n    /**\n     * Enables or disables writing to the depth buffer.\n     * @default true\n     */\n    get depthMask(): boolean\n    {\n        return !!(this.data & (1 << DEPTH_MASK));\n    }\n\n    set depthMask(value: boolean)\n    {\n        if (!!(this.data & (1 << DEPTH_MASK)) !== value)\n        {\n            this.data ^= (1 << DEPTH_MASK);\n        }\n    }\n\n    /**\n     * Specifies whether or not front or back-facing polygons can be culled.\n     * @default false\n     */\n    get clockwiseFrontFace(): boolean\n    {\n        return !!(this.data & (1 << WINDING));\n    }\n\n    set clockwiseFrontFace(value: boolean)\n    {\n        if (!!(this.data & (1 << WINDING)) !== value)\n        {\n            this.data ^= (1 << WINDING);\n        }\n    }\n\n    /**\n     * The blend mode to be applied when this state is set. Apply a value of `normal` to reset the blend mode.\n     * Setting this mode to anything other than NO_BLEND will automatically switch blending on.\n     * @default 'normal'\n     */\n    get blendMode(): BLEND_MODES\n    {\n        return this._blendMode;\n    }\n\n    set blendMode(value: BLEND_MODES)\n    {\n        this.blend = (value !== 'none');\n        this._blendMode = value;\n        this._blendModeId = blendModeIds[value as keyof typeof blendModeIds] || 0;\n    }\n\n    /**\n     * The polygon offset. Setting this property to anything other than 0 will automatically enable polygon offset fill.\n     * @default 0\n     */\n    get polygonOffset(): number\n    {\n        return this._polygonOffset;\n    }\n\n    set polygonOffset(value: number)\n    {\n        this.offsets = !!value;\n        this._polygonOffset = value;\n    }\n\n    // #if _DEBUG\n    public toString(): string\n    {\n        return `[pixi.js/core:State `\n            + `blendMode=${this.blendMode} `\n            + `clockwiseFrontFace=${this.clockwiseFrontFace} `\n            + `culling=${this.culling} `\n            + `depthMask=${this.depthMask} `\n            + `polygonOffset=${this.polygonOffset}`\n            + `]`;\n    }\n    // #endif\n\n    /**\n     * A quickly getting an instance of a State that is configured for 2d rendering.\n     * @returns a new State with values set for 2d rendering\n     */\n    public static for2d(): State\n    {\n        const state = new State();\n\n        state.depthTest = false;\n        state.blend = true;\n\n        return state;\n    }\n\n    public static default2d = State.for2d();\n}\n\n"],"names":[],"mappings":"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"}