pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 15 kB
Source Map (JSON)
{"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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"}