{"version":3,"file":"GraphicsPipe.mjs","sources":["../../../../src/scene/graphics/shared/GraphicsPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { State } from '../../../rendering/renderers/shared/state/State';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { color32BitToUniform } from '../gpu/colorToUniform';\nimport { BatchableGraphics } from './BatchableGraphics';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { BatchPipe, RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Shader } from '../../../rendering/renderers/shared/shader/Shader';\nimport type { PoolItem } from '../../../utils/pool/Pool';\nimport type { Container } from '../../container/Container';\nimport type { Graphics } from './Graphics';\nimport type { GpuGraphicsContext, GraphicsContextSystem } from './GraphicsContextSystem';\n\nexport interface GraphicsAdaptor\n{\n    shader: Shader;\n    init(): void;\n    execute(graphicsPipe: GraphicsPipe, renderable: Graphics): void;\n    destroy(): void;\n}\nexport interface GraphicsSystem\n{\n    graphicsContext: GraphicsContextSystem;\n    renderPipes: {\n        batch: BatchPipe\n    }\n    _roundPixels: 0 | 1;\n}\n\nexport class GraphicsPipe implements RenderPipe<Graphics>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'graphics',\n    } as const;\n\n    public renderer: GraphicsSystem;\n    public state: State = State.for2d();\n\n    // batchable graphics list, used to render batches\n    private _graphicsBatchesHash: Record<number, BatchableGraphics[]> = Object.create(null);\n    private _adaptor: GraphicsAdaptor;\n    private readonly _destroyRenderableBound = this.destroyRenderable.bind(this) as (renderable: Container) => void;\n\n    constructor(renderer: GraphicsSystem, adaptor: GraphicsAdaptor)\n    {\n        this.renderer = renderer;\n\n        this._adaptor = adaptor;\n        this._adaptor.init();\n    }\n\n    public validateRenderable(graphics: Graphics): boolean\n    {\n        // assume context is dirty..\n\n        const context = graphics.context;\n\n        const wasBatched = !!this._graphicsBatchesHash[graphics.uid];\n\n        const gpuContext = this.renderer.graphicsContext.updateGpuContext(context);\n\n        if (gpuContext.isBatchable || wasBatched !== gpuContext.isBatchable)\n        {\n            // TODO what if they are the same size??\n            return true;\n        }\n\n        return false;\n    }\n\n    public addRenderable(graphics: Graphics, instructionSet: InstructionSet)\n    {\n        const gpuContext = this.renderer.graphicsContext.updateGpuContext(graphics.context);\n\n        // need to get batches here.. as we need to know if we can batch or not..\n        // this also overrides the current batches..\n\n        if (graphics._didGraphicsUpdate)\n        {\n            graphics._didGraphicsUpdate = false;\n\n            this._rebuild(graphics);\n        }\n\n        if (gpuContext.isBatchable)\n        {\n            this._addToBatcher(graphics);\n        }\n        else\n        {\n            this.renderer.renderPipes.batch.break(instructionSet);\n            instructionSet.add(graphics);\n        }\n    }\n\n    public updateRenderable(graphics: Graphics)\n    {\n        const batches = this._graphicsBatchesHash[graphics.uid];\n\n        if (batches)\n        {\n            for (let i = 0; i < batches.length; i++)\n            {\n                const batch = batches[i];\n\n                batch.batcher.updateElement(batch);\n            }\n        }\n    }\n\n    public destroyRenderable(graphics: Graphics)\n    {\n        if (this._graphicsBatchesHash[graphics.uid])\n        {\n            this._removeBatchForRenderable(graphics.uid);\n        }\n\n        graphics.off('destroyed', this._destroyRenderableBound);\n    }\n\n    public execute(graphics: Graphics)\n    {\n        if (!graphics.isRenderable) return;\n\n        const renderer = this.renderer;\n        const context = graphics.context;\n        const contextSystem = renderer.graphicsContext;\n\n        // early out if there is no actual visual stuff...\n        if (!contextSystem.getGpuContext(context).batches.length)\n        { return; }\n\n        const shader = context.customShader || this._adaptor.shader;\n\n        this.state.blendMode = graphics.groupBlendMode;\n\n        const localUniforms = shader.resources.localUniforms.uniforms;\n\n        localUniforms.uTransformMatrix = graphics.groupTransform;\n        localUniforms.uRound = renderer._roundPixels | graphics._roundPixels;\n\n        color32BitToUniform(\n            graphics.groupColorAlpha,\n            localUniforms.uColor,\n            0,\n        );\n\n        this._adaptor.execute(this, graphics);\n    }\n\n    private _rebuild(graphics: Graphics)\n    {\n        const wasBatched = !!this._graphicsBatchesHash[graphics.uid];\n\n        const gpuContext = this.renderer.graphicsContext.updateGpuContext(graphics.context);\n\n        // TODO POOL the old batches!\n\n        if (wasBatched)\n        {\n            this._removeBatchForRenderable(graphics.uid);\n        }\n\n        if (gpuContext.isBatchable)\n        {\n            this._initBatchesForRenderable(graphics);\n        }\n\n        graphics.batched = gpuContext.isBatchable;\n    }\n\n    private _addToBatcher(graphics: Graphics)\n    {\n        const batchPipe = this.renderer.renderPipes.batch;\n\n        const batches = this._getBatchesForRenderable(graphics);\n\n        for (let i = 0; i < batches.length; i++)\n        {\n            const batch = batches[i];\n\n            batchPipe.addToBatch(batch);\n        }\n    }\n\n    private _getBatchesForRenderable(graphics: Graphics): BatchableGraphics[]\n    {\n        return this._graphicsBatchesHash[graphics.uid] || this._initBatchesForRenderable(graphics);\n    }\n\n    private _initBatchesForRenderable(graphics: Graphics): BatchableGraphics[]\n    {\n        const context = graphics.context;\n\n        const gpuContext: GpuGraphicsContext = this.renderer.graphicsContext.getGpuContext(context);\n\n        const roundPixels = (this.renderer._roundPixels | graphics._roundPixels) as 0 | 1;\n\n        const batches = gpuContext.batches.map((batch) =>\n        {\n            // TODO pool this!!\n            const batchClone = BigPool.get(BatchableGraphics);\n\n            batch.copyTo(batchClone);\n\n            batchClone.renderable = graphics;\n\n            batchClone.roundPixels = roundPixels;\n\n            return batchClone;\n        });\n\n        if (this._graphicsBatchesHash[graphics.uid] === undefined)\n        {\n            // TODO perhaps manage this outside this pipe? (a bit like how we update / add)\n            graphics.on('destroyed', this._destroyRenderableBound);\n        }\n\n        this._graphicsBatchesHash[graphics.uid] = batches;\n\n        return batches;\n    }\n\n    private _removeBatchForRenderable(graphicsUid: number)\n    {\n        this._graphicsBatchesHash[graphicsUid].forEach((batch) =>\n        {\n            BigPool.return(batch as PoolItem);\n        });\n\n        this._graphicsBatchesHash[graphicsUid] = null;\n    }\n\n    public destroy()\n    {\n        this.renderer = null;\n\n        this._adaptor.destroy();\n        this._adaptor = null;\n        this.state = null;\n\n        for (const i in this._graphicsBatchesHash)\n        {\n            this._removeBatchForRenderable(i as unknown as number);\n        }\n\n        this._graphicsBatchesHash = null;\n    }\n}\n"],"names":[],"mappings":"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"}