{"version":3,"file":"Batcher.mjs","sources":["../../../../src/rendering/batcher/shared/Batcher.ts"],"sourcesContent":["import { uid } from '../../../utils/data/uid';\nimport { ViewableBuffer } from '../../../utils/data/ViewableBuffer';\nimport { fastCopy } from '../../renderers/shared/buffer/utils/fastCopy';\nimport { type BLEND_MODES } from '../../renderers/shared/state/const';\nimport { getAdjustedBlendModeBlend } from '../../renderers/shared/state/getAdjustedBlendModeBlend';\nimport { getMaxTexturesPerBatch } from '../gl/utils/maxRecommendedTextures';\nimport { BatchTextureArray } from './BatchTextureArray';\n\nimport type { BindGroup } from '../../renderers/gpu/shader/BindGroup';\nimport type { IndexBufferArray } from '../../renderers/shared/geometry/Geometry';\nimport type { Instruction } from '../../renderers/shared/instructions/Instruction';\nimport type { InstructionSet } from '../../renderers/shared/instructions/InstructionSet';\nimport type { Texture } from '../../renderers/shared/texture/Texture';\n\nexport type BatchAction = 'startBatch' | 'renderBatch';\n\n/**\n * A batch pool is used to store batches when they are not currently in use.\n * @memberof rendering\n */\nexport class Batch implements Instruction\n{\n    public renderPipeId = 'batch';\n    public action: BatchAction = 'startBatch';\n\n    // TODO - eventually this could be useful for flagging batches as dirty and then only rebuilding those ones\n    // public elementStart = 0;\n    // public elementSize = 0;\n\n    // for drawing..\n    public start = 0;\n    public size = 0;\n    public textures: BatchTextureArray = new BatchTextureArray();\n\n    public blendMode: BLEND_MODES = 'normal';\n\n    public canBundle = true;\n\n    /**\n     * breaking rules slightly here in the name of performance..\n     * storing references to these bindgroups here is just faster for access!\n     * keeps a reference to the GPU bind group to set when rendering this batch for WebGPU. Will be null is using WebGL.\n     */\n    public gpuBindGroup: GPUBindGroup;\n    /**\n     * breaking rules slightly here in the name of performance..\n     * storing references to these bindgroups here is just faster for access!\n     * keeps a reference to the bind group to set when rendering this batch for WebGPU. Will be null if using WebGl.\n     */\n    public bindGroup: BindGroup;\n\n    public batcher: Batcher;\n\n    public destroy()\n    {\n        this.textures = null;\n        this.gpuBindGroup = null;\n        this.bindGroup = null;\n        this.batcher = null;\n    }\n}\n\n// inlined pool for SPEEEEEEEEEED :D\nconst batchPool: Batch[] = [];\nlet batchPoolIndex = 0;\n\nfunction getBatchFromPool()\n{\n    return batchPoolIndex > 0 ? batchPool[--batchPoolIndex] : new Batch();\n}\n\nfunction returnBatchToPool(batch: Batch)\n{\n    batchPool[batchPoolIndex++] = batch;\n}\nexport interface BatchableObject\n{\n    indexStart: number;\n\n    packAttributes: (\n        float32View: Float32Array,\n        uint32View: Uint32Array,\n        index: number,\n        textureId: number,\n    ) => void;\n    packIndex: (indexBuffer: IndexBufferArray, index: number, indicesOffset: number) => void;\n\n    texture: Texture;\n    blendMode: BLEND_MODES;\n    vertexSize: number;\n    indexSize: number;\n\n    // stored for efficient updating..\n    textureId: number;\n    location: number; // location in the buffer\n    batcher: Batcher;\n    batch: Batch;\n\n    roundPixels: 0 | 1;\n}\n\nlet BATCH_TICK = 0;\n\n/**\n * The options for the batcher.\n * @ignore\n */\nexport interface BatcherOptions\n{\n    /** The size of the vertex buffer. */\n    vertexSize?: number;\n    /** The size of the index buffer. */\n    indexSize?: number;\n    /** The maximum number of textures per batch. */\n    maxTextures?: number;\n}\n\n/**\n * A batcher is used to batch together objects with the same texture.\n * @ignore\n */\nexport class Batcher\n{\n    public static defaultOptions: BatcherOptions = {\n        vertexSize: 4,\n        indexSize: 6,\n        maxTextures: null,\n    };\n\n    /** unique id for this batcher */\n    public readonly uid: number = uid('batcher');\n    public attributeBuffer: ViewableBuffer;\n    public indexBuffer: IndexBufferArray;\n\n    public attributeSize: number;\n    public indexSize: number;\n    public elementSize: number;\n    public elementStart: number;\n\n    public dirty = true;\n\n    public batchIndex = 0;\n    public batches: Batch[] = [];\n\n    // specifics.\n    private readonly _vertexSize: number = 6;\n\n    private _elements: BatchableObject[] = [];\n\n    private _batchIndexStart: number;\n    private _batchIndexSize: number;\n\n    /** The maximum number of textures per batch. */\n    public readonly maxTextures: number;\n\n    constructor(options: BatcherOptions = {})\n    {\n        Batcher.defaultOptions.maxTextures = Batcher.defaultOptions.maxTextures ?? getMaxTexturesPerBatch();\n        options = { ...Batcher.defaultOptions, ...options };\n\n        const { vertexSize, indexSize, maxTextures } = options;\n\n        this.attributeBuffer = new ViewableBuffer(vertexSize * this._vertexSize * 4);\n\n        this.indexBuffer = new Uint16Array(indexSize);\n\n        this.maxTextures = maxTextures;\n    }\n\n    public begin()\n    {\n        this.elementSize = 0;\n        this.elementStart = 0;\n        this.indexSize = 0;\n        this.attributeSize = 0;\n\n        for (let i = 0; i < this.batchIndex; i++)\n        {\n            returnBatchToPool(this.batches[i]);\n        }\n\n        this.batchIndex = 0;\n        this._batchIndexStart = 0;\n        this._batchIndexSize = 0;\n\n        this.dirty = true;\n    }\n\n    public add(batchableObject: BatchableObject)\n    {\n        this._elements[this.elementSize++] = batchableObject;\n\n        batchableObject.indexStart = this.indexSize;\n        batchableObject.location = this.attributeSize;\n        batchableObject.batcher = this;\n\n        this.indexSize += batchableObject.indexSize;\n        this.attributeSize += ((batchableObject.vertexSize) * this._vertexSize);\n    }\n\n    public checkAndUpdateTexture(batchableObject: BatchableObject, texture: Texture): boolean\n    {\n        const textureId = batchableObject.batch.textures.ids[texture._source.uid];\n\n        // TODO could try to be a bit smarter if there are spare textures..\n        // but need to figure out how to alter the bind groups too..\n        if (!textureId && textureId !== 0) return false;\n\n        batchableObject.textureId = textureId;\n        batchableObject.texture = texture;\n\n        return true;\n    }\n\n    public updateElement(batchableObject: BatchableObject)\n    {\n        this.dirty = true;\n\n        batchableObject.packAttributes(\n            this.attributeBuffer.float32View,\n            this.attributeBuffer.uint32View,\n            batchableObject.location, batchableObject.textureId);\n    }\n\n    /**\n     * breaks the batcher. This happens when a batch gets too big,\n     * or we need to switch to a different type of rendering (a filter for example)\n     * @param instructionSet\n     */\n    public break(instructionSet: InstructionSet)\n    {\n        // ++BATCH_TICK;\n        const elements = this._elements;\n\n        // length 0??!! (we broke without adding anything)\n        if (!elements[this.elementStart]) return;\n\n        let batch = getBatchFromPool();\n        let textureBatch = batch.textures;\n\n        textureBatch.clear();\n\n        const firstElement = elements[this.elementStart];\n        let blendMode = getAdjustedBlendModeBlend(firstElement.blendMode, firstElement.texture._source);\n\n        if (this.attributeSize * 4 > this.attributeBuffer.size)\n        {\n            this._resizeAttributeBuffer(this.attributeSize * 4);\n        }\n\n        if (this.indexSize > this.indexBuffer.length)\n        {\n            this._resizeIndexBuffer(this.indexSize);\n        }\n\n        const f32 = this.attributeBuffer.float32View;\n        const u32 = this.attributeBuffer.uint32View;\n        const iBuffer = this.indexBuffer;\n\n        let size = this._batchIndexSize;\n        let start = this._batchIndexStart;\n\n        let action: BatchAction = 'startBatch';\n\n        const maxTextures = this.maxTextures;\n\n        for (let i = this.elementStart; i < this.elementSize; ++i)\n        {\n            const element = elements[i];\n\n            elements[i] = null;\n\n            const texture = element.texture;\n            const source = texture._source;\n\n            const adjustedBlendMode = getAdjustedBlendModeBlend(element.blendMode, source);\n\n            const blendModeChange = blendMode !== adjustedBlendMode;\n\n            if (source._batchTick === BATCH_TICK && !blendModeChange)\n            {\n                element.textureId = source._textureBindLocation;\n\n                size += element.indexSize;\n                element.packAttributes(f32, u32, element.location, element.textureId);\n                element.packIndex(iBuffer, element.indexStart, element.location / this._vertexSize);\n\n                element.batch = batch;\n\n                continue;\n            }\n\n            source._batchTick = BATCH_TICK;\n\n            if (textureBatch.count >= maxTextures || blendModeChange)\n            {\n                this._finishBatch(\n                    batch,\n                    start,\n                    size - start,\n                    textureBatch,\n                    blendMode,\n                    instructionSet,\n                    action\n                );\n\n                action = 'renderBatch';\n                start = size;\n                // create a batch...\n                blendMode = adjustedBlendMode;\n\n                batch = getBatchFromPool();\n                textureBatch = batch.textures;\n                textureBatch.clear();\n\n                ++BATCH_TICK;\n            }\n\n            element.textureId = source._textureBindLocation = textureBatch.count;\n            textureBatch.ids[source.uid] = textureBatch.count;\n            textureBatch.textures[textureBatch.count++] = source;\n            element.batch = batch;\n\n            size += element.indexSize;\n            element.packAttributes(f32, u32, element.location, element.textureId);\n            element.packIndex(iBuffer, element.indexStart, element.location / this._vertexSize);\n        }\n\n        if (textureBatch.count > 0)\n        {\n            this._finishBatch(\n                batch,\n                start,\n                size - start,\n                textureBatch,\n                blendMode,\n                instructionSet,\n                action\n            );\n\n            start = size;\n            ++BATCH_TICK;\n        }\n\n        this.elementStart = this.elementSize;\n        this._batchIndexStart = start;\n        this._batchIndexSize = size;\n    }\n\n    private _finishBatch(\n        batch: Batch,\n        indexStart: number,\n        indexSize: number,\n        textureBatch: BatchTextureArray,\n        blendMode: BLEND_MODES,\n        instructionSet: InstructionSet,\n        action: BatchAction\n    )\n    {\n        batch.gpuBindGroup = null;\n        batch.bindGroup = null;\n        batch.action = action;\n\n        batch.batcher = this;\n        batch.textures = textureBatch;\n        batch.blendMode = blendMode;\n\n        batch.start = indexStart;\n        batch.size = indexSize;\n\n        ++BATCH_TICK;\n\n        // track for returning later!\n        this.batches[this.batchIndex++] = batch;\n        instructionSet.add(batch);\n    }\n\n    public finish(instructionSet: InstructionSet)\n    {\n        this.break(instructionSet);\n    }\n\n    /**\n     * Resizes the attribute buffer to the given size (1 = 1 float32)\n     * @param size - the size in vertices to ensure (not bytes!)\n     */\n    public ensureAttributeBuffer(size: number)\n    {\n        if (size * 4 <= this.attributeBuffer.size) return;\n\n        this._resizeAttributeBuffer(size * 4);\n    }\n\n    /**\n     * Resizes the index buffer to the given size (1 = 1 float32)\n     * @param size - the size in vertices to ensure (not bytes!)\n     */\n    public ensureIndexBuffer(size: number)\n    {\n        if (size <= this.indexBuffer.length) return;\n\n        this._resizeIndexBuffer(size);\n    }\n\n    private _resizeAttributeBuffer(size: number)\n    {\n        const newSize = Math.max(size, this.attributeBuffer.size * 2);\n\n        const newArrayBuffer = new ViewableBuffer(newSize);\n\n        fastCopy(this.attributeBuffer.rawBinaryData, newArrayBuffer.rawBinaryData);\n\n        this.attributeBuffer = newArrayBuffer;\n    }\n\n    private _resizeIndexBuffer(size: number)\n    {\n        const indexBuffer = this.indexBuffer;\n\n        let newSize = Math.max(size, indexBuffer.length * 1.5);\n\n        newSize += newSize % 2;\n\n        // this, is technically not 100% accurate, as really we should\n        // be checking the maximum value in the buffer. This approximation\n        // does the trick though...\n\n        // make sure buffer is always an even number..\n        const newIndexBuffer = (newSize > 65535) ? new Uint32Array(newSize) : new Uint16Array(newSize);\n\n        if (newIndexBuffer.BYTES_PER_ELEMENT !== indexBuffer.BYTES_PER_ELEMENT)\n        {\n            for (let i = 0; i < indexBuffer.length; i++)\n            {\n                newIndexBuffer[i] = indexBuffer[i];\n            }\n        }\n        else\n        {\n            fastCopy(indexBuffer.buffer, newIndexBuffer.buffer);\n        }\n\n        this.indexBuffer = newIndexBuffer;\n    }\n\n    public destroy()\n    {\n        for (let i = 0; i < this.batches.length; i++)\n        {\n            returnBatchToPool(this.batches[i]);\n        }\n\n        this.batches = null;\n\n        for (let i = 0; i < this._elements.length; i++)\n        {\n            this._elements[i].batch = null;\n        }\n\n        this._elements = null;\n\n        this.indexBuffer = null;\n\n        this.attributeBuffer.destroy();\n        this.attributeBuffer = null;\n    }\n}\n\n"],"names":[],"mappings":"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"}