{"version":3,"file":"BatchDrawCall.mjs","sources":["../../src/core/BatchDrawCall.ts"],"sourcesContent":["import { BaseTexture, BatchTextureArray, BLEND_MODES, Matrix, Shader, Texture } from '@pixi/core';\n/**\n * @memberof PIXI.smooth\n */\nexport interface IGraphicsBatchSettings\n{\n    maxStyles: number;\n    maxTextures: number;\n    pixelLine: number;\n}\n\n/**\n * @memberof PIXI.smooth\n */\nexport function matrixEquals(th: Matrix, matrix: Matrix, eps = 1e-3)\n{\n    return th === matrix || (Math.abs(th.a - matrix.a) < eps\n        && Math.abs(th.b - matrix.b) < eps\n        && Math.abs(th.c - matrix.c) < eps\n        && Math.abs(th.d - matrix.d) < eps\n        && Math.abs(th.tx - matrix.tx) < eps\n        && Math.abs(th.ty - matrix.ty) < eps);\n}\n\n/**\n * @memberof PIXI.smooth\n */\nexport class BatchStyleArray\n{\n    public textureIds: number[];\n    public matrices: Matrix[];\n    public lines: number[];\n    public count: number;\n\n    constructor()\n    {\n        this.textureIds = [];\n        this.matrices = [];\n        this.lines = [];\n        this.count = 0;\n        // TODO: mapCoord for atlas cases\n        // TODO: gradients?\n    }\n\n    clear(): void\n    {\n        for (let i = 0; i < this.count; i++)\n        {\n            this.textureIds[i] = null;\n            this.matrices[i] = null;\n        }\n        this.count = 0;\n    }\n\n    add(textureId: number, matrix: Matrix,\n        lineWidth: number, lineAlignment: number, lineScaleMode: number,\n        settings: IGraphicsBatchSettings): number\n    {\n        const { textureIds, matrices, lines, count } = this;\n\n        textureId = (textureId * 4) + lineScaleMode;\n        for (let i = 0; i < count; i++)\n        {\n            if (lines[i * 2] === lineWidth && lines[(i * 2) + 1] === lineAlignment\n                && textureIds[i] === textureId && (matrixEquals(matrices[i], matrix)))\n            {\n                return i;\n            }\n        }\n        if (count >= settings.maxStyles)\n        {\n            return -1;\n        }\n        textureIds[count] = textureId;\n        matrices[count] = matrix;\n        lines[count * 2] = lineWidth;\n        lines[(count * 2) + 1] = lineAlignment;\n        this.count++;\n\n        return count;\n    }\n}\n\n/**\n * @memberof PIXI.smooth\n */\nexport class BatchDrawCall\n{\n    texArray: BatchTextureArray;\n    styleArray: BatchStyleArray;\n    blend: BLEND_MODES;\n    start: number;\n    size: number;\n    data: any;\n    shader: Shader;\n    TICK: number;\n    settings: IGraphicsBatchSettings;\n\n    constructor()\n    {\n        this.texArray = new BatchTextureArray();\n        this.styleArray = new BatchStyleArray();\n        this.shader = null;\n        this.blend = BLEND_MODES.NORMAL;\n\n        this.start = 0;\n        this.size = 0;\n        this.TICK = 0; // for filling textures\n        this.settings = null;\n        /**\n         * data for uniforms or custom webgl state\n         * @member {object}\n         */\n        this.data = null;\n    }\n\n    clear()\n    {\n        this.texArray.clear();\n        this.styleArray.clear();\n        this.settings = null;\n        this.data = null;\n        this.shader = null;\n    }\n\n    begin(settings: IGraphicsBatchSettings, shader: Shader)\n    {\n        this.TICK = ++BaseTexture._globalBatch;\n        this.settings = settings;\n        this.shader = shader;\n        // start and size calculated outside\n        this.start = 0;\n        this.size = 0;\n        this.data = null;\n        if (shader && (shader as any).settings)\n        {\n            this.settings = (shader as any).settings;\n        }\n    }\n\n    check(shader: Shader): boolean\n    {\n        if (this.size === 0)\n        {\n            this.shader = shader;\n\n            return true;\n        }\n\n        return (this.shader === shader);\n    }\n\n    add(texture: Texture, matrix: Matrix, lineWidth: number,\n        lineAlignment: number, lineScaleMode: number): number\n    {\n        const { texArray, TICK, styleArray, settings } = this;\n        const { baseTexture } = texture;\n        // check tex\n\n        if (baseTexture._batchEnabled !== TICK && texArray.count === settings.maxTextures)\n        {\n            return -1;\n        }\n        const loc = baseTexture._batchEnabled !== TICK ? texArray.count : baseTexture._batchLocation;\n        // check and add style\n        // add1 -> add2 only works in chain, not when there are several adds inside\n        const res = styleArray.add(loc, matrix || Matrix.IDENTITY,\n            lineWidth, lineAlignment, lineScaleMode, settings);\n\n        if (res >= 0)\n        {\n            // SUCCESS here\n            // add tex\n            if (baseTexture._batchEnabled !== TICK)\n            {\n                baseTexture._batchEnabled = TICK;\n                baseTexture._batchLocation = texArray.count;\n                texArray.elements[texArray.count++] = baseTexture;\n            }\n        }\n\n        return res;\n    }\n}\n"],"names":[],"mappings":";;AAcO,SAAS,YAAa,CAAA,EAAA,EAAY,MAAgB,EAAA,GAAA,GAAM,IAC/D,EAAA;AACI,EAAO,OAAA,EAAA,KAAO,UAAW,IAAK,CAAA,GAAA,CAAI,GAAG,CAAI,GAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAC9C,IAAA,IAAA,CAAK,IAAI,EAAG,CAAA,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,OAC5B,IAAK,CAAA,GAAA,CAAI,EAAG,CAAA,CAAA,GAAI,MAAO,CAAA,CAAC,IAAI,GAC5B,IAAA,IAAA,CAAK,IAAI,EAAG,CAAA,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,GAC5B,IAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,KAAK,MAAO,CAAA,EAAE,IAAI,GAC9B,IAAA,IAAA,CAAK,IAAI,EAAG,CAAA,EAAA,GAAK,MAAO,CAAA,EAAE,CAAI,GAAA,GAAA,CAAA;AACzC,CAAA;AAKO,MAAM,eACb,CAAA;AAAA,EAMI,WACA,GAAA;AACI,IAAA,IAAA,CAAK,aAAa,EAAC,CAAA;AACnB,IAAA,IAAA,CAAK,WAAW,EAAC,CAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,EAAC,CAAA;AACd,IAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,CAAA;AAAA,GAGjB;AAAA,EAEA,KACA,GAAA;AACI,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,OAAO,CAChC,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,UAAA,CAAW,CAAC,CAAI,GAAA,IAAA,CAAA;AACrB,MAAK,IAAA,CAAA,QAAA,CAAS,CAAC,CAAI,GAAA,IAAA,CAAA;AAAA,KACvB;AACA,IAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,CAAA;AAAA,GACjB;AAAA,EAEA,IAAI,SAAmB,EAAA,MAAA,EACnB,SAAmB,EAAA,aAAA,EAAuB,eAC1C,QACJ,EAAA;AACI,IAAA,MAAM,EAAE,UAAA,EAAY,QAAU,EAAA,KAAA,EAAO,OAAU,GAAA,IAAA,CAAA;AAE/C,IAAA,SAAA,GAAa,YAAY,CAAK,GAAA,aAAA,CAAA;AAC9B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,CAC3B,EAAA,EAAA;AACI,MAAI,IAAA,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,aAAa,KAAO,CAAA,CAAA,GAAI,IAAK,CAAC,CAAA,KAAM,iBAClD,UAAW,CAAA,CAAC,MAAM,SAAc,IAAA,YAAA,CAAa,SAAS,CAAC,CAAA,EAAG,MAAM,CACvE,EAAA;AACI,QAAO,OAAA,CAAA,CAAA;AAAA,OACX;AAAA,KACJ;AACA,IAAI,IAAA,KAAA,IAAS,SAAS,SACtB,EAAA;AACI,MAAO,OAAA,CAAA,CAAA,CAAA;AAAA,KACX;AACA,IAAA,UAAA,CAAW,KAAK,CAAI,GAAA,SAAA,CAAA;AACpB,IAAA,QAAA,CAAS,KAAK,CAAI,GAAA,MAAA,CAAA;AAClB,IAAM,KAAA,CAAA,KAAA,GAAQ,CAAC,CAAI,GAAA,SAAA,CAAA;AACnB,IAAO,KAAA,CAAA,KAAA,GAAQ,CAAK,GAAA,CAAC,CAAI,GAAA,aAAA,CAAA;AACzB,IAAK,IAAA,CAAA,KAAA,EAAA,CAAA;AAEL,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACJ,CAAA;AAKO,MAAM,aACb,CAAA;AAAA,EAWI,WACA,GAAA;AACI,IAAK,IAAA,CAAA,QAAA,GAAW,IAAI,iBAAkB,EAAA,CAAA;AACtC,IAAK,IAAA,CAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACtC,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAA,IAAA,CAAK,QAAQ,WAAY,CAAA,MAAA,CAAA;AAEzB,IAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,CAAA,CAAA;AACZ,IAAA,IAAA,CAAK,IAAO,GAAA,CAAA,CAAA;AACZ,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAKhB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AAAA,GAChB;AAAA,EAEA,KACA,GAAA;AACI,IAAA,IAAA,CAAK,SAAS,KAAM,EAAA,CAAA;AACpB,IAAA,IAAA,CAAK,WAAW,KAAM,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAChB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AAAA,GAClB;AAAA,EAEA,KAAA,CAAM,UAAkC,MACxC,EAAA;AACI,IAAK,IAAA,CAAA,IAAA,GAAO,EAAE,WAAY,CAAA,YAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAEd,IAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,CAAA,CAAA;AACZ,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAI,IAAA,MAAA,IAAW,OAAe,QAC9B,EAAA;AACI,MAAA,IAAA,CAAK,WAAY,MAAe,CAAA,QAAA,CAAA;AAAA,KACpC;AAAA,GACJ;AAAA,EAEA,MAAM,MACN,EAAA;AACI,IAAI,IAAA,IAAA,CAAK,SAAS,CAClB,EAAA;AACI,MAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAEd,MAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAEA,IAAA,OAAQ,KAAK,MAAW,KAAA,MAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,GAAI,CAAA,OAAA,EAAkB,MAAgB,EAAA,SAAA,EAClC,eAAuB,aAC3B,EAAA;AACI,IAAA,MAAM,EAAE,QAAA,EAAU,IAAM,EAAA,UAAA,EAAY,UAAa,GAAA,IAAA,CAAA;AACjD,IAAM,MAAA,EAAE,aAAgB,GAAA,OAAA,CAAA;AAGxB,IAAA,IAAI,YAAY,aAAkB,KAAA,IAAA,IAAQ,QAAS,CAAA,KAAA,KAAU,SAAS,WACtE,EAAA;AACI,MAAO,OAAA,CAAA,CAAA,CAAA;AAAA,KACX;AACA,IAAA,MAAM,MAAM,WAAY,CAAA,aAAA,KAAkB,IAAO,GAAA,QAAA,CAAS,QAAQ,WAAY,CAAA,cAAA,CAAA;AAG9E,IAAA,MAAM,MAAM,UAAW,CAAA,GAAA;AAAA,MAAI,GAAA;AAAA,MAAK,UAAU,MAAO,CAAA,QAAA;AAAA,MAC7C,SAAA;AAAA,MAAW,aAAA;AAAA,MAAe,aAAA;AAAA,MAAe,QAAA;AAAA,KAAQ,CAAA;AAErD,IAAA,IAAI,OAAO,CACX,EAAA;AAGI,MAAI,IAAA,WAAA,CAAY,kBAAkB,IAClC,EAAA;AACI,QAAA,WAAA,CAAY,aAAgB,GAAA,IAAA,CAAA;AAC5B,QAAA,WAAA,CAAY,iBAAiB,QAAS,CAAA,KAAA,CAAA;AACtC,QAAS,QAAA,CAAA,QAAA,CAAS,QAAS,CAAA,KAAA,EAAO,CAAI,GAAA,WAAA,CAAA;AAAA,OAC1C;AAAA,KACJ;AAEA,IAAO,OAAA,GAAA,CAAA;AAAA,GACX;AACJ;;;;"}