{"version":3,"file":"ParticleBuffer.mjs","sources":["../src/ParticleBuffer.ts"],"sourcesContent":["import { Buffer, Geometry, TYPES, utils } from 'pixijs/core';\n\nimport type { Sprite } from 'pixijs/sprite';\nimport type { IParticleRendererProperty } from './ParticleRenderer';\n\n/*\n * @author Mat Groves\n *\n * Big thanks to the very clever Matt DesLauriers <mattdesl> https://github.com/mattdesl/\n * for creating the original PixiJS version!\n * Also a thanks to https://github.com/bchevalier for tweaking the tint and alpha so that\n * they now share 4 bytes on the vertex buffer\n *\n * Heavily inspired by LibGDX's ParticleBuffer:\n * https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/ParticleBuffer.java\n */\n\n/**\n * The particle buffer manages the static and dynamic buffers for a particle container.\n * @private\n * @memberof PIXI\n */\nexport class ParticleBuffer\n{\n    public geometry: Geometry;\n    public staticStride: number;\n    public staticBuffer: Buffer;\n    public staticData: Float32Array;\n    public staticDataUint32: Uint32Array;\n    public dynamicStride: number;\n    public dynamicBuffer: Buffer;\n    public dynamicData: Float32Array;\n    public dynamicDataUint32: Uint32Array;\n    public _updateID: number;\n\n    /** Holds the indices of the geometry (quads) to draw. */\n    indexBuffer: Buffer;\n\n    /** The number of particles the buffer can hold. */\n    private size: number;\n\n    /** A list of the properties that are dynamic. */\n    private dynamicProperties: IParticleRendererProperty[];\n\n    /** A list of the properties that are static. */\n    private staticProperties: IParticleRendererProperty[];\n\n    /**\n     * @param {object} properties - The properties to upload.\n     * @param {boolean[]} dynamicPropertyFlags - Flags for which properties are dynamic.\n     * @param {number} size - The size of the batch.\n     */\n    constructor(properties: IParticleRendererProperty[], dynamicPropertyFlags: boolean[], size: number)\n    {\n        this.geometry = new Geometry();\n\n        this.indexBuffer = null;\n\n        this.size = size;\n        this.dynamicProperties = [];\n        this.staticProperties = [];\n\n        for (let i = 0; i < properties.length; ++i)\n        {\n            let property = properties[i];\n\n            // Make copy of properties object so that when we edit the offset it doesn't\n            // change all other instances of the object literal\n            property = {\n                attributeName: property.attributeName,\n                size: property.size,\n                uploadFunction: property.uploadFunction,\n                type: property.type || TYPES.FLOAT,\n                offset: property.offset,\n            };\n\n            if (dynamicPropertyFlags[i])\n            {\n                this.dynamicProperties.push(property);\n            }\n            else\n            {\n                this.staticProperties.push(property);\n            }\n        }\n\n        this.staticStride = 0;\n        this.staticBuffer = null;\n        this.staticData = null;\n        this.staticDataUint32 = null;\n\n        this.dynamicStride = 0;\n        this.dynamicBuffer = null;\n        this.dynamicData = null;\n        this.dynamicDataUint32 = null;\n\n        this._updateID = 0;\n\n        this.initBuffers();\n    }\n\n    /** Sets up the renderer context and necessary buffers. */\n    private initBuffers(): void\n    {\n        const geometry = this.geometry;\n\n        let dynamicOffset = 0;\n\n        this.indexBuffer = new Buffer(utils.createIndicesForQuads(this.size), true, true);\n        geometry.addIndex(this.indexBuffer);\n\n        this.dynamicStride = 0;\n\n        for (let i = 0; i < this.dynamicProperties.length; ++i)\n        {\n            const property = this.dynamicProperties[i];\n\n            property.offset = dynamicOffset;\n            dynamicOffset += property.size;\n            this.dynamicStride += property.size;\n        }\n\n        const dynBuffer = new ArrayBuffer(this.size * this.dynamicStride * 4 * 4);\n\n        this.dynamicData = new Float32Array(dynBuffer);\n        this.dynamicDataUint32 = new Uint32Array(dynBuffer);\n        this.dynamicBuffer = new Buffer(this.dynamicData, false, false);\n\n        // static //\n        let staticOffset = 0;\n\n        this.staticStride = 0;\n\n        for (let i = 0; i < this.staticProperties.length; ++i)\n        {\n            const property = this.staticProperties[i];\n\n            property.offset = staticOffset;\n            staticOffset += property.size;\n            this.staticStride += property.size;\n        }\n\n        const statBuffer = new ArrayBuffer(this.size * this.staticStride * 4 * 4);\n\n        this.staticData = new Float32Array(statBuffer);\n        this.staticDataUint32 = new Uint32Array(statBuffer);\n        this.staticBuffer = new Buffer(this.staticData, true, false);\n\n        for (let i = 0; i < this.dynamicProperties.length; ++i)\n        {\n            const property = this.dynamicProperties[i];\n\n            geometry.addAttribute(\n                property.attributeName,\n                this.dynamicBuffer,\n                0,\n                property.type === TYPES.UNSIGNED_BYTE,\n                property.type,\n                this.dynamicStride * 4,\n                property.offset * 4\n            );\n        }\n\n        for (let i = 0; i < this.staticProperties.length; ++i)\n        {\n            const property = this.staticProperties[i];\n\n            geometry.addAttribute(\n                property.attributeName,\n                this.staticBuffer,\n                0,\n                property.type === TYPES.UNSIGNED_BYTE,\n                property.type,\n                this.staticStride * 4,\n                property.offset * 4\n            );\n        }\n    }\n\n    /**\n     * Uploads the dynamic properties.\n     * @param children - The children to upload.\n     * @param startIndex - The index to start at.\n     * @param amount - The number to upload.\n     */\n    uploadDynamic(children: Sprite[], startIndex: number, amount: number): void\n    {\n        for (let i = 0; i < this.dynamicProperties.length; i++)\n        {\n            const property = this.dynamicProperties[i];\n\n            property.uploadFunction(children, startIndex, amount,\n                property.type === TYPES.UNSIGNED_BYTE ? this.dynamicDataUint32 : this.dynamicData,\n                this.dynamicStride, property.offset);\n        }\n\n        this.dynamicBuffer._updateID++;\n    }\n\n    /**\n     * Uploads the static properties.\n     * @param children - The children to upload.\n     * @param startIndex - The index to start at.\n     * @param amount - The number to upload.\n     */\n    uploadStatic(children: Sprite[], startIndex: number, amount: number): void\n    {\n        for (let i = 0; i < this.staticProperties.length; i++)\n        {\n            const property = this.staticProperties[i];\n\n            property.uploadFunction(children, startIndex, amount,\n                property.type === TYPES.UNSIGNED_BYTE ? this.staticDataUint32 : this.staticData,\n                this.staticStride, property.offset);\n        }\n\n        this.staticBuffer._updateID++;\n    }\n\n    /** Destroys the ParticleBuffer. */\n    destroy(): void\n    {\n        this.indexBuffer = null;\n\n        this.dynamicProperties = null;\n        this.dynamicBuffer = null;\n        this.dynamicData = null;\n        this.dynamicDataUint32 = null;\n\n        this.staticProperties = null;\n        this.staticBuffer = null;\n        this.staticData = null;\n        this.staticDataUint32 = null;\n        // all buffers are destroyed inside geometry\n        this.geometry.destroy();\n    }\n}\n"],"names":[],"mappings":"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"}