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 • 12.8 kB
Source Map (JSON)
{"version":3,"file":"ParticleBuffer.mjs","sources":["../../../../src/scene/particle-container/shared/ParticleBuffer.ts"],"sourcesContent":["import { Buffer } from '../../../rendering/renderers/shared/buffer/Buffer';\nimport { BufferUsage } from '../../../rendering/renderers/shared/buffer/const';\nimport { Geometry } from '../../../rendering/renderers/shared/geometry/Geometry';\nimport { getAttributeInfoFromFormat } from '../../../rendering/renderers/shared/geometry/utils/getAttributeInfoFromFormat';\nimport { ViewableBuffer } from '../../../utils/data/ViewableBuffer';\nimport { createIndicesForQuads } from './utils/createIndicesForQuads';\nimport { generateParticleUpdateFunction } from './utils/generateParticleUpdateFunction';\n\nimport type { IndexBufferArray } from '../../../rendering/renderers/shared/geometry/Geometry';\nimport type { IParticle } from './Particle';\nimport type { ParticleRendererProperty } from './particleData';\nimport type { ParticleUpdateFunction } from './utils/generateParticleUpdateFunction';\n\n/**\n * Options for creating a ParticleBuffer.\n * @internal\n */\nexport interface ParticleBufferOptions\n{\n /** The size of the particle buffer, defaults to 1000. */\n size: number;\n /** A record of attributes that the particle container uses. */\n properties: Record<string, ParticleRendererProperty>;\n}\n\n/**\n * The ParticleBuffer holds the buffers and geometry for a particle container.\n * It also contains the upload functions for the static and dynamic properties.\n * @internal\n */\nexport class ParticleBuffer\n{\n /** The buffer containing static attribute data for all elements in the batch. */\n public staticAttributeBuffer: ViewableBuffer;\n /** The buffer containing dynamic attribute data for all elements in the batch. */\n public dynamicAttributeBuffer: ViewableBuffer;\n\n private readonly _staticBuffer: Buffer;\n private readonly _dynamicBuffer: Buffer;\n\n /** The buffer containing index data for all elements in the batch. */\n public indexBuffer: IndexBufferArray;\n\n private readonly _dynamicStride: number;\n private readonly _staticStride: number;\n\n /** The geometry of the particle buffer. */\n public readonly geometry: Geometry;\n\n private _size = 0;\n private readonly _dynamicUpload: ParticleUpdateFunction;\n private readonly _staticUpload: ParticleUpdateFunction;\n private readonly _generateParticleUpdateCache: Record<string, {\n dynamicUpdate: ParticleUpdateFunction;\n staticUpdate: ParticleUpdateFunction;\n }> = {};\n\n constructor(options: ParticleBufferOptions)\n {\n // size in sprites!\n const size = this._size = options.size ?? 1000;\n\n // TODO add the option to specify what is dynamic!\n const properties = options.properties;\n\n // in bytes!\n let staticVertexSize = 0;\n let dynamicVertexSize = 0;\n\n for (const i in properties)\n {\n const property = properties[i];\n const attributeInfo = getAttributeInfoFromFormat(property.format);\n\n if (property.dynamic)\n {\n // dynamic.\n dynamicVertexSize += attributeInfo.stride;\n }\n else\n {\n // static.\n staticVertexSize += attributeInfo.stride;\n }\n }\n\n this._dynamicStride = dynamicVertexSize / 4;\n this._staticStride = staticVertexSize / 4;\n\n this.staticAttributeBuffer = new ViewableBuffer(size * 4 * staticVertexSize);\n this.dynamicAttributeBuffer = new ViewableBuffer(size * 4 * dynamicVertexSize);\n\n this.indexBuffer = createIndicesForQuads(size);\n\n // build geometry..\n\n const geometry = new Geometry();\n\n let dynamicOffset = 0;\n let staticOffset = 0;\n\n this._staticBuffer = new Buffer({\n data: new Float32Array(1),\n label: 'static-particle-buffer',\n shrinkToFit: false,\n usage: BufferUsage.VERTEX | BufferUsage.COPY_DST\n });\n\n this._dynamicBuffer = new Buffer({\n data: new Float32Array(1),\n label: 'dynamic-particle-buffer',\n shrinkToFit: false,\n usage: BufferUsage.VERTEX | BufferUsage.COPY_DST\n });\n\n for (const i in properties)\n {\n const property = properties[i];\n const attributeInfo = getAttributeInfoFromFormat(property.format);\n\n if (property.dynamic)\n {\n geometry.addAttribute(property.attributeName, {\n buffer: this._dynamicBuffer,\n stride: this._dynamicStride * 4,\n offset: dynamicOffset * 4,\n format: property.format,\n });\n dynamicOffset += attributeInfo.size;\n }\n else\n {\n geometry.addAttribute(property.attributeName, {\n buffer: this._staticBuffer,\n stride: this._staticStride * 4,\n offset: staticOffset * 4,\n format: property.format,\n });\n staticOffset += attributeInfo.size;\n }\n }\n\n geometry.addIndex(this.indexBuffer);\n\n const uploadFunction = this.getParticleUpdate(properties);\n\n this._dynamicUpload = uploadFunction.dynamicUpdate;\n this._staticUpload = uploadFunction.staticUpdate;\n\n this.geometry = geometry;\n }\n\n public getParticleUpdate(properties: Record<string, ParticleRendererProperty>)\n {\n const key = getParticleSyncKey(properties);\n\n if (this._generateParticleUpdateCache[key])\n {\n return this._generateParticleUpdateCache[key];\n }\n\n this._generateParticleUpdateCache[key] = this.generateParticleUpdate(properties);\n\n return this._generateParticleUpdateCache[key];\n }\n\n public generateParticleUpdate(properties: Record<string, ParticleRendererProperty>)\n {\n return generateParticleUpdateFunction(properties);\n }\n\n public update(particles: IParticle[], uploadStatic: boolean)\n {\n // first resize the buffers if needed!\n // TODO resize!\n if (particles.length > this._size)\n {\n uploadStatic = true;\n\n this._size = Math.max(particles.length, (this._size * 1.5) | 0);\n\n this.staticAttributeBuffer = new ViewableBuffer(this._size * this._staticStride * 4 * 4);\n this.dynamicAttributeBuffer = new ViewableBuffer(this._size * this._dynamicStride * 4 * 4);\n this.indexBuffer = createIndicesForQuads(this._size);\n\n this.geometry.indexBuffer.setDataWithSize(\n this.indexBuffer, this.indexBuffer.byteLength, true);\n }\n\n const dynamicAttributeBuffer = this.dynamicAttributeBuffer;\n\n this._dynamicUpload(particles, dynamicAttributeBuffer.float32View, dynamicAttributeBuffer.uint32View);\n\n this._dynamicBuffer.setDataWithSize(\n this.dynamicAttributeBuffer.float32View, particles.length * this._dynamicStride * 4, true);\n\n if (uploadStatic)\n {\n const staticAttributeBuffer = this.staticAttributeBuffer;\n\n this._staticUpload(particles, staticAttributeBuffer.float32View, staticAttributeBuffer.uint32View);\n\n this._staticBuffer.setDataWithSize(\n staticAttributeBuffer.float32View, particles.length * this._staticStride * 4, true);\n }\n }\n\n public destroy()\n {\n this._staticBuffer.destroy();\n this._dynamicBuffer.destroy();\n this.geometry.destroy();\n }\n}\n\nfunction getParticleSyncKey(properties: Record<string, ParticleRendererProperty>)\n{\n const keyGen: string[] = [];\n\n for (const key in properties)\n {\n const property = properties[key];\n\n keyGen.push(key, property.code, property.dynamic ? 'd' : 's');\n }\n\n return keyGen.join('_');\n}\n\n"],"names":[],"mappings":"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"}