{"version":3,"file":"BatcherPipe.mjs","sources":["../../../../src/rendering/batcher/shared/BatcherPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { State } from '../../renderers/shared/state/State';\nimport { Batcher } from './Batcher';\nimport { BatchGeometry } from './BatchGeometry';\n\nimport type { Geometry } from '../../renderers/shared/geometry/Geometry';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { BatchPipe, InstructionPipe } from '../../renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../renderers/types';\nimport type { Batch, BatchableObject } from './Batcher';\n\nexport interface BatcherAdaptor\n{\n    start(batchPipe: BatcherPipe, geometry: Geometry): void\n    init(batchPipe: BatcherPipe): void;\n    execute(batchPipe: BatcherPipe, batch: Batch): void\n    destroy(): void;\n    contextChange?(): void;\n}\n\n// eslint-disable-next-line max-len\nexport class BatcherPipe implements InstructionPipe<Batch>, BatchPipe\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'batch',\n    } as const;\n\n    public state: State = State.for2d();\n    public renderer: Renderer;\n\n    private _batches: Record<number, Batcher> = Object.create(null);\n    private _geometries: Record<number, BatchGeometry> = Object.create(null);\n    private _adaptor: BatcherAdaptor;\n\n    private _activeBatch: Batcher;\n    private _activeGeometry: Geometry;\n\n    constructor(renderer: Renderer, adaptor: BatcherAdaptor)\n    {\n        this.renderer = renderer;\n        this._adaptor = adaptor;\n\n        this._adaptor.init(this);\n    }\n\n    public buildStart(instructionSet: InstructionSet)\n    {\n        if (!this._batches[instructionSet.uid])\n        {\n            const batcher = new Batcher();\n\n            this._batches[instructionSet.uid] = batcher;\n            this._geometries[batcher.uid] = new BatchGeometry();\n        }\n\n        this._activeBatch = this._batches[instructionSet.uid];\n        this._activeGeometry = this._geometries[this._activeBatch.uid];\n\n        this._activeBatch.begin();\n    }\n\n    public addToBatch(batchableObject: BatchableObject)\n    {\n        this._activeBatch.add(batchableObject);\n    }\n\n    public break(instructionSet: InstructionSet)\n    {\n        this._activeBatch.break(instructionSet);\n    }\n\n    public buildEnd(instructionSet: InstructionSet)\n    {\n        const activeBatch = this._activeBatch;\n        const geometry = this._activeGeometry;\n\n        activeBatch.finish(instructionSet);\n\n        geometry.indexBuffer.setDataWithSize(activeBatch.indexBuffer, activeBatch.indexSize, true);\n\n        geometry.buffers[0].setDataWithSize(activeBatch.attributeBuffer.float32View, activeBatch.attributeSize, false);\n    }\n\n    public upload(instructionSet: InstructionSet)\n    {\n        const batcher = this._batches[instructionSet.uid];\n        const geometry = this._geometries[batcher.uid];\n\n        if (batcher.dirty)\n        {\n            batcher.dirty = false;\n            geometry.buffers[0].update(batcher.attributeSize * 4);\n        }\n    }\n\n    public execute(batch: Batch)\n    {\n        if (batch.action === 'startBatch')\n        {\n            const batcher = batch.batcher;\n            const geometry = this._geometries[batcher.uid];\n\n            this._adaptor.start(this, geometry);\n        }\n\n        this._adaptor.execute(this, batch);\n    }\n\n    public destroy()\n    {\n        this.state = null;\n        this.renderer = null;\n\n        this._adaptor.destroy();\n        this._adaptor = null;\n\n        for (const i in this._batches)\n        {\n            this._batches[i].destroy();\n        }\n\n        this._batches = null;\n\n        for (const i in this._geometries)\n        {\n            this._geometries[i].destroy();\n        }\n\n        this._geometries = null;\n    }\n}\n"],"names":[],"mappings":"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"}