{"version":3,"file":"CanvasGraphicsContextSystem.mjs","sources":["../../../../src/scene/graphics/canvas/CanvasGraphicsContextSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport { GCManagedHash } from '../../../utils/data/GCManagedHash';\nimport { type GPUData } from '../../view/ViewContainer';\n\nimport type { System } from '../../../rendering/renderers/shared/system/System';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { GraphicsContext } from '../shared/GraphicsContext';\nimport type { GraphicsContextSystemOptions } from '../shared/GraphicsContextSystem';\n\nclass CanvasGraphicsContext implements GPUData\n{\n    /**\n     * Whether this context can be batched.\n     * @advanced\n     */\n    public isBatchable = false;\n    /**\n     * The source GraphicsContext.\n     * @advanced\n     */\n    public context: GraphicsContext;\n    /**\n     * Render data for this context.\n     * @advanced\n     */\n    public graphicsData: CanvasGraphicsContextRenderData;\n\n    /**\n     * Reset cached canvas data.\n     * @advanced\n     */\n    public reset()\n    {\n        this.isBatchable = false;\n        this.context = null;\n\n        if (this.graphicsData)\n        {\n            this.graphicsData.destroy();\n            this.graphicsData = null;\n        }\n    }\n\n    /**\n     * Destroy the cached data.\n     * @advanced\n     */\n    public destroy()\n    {\n        this.reset();\n    }\n}\n\nclass CanvasGraphicsContextRenderData\n{\n    /**\n     * Instructions for canvas rendering.\n     * @advanced\n     */\n    public instructions = new InstructionSet();\n\n    /**\n     * Initialize render data.\n     * @advanced\n     */\n    public init(): void\n    {\n        this.instructions.reset();\n    }\n\n    /**\n     * Destroy render data.\n     * @advanced\n     */\n    public destroy(): void\n    {\n        this.instructions.destroy();\n        (this.instructions as null) = null;\n    }\n}\n\n/**\n * A system that manages the rendering of GraphicsContexts for Canvas2D.\n * @category rendering\n * @advanced\n */\nexport class CanvasGraphicsContextSystem implements System<GraphicsContextSystemOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.CanvasSystem,\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        CanvasGraphicsContextSystem.defaultOptions.bezierSmoothness = options?.bezierSmoothness\n            ?? CanvasGraphicsContextSystem.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): CanvasGraphicsContextRenderData\n    {\n        const gpuContext = this.getGpuContext(context);\n\n        return gpuContext.graphicsData || this._initContextRenderData(context);\n    }\n\n    /**\n     * Updates the GPU context for a given GraphicsContext.\n     * @param context - The GraphicsContext to update.\n     * @returns The updated CanvasGraphicsContext.\n     * @internal\n     */\n    public updateGpuContext(context: GraphicsContext)\n    {\n        const gpuData = context._gpuData as unknown as Record<number | string, CanvasGraphicsContext>;\n        const hasContext = !!gpuData[this._renderer.uid];\n        const gpuContext = gpuData[this._renderer.uid] || this._initContext(context);\n\n        if (context.dirty || !hasContext)\n        {\n            if (hasContext)\n            {\n                gpuContext.reset();\n            }\n\n            gpuContext.isBatchable = false;\n            context.dirty = false;\n        }\n\n        return gpuContext;\n    }\n\n    /**\n     * Returns the CanvasGraphicsContext for a given GraphicsContext.\n     * If it does not exist, it will initialize a new one.\n     * @param context - The GraphicsContext to get the CanvasGraphicsContext for.\n     * @returns The CanvasGraphicsContext for the given GraphicsContext.\n     * @internal\n     */\n    public getGpuContext(context: GraphicsContext): CanvasGraphicsContext\n    {\n        const gpuData = context._gpuData as unknown as Record<number | string, CanvasGraphicsContext>;\n\n        return gpuData[this._renderer.uid] || this._initContext(context);\n    }\n\n    private _initContextRenderData(context: GraphicsContext): CanvasGraphicsContextRenderData\n    {\n        const renderData = new CanvasGraphicsContextRenderData();\n        const gpuContext = this.getGpuContext(context);\n\n        gpuContext.graphicsData = renderData;\n\n        renderData.init();\n\n        return renderData;\n    }\n\n    private _initContext(context: GraphicsContext): CanvasGraphicsContext\n    {\n        const gpuContext = new CanvasGraphicsContext();\n\n        gpuContext.context = context;\n        (context._gpuData as unknown as Record<number | string, CanvasGraphicsContext>)[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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"}