{"version":3,"file":"GlBatchAdaptor.mjs","sources":["../../../../src/rendering/batcher/gl/GlBatchAdaptor.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { compileHighShaderGlProgram } from '../../high-shader/compileHighShaderToProgram';\nimport { colorBitGl } from '../../high-shader/shader-bits/colorBit';\nimport { generateTextureBatchBitGl } from '../../high-shader/shader-bits/generateTextureBatchBit';\nimport { roundPixelsBitGl } from '../../high-shader/shader-bits/roundPixelsBit';\nimport { getBatchSamplersUniformGroup } from '../../renderers/gl/shader/getBatchSamplersUniformGroup';\nimport { Shader } from '../../renderers/shared/shader/Shader';\nimport { State } from '../../renderers/shared/state/State';\nimport { getMaxTexturesPerBatch } from './utils/maxRecommendedTextures';\n\nimport type { WebGLRenderer } from '../../renderers/gl/WebGLRenderer';\nimport type { Geometry } from '../../renderers/shared/geometry/Geometry';\nimport type { Batch } from '../shared/Batcher';\nimport type { BatcherAdaptor, BatcherPipe } from '../shared/BatcherPipe';\n\n/**\n * A BatcherAdaptor that uses WebGL to render batches.\n * @memberof rendering\n * @ignore\n */\nexport class GlBatchAdaptor implements BatcherAdaptor\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipesAdaptor,\n        ],\n        name: 'batch',\n    } as const;\n\n    private _shader: Shader;\n    private _didUpload = false;\n    private readonly _tempState = State.for2d();\n\n    public init(batcherPipe: BatcherPipe): void\n    {\n        const maxTextures = getMaxTexturesPerBatch();\n\n        const glProgram = compileHighShaderGlProgram({\n            name: 'batch',\n            bits: [\n                colorBitGl,\n                generateTextureBatchBitGl(maxTextures),\n                roundPixelsBitGl,\n            ]\n        });\n\n        this._shader = new Shader({\n            glProgram,\n            resources: {\n                batchSamplers: getBatchSamplersUniformGroup(maxTextures),\n            }\n        });\n\n        batcherPipe.renderer.runners.contextChange.add(this);\n    }\n\n    public contextChange(): void\n    {\n        this._didUpload = false;\n    }\n\n    public start(batchPipe: BatcherPipe, geometry: Geometry): void\n    {\n        const renderer = batchPipe.renderer as WebGLRenderer;\n\n        renderer.shader.bind(this._shader, this._didUpload);\n\n        renderer.shader.updateUniformGroup(renderer.globalUniforms.uniformGroup);\n\n        renderer.geometry.bind(geometry, this._shader.glProgram);\n    }\n\n    public execute(batchPipe: BatcherPipe, batch: Batch): void\n    {\n        const renderer = batchPipe.renderer as WebGLRenderer;\n\n        this._didUpload = true;\n\n        this._tempState.blendMode = batch.blendMode;\n\n        renderer.state.set(this._tempState);\n\n        const textures = batch.textures.textures;\n\n        for (let i = 0; i < batch.textures.count; i++)\n        {\n            renderer.texture.bind(textures[i], i);\n        }\n\n        renderer.geometry.draw('triangle-list', batch.size, batch.start);\n    }\n\n    public destroy(): void\n    {\n        this._shader.destroy(true);\n        this._shader = null;\n    }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBO,MAAM,cACb,CAAA;AAAA,EADO,WAAA,GAAA;AAWH,IAAA,IAAA,CAAQ,UAAa,GAAA,KAAA,CAAA;AACrB,IAAiB,IAAA,CAAA,UAAA,GAAa,MAAM,KAAM,EAAA,CAAA;AAAA,GAAA;AAAA,EAEnC,KAAK,WACZ,EAAA;AACI,IAAA,MAAM,cAAc,sBAAuB,EAAA,CAAA;AAE3C,IAAA,MAAM,YAAY,0BAA2B,CAAA;AAAA,MACzC,IAAM,EAAA,OAAA;AAAA,MACN,IAAM,EAAA;AAAA,QACF,UAAA;AAAA,QACA,0BAA0B,WAAW,CAAA;AAAA,QACrC,gBAAA;AAAA,OACJ;AAAA,KACH,CAAA,CAAA;AAED,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,MAAO,CAAA;AAAA,MACtB,SAAA;AAAA,MACA,SAAW,EAAA;AAAA,QACP,aAAA,EAAe,6BAA6B,WAAW,CAAA;AAAA,OAC3D;AAAA,KACH,CAAA,CAAA;AAED,IAAA,WAAA,CAAY,QAAS,CAAA,OAAA,CAAQ,aAAc,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GACvD;AAAA,EAEO,aACP,GAAA;AACI,IAAA,IAAA,CAAK,UAAa,GAAA,KAAA,CAAA;AAAA,GACtB;AAAA,EAEO,KAAA,CAAM,WAAwB,QACrC,EAAA;AACI,IAAA,MAAM,WAAW,SAAU,CAAA,QAAA,CAAA;AAE3B,IAAA,QAAA,CAAS,MAAO,CAAA,IAAA,CAAK,IAAK,CAAA,OAAA,EAAS,KAAK,UAAU,CAAA,CAAA;AAElD,IAAA,QAAA,CAAS,MAAO,CAAA,kBAAA,CAAmB,QAAS,CAAA,cAAA,CAAe,YAAY,CAAA,CAAA;AAEvE,IAAA,QAAA,CAAS,QAAS,CAAA,IAAA,CAAK,QAAU,EAAA,IAAA,CAAK,QAAQ,SAAS,CAAA,CAAA;AAAA,GAC3D;AAAA,EAEO,OAAA,CAAQ,WAAwB,KACvC,EAAA;AACI,IAAA,MAAM,WAAW,SAAU,CAAA,QAAA,CAAA;AAE3B,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAElB,IAAK,IAAA,CAAA,UAAA,CAAW,YAAY,KAAM,CAAA,SAAA,CAAA;AAElC,IAAS,QAAA,CAAA,KAAA,CAAM,GAAI,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAElC,IAAM,MAAA,QAAA,GAAW,MAAM,QAAS,CAAA,QAAA,CAAA;AAEhC,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,QAAA,CAAS,OAAO,CAC1C,EAAA,EAAA;AACI,MAAA,QAAA,CAAS,OAAQ,CAAA,IAAA,CAAK,QAAS,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AAAA,KACxC;AAEA,IAAA,QAAA,CAAS,SAAS,IAAK,CAAA,eAAA,EAAiB,KAAM,CAAA,IAAA,EAAM,MAAM,KAAK,CAAA,CAAA;AAAA,GACnE;AAAA,EAEO,OACP,GAAA;AACI,IAAK,IAAA,CAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AACzB,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AAAA,GACnB;AACJ,CAAA;AAAA;AA9Ea,cAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,iBAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,OAAA;AACV,CAAA;;;;"}