UNPKG

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.4 kB
{"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 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 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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"}