{"version":3,"file":"UniformBatchRenderer.mjs","sources":["../../../src/base/webgl/UniformBatchRenderer.ts"],"sourcesContent":["import {\r\n    BatchRenderer,\r\n    ViewableBuffer,\r\n    BatchTextureArray\r\n} from '@pixi/core';\r\nimport { Dict, premultiplyBlendMode } from '@pixi/utils';\r\nimport { Sprite } from '@pixi/sprite';\r\n\r\nexport class UniformBatchRenderer extends BatchRenderer\r\n{\r\n    _iIndex: number;\r\n    _aIndex: number;\r\n    _dcIndex: number;\r\n    _bufferedElements: Array<any>;\r\n    _attributeBuffer: ViewableBuffer;\r\n    _indexBuffer: Uint16Array;\r\n    vertexSize: number;\r\n    forceMaxTextures = 0;\r\n\r\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n    getUniforms(sprite: Sprite): any\r\n    {\r\n        return this.defUniforms;\r\n    }\r\n\r\n    syncUniforms(obj: Dict<any>): void\r\n    {\r\n        if (!obj) return;\r\n        const sh = this._shader;\r\n\r\n        for (const key in obj)\r\n        {\r\n            sh.uniforms[key] = obj[key];\r\n        }\r\n    }\r\n\r\n    defUniforms = {};\r\n\r\n    buildDrawCalls(texArray: BatchTextureArray, start: number, finish: number): void\r\n    {\r\n        const thisAny = this as any;\r\n\r\n        const {\r\n            _bufferedElements: elements,\r\n            _attributeBuffer,\r\n            _indexBuffer,\r\n            vertexSize,\r\n        } = this;\r\n        const drawCalls = BatchRenderer._drawCallPool;\r\n\r\n        let dcIndex: number = this._dcIndex;\r\n        let aIndex: number = this._aIndex;\r\n        let iIndex: number = this._iIndex;\r\n\r\n        let drawCall = drawCalls[dcIndex] as any;\r\n\r\n        drawCall.start = this._iIndex;\r\n        drawCall.texArray = texArray;\r\n\r\n        for (let i = start; i < finish; ++i)\r\n        {\r\n            const sprite = elements[i];\r\n            const tex = sprite._texture.baseTexture;\r\n            const spriteBlendMode = premultiplyBlendMode[\r\n                tex.alphaMode ? 1 : 0][sprite.blendMode];\r\n            const uniforms = this.getUniforms(sprite);\r\n\r\n            elements[i] = null;\r\n\r\n            // here is the difference\r\n            if (start < i && (drawCall.blend !== spriteBlendMode || drawCall.uniforms !== uniforms))\r\n            {\r\n                drawCall.size = iIndex - drawCall.start;\r\n                start = i;\r\n                drawCall = drawCalls[++dcIndex];\r\n                drawCall.texArray = texArray;\r\n                drawCall.start = iIndex;\r\n            }\r\n\r\n            this.packInterleavedGeometry(sprite, _attributeBuffer, _indexBuffer, aIndex, iIndex);\r\n            aIndex += sprite.vertexData.length / 2 * vertexSize;\r\n            iIndex += sprite.indices.length;\r\n\r\n            drawCall.blend = spriteBlendMode;\r\n            // here is the difference\r\n            drawCall.uniforms = uniforms;\r\n        }\r\n\r\n        if (start < finish)\r\n        {\r\n            drawCall.size = iIndex - drawCall.start;\r\n            ++dcIndex;\r\n        }\r\n\r\n        thisAny._dcIndex = dcIndex;\r\n        thisAny._aIndex = aIndex;\r\n        thisAny._iIndex = iIndex;\r\n    }\r\n\r\n    drawBatches(): void\r\n    {\r\n        const dcCount = this._dcIndex;\r\n        const { gl, state: stateSystem, shader: shaderSystem } = this.renderer;\r\n        const drawCalls = BatchRenderer._drawCallPool;\r\n        let curUniforms: any = null;\r\n        let curTexArray: BatchTextureArray = null;\r\n\r\n        for (let i = 0; i < dcCount; i++)\r\n        {\r\n            const { texArray, type, size, start, blend, uniforms } = drawCalls[i] as any;\r\n\r\n            if (curTexArray !== texArray)\r\n            {\r\n                curTexArray = texArray;\r\n                this.bindAndClearTexArray(texArray);\r\n            }\r\n            // here is the difference\r\n            if (curUniforms !== uniforms)\r\n            {\r\n                curUniforms = uniforms;\r\n                this.syncUniforms(uniforms);\r\n                (shaderSystem as any).syncUniformGroup((this._shader as any).uniformGroup);\r\n            }\r\n\r\n            this.state.blendMode = blend;\r\n            stateSystem.set(this.state);\r\n            gl.drawElements(type, size, gl.UNSIGNED_SHORT, start * 2);\r\n        }\r\n    }\r\n\r\n    contextChange(): void\r\n    {\r\n        if (!this.forceMaxTextures)\r\n        {\r\n            super.contextChange();\r\n            this.syncUniforms(this.defUniforms);\r\n\r\n            return;\r\n        }\r\n\r\n        // we can override maxTextures with this hack\r\n\r\n        const thisAny = this as any;\r\n\r\n        thisAny.maxTextures = this.forceMaxTextures;\r\n        this._shader = thisAny.shaderGenerator.generateShader(this.maxTextures);\r\n        this.syncUniforms(this.defUniforms);\r\n        for (let i = 0; i < thisAny._packedGeometryPoolSize; i++)\r\n        {\r\n            /* eslint-disable max-len */\r\n            thisAny._packedGeometries[i] = new (this.geometryClass)();\r\n        }\r\n        this.initFlushBuffers();\r\n    }\r\n}\r\n"],"names":[],"mappings":"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"}