{"version":3,"file":"GraphicsContextSystem.mjs","sources":["../../../../src/scene/graphics/shared/GraphicsContextSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { getTextureBatchBindGroup } from '../../../rendering/batcher/gpu/getTextureBatchBindGroup';\nimport { type BatcherOptions } from '../../../rendering/batcher/shared/Batcher';\nimport { DefaultBatcher } from '../../../rendering/batcher/shared/DefaultBatcher';\nimport { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport { GCManagedHash } from '../../../utils/data/GCManagedHash';\nimport { deprecation, v8_3_4 } from '../../../utils/logging/deprecation';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { type GPUData } from '../../view/ViewContainer';\nimport { buildContextBatches } from './utils/buildContextBatches';\n\nimport type { System } from '../../../rendering/renderers/shared/system/System';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { BatchableGraphics } from './BatchableGraphics';\nimport type { GraphicsContext } from './GraphicsContext';\n\ninterface GeometryData\n{\n    vertices: number[];\n    uvs: number[];\n    indices: number[];\n}\n\n/**\n * A class that holds batchable graphics data for a GraphicsContext.\n * @category rendering\n * @ignore\n */\nexport class GpuGraphicsContext implements GPUData\n{\n    public isBatchable: boolean;\n    public context: GraphicsContext;\n\n    public batches: BatchableGraphics[] = [];\n    public geometryData: GeometryData = {\n        vertices: [],\n        uvs: [],\n        indices: [],\n    };\n    public graphicsData: GraphicsContextRenderData;\n\n    public reset()\n    {\n        if (this.batches)\n        {\n            this.batches.forEach((batch) =>\n            {\n                BigPool.return(batch);\n            });\n        }\n        if (this.graphicsData)\n        {\n            BigPool.return(this.graphicsData);\n        }\n\n        this.isBatchable = false;\n        this.context = null;\n\n        this.batches.length = 0;\n        this.geometryData.indices.length = 0;\n        this.geometryData.vertices.length = 0;\n        this.geometryData.uvs.length = 0;\n\n        this.graphicsData = null;\n    }\n\n    public destroy()\n    {\n        this.reset();\n        this.batches = null;\n        this.geometryData = null;\n    }\n}\n\n/**\n * A class that holds the render data for a GraphicsContext.\n * @category rendering\n * @ignore\n */\nexport class GraphicsContextRenderData\n{\n    public batcher: DefaultBatcher;\n    public instructions = new InstructionSet();\n\n    public init(options: BatcherOptions)\n    {\n        const maxTextures = options.maxTextures;\n\n        this.batcher ? this.batcher._updateMaxTextures(maxTextures) : this.batcher = new DefaultBatcher({ maxTextures });\n        this.instructions.reset();\n    }\n\n    /**\n     * @deprecated since version 8.0.0\n     * Use `batcher.geometry` instead.\n     * @see {Batcher#geometry}\n     */\n    get geometry()\n    {\n        // #if _DEBUG\n        deprecation(v8_3_4, 'GraphicsContextRenderData#geometry is deprecated, please use batcher.geometry instead.');\n        // #endif\n\n        return this.batcher.geometry;\n    }\n\n    public destroy()\n    {\n        this.batcher.destroy();\n        this.instructions.destroy();\n\n        this.batcher = null;\n        this.instructions = null;\n    }\n}\n\n/**\n * Options for the GraphicsContextSystem.\n * @category rendering\n * @advanced\n */\nexport interface GraphicsContextSystemOptions\n{\n    /** A value from 0 to 1 that controls the smoothness of bezier curves (the higher the smoother) */\n    bezierSmoothness?: number;\n}\n\n/**\n * A system that manages the rendering of GraphicsContexts.\n * @category rendering\n * @advanced\n */\nexport class GraphicsContextSystem implements System<GraphicsContextSystemOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'graphicsContext'\n    } as const;\n\n    /** The default options for the GraphicsContextSystem. */\n    public static readonly defaultOptions: GraphicsContextSystemOptions = {\n        /**\n         * A value from 0 to 1 that controls the smoothness of bezier curves (the higher the smoother)\n         * @default 0.5\n         */\n        bezierSmoothness: 0.5,\n    };\n\n    private readonly _renderer: Renderer;\n    private readonly _managedContexts: GCManagedHash<GraphicsContext>;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n        this._managedContexts = new GCManagedHash({ renderer, type: 'resource', name: 'graphicsContext' });\n    }\n\n    /**\n     * Runner init called, update the default options\n     * @ignore\n     */\n    public init(options?: GraphicsContextSystemOptions)\n    {\n        GraphicsContextSystem.defaultOptions.bezierSmoothness = options?.bezierSmoothness\n            ?? GraphicsContextSystem.defaultOptions.bezierSmoothness;\n    }\n\n    /**\n     * Returns the render data for a given GraphicsContext.\n     * @param context - The GraphicsContext to get the render data for.\n     * @internal\n     */\n    public getContextRenderData(context: GraphicsContext): GraphicsContextRenderData\n    {\n        return context._gpuData[this._renderer.uid].graphicsData || this._initContextRenderData(context);\n    }\n\n    /**\n     * Updates the GPU context for a given GraphicsContext.\n     * If the context is dirty, it will rebuild the batches and geometry data.\n     * @param context - The GraphicsContext to update.\n     * @returns The updated GpuGraphicsContext.\n     * @internal\n     */\n    public updateGpuContext(context: GraphicsContext)\n    {\n        const hasContext = !!context._gpuData[this._renderer.uid];\n        const gpuContext: GpuGraphicsContext = context._gpuData[this._renderer.uid] || this._initContext(context);\n\n        if (context.dirty || !hasContext)\n        {\n            if (hasContext)\n            {\n                gpuContext.reset();\n            }\n\n            buildContextBatches(context, gpuContext);\n\n            const batchMode = context.batchMode;\n\n            if (context.customShader || batchMode === 'no-batch')\n            {\n                gpuContext.isBatchable = false;\n            }\n            else if (batchMode === 'auto')\n            {\n                gpuContext.isBatchable = (gpuContext.geometryData.vertices.length < 400);\n            }\n            else\n            {\n                gpuContext.isBatchable = true;\n            }\n\n            context.dirty = false;\n        }\n\n        return gpuContext;\n    }\n\n    /**\n     * Returns the GpuGraphicsContext for a given GraphicsContext.\n     * If it does not exist, it will initialize a new one.\n     * @param context - The GraphicsContext to get the GpuGraphicsContext for.\n     * @returns The GpuGraphicsContext for the given GraphicsContext.\n     * @internal\n     */\n    public getGpuContext(context: GraphicsContext): GpuGraphicsContext\n    {\n        return context._gpuData[this._renderer.uid] || this._initContext(context);\n    }\n\n    private _initContextRenderData(context: GraphicsContext): GraphicsContextRenderData\n    {\n        const graphicsData: GraphicsContextRenderData = BigPool.get(GraphicsContextRenderData, {\n            maxTextures: this._renderer.limits.maxBatchableTextures,\n        });\n\n        const gpuContext = context._gpuData[this._renderer.uid];\n        const { batches, geometryData } = gpuContext;\n\n        gpuContext.graphicsData = graphicsData;\n\n        const vertexSize = geometryData.vertices.length;\n        const indexSize = geometryData.indices.length;\n\n        for (let i = 0; i < batches.length; i++)\n        {\n            batches[i].applyTransform = false;\n        }\n\n        const batcher = graphicsData.batcher;\n\n        // TODO we can pool buffers here eventually..\n        batcher.ensureAttributeBuffer(vertexSize);\n        batcher.ensureIndexBuffer(indexSize);\n\n        batcher.begin();\n\n        for (let i = 0; i < batches.length; i++)\n        {\n            const batch = batches[i];\n\n            batcher.add(batch);\n        }\n\n        batcher.finish(graphicsData.instructions);\n\n        const geometry = batcher.geometry;\n\n        // not to self - this works as we are assigning the batchers array buffer\n        // once its up loaded - this buffer is then put back in the pool to be reused.\n        // this mean we don't have to creating new Batchers for each graphics items\n        geometry.indexBuffer.setDataWithSize(batcher.indexBuffer, batcher.indexSize, true);\n        geometry.buffers[0].setDataWithSize(batcher.attributeBuffer.float32View, batcher.attributeSize, true);\n\n        const drawBatches = batcher.batches;\n\n        for (let i = 0; i < drawBatches.length; i++)\n        {\n            const batch = drawBatches[i];\n\n            batch.bindGroup = getTextureBatchBindGroup(\n                batch.textures.textures,\n                batch.textures.count,\n                this._renderer.limits.maxBatchableTextures\n            );\n        }\n\n        return graphicsData;\n    }\n\n    private _initContext(context: GraphicsContext): GpuGraphicsContext\n    {\n        const gpuContext = new GpuGraphicsContext();\n\n        gpuContext.context = context;\n\n        context._gpuData[this._renderer.uid] = gpuContext;\n\n        this._managedContexts.add(context);\n\n        return gpuContext;\n    }\n\n    public destroy()\n    {\n        this._managedContexts.destroy();\n        (this._renderer as null) = null;\n    }\n}\n"],"names":[],"mappings":"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"}