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 12.5 kB
{"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 { type GPUData } from '../../view/ViewContainer';\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 implements GPUData\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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"}