{"version":3,"file":"ParticleRenderer.mjs","sources":["../src/ParticleRenderer.ts"],"sourcesContent":["import { extensions, ExtensionType, Matrix, ObjectRenderer, Shader, State, TYPES, utils } from 'pixijs/core';\nimport { ParticleBuffer } from './ParticleBuffer';\nimport fragment from './particles.frag';\nimport vertex from './particles.vert';\n\nimport type { ExtensionMetadata, Renderer } from 'pixijs/core';\nimport type { Sprite } from 'pixijs/sprite';\nimport type { ParticleContainer } from './ParticleContainer';\n\nexport interface IParticleRendererProperty\n{\n    attributeName: string;\n    size: number;\n    type?: TYPES;\n    uploadFunction: (...params: any[]) => any;\n    offset: number;\n}\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 they now\n * share 4 bytes on the vertex buffer\n *\n * Heavily inspired by LibGDX's ParticleRenderer:\n * https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/ParticleRenderer.java\n */\n\n/**\n * Renderer for Particles that is designer for speed over feature set.\n * @memberof PIXI\n */\nexport class ParticleRenderer extends ObjectRenderer\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        name: 'particle',\n        type: ExtensionType.RendererPlugin,\n    };\n\n    /** The WebGL state in which this renderer will work. */\n    public readonly state: State;\n\n    /** The default shader that is used if a sprite doesn't have a more specific one. */\n    public shader: Shader;\n    public tempMatrix: Matrix;\n    public properties: IParticleRendererProperty[];\n\n    /**\n     * @param renderer - The renderer this sprite batch works for.\n     */\n    constructor(renderer: Renderer)\n    {\n        super(renderer);\n\n        // 65535 is max vertex index in the index buffer (see ParticleRenderer)\n        // so max number of particles is 65536 / 4 = 16384\n        // and max number of element in the index buffer is 16384 * 6 = 98304\n        // Creating a full index buffer, overhead is 98304 * 2 = 196Ko\n        // let numIndices = 98304;\n\n        this.shader = null;\n\n        this.properties = null;\n\n        this.tempMatrix = new Matrix();\n\n        this.properties = [\n            // verticesData\n            {\n                attributeName: 'aVertexPosition',\n                size: 2,\n                uploadFunction: this.uploadVertices,\n                offset: 0,\n            },\n            // positionData\n            {\n                attributeName: 'aPositionCoord',\n                size: 2,\n                uploadFunction: this.uploadPosition,\n                offset: 0,\n            },\n            // rotationData\n            {\n                attributeName: 'aRotation',\n                size: 1,\n                uploadFunction: this.uploadRotation,\n                offset: 0,\n            },\n            // uvsData\n            {\n                attributeName: 'aTextureCoord',\n                size: 2,\n                uploadFunction: this.uploadUvs,\n                offset: 0,\n            },\n            // tintData\n            {\n                attributeName: 'aColor',\n                size: 1,\n                type: TYPES.UNSIGNED_BYTE,\n                uploadFunction: this.uploadTint,\n                offset: 0,\n            },\n        ];\n\n        this.shader = Shader.from(vertex, fragment, {});\n        this.state = State.for2d();\n    }\n\n    /**\n     * Renders the particle container object.\n     * @param container - The container to render using this ParticleRenderer.\n     */\n    public render(container: ParticleContainer): void\n    {\n        const children = container.children;\n        const maxSize = container._maxSize;\n        const batchSize = container._batchSize;\n        const renderer = this.renderer;\n        let totalChildren = children.length;\n\n        if (totalChildren === 0)\n        {\n            return;\n        }\n        else if (totalChildren > maxSize && !container.autoResize)\n        {\n            totalChildren = maxSize;\n        }\n\n        let buffers = container._buffers;\n\n        if (!buffers)\n        {\n            buffers = container._buffers = this.generateBuffers(container);\n        }\n\n        const baseTexture = children[0]._texture.baseTexture;\n        const premultiplied = baseTexture.alphaMode > 0;\n\n        // if the uvs have not updated then no point rendering just yet!\n        this.state.blendMode = utils.correctBlendMode(container.blendMode, premultiplied);\n        renderer.state.set(this.state);\n\n        const gl = renderer.gl;\n\n        const m = container.worldTransform.copyTo(this.tempMatrix);\n\n        m.prepend(renderer.globalUniforms.uniforms.projectionMatrix);\n\n        this.shader.uniforms.translationMatrix = m.toArray(true);\n\n        this.shader.uniforms.uColor = utils.premultiplyRgba(container.tintRgb,\n            container.worldAlpha, this.shader.uniforms.uColor, premultiplied);\n\n        this.shader.uniforms.uSampler = baseTexture;\n\n        this.renderer.shader.bind(this.shader);\n\n        let updateStatic = false;\n\n        // now lets upload and render the buffers..\n        for (let i = 0, j = 0; i < totalChildren; i += batchSize, j += 1)\n        {\n            let amount = (totalChildren - i);\n\n            if (amount > batchSize)\n            {\n                amount = batchSize;\n            }\n\n            if (j >= buffers.length)\n            {\n                buffers.push(this._generateOneMoreBuffer(container));\n            }\n\n            const buffer = buffers[j];\n\n            // we always upload the dynamic\n            buffer.uploadDynamic(children, i, amount);\n\n            const bid = container._bufferUpdateIDs[j] || 0;\n\n            updateStatic = updateStatic || (buffer._updateID < bid);\n            // we only upload the static content when we have to!\n            if (updateStatic)\n            {\n                buffer._updateID = container._updateID;\n                buffer.uploadStatic(children, i, amount);\n            }\n\n            // bind the buffer\n            renderer.geometry.bind(buffer.geometry);\n            gl.drawElements(gl.TRIANGLES, amount * 6, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n\n    /**\n     * Creates one particle buffer for each child in the container we want to render and updates internal properties.\n     * @param container - The container to render using this ParticleRenderer\n     * @returns - The buffers\n     */\n    private generateBuffers(container: ParticleContainer): ParticleBuffer[]\n    {\n        const buffers = [];\n        const size = container._maxSize;\n        const batchSize = container._batchSize;\n        const dynamicPropertyFlags = container._properties;\n\n        for (let i = 0; i < size; i += batchSize)\n        {\n            buffers.push(new ParticleBuffer(this.properties, dynamicPropertyFlags, batchSize));\n        }\n\n        return buffers;\n    }\n\n    /**\n     * Creates one more particle buffer, because container has autoResize feature.\n     * @param container - The container to render using this ParticleRenderer\n     * @returns - The generated buffer\n     */\n    private _generateOneMoreBuffer(container: ParticleContainer): ParticleBuffer\n    {\n        const batchSize = container._batchSize;\n        const dynamicPropertyFlags = container._properties;\n\n        return new ParticleBuffer(this.properties, dynamicPropertyFlags, batchSize);\n    }\n\n    /**\n     * Uploads the vertices.\n     * @param children - the array of sprites to render\n     * @param startIndex - the index to start from in the children array\n     * @param amount - the amount of children that will have their vertices uploaded\n     * @param array - The vertices to upload.\n     * @param stride - Stride to use for iteration.\n     * @param offset - Offset to start at.\n     */\n    public uploadVertices(\n        children: Sprite[], startIndex: number, amount: number,\n        array: number[], stride: number, offset: number\n    ): void\n    {\n        let w0 = 0;\n        let w1 = 0;\n        let h0 = 0;\n        let h1 = 0;\n\n        for (let i = 0; i < amount; ++i)\n        {\n            const sprite = children[startIndex + i];\n            const texture = sprite._texture;\n            const sx = sprite.scale.x;\n            const sy = sprite.scale.y;\n            const trim = texture.trim;\n            const orig = texture.orig;\n\n            if (trim)\n            {\n                // if the sprite is trimmed and is not a tilingsprite then we need to add the\n                // extra space before transforming the sprite coords..\n                w1 = trim.x - (sprite.anchor.x * orig.width);\n                w0 = w1 + trim.width;\n\n                h1 = trim.y - (sprite.anchor.y * orig.height);\n                h0 = h1 + trim.height;\n            }\n            else\n            {\n                w0 = (orig.width) * (1 - sprite.anchor.x);\n                w1 = (orig.width) * -sprite.anchor.x;\n\n                h0 = orig.height * (1 - sprite.anchor.y);\n                h1 = orig.height * -sprite.anchor.y;\n            }\n\n            array[offset] = w1 * sx;\n            array[offset + 1] = h1 * sy;\n\n            array[offset + stride] = w0 * sx;\n            array[offset + stride + 1] = h1 * sy;\n\n            array[offset + (stride * 2)] = w0 * sx;\n            array[offset + (stride * 2) + 1] = h0 * sy;\n\n            array[offset + (stride * 3)] = w1 * sx;\n            array[offset + (stride * 3) + 1] = h0 * sy;\n\n            offset += stride * 4;\n        }\n    }\n\n    /**\n     * Uploads the position.\n     * @param children - the array of sprites to render\n     * @param startIndex - the index to start from in the children array\n     * @param amount - the amount of children that will have their positions uploaded\n     * @param array - The vertices to upload.\n     * @param stride - Stride to use for iteration.\n     * @param offset - Offset to start at.\n     */\n    public uploadPosition(\n        children: Sprite[], startIndex: number, amount: number,\n        array: number[], stride: number, offset: number\n    ): void\n    {\n        for (let i = 0; i < amount; i++)\n        {\n            const spritePosition = children[startIndex + i].position;\n\n            array[offset] = spritePosition.x;\n            array[offset + 1] = spritePosition.y;\n\n            array[offset + stride] = spritePosition.x;\n            array[offset + stride + 1] = spritePosition.y;\n\n            array[offset + (stride * 2)] = spritePosition.x;\n            array[offset + (stride * 2) + 1] = spritePosition.y;\n\n            array[offset + (stride * 3)] = spritePosition.x;\n            array[offset + (stride * 3) + 1] = spritePosition.y;\n\n            offset += stride * 4;\n        }\n    }\n\n    /**\n     * Uploads the rotation.\n     * @param children - the array of sprites to render\n     * @param startIndex - the index to start from in the children array\n     * @param amount - the amount of children that will have their rotation uploaded\n     * @param array - The vertices to upload.\n     * @param stride - Stride to use for iteration.\n     * @param offset - Offset to start at.\n     */\n    public uploadRotation(\n        children: Sprite[], startIndex: number, amount: number,\n        array: number[], stride: number, offset: number\n    ): void\n    {\n        for (let i = 0; i < amount; i++)\n        {\n            const spriteRotation = children[startIndex + i].rotation;\n\n            array[offset] = spriteRotation;\n            array[offset + stride] = spriteRotation;\n            array[offset + (stride * 2)] = spriteRotation;\n            array[offset + (stride * 3)] = spriteRotation;\n\n            offset += stride * 4;\n        }\n    }\n\n    /**\n     * Uploads the UVs.\n     * @param children - the array of sprites to render\n     * @param startIndex - the index to start from in the children array\n     * @param amount - the amount of children that will have their rotation uploaded\n     * @param array - The vertices to upload.\n     * @param stride - Stride to use for iteration.\n     * @param offset - Offset to start at.\n     */\n    public uploadUvs(\n        children: Sprite[], startIndex: number, amount: number,\n        array: number[], stride: number, offset: number\n    ): void\n    {\n        for (let i = 0; i < amount; ++i)\n        {\n            const textureUvs = children[startIndex + i]._texture._uvs;\n\n            if (textureUvs)\n            {\n                array[offset] = textureUvs.x0;\n                array[offset + 1] = textureUvs.y0;\n\n                array[offset + stride] = textureUvs.x1;\n                array[offset + stride + 1] = textureUvs.y1;\n\n                array[offset + (stride * 2)] = textureUvs.x2;\n                array[offset + (stride * 2) + 1] = textureUvs.y2;\n\n                array[offset + (stride * 3)] = textureUvs.x3;\n                array[offset + (stride * 3) + 1] = textureUvs.y3;\n\n                offset += stride * 4;\n            }\n            else\n            {\n                // TODO you know this can be easier!\n                array[offset] = 0;\n                array[offset + 1] = 0;\n\n                array[offset + stride] = 0;\n                array[offset + stride + 1] = 0;\n\n                array[offset + (stride * 2)] = 0;\n                array[offset + (stride * 2) + 1] = 0;\n\n                array[offset + (stride * 3)] = 0;\n                array[offset + (stride * 3) + 1] = 0;\n\n                offset += stride * 4;\n            }\n        }\n    }\n\n    /**\n     * Uploads the tint.\n     * @param children - the array of sprites to render\n     * @param startIndex - the index to start from in the children array\n     * @param amount - the amount of children that will have their rotation uploaded\n     * @param array - The vertices to upload.\n     * @param stride - Stride to use for iteration.\n     * @param offset - Offset to start at.\n     */\n    public uploadTint(\n        children: Sprite[], startIndex: number, amount: number,\n        array: number[], stride: number, offset: number\n    ): void\n    {\n        for (let i = 0; i < amount; ++i)\n        {\n            const sprite = children[startIndex + i];\n            const premultiplied = sprite._texture.baseTexture.alphaMode > 0;\n            const alpha = sprite.alpha;\n\n            // we dont call extra function if alpha is 1.0, that's faster\n            const argb = alpha < 1.0 && premultiplied\n                ? utils.premultiplyTint(sprite._tintRGB, alpha) : sprite._tintRGB + (alpha * 255 << 24);\n\n            array[offset] = argb;\n            array[offset + stride] = argb;\n            array[offset + (stride * 2)] = argb;\n            array[offset + (stride * 3)] = argb;\n\n            offset += stride * 4;\n        }\n    }\n\n    /** Destroys the ParticleRenderer. */\n    public destroy(): void\n    {\n        super.destroy();\n\n        if (this.shader)\n        {\n            this.shader.destroy();\n            this.shader = null;\n        }\n\n        this.tempMatrix = null;\n    }\n}\n\nextensions.add(ParticleRenderer);\n"],"names":[],"mappings":"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"}