{"version":3,"file":"ParticleContainerPipe.mjs","sources":["../../../../src/scene/particle-container/shared/ParticleContainerPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { Matrix } from '../../../maths/matrix/Matrix';\nimport { UniformGroup } from '../../../rendering/renderers/shared/shader/UniformGroup';\nimport { getAdjustedBlendModeBlend } from '../../../rendering/renderers/shared/state/getAdjustedBlendModeBlend';\nimport { State } from '../../../rendering/renderers/shared/state/State';\nimport { GCManagedHash } from '../../../utils/data/GCManagedHash';\nimport { color32BitToUniform } from '../../graphics/gpu/colorToUniform';\nimport { ParticleBuffer } from './ParticleBuffer';\nimport { ParticleShader } from './shader/ParticleShader';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Shader } from '../../../rendering/renderers/shared/shader/Shader';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { ParticleContainer } from './ParticleContainer';\n\n/** @internal */\nexport interface ParticleContainerAdaptor\n{\n    execute(particleContainerPop: ParticleContainerPipe, container: ParticleContainer): void;\n}\n\n/**\n * Renderer for Particles that is designer for speed over feature set.\n * @category scene\n * @internal\n */\nexport class ParticleContainerPipe implements RenderPipe<ParticleContainer>\n{\n    /** @ignore */\n    public static extension: { type: ExtensionType[]; name: 'particle' } = {\n        type: [\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'particle',\n    } as const;\n\n    /** The default shader that is used if a sprite doesn't have a more specific one. */\n    public defaultShader: Shader;\n\n    /** @internal */\n    public adaptor: ParticleContainerAdaptor;\n    /** @internal */\n    public readonly state = State.for2d();\n    /** @internal */\n    public readonly renderer: Renderer;\n    private readonly _managedContainers: GCManagedHash<ParticleContainer>;\n\n    /** Local uniforms that are used for rendering particles. */\n    public readonly localUniforms = new UniformGroup({\n        uTranslationMatrix: { value: new Matrix(), type: 'mat3x3<f32>' },\n        uColor: { value: new Float32Array(4), type: 'vec4<f32>' },\n        uRound: { value: 1, type: 'f32' },\n        uResolution: { value: [0, 0], type: 'vec2<f32>' },\n    });\n\n    /**\n     * @param renderer - The renderer this sprite batch works for.\n     * @param adaptor\n     */\n    constructor(renderer: Renderer, adaptor: ParticleContainerAdaptor)\n    {\n        this.renderer = renderer;\n\n        this.adaptor = adaptor;\n\n        this.defaultShader = new ParticleShader();\n\n        this.state = State.for2d();\n\n        this._managedContainers = new GCManagedHash({ renderer, type: 'renderable', name: 'particleContainer' });\n    }\n\n    public validateRenderable(_renderable: ParticleContainer): boolean\n    {\n        // always fine :D\n        return false;\n    }\n\n    public addRenderable(renderable: ParticleContainer, instructionSet: InstructionSet)\n    {\n        this.renderer.renderPipes.batch.break(instructionSet);\n        instructionSet.add(renderable);\n    }\n\n    public getBuffers(renderable: ParticleContainer): ParticleBuffer\n    {\n        return renderable._gpuData[this.renderer.uid] || this._initBuffer(renderable);\n    }\n\n    private _initBuffer(renderable: ParticleContainer): ParticleBuffer\n    {\n        renderable._gpuData[this.renderer.uid] = new ParticleBuffer({\n            size: renderable.particleChildren.length,\n            properties: renderable._properties,\n        });\n\n        this._managedContainers.add(renderable);\n\n        return renderable._gpuData[this.renderer.uid];\n    }\n\n    public updateRenderable(_renderable: ParticleContainer)\n    {\n        // nothing to be done here!\n    }\n\n    public execute(container: ParticleContainer): void\n    {\n        const children = container.particleChildren;\n\n        if (children.length === 0)\n        {\n            return;\n        }\n\n        const renderer = this.renderer;\n        const buffer = this.getBuffers(container);\n\n        container.texture ||= children[0].texture;\n\n        const state = this.state;\n\n        buffer.update(children, container._childrenDirty);\n        container._childrenDirty = false;\n\n        state.blendMode = getAdjustedBlendModeBlend(container.blendMode, container.texture._source);\n\n        const uniforms = this.localUniforms.uniforms;\n\n        const transformationMatrix = uniforms.uTranslationMatrix;\n\n        container.worldTransform.copyTo(transformationMatrix);\n\n        // Apply the global offset from filters (e.g., when using filterArea)\n        const globalUniformData = renderer.globalUniforms.globalUniformData;\n\n        transformationMatrix.tx -= globalUniformData.offset.x;\n        transformationMatrix.ty -= globalUniformData.offset.y;\n\n        transformationMatrix.prepend(globalUniformData.projectionMatrix);\n\n        uniforms.uResolution = globalUniformData.resolution;\n        uniforms.uRound = renderer._roundPixels | container._roundPixels;\n\n        color32BitToUniform(\n            container.groupColorAlpha,\n            uniforms.uColor,\n            0\n        );\n\n        this.adaptor.execute(this, container);\n    }\n\n    /** Destroys the ParticleRenderer. */\n    public destroy(): void\n    {\n        this._managedContainers.destroy();\n        (this.renderer as null) = null;\n        if (this.defaultShader)\n        {\n            this.defaultShader.destroy();\n            this.defaultShader = null;\n        }\n    }\n}\n"],"names":[],"mappings":"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"}