1 |
- {"ast":null,"code":"import { ThinParticleSystem } from \"./thinParticleSystem.js\";\nimport { SubEmitter } from \"./subEmitter.js\";\nimport { Color3, Color4 } from \"../Maths/math.color.js\";\nimport { Vector3 } from \"../Maths/math.vector.js\";\nimport { AbstractEngine } from \"../Engines/abstractEngine.js\";\nimport { GetClass } from \"../Misc/typeStore.js\";\nimport { SerializationHelper } from \"../Misc/decorators.serialization.js\";\nimport { MeshParticleEmitter } from \"./EmitterTypes/meshParticleEmitter.js\";\nimport { CustomParticleEmitter } from \"./EmitterTypes/customParticleEmitter.js\";\nimport { BoxParticleEmitter } from \"./EmitterTypes/boxParticleEmitter.js\";\nimport { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter.js\";\nimport { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter.js\";\nimport { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter.js\";\nimport { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter.js\";\nimport { ConeDirectedParticleEmitter, ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter.js\";\nimport { CreateConeEmitter, CreateCylinderEmitter, CreateDirectedCylinderEmitter, CreateDirectedSphereEmitter, CreateDirectedConeEmitter, CreateHemisphericEmitter, CreatePointEmitter, CreateSphereEmitter } from \"./particleSystem.functions.js\";\n/**\n * This represents a particle system in Babylon.\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\n * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\n */\nexport class ParticleSystem extends ThinParticleSystem {\n constructor() {\n super(...arguments);\n /**\n * @internal\n * If the particle systems emitter should be disposed when the particle system is disposed\n */\n this._disposeEmitterOnDispose = false;\n this._emitFromParticle = particle => {\n if (!this._subEmitters || this._subEmitters.length === 0) {\n return;\n }\n const templateIndex = Math.floor(Math.random() * this._subEmitters.length);\n this._subEmitters[templateIndex].forEach(subEmitter => {\n if (subEmitter.type === 1 /* SubEmitterType.END */) {\n const subSystem = subEmitter.clone();\n particle._inheritParticleInfoToSubEmitter(subSystem);\n subSystem.particleSystem._rootParticleSystem = this;\n this.activeSubSystems.push(subSystem.particleSystem);\n subSystem.particleSystem.start();\n }\n });\n };\n }\n /**\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\n * @returns the emitter\n */\n createPointEmitter(direction1, direction2) {\n const particleEmitter = CreatePointEmitter(direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\n * @param radius The radius of the hemisphere to emit from\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\n * @returns the emitter\n */\n createHemisphericEmitter(radius = 1, radiusRange = 1) {\n const particleEmitter = CreateHemisphericEmitter(radius, radiusRange);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\n * @param radius The radius of the sphere to emit from\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\n * @returns the emitter\n */\n createSphereEmitter(radius = 1, radiusRange = 1) {\n const particleEmitter = CreateSphereEmitter(radius, radiusRange);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\n * @param radius The radius of the sphere to emit from\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\n * @returns the emitter\n */\n createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedSphereEmitter(radius, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\n * @param radius The radius of the emission cylinder\n * @param height The height of the emission cylinder\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\n * @param directionRandomizer How much to randomize the particle direction [0-1]\n * @returns the emitter\n */\n createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0) {\n const particleEmitter = CreateCylinderEmitter(radius, height, radiusRange, directionRandomizer);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\n * @param radius The radius of the cylinder to emit from\n * @param height The height of the emission cylinder\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\n * @returns the emitter\n */\n createDirectedCylinderEmitter(radius = 1, height = 1, radiusRange = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedCylinderEmitter(radius, height, radiusRange, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\n * @param radius The radius of the cone to emit from\n * @param angle The base angle of the cone\n * @returns the emitter\n */\n createConeEmitter(radius = 1, angle = Math.PI / 4) {\n const particleEmitter = CreateConeEmitter(radius, angle);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n createDirectedConeEmitter(radius = 1, angle = Math.PI / 4, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedConeEmitter(radius, angle, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\n * @returns the emitter\n */\n createBoxEmitter(direction1, direction2, minEmitBox, maxEmitBox) {\n const particleEmitter = new BoxParticleEmitter();\n this.particleEmitterType = particleEmitter;\n this.direction1 = direction1;\n this.direction2 = direction2;\n this.minEmitBox = minEmitBox;\n this.maxEmitBox = maxEmitBox;\n return particleEmitter;\n }\n _prepareSubEmitterInternalArray() {\n this._subEmitters = new Array();\n if (this.subEmitters) {\n this.subEmitters.forEach(subEmitter => {\n if (subEmitter instanceof ParticleSystem) {\n this._subEmitters.push([new SubEmitter(subEmitter)]);\n } else if (subEmitter instanceof SubEmitter) {\n this._subEmitters.push([subEmitter]);\n } else if (subEmitter instanceof Array) {\n this._subEmitters.push(subEmitter);\n }\n });\n }\n }\n _stopSubEmitters() {\n if (!this.activeSubSystems) {\n return;\n }\n this.activeSubSystems.forEach(subSystem => {\n subSystem.stop(true);\n });\n this.activeSubSystems = [];\n }\n _removeFromRoot() {\n if (!this._rootParticleSystem) {\n return;\n }\n const index = this._rootParticleSystem.activeSubSystems.indexOf(this);\n if (index !== -1) {\n this._rootParticleSystem.activeSubSystems.splice(index, 1);\n }\n this._rootParticleSystem = null;\n }\n _preStart() {\n // Convert the subEmitters field to the constant type field _subEmitters\n this._prepareSubEmitterInternalArray();\n if (this._subEmitters && this._subEmitters.length != 0) {\n this.activeSubSystems = [];\n }\n }\n _postStop(stopSubEmitters) {\n if (stopSubEmitters) {\n this._stopSubEmitters();\n }\n }\n _prepareParticle(particle) {\n // Attach emitters\n if (this._subEmitters && this._subEmitters.length > 0) {\n const subEmitters = this._subEmitters[Math.floor(Math.random() * this._subEmitters.length)];\n particle._attachedSubEmitters = [];\n subEmitters.forEach(subEmitter => {\n if (subEmitter.type === 0 /* SubEmitterType.ATTACHED */) {\n const newEmitter = subEmitter.clone();\n particle._attachedSubEmitters.push(newEmitter);\n newEmitter.particleSystem.start();\n }\n });\n }\n }\n /** @internal */\n _onDispose(disposeAttachedSubEmitters = false, disposeEndSubEmitters = false) {\n this._removeFromRoot();\n if (this.subEmitters && !this._subEmitters) {\n this._prepareSubEmitterInternalArray();\n }\n if (disposeAttachedSubEmitters) {\n var _this$particles;\n (_this$particles = this.particles) === null || _this$particles === void 0 || _this$particles.forEach(particle => {\n if (particle._attachedSubEmitters) {\n for (let i = particle._attachedSubEmitters.length - 1; i >= 0; i -= 1) {\n particle._attachedSubEmitters[i].dispose();\n }\n }\n });\n }\n if (disposeEndSubEmitters) {\n if (this.activeSubSystems) {\n for (let i = this.activeSubSystems.length - 1; i >= 0; i -= 1) {\n this.activeSubSystems[i].dispose();\n }\n }\n }\n if (this._subEmitters && this._subEmitters.length) {\n for (let index = 0; index < this._subEmitters.length; index++) {\n for (const subEmitter of this._subEmitters[index]) {\n subEmitter.dispose();\n }\n }\n this._subEmitters = [];\n this.subEmitters = [];\n }\n if (this._disposeEmitterOnDispose && this.emitter && this.emitter.dispose) {\n this.emitter.dispose(true);\n }\n }\n /**\n * @internal\n */\n static _Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl) {\n var _parsedParticleSystem, _parsedParticleSystem2, _parsedParticleSystem3;\n let scene;\n if (sceneOrEngine instanceof AbstractEngine) {\n scene = null;\n } else {\n scene = sceneOrEngine;\n }\n const internalClass = GetClass(\"BABYLON.Texture\");\n if (internalClass && scene) {\n // Texture\n if (parsedParticleSystem.texture) {\n particleSystem.particleTexture = internalClass.Parse(parsedParticleSystem.texture, scene, rootUrl);\n } else if (parsedParticleSystem.textureName) {\n particleSystem.particleTexture = new internalClass(rootUrl + parsedParticleSystem.textureName, scene, false, parsedParticleSystem.invertY !== undefined ? parsedParticleSystem.invertY : true);\n particleSystem.particleTexture.name = parsedParticleSystem.textureName;\n }\n }\n // Emitter\n if (!parsedParticleSystem.emitterId && parsedParticleSystem.emitterId !== 0 && parsedParticleSystem.emitter === undefined) {\n particleSystem.emitter = Vector3.Zero();\n } else if (parsedParticleSystem.emitterId && scene) {\n particleSystem.emitter = scene.getLastMeshById(parsedParticleSystem.emitterId);\n } else {\n particleSystem.emitter = Vector3.FromArray(parsedParticleSystem.emitter);\n }\n particleSystem.isLocal = !!parsedParticleSystem.isLocal;\n // Misc.\n if (parsedParticleSystem.renderingGroupId !== undefined) {\n particleSystem.renderingGroupId = parsedParticleSystem.renderingGroupId;\n }\n if (parsedParticleSystem.isBillboardBased !== undefined) {\n particleSystem.isBillboardBased = parsedParticleSystem.isBillboardBased;\n }\n if (parsedParticleSystem.billboardMode !== undefined) {\n particleSystem.billboardMode = parsedParticleSystem.billboardMode;\n }\n if (parsedParticleSystem.useLogarithmicDepth !== undefined) {\n particleSystem.useLogarithmicDepth = parsedParticleSystem.useLogarithmicDepth;\n }\n // Animations\n if (parsedParticleSystem.animations) {\n for (let animationIndex = 0; animationIndex < parsedParticleSystem.animations.length; animationIndex++) {\n const parsedAnimation = parsedParticleSystem.animations[animationIndex];\n const internalClass = GetClass(\"BABYLON.Animation\");\n if (internalClass) {\n particleSystem.animations.push(internalClass.Parse(parsedAnimation));\n }\n }\n particleSystem.beginAnimationOnStart = parsedParticleSystem.beginAnimationOnStart;\n particleSystem.beginAnimationFrom = parsedParticleSystem.beginAnimationFrom;\n particleSystem.beginAnimationTo = parsedParticleSystem.beginAnimationTo;\n particleSystem.beginAnimationLoop = parsedParticleSystem.beginAnimationLoop;\n }\n if (parsedParticleSystem.autoAnimate && scene) {\n scene.beginAnimation(particleSystem, parsedParticleSystem.autoAnimateFrom, parsedParticleSystem.autoAnimateTo, parsedParticleSystem.autoAnimateLoop, parsedParticleSystem.autoAnimateSpeed || 1.0);\n }\n // Particle system\n particleSystem.startDelay = parsedParticleSystem.startDelay | 0;\n particleSystem.minAngularSpeed = parsedParticleSystem.minAngularSpeed;\n particleSystem.maxAngularSpeed = parsedParticleSystem.maxAngularSpeed;\n particleSystem.minSize = parsedParticleSystem.minSize;\n particleSystem.maxSize = parsedParticleSystem.maxSize;\n if (parsedParticleSystem.minScaleX) {\n particleSystem.minScaleX = parsedParticleSystem.minScaleX;\n particleSystem.maxScaleX = parsedParticleSystem.maxScaleX;\n particleSystem.minScaleY = parsedParticleSystem.minScaleY;\n particleSystem.maxScaleY = parsedParticleSystem.maxScaleY;\n }\n if (parsedParticleSystem.preWarmCycles !== undefined) {\n particleSystem.preWarmCycles = parsedParticleSystem.preWarmCycles;\n particleSystem.preWarmStepOffset = parsedParticleSystem.preWarmStepOffset;\n }\n if (parsedParticleSystem.minInitialRotation !== undefined) {\n particleSystem.minInitialRotation = parsedParticleSystem.minInitialRotation;\n particleSystem.maxInitialRotation = parsedParticleSystem.maxInitialRotation;\n }\n particleSystem.minLifeTime = parsedParticleSystem.minLifeTime;\n particleSystem.maxLifeTime = parsedParticleSystem.maxLifeTime;\n particleSystem.minEmitPower = parsedParticleSystem.minEmitPower;\n particleSystem.maxEmitPower = parsedParticleSystem.maxEmitPower;\n particleSystem.emitRate = parsedParticleSystem.emitRate;\n particleSystem.gravity = Vector3.FromArray(parsedParticleSystem.gravity);\n if (parsedParticleSystem.noiseStrength) {\n particleSystem.noiseStrength = Vector3.FromArray(parsedParticleSystem.noiseStrength);\n }\n particleSystem.color1 = Color4.FromArray(parsedParticleSystem.color1);\n particleSystem.color2 = Color4.FromArray(parsedParticleSystem.color2);\n particleSystem.colorDead = Color4.FromArray(parsedParticleSystem.colorDead);\n particleSystem.updateSpeed = parsedParticleSystem.updateSpeed;\n particleSystem.targetStopDuration = parsedParticleSystem.targetStopDuration;\n particleSystem.blendMode = parsedParticleSystem.blendMode;\n if (parsedParticleSystem.colorGradients) {\n for (const colorGradient of parsedParticleSystem.colorGradients) {\n particleSystem.addColorGradient(colorGradient.gradient, Color4.FromArray(colorGradient.color1), colorGradient.color2 ? Color4.FromArray(colorGradient.color2) : undefined);\n }\n }\n if (parsedParticleSystem.rampGradients) {\n for (const rampGradient of parsedParticleSystem.rampGradients) {\n particleSystem.addRampGradient(rampGradient.gradient, Color3.FromArray(rampGradient.color));\n }\n particleSystem.useRampGradients = parsedParticleSystem.useRampGradients;\n }\n if (parsedParticleSystem.colorRemapGradients) {\n for (const colorRemapGradient of parsedParticleSystem.colorRemapGradients) {\n particleSystem.addColorRemapGradient(colorRemapGradient.gradient, colorRemapGradient.factor1 !== undefined ? colorRemapGradient.factor1 : colorRemapGradient.factor, colorRemapGradient.factor2);\n }\n }\n if (parsedParticleSystem.alphaRemapGradients) {\n for (const alphaRemapGradient of parsedParticleSystem.alphaRemapGradients) {\n particleSystem.addAlphaRemapGradient(alphaRemapGradient.gradient, alphaRemapGradient.factor1 !== undefined ? alphaRemapGradient.factor1 : alphaRemapGradient.factor, alphaRemapGradient.factor2);\n }\n }\n if (parsedParticleSystem.sizeGradients) {\n for (const sizeGradient of parsedParticleSystem.sizeGradients) {\n particleSystem.addSizeGradient(sizeGradient.gradient, sizeGradient.factor1 !== undefined ? sizeGradient.factor1 : sizeGradient.factor, sizeGradient.factor2);\n }\n }\n if (parsedParticleSystem.angularSpeedGradients) {\n for (const angularSpeedGradient of parsedParticleSystem.angularSpeedGradients) {\n particleSystem.addAngularSpeedGradient(angularSpeedGradient.gradient, angularSpeedGradient.factor1 !== undefined ? angularSpeedGradient.factor1 : angularSpeedGradient.factor, angularSpeedGradient.factor2);\n }\n }\n if (parsedParticleSystem.velocityGradients) {\n for (const velocityGradient of parsedParticleSystem.velocityGradients) {\n particleSystem.addVelocityGradient(velocityGradient.gradient, velocityGradient.factor1 !== undefined ? velocityGradient.factor1 : velocityGradient.factor, velocityGradient.factor2);\n }\n }\n if (parsedParticleSystem.dragGradients) {\n for (const dragGradient of parsedParticleSystem.dragGradients) {\n particleSystem.addDragGradient(dragGradient.gradient, dragGradient.factor1 !== undefined ? dragGradient.factor1 : dragGradient.factor, dragGradient.factor2);\n }\n }\n if (parsedParticleSystem.emitRateGradients) {\n for (const emitRateGradient of parsedParticleSystem.emitRateGradients) {\n particleSystem.addEmitRateGradient(emitRateGradient.gradient, emitRateGradient.factor1 !== undefined ? emitRateGradient.factor1 : emitRateGradient.factor, emitRateGradient.factor2);\n }\n }\n if (parsedParticleSystem.startSizeGradients) {\n for (const startSizeGradient of parsedParticleSystem.startSizeGradients) {\n particleSystem.addStartSizeGradient(startSizeGradient.gradient, startSizeGradient.factor1 !== undefined ? startSizeGradient.factor1 : startSizeGradient.factor, startSizeGradient.factor2);\n }\n }\n if (parsedParticleSystem.lifeTimeGradients) {\n for (const lifeTimeGradient of parsedParticleSystem.lifeTimeGradients) {\n particleSystem.addLifeTimeGradient(lifeTimeGradient.gradient, lifeTimeGradient.factor1 !== undefined ? lifeTimeGradient.factor1 : lifeTimeGradient.factor, lifeTimeGradient.factor2);\n }\n }\n if (parsedParticleSystem.limitVelocityGradients) {\n for (const limitVelocityGradient of parsedParticleSystem.limitVelocityGradients) {\n particleSystem.addLimitVelocityGradient(limitVelocityGradient.gradient, limitVelocityGradient.factor1 !== undefined ? limitVelocityGradient.factor1 : limitVelocityGradient.factor, limitVelocityGradient.factor2);\n }\n particleSystem.limitVelocityDamping = parsedParticleSystem.limitVelocityDamping;\n }\n if (parsedParticleSystem.noiseTexture && scene) {\n const internalClass = GetClass(\"BABYLON.ProceduralTexture\");\n particleSystem.noiseTexture = internalClass.Parse(parsedParticleSystem.noiseTexture, scene, rootUrl);\n }\n // Emitter\n let emitterType;\n if (parsedParticleSystem.particleEmitterType) {\n switch (parsedParticleSystem.particleEmitterType.type) {\n case \"SphereParticleEmitter\":\n emitterType = new SphereParticleEmitter();\n break;\n case \"SphereDirectedParticleEmitter\":\n emitterType = new SphereDirectedParticleEmitter();\n break;\n case \"ConeEmitter\":\n case \"ConeParticleEmitter\":\n emitterType = new ConeParticleEmitter();\n break;\n case \"ConeDirectedParticleEmitter\":\n emitterType = new ConeDirectedParticleEmitter();\n break;\n case \"CylinderParticleEmitter\":\n emitterType = new CylinderParticleEmitter();\n break;\n case \"CylinderDirectedParticleEmitter\":\n emitterType = new CylinderDirectedParticleEmitter();\n break;\n case \"HemisphericParticleEmitter\":\n emitterType = new HemisphericParticleEmitter();\n break;\n case \"PointParticleEmitter\":\n emitterType = new PointParticleEmitter();\n break;\n case \"MeshParticleEmitter\":\n emitterType = new MeshParticleEmitter();\n break;\n case \"CustomParticleEmitter\":\n emitterType = new CustomParticleEmitter();\n break;\n case \"BoxEmitter\":\n case \"BoxParticleEmitter\":\n default:\n emitterType = new BoxParticleEmitter();\n break;\n }\n emitterType.parse(parsedParticleSystem.particleEmitterType, scene);\n } else {\n emitterType = new BoxParticleEmitter();\n emitterType.parse(parsedParticleSystem, scene);\n }\n particleSystem.particleEmitterType = emitterType;\n // Animation sheet\n particleSystem.startSpriteCellID = parsedParticleSystem.startSpriteCellID;\n particleSystem.endSpriteCellID = parsedParticleSystem.endSpriteCellID;\n particleSystem.spriteCellLoop = (_parsedParticleSystem = parsedParticleSystem.spriteCellLoop) !== null && _parsedParticleSystem !== void 0 ? _parsedParticleSystem : true;\n particleSystem.spriteCellWidth = parsedParticleSystem.spriteCellWidth;\n particleSystem.spriteCellHeight = parsedParticleSystem.spriteCellHeight;\n particleSystem.spriteCellChangeSpeed = parsedParticleSystem.spriteCellChangeSpeed;\n particleSystem.spriteRandomStartCell = parsedParticleSystem.spriteRandomStartCell;\n particleSystem.disposeOnStop = (_parsedParticleSystem2 = parsedParticleSystem.disposeOnStop) !== null && _parsedParticleSystem2 !== void 0 ? _parsedParticleSystem2 : false;\n particleSystem.manualEmitCount = (_parsedParticleSystem3 = parsedParticleSystem.manualEmitCount) !== null && _parsedParticleSystem3 !== void 0 ? _parsedParticleSystem3 : -1;\n }\n /**\n * Parses a JSON object to create a particle system.\n * @param parsedParticleSystem The JSON object to parse\n * @param sceneOrEngine The scene or the engine to create the particle system in\n * @param rootUrl The root url to use to load external dependencies like texture\n * @param doNotStart Ignore the preventAutoStart attribute and does not start\n * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)\n * @returns the Parsed particle system\n */\n static Parse(parsedParticleSystem, sceneOrEngine, rootUrl, doNotStart = false, capacity) {\n const name = parsedParticleSystem.name;\n let custom = null;\n let program = null;\n let engine;\n let scene;\n if (sceneOrEngine instanceof AbstractEngine) {\n engine = sceneOrEngine;\n } else {\n scene = sceneOrEngine;\n engine = scene.getEngine();\n }\n if (parsedParticleSystem.customShader && engine.createEffectForParticles) {\n program = parsedParticleSystem.customShader;\n const defines = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\n custom = engine.createEffectForParticles(program.shaderPath.fragmentElement, program.shaderOptions.uniforms, program.shaderOptions.samplers, defines);\n }\n const particleSystem = new ParticleSystem(name, capacity || parsedParticleSystem.capacity, sceneOrEngine, custom, parsedParticleSystem.isAnimationSheetEnabled);\n particleSystem.customShader = program;\n particleSystem._rootUrl = rootUrl;\n if (parsedParticleSystem.id) {\n particleSystem.id = parsedParticleSystem.id;\n }\n // SubEmitters\n if (parsedParticleSystem.subEmitters) {\n particleSystem.subEmitters = [];\n for (const cell of parsedParticleSystem.subEmitters) {\n const cellArray = [];\n for (const sub of cell) {\n cellArray.push(SubEmitter.Parse(sub, sceneOrEngine, rootUrl));\n }\n particleSystem.subEmitters.push(cellArray);\n }\n }\n ParticleSystem._Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl);\n if (parsedParticleSystem.textureMask) {\n particleSystem.textureMask = Color4.FromArray(parsedParticleSystem.textureMask);\n }\n if (parsedParticleSystem.worldOffset) {\n particleSystem.worldOffset = Vector3.FromArray(parsedParticleSystem.worldOffset);\n }\n // Auto start\n if (parsedParticleSystem.preventAutoStart) {\n particleSystem.preventAutoStart = parsedParticleSystem.preventAutoStart;\n }\n if (!doNotStart && !particleSystem.preventAutoStart) {\n particleSystem.start();\n }\n return particleSystem;\n }\n /**\n * Serializes the particle system to a JSON object\n * @param serializeTexture defines if the texture must be serialized as well\n * @returns the JSON object\n */\n serialize(serializeTexture = false) {\n const serializationObject = {};\n ParticleSystem._Serialize(serializationObject, this, serializeTexture);\n serializationObject.textureMask = this.textureMask.asArray();\n serializationObject.customShader = this.customShader;\n serializationObject.preventAutoStart = this.preventAutoStart;\n serializationObject.worldOffset = this.worldOffset.asArray();\n // SubEmitters\n if (this.subEmitters) {\n serializationObject.subEmitters = [];\n if (!this._subEmitters) {\n this._prepareSubEmitterInternalArray();\n }\n for (const subs of this._subEmitters) {\n const cell = [];\n for (const sub of subs) {\n cell.push(sub.serialize(serializeTexture));\n }\n serializationObject.subEmitters.push(cell);\n }\n }\n return serializationObject;\n }\n /**\n * @internal\n */\n static _Serialize(serializationObject, particleSystem, serializeTexture) {\n serializationObject.name = particleSystem.name;\n serializationObject.id = particleSystem.id;\n serializationObject.capacity = particleSystem.getCapacity();\n serializationObject.disposeOnStop = particleSystem.disposeOnStop;\n serializationObject.manualEmitCount = particleSystem.manualEmitCount;\n // Emitter\n if (particleSystem.emitter.position) {\n const emitterMesh = particleSystem.emitter;\n serializationObject.emitterId = emitterMesh.id;\n } else {\n const emitterPosition = particleSystem.emitter;\n serializationObject.emitter = emitterPosition.asArray();\n }\n // Emitter\n if (particleSystem.particleEmitterType) {\n serializationObject.particleEmitterType = particleSystem.particleEmitterType.serialize();\n }\n if (particleSystem.particleTexture) {\n if (serializeTexture) {\n serializationObject.texture = particleSystem.particleTexture.serialize();\n } else {\n serializationObject.textureName = particleSystem.particleTexture.name;\n serializationObject.invertY = !!particleSystem.particleTexture._invertY;\n }\n }\n serializationObject.isLocal = particleSystem.isLocal;\n // Animations\n SerializationHelper.AppendSerializedAnimations(particleSystem, serializationObject);\n serializationObject.beginAnimationOnStart = particleSystem.beginAnimationOnStart;\n serializationObject.beginAnimationFrom = particleSystem.beginAnimationFrom;\n serializationObject.beginAnimationTo = particleSystem.beginAnimationTo;\n serializationObject.beginAnimationLoop = particleSystem.beginAnimationLoop;\n // Particle system\n serializationObject.startDelay = particleSystem.startDelay;\n serializationObject.renderingGroupId = particleSystem.renderingGroupId;\n serializationObject.isBillboardBased = particleSystem.isBillboardBased;\n serializationObject.billboardMode = particleSystem.billboardMode;\n serializationObject.minAngularSpeed = particleSystem.minAngularSpeed;\n serializationObject.maxAngularSpeed = particleSystem.maxAngularSpeed;\n serializationObject.minSize = particleSystem.minSize;\n serializationObject.maxSize = particleSystem.maxSize;\n serializationObject.minScaleX = particleSystem.minScaleX;\n serializationObject.maxScaleX = particleSystem.maxScaleX;\n serializationObject.minScaleY = particleSystem.minScaleY;\n serializationObject.maxScaleY = particleSystem.maxScaleY;\n serializationObject.minEmitPower = particleSystem.minEmitPower;\n serializationObject.maxEmitPower = particleSystem.maxEmitPower;\n serializationObject.minLifeTime = particleSystem.minLifeTime;\n serializationObject.maxLifeTime = particleSystem.maxLifeTime;\n serializationObject.emitRate = particleSystem.emitRate;\n serializationObject.gravity = particleSystem.gravity.asArray();\n serializationObject.noiseStrength = particleSystem.noiseStrength.asArray();\n serializationObject.color1 = particleSystem.color1.asArray();\n serializationObject.color2 = particleSystem.color2.asArray();\n serializationObject.colorDead = particleSystem.colorDead.asArray();\n serializationObject.updateSpeed = particleSystem.updateSpeed;\n serializationObject.targetStopDuration = particleSystem.targetStopDuration;\n serializationObject.blendMode = particleSystem.blendMode;\n serializationObject.preWarmCycles = particleSystem.preWarmCycles;\n serializationObject.preWarmStepOffset = particleSystem.preWarmStepOffset;\n serializationObject.minInitialRotation = particleSystem.minInitialRotation;\n serializationObject.maxInitialRotation = particleSystem.maxInitialRotation;\n serializationObject.startSpriteCellID = particleSystem.startSpriteCellID;\n serializationObject.spriteCellLoop = particleSystem.spriteCellLoop;\n serializationObject.endSpriteCellID = particleSystem.endSpriteCellID;\n serializationObject.spriteCellChangeSpeed = particleSystem.spriteCellChangeSpeed;\n serializationObject.spriteCellWidth = particleSystem.spriteCellWidth;\n serializationObject.spriteCellHeight = particleSystem.spriteCellHeight;\n serializationObject.spriteRandomStartCell = particleSystem.spriteRandomStartCell;\n serializationObject.isAnimationSheetEnabled = particleSystem.isAnimationSheetEnabled;\n serializationObject.useLogarithmicDepth = particleSystem.useLogarithmicDepth;\n const colorGradients = particleSystem.getColorGradients();\n if (colorGradients) {\n serializationObject.colorGradients = [];\n for (const colorGradient of colorGradients) {\n const serializedGradient = {\n gradient: colorGradient.gradient,\n color1: colorGradient.color1.asArray()\n };\n if (colorGradient.color2) {\n serializedGradient.color2 = colorGradient.color2.asArray();\n } else {\n serializedGradient.color2 = colorGradient.color1.asArray();\n }\n serializationObject.colorGradients.push(serializedGradient);\n }\n }\n const rampGradients = particleSystem.getRampGradients();\n if (rampGradients) {\n serializationObject.rampGradients = [];\n for (const rampGradient of rampGradients) {\n const serializedGradient = {\n gradient: rampGradient.gradient,\n color: rampGradient.color.asArray()\n };\n serializationObject.rampGradients.push(serializedGradient);\n }\n serializationObject.useRampGradients = particleSystem.useRampGradients;\n }\n const colorRemapGradients = particleSystem.getColorRemapGradients();\n if (colorRemapGradients) {\n serializationObject.colorRemapGradients = [];\n for (const colorRemapGradient of colorRemapGradients) {\n const serializedGradient = {\n gradient: colorRemapGradient.gradient,\n factor1: colorRemapGradient.factor1\n };\n if (colorRemapGradient.factor2 !== undefined) {\n serializedGradient.factor2 = colorRemapGradient.factor2;\n } else {\n serializedGradient.factor2 = colorRemapGradient.factor1;\n }\n serializationObject.colorRemapGradients.push(serializedGradient);\n }\n }\n const alphaRemapGradients = particleSystem.getAlphaRemapGradients();\n if (alphaRemapGradients) {\n serializationObject.alphaRemapGradients = [];\n for (const alphaRemapGradient of alphaRemapGradients) {\n const serializedGradient = {\n gradient: alphaRemapGradient.gradient,\n factor1: alphaRemapGradient.factor1\n };\n if (alphaRemapGradient.factor2 !== undefined) {\n serializedGradient.factor2 = alphaRemapGradient.factor2;\n } else {\n serializedGradient.factor2 = alphaRemapGradient.factor1;\n }\n serializationObject.alphaRemapGradients.push(serializedGradient);\n }\n }\n const sizeGradients = particleSystem.getSizeGradients();\n if (sizeGradients) {\n serializationObject.sizeGradients = [];\n for (const sizeGradient of sizeGradients) {\n const serializedGradient = {\n gradient: sizeGradient.gradient,\n factor1: sizeGradient.factor1\n };\n if (sizeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = sizeGradient.factor2;\n } else {\n serializedGradient.factor2 = sizeGradient.factor1;\n }\n serializationObject.sizeGradients.push(serializedGradient);\n }\n }\n const angularSpeedGradients = particleSystem.getAngularSpeedGradients();\n if (angularSpeedGradients) {\n serializationObject.angularSpeedGradients = [];\n for (const angularSpeedGradient of angularSpeedGradients) {\n const serializedGradient = {\n gradient: angularSpeedGradient.gradient,\n factor1: angularSpeedGradient.factor1\n };\n if (angularSpeedGradient.factor2 !== undefined) {\n serializedGradient.factor2 = angularSpeedGradient.factor2;\n } else {\n serializedGradient.factor2 = angularSpeedGradient.factor1;\n }\n serializationObject.angularSpeedGradients.push(serializedGradient);\n }\n }\n const velocityGradients = particleSystem.getVelocityGradients();\n if (velocityGradients) {\n serializationObject.velocityGradients = [];\n for (const velocityGradient of velocityGradients) {\n const serializedGradient = {\n gradient: velocityGradient.gradient,\n factor1: velocityGradient.factor1\n };\n if (velocityGradient.factor2 !== undefined) {\n serializedGradient.factor2 = velocityGradient.factor2;\n } else {\n serializedGradient.factor2 = velocityGradient.factor1;\n }\n serializationObject.velocityGradients.push(serializedGradient);\n }\n }\n const dragGradients = particleSystem.getDragGradients();\n if (dragGradients) {\n serializationObject.dragGradients = [];\n for (const dragGradient of dragGradients) {\n const serializedGradient = {\n gradient: dragGradient.gradient,\n factor1: dragGradient.factor1\n };\n if (dragGradient.factor2 !== undefined) {\n serializedGradient.factor2 = dragGradient.factor2;\n } else {\n serializedGradient.factor2 = dragGradient.factor1;\n }\n serializationObject.dragGradients.push(serializedGradient);\n }\n }\n const emitRateGradients = particleSystem.getEmitRateGradients();\n if (emitRateGradients) {\n serializationObject.emitRateGradients = [];\n for (const emitRateGradient of emitRateGradients) {\n const serializedGradient = {\n gradient: emitRateGradient.gradient,\n factor1: emitRateGradient.factor1\n };\n if (emitRateGradient.factor2 !== undefined) {\n serializedGradient.factor2 = emitRateGradient.factor2;\n } else {\n serializedGradient.factor2 = emitRateGradient.factor1;\n }\n serializationObject.emitRateGradients.push(serializedGradient);\n }\n }\n const startSizeGradients = particleSystem.getStartSizeGradients();\n if (startSizeGradients) {\n serializationObject.startSizeGradients = [];\n for (const startSizeGradient of startSizeGradients) {\n const serializedGradient = {\n gradient: startSizeGradient.gradient,\n factor1: startSizeGradient.factor1\n };\n if (startSizeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = startSizeGradient.factor2;\n } else {\n serializedGradient.factor2 = startSizeGradient.factor1;\n }\n serializationObject.startSizeGradients.push(serializedGradient);\n }\n }\n const lifeTimeGradients = particleSystem.getLifeTimeGradients();\n if (lifeTimeGradients) {\n serializationObject.lifeTimeGradients = [];\n for (const lifeTimeGradient of lifeTimeGradients) {\n const serializedGradient = {\n gradient: lifeTimeGradient.gradient,\n factor1: lifeTimeGradient.factor1\n };\n if (lifeTimeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = lifeTimeGradient.factor2;\n } else {\n serializedGradient.factor2 = lifeTimeGradient.factor1;\n }\n serializationObject.lifeTimeGradients.push(serializedGradient);\n }\n }\n const limitVelocityGradients = particleSystem.getLimitVelocityGradients();\n if (limitVelocityGradients) {\n serializationObject.limitVelocityGradients = [];\n for (const limitVelocityGradient of limitVelocityGradients) {\n const serializedGradient = {\n gradient: limitVelocityGradient.gradient,\n factor1: limitVelocityGradient.factor1\n };\n if (limitVelocityGradient.factor2 !== undefined) {\n serializedGradient.factor2 = limitVelocityGradient.factor2;\n } else {\n serializedGradient.factor2 = limitVelocityGradient.factor1;\n }\n serializationObject.limitVelocityGradients.push(serializedGradient);\n }\n serializationObject.limitVelocityDamping = particleSystem.limitVelocityDamping;\n }\n if (particleSystem.noiseTexture) {\n serializationObject.noiseTexture = particleSystem.noiseTexture.serialize();\n }\n }\n // Clone\n /**\n * Clones the particle system.\n * @param name The name of the cloned object\n * @param newEmitter The new emitter to use\n * @param cloneTexture Also clone the textures if true\n * @returns the cloned particle system\n */\n clone(name, newEmitter, cloneTexture = false) {\n const custom = {\n ...this._customWrappers\n };\n let program = null;\n const engine = this._engine;\n if (engine.createEffectForParticles) {\n if (this.customShader != null) {\n program = this.customShader;\n const defines = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\n const effect = engine.createEffectForParticles(program.shaderPath.fragmentElement, program.shaderOptions.uniforms, program.shaderOptions.samplers, defines);\n if (!custom[0]) {\n this.setCustomEffect(effect, 0);\n } else {\n custom[0].effect = effect;\n }\n }\n }\n const serialization = this.serialize(cloneTexture);\n const result = ParticleSystem.Parse(serialization, this._scene || this._engine, this._rootUrl);\n result.name = name;\n result.customShader = program;\n result._customWrappers = custom;\n if (newEmitter === undefined) {\n newEmitter = this.emitter;\n }\n if (this.noiseTexture) {\n result.noiseTexture = this.noiseTexture.clone();\n }\n result.emitter = newEmitter;\n if (!this.preventAutoStart) {\n result.start();\n }\n return result;\n }\n}\n/**\n * Billboard mode will only apply to Y axis\n */\nParticleSystem.BILLBOARDMODE_Y = 2;\n/**\n * Billboard mode will apply to all axes\n */\nParticleSystem.BILLBOARDMODE_ALL = 7;\n/**\n * Special billboard mode where the particle will be biilboard to the camera but rotated to align with direction\n */\nParticleSystem.BILLBOARDMODE_STRETCHED = 8;\n/**\n * Special billboard mode where the particle will be billboard to the camera but only around the axis of the direction of particle emission\n */\nParticleSystem.BILLBOARDMODE_STRETCHED_LOCAL = 9;\nSubEmitter._ParseParticleSystem = ParticleSystem.Parse;","map":{"version":3,"names":["ThinParticleSystem","SubEmitter","Color3","Color4","Vector3","AbstractEngine","GetClass","SerializationHelper","MeshParticleEmitter","CustomParticleEmitter","BoxParticleEmitter","PointParticleEmitter","HemisphericParticleEmitter","SphereDirectedParticleEmitter","SphereParticleEmitter","CylinderDirectedParticleEmitter","CylinderParticleEmitter","ConeDirectedParticleEmitter","ConeParticleEmitter","CreateConeEmitter","CreateCylinderEmitter","CreateDirectedCylinderEmitter","CreateDirectedSphereEmitter","CreateDirectedConeEmitter","CreateHemisphericEmitter","CreatePointEmitter","CreateSphereEmitter","ParticleSystem","constructor","arguments","_disposeEmitterOnDispose","_emitFromParticle","particle","_subEmitters","length","templateIndex","Math","floor","random","forEach","subEmitter","type","subSystem","clone","_inheritParticleInfoToSubEmitter","particleSystem","_rootParticleSystem","activeSubSystems","push","start","createPointEmitter","direction1","direction2","particleEmitter","particleEmitterType","createHemisphericEmitter","radius","radiusRange","createSphereEmitter","createDirectedSphereEmitter","createCylinderEmitter","height","directionRandomizer","createDirectedCylinderEmitter","createConeEmitter","angle","PI","createDirectedConeEmitter","createBoxEmitter","minEmitBox","maxEmitBox","_prepareSubEmitterInternalArray","Array","subEmitters","_stopSubEmitters","stop","_removeFromRoot","index","indexOf","splice","_preStart","_postStop","stopSubEmitters","_prepareParticle","_attachedSubEmitters","newEmitter","_onDispose","disposeAttachedSubEmitters","disposeEndSubEmitters","_this$particles","particles","i","dispose","emitter","_Parse","parsedParticleSystem","sceneOrEngine","rootUrl","_parsedParticleSystem","_parsedParticleSystem2","_parsedParticleSystem3","scene","internalClass","texture","particleTexture","Parse","textureName","invertY","undefined","name","emitterId","Zero","getLastMeshById","FromArray","isLocal","renderingGroupId","isBillboardBased","billboardMode","useLogarithmicDepth","animations","animationIndex","parsedAnimation","beginAnimationOnStart","beginAnimationFrom","beginAnimationTo","beginAnimationLoop","autoAnimate","beginAnimation","autoAnimateFrom","autoAnimateTo","autoAnimateLoop","autoAnimateSpeed","startDelay","minAngularSpeed","maxAngularSpeed","minSize","maxSize","minScaleX","maxScaleX","minScaleY","maxScaleY","preWarmCycles","preWarmStepOffset","minInitialRotation","maxInitialRotation","minLifeTime","maxLifeTime","minEmitPower","maxEmitPower","emitRate","gravity","noiseStrength","color1","color2","colorDead","updateSpeed","targetStopDuration","blendMode","colorGradients","colorGradient","addColorGradient","gradient","rampGradients","rampGradient","addRampGradient","color","useRampGradients","colorRemapGradients","colorRemapGradient","addColorRemapGradient","factor1","factor","factor2","alphaRemapGradients","alphaRemapGradient","addAlphaRemapGradient","sizeGradients","sizeGradient","addSizeGradient","angularSpeedGradients","angularSpeedGradient","addAngularSpeedGradient","velocityGradients","velocityGradient","addVelocityGradient","dragGradients","dragGradient","addDragGradient","emitRateGradients","emitRateGradient","addEmitRateGradient","startSizeGradients","startSizeGradient","addStartSizeGradient","lifeTimeGradients","lifeTimeGradient","addLifeTimeGradient","limitVelocityGradients","limitVelocityGradient","addLimitVelocityGradient","limitVelocityDamping","noiseTexture","emitterType","parse","startSpriteCellID","endSpriteCellID","spriteCellLoop","spriteCellWidth","spriteCellHeight","spriteCellChangeSpeed","spriteRandomStartCell","disposeOnStop","manualEmitCount","doNotStart","capacity","custom","program","engine","getEngine","customShader","createEffectForParticles","defines","shaderOptions","join","shaderPath","fragmentElement","uniforms","samplers","isAnimationSheetEnabled","_rootUrl","id","cell","cellArray","sub","textureMask","worldOffset","preventAutoStart","serialize","serializeTexture","serializationObject","_Serialize","asArray","subs","getCapacity","position","emitterMesh","emitterPosition","_invertY","AppendSerializedAnimations","getColorGradients","serializedGradient","getRampGradients","getColorRemapGradients","getAlphaRemapGradients","getSizeGradients","getAngularSpeedGradients","getVelocityGradients","getDragGradients","getEmitRateGradients","getStartSizeGradients","getLifeTimeGradients","getLimitVelocityGradients","cloneTexture","_customWrappers","_engine","effect","setCustomEffect","serialization","result","_scene","BILLBOARDMODE_Y","BILLBOARDMODE_ALL","BILLBOARDMODE_STRETCHED","BILLBOARDMODE_STRETCHED_LOCAL","_ParseParticleSystem"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Particles/particleSystem.js"],"sourcesContent":["import { ThinParticleSystem } from \"./thinParticleSystem.js\";\nimport { SubEmitter } from \"./subEmitter.js\";\nimport { Color3, Color4 } from \"../Maths/math.color.js\";\nimport { Vector3 } from \"../Maths/math.vector.js\";\nimport { AbstractEngine } from \"../Engines/abstractEngine.js\";\nimport { GetClass } from \"../Misc/typeStore.js\";\n\nimport { SerializationHelper } from \"../Misc/decorators.serialization.js\";\nimport { MeshParticleEmitter } from \"./EmitterTypes/meshParticleEmitter.js\";\nimport { CustomParticleEmitter } from \"./EmitterTypes/customParticleEmitter.js\";\nimport { BoxParticleEmitter } from \"./EmitterTypes/boxParticleEmitter.js\";\nimport { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter.js\";\nimport { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter.js\";\nimport { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter.js\";\nimport { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter.js\";\nimport { ConeDirectedParticleEmitter, ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter.js\";\nimport { CreateConeEmitter, CreateCylinderEmitter, CreateDirectedCylinderEmitter, CreateDirectedSphereEmitter, CreateDirectedConeEmitter, CreateHemisphericEmitter, CreatePointEmitter, CreateSphereEmitter, } from \"./particleSystem.functions.js\";\n/**\n * This represents a particle system in Babylon.\n * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.\n * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\n */\nexport class ParticleSystem extends ThinParticleSystem {\n constructor() {\n super(...arguments);\n /**\n * @internal\n * If the particle systems emitter should be disposed when the particle system is disposed\n */\n this._disposeEmitterOnDispose = false;\n this._emitFromParticle = (particle) => {\n if (!this._subEmitters || this._subEmitters.length === 0) {\n return;\n }\n const templateIndex = Math.floor(Math.random() * this._subEmitters.length);\n this._subEmitters[templateIndex].forEach((subEmitter) => {\n if (subEmitter.type === 1 /* SubEmitterType.END */) {\n const subSystem = subEmitter.clone();\n particle._inheritParticleInfoToSubEmitter(subSystem);\n subSystem.particleSystem._rootParticleSystem = this;\n this.activeSubSystems.push(subSystem.particleSystem);\n subSystem.particleSystem.start();\n }\n });\n };\n }\n /**\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\n * @returns the emitter\n */\n createPointEmitter(direction1, direction2) {\n const particleEmitter = CreatePointEmitter(direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\n * @param radius The radius of the hemisphere to emit from\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\n * @returns the emitter\n */\n createHemisphericEmitter(radius = 1, radiusRange = 1) {\n const particleEmitter = CreateHemisphericEmitter(radius, radiusRange);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\n * @param radius The radius of the sphere to emit from\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\n * @returns the emitter\n */\n createSphereEmitter(radius = 1, radiusRange = 1) {\n const particleEmitter = CreateSphereEmitter(radius, radiusRange);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\n * @param radius The radius of the sphere to emit from\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\n * @returns the emitter\n */\n createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedSphereEmitter(radius, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\n * @param radius The radius of the emission cylinder\n * @param height The height of the emission cylinder\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\n * @param directionRandomizer How much to randomize the particle direction [0-1]\n * @returns the emitter\n */\n createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0) {\n const particleEmitter = CreateCylinderEmitter(radius, height, radiusRange, directionRandomizer);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\n * @param radius The radius of the cylinder to emit from\n * @param height The height of the emission cylinder\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\n * @returns the emitter\n */\n createDirectedCylinderEmitter(radius = 1, height = 1, radiusRange = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedCylinderEmitter(radius, height, radiusRange, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\n * @param radius The radius of the cone to emit from\n * @param angle The base angle of the cone\n * @returns the emitter\n */\n createConeEmitter(radius = 1, angle = Math.PI / 4) {\n const particleEmitter = CreateConeEmitter(radius, angle);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n createDirectedConeEmitter(radius = 1, angle = Math.PI / 4, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)) {\n const particleEmitter = CreateDirectedConeEmitter(radius, angle, direction1, direction2);\n this.particleEmitterType = particleEmitter;\n return particleEmitter;\n }\n /**\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\n * @returns the emitter\n */\n createBoxEmitter(direction1, direction2, minEmitBox, maxEmitBox) {\n const particleEmitter = new BoxParticleEmitter();\n this.particleEmitterType = particleEmitter;\n this.direction1 = direction1;\n this.direction2 = direction2;\n this.minEmitBox = minEmitBox;\n this.maxEmitBox = maxEmitBox;\n return particleEmitter;\n }\n _prepareSubEmitterInternalArray() {\n this._subEmitters = new Array();\n if (this.subEmitters) {\n this.subEmitters.forEach((subEmitter) => {\n if (subEmitter instanceof ParticleSystem) {\n this._subEmitters.push([new SubEmitter(subEmitter)]);\n }\n else if (subEmitter instanceof SubEmitter) {\n this._subEmitters.push([subEmitter]);\n }\n else if (subEmitter instanceof Array) {\n this._subEmitters.push(subEmitter);\n }\n });\n }\n }\n _stopSubEmitters() {\n if (!this.activeSubSystems) {\n return;\n }\n this.activeSubSystems.forEach((subSystem) => {\n subSystem.stop(true);\n });\n this.activeSubSystems = [];\n }\n _removeFromRoot() {\n if (!this._rootParticleSystem) {\n return;\n }\n const index = this._rootParticleSystem.activeSubSystems.indexOf(this);\n if (index !== -1) {\n this._rootParticleSystem.activeSubSystems.splice(index, 1);\n }\n this._rootParticleSystem = null;\n }\n _preStart() {\n // Convert the subEmitters field to the constant type field _subEmitters\n this._prepareSubEmitterInternalArray();\n if (this._subEmitters && this._subEmitters.length != 0) {\n this.activeSubSystems = [];\n }\n }\n _postStop(stopSubEmitters) {\n if (stopSubEmitters) {\n this._stopSubEmitters();\n }\n }\n _prepareParticle(particle) {\n // Attach emitters\n if (this._subEmitters && this._subEmitters.length > 0) {\n const subEmitters = this._subEmitters[Math.floor(Math.random() * this._subEmitters.length)];\n particle._attachedSubEmitters = [];\n subEmitters.forEach((subEmitter) => {\n if (subEmitter.type === 0 /* SubEmitterType.ATTACHED */) {\n const newEmitter = subEmitter.clone();\n particle._attachedSubEmitters.push(newEmitter);\n newEmitter.particleSystem.start();\n }\n });\n }\n }\n /** @internal */\n _onDispose(disposeAttachedSubEmitters = false, disposeEndSubEmitters = false) {\n this._removeFromRoot();\n if (this.subEmitters && !this._subEmitters) {\n this._prepareSubEmitterInternalArray();\n }\n if (disposeAttachedSubEmitters) {\n this.particles?.forEach((particle) => {\n if (particle._attachedSubEmitters) {\n for (let i = particle._attachedSubEmitters.length - 1; i >= 0; i -= 1) {\n particle._attachedSubEmitters[i].dispose();\n }\n }\n });\n }\n if (disposeEndSubEmitters) {\n if (this.activeSubSystems) {\n for (let i = this.activeSubSystems.length - 1; i >= 0; i -= 1) {\n this.activeSubSystems[i].dispose();\n }\n }\n }\n if (this._subEmitters && this._subEmitters.length) {\n for (let index = 0; index < this._subEmitters.length; index++) {\n for (const subEmitter of this._subEmitters[index]) {\n subEmitter.dispose();\n }\n }\n this._subEmitters = [];\n this.subEmitters = [];\n }\n if (this._disposeEmitterOnDispose && this.emitter && this.emitter.dispose) {\n this.emitter.dispose(true);\n }\n }\n /**\n * @internal\n */\n static _Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl) {\n let scene;\n if (sceneOrEngine instanceof AbstractEngine) {\n scene = null;\n }\n else {\n scene = sceneOrEngine;\n }\n const internalClass = GetClass(\"BABYLON.Texture\");\n if (internalClass && scene) {\n // Texture\n if (parsedParticleSystem.texture) {\n particleSystem.particleTexture = internalClass.Parse(parsedParticleSystem.texture, scene, rootUrl);\n }\n else if (parsedParticleSystem.textureName) {\n particleSystem.particleTexture = new internalClass(rootUrl + parsedParticleSystem.textureName, scene, false, parsedParticleSystem.invertY !== undefined ? parsedParticleSystem.invertY : true);\n particleSystem.particleTexture.name = parsedParticleSystem.textureName;\n }\n }\n // Emitter\n if (!parsedParticleSystem.emitterId && parsedParticleSystem.emitterId !== 0 && parsedParticleSystem.emitter === undefined) {\n particleSystem.emitter = Vector3.Zero();\n }\n else if (parsedParticleSystem.emitterId && scene) {\n particleSystem.emitter = scene.getLastMeshById(parsedParticleSystem.emitterId);\n }\n else {\n particleSystem.emitter = Vector3.FromArray(parsedParticleSystem.emitter);\n }\n particleSystem.isLocal = !!parsedParticleSystem.isLocal;\n // Misc.\n if (parsedParticleSystem.renderingGroupId !== undefined) {\n particleSystem.renderingGroupId = parsedParticleSystem.renderingGroupId;\n }\n if (parsedParticleSystem.isBillboardBased !== undefined) {\n particleSystem.isBillboardBased = parsedParticleSystem.isBillboardBased;\n }\n if (parsedParticleSystem.billboardMode !== undefined) {\n particleSystem.billboardMode = parsedParticleSystem.billboardMode;\n }\n if (parsedParticleSystem.useLogarithmicDepth !== undefined) {\n particleSystem.useLogarithmicDepth = parsedParticleSystem.useLogarithmicDepth;\n }\n // Animations\n if (parsedParticleSystem.animations) {\n for (let animationIndex = 0; animationIndex < parsedParticleSystem.animations.length; animationIndex++) {\n const parsedAnimation = parsedParticleSystem.animations[animationIndex];\n const internalClass = GetClass(\"BABYLON.Animation\");\n if (internalClass) {\n particleSystem.animations.push(internalClass.Parse(parsedAnimation));\n }\n }\n particleSystem.beginAnimationOnStart = parsedParticleSystem.beginAnimationOnStart;\n particleSystem.beginAnimationFrom = parsedParticleSystem.beginAnimationFrom;\n particleSystem.beginAnimationTo = parsedParticleSystem.beginAnimationTo;\n particleSystem.beginAnimationLoop = parsedParticleSystem.beginAnimationLoop;\n }\n if (parsedParticleSystem.autoAnimate && scene) {\n scene.beginAnimation(particleSystem, parsedParticleSystem.autoAnimateFrom, parsedParticleSystem.autoAnimateTo, parsedParticleSystem.autoAnimateLoop, parsedParticleSystem.autoAnimateSpeed || 1.0);\n }\n // Particle system\n particleSystem.startDelay = parsedParticleSystem.startDelay | 0;\n particleSystem.minAngularSpeed = parsedParticleSystem.minAngularSpeed;\n particleSystem.maxAngularSpeed = parsedParticleSystem.maxAngularSpeed;\n particleSystem.minSize = parsedParticleSystem.minSize;\n particleSystem.maxSize = parsedParticleSystem.maxSize;\n if (parsedParticleSystem.minScaleX) {\n particleSystem.minScaleX = parsedParticleSystem.minScaleX;\n particleSystem.maxScaleX = parsedParticleSystem.maxScaleX;\n particleSystem.minScaleY = parsedParticleSystem.minScaleY;\n particleSystem.maxScaleY = parsedParticleSystem.maxScaleY;\n }\n if (parsedParticleSystem.preWarmCycles !== undefined) {\n particleSystem.preWarmCycles = parsedParticleSystem.preWarmCycles;\n particleSystem.preWarmStepOffset = parsedParticleSystem.preWarmStepOffset;\n }\n if (parsedParticleSystem.minInitialRotation !== undefined) {\n particleSystem.minInitialRotation = parsedParticleSystem.minInitialRotation;\n particleSystem.maxInitialRotation = parsedParticleSystem.maxInitialRotation;\n }\n particleSystem.minLifeTime = parsedParticleSystem.minLifeTime;\n particleSystem.maxLifeTime = parsedParticleSystem.maxLifeTime;\n particleSystem.minEmitPower = parsedParticleSystem.minEmitPower;\n particleSystem.maxEmitPower = parsedParticleSystem.maxEmitPower;\n particleSystem.emitRate = parsedParticleSystem.emitRate;\n particleSystem.gravity = Vector3.FromArray(parsedParticleSystem.gravity);\n if (parsedParticleSystem.noiseStrength) {\n particleSystem.noiseStrength = Vector3.FromArray(parsedParticleSystem.noiseStrength);\n }\n particleSystem.color1 = Color4.FromArray(parsedParticleSystem.color1);\n particleSystem.color2 = Color4.FromArray(parsedParticleSystem.color2);\n particleSystem.colorDead = Color4.FromArray(parsedParticleSystem.colorDead);\n particleSystem.updateSpeed = parsedParticleSystem.updateSpeed;\n particleSystem.targetStopDuration = parsedParticleSystem.targetStopDuration;\n particleSystem.blendMode = parsedParticleSystem.blendMode;\n if (parsedParticleSystem.colorGradients) {\n for (const colorGradient of parsedParticleSystem.colorGradients) {\n particleSystem.addColorGradient(colorGradient.gradient, Color4.FromArray(colorGradient.color1), colorGradient.color2 ? Color4.FromArray(colorGradient.color2) : undefined);\n }\n }\n if (parsedParticleSystem.rampGradients) {\n for (const rampGradient of parsedParticleSystem.rampGradients) {\n particleSystem.addRampGradient(rampGradient.gradient, Color3.FromArray(rampGradient.color));\n }\n particleSystem.useRampGradients = parsedParticleSystem.useRampGradients;\n }\n if (parsedParticleSystem.colorRemapGradients) {\n for (const colorRemapGradient of parsedParticleSystem.colorRemapGradients) {\n particleSystem.addColorRemapGradient(colorRemapGradient.gradient, colorRemapGradient.factor1 !== undefined ? colorRemapGradient.factor1 : colorRemapGradient.factor, colorRemapGradient.factor2);\n }\n }\n if (parsedParticleSystem.alphaRemapGradients) {\n for (const alphaRemapGradient of parsedParticleSystem.alphaRemapGradients) {\n particleSystem.addAlphaRemapGradient(alphaRemapGradient.gradient, alphaRemapGradient.factor1 !== undefined ? alphaRemapGradient.factor1 : alphaRemapGradient.factor, alphaRemapGradient.factor2);\n }\n }\n if (parsedParticleSystem.sizeGradients) {\n for (const sizeGradient of parsedParticleSystem.sizeGradients) {\n particleSystem.addSizeGradient(sizeGradient.gradient, sizeGradient.factor1 !== undefined ? sizeGradient.factor1 : sizeGradient.factor, sizeGradient.factor2);\n }\n }\n if (parsedParticleSystem.angularSpeedGradients) {\n for (const angularSpeedGradient of parsedParticleSystem.angularSpeedGradients) {\n particleSystem.addAngularSpeedGradient(angularSpeedGradient.gradient, angularSpeedGradient.factor1 !== undefined ? angularSpeedGradient.factor1 : angularSpeedGradient.factor, angularSpeedGradient.factor2);\n }\n }\n if (parsedParticleSystem.velocityGradients) {\n for (const velocityGradient of parsedParticleSystem.velocityGradients) {\n particleSystem.addVelocityGradient(velocityGradient.gradient, velocityGradient.factor1 !== undefined ? velocityGradient.factor1 : velocityGradient.factor, velocityGradient.factor2);\n }\n }\n if (parsedParticleSystem.dragGradients) {\n for (const dragGradient of parsedParticleSystem.dragGradients) {\n particleSystem.addDragGradient(dragGradient.gradient, dragGradient.factor1 !== undefined ? dragGradient.factor1 : dragGradient.factor, dragGradient.factor2);\n }\n }\n if (parsedParticleSystem.emitRateGradients) {\n for (const emitRateGradient of parsedParticleSystem.emitRateGradients) {\n particleSystem.addEmitRateGradient(emitRateGradient.gradient, emitRateGradient.factor1 !== undefined ? emitRateGradient.factor1 : emitRateGradient.factor, emitRateGradient.factor2);\n }\n }\n if (parsedParticleSystem.startSizeGradients) {\n for (const startSizeGradient of parsedParticleSystem.startSizeGradients) {\n particleSystem.addStartSizeGradient(startSizeGradient.gradient, startSizeGradient.factor1 !== undefined ? startSizeGradient.factor1 : startSizeGradient.factor, startSizeGradient.factor2);\n }\n }\n if (parsedParticleSystem.lifeTimeGradients) {\n for (const lifeTimeGradient of parsedParticleSystem.lifeTimeGradients) {\n particleSystem.addLifeTimeGradient(lifeTimeGradient.gradient, lifeTimeGradient.factor1 !== undefined ? lifeTimeGradient.factor1 : lifeTimeGradient.factor, lifeTimeGradient.factor2);\n }\n }\n if (parsedParticleSystem.limitVelocityGradients) {\n for (const limitVelocityGradient of parsedParticleSystem.limitVelocityGradients) {\n particleSystem.addLimitVelocityGradient(limitVelocityGradient.gradient, limitVelocityGradient.factor1 !== undefined ? limitVelocityGradient.factor1 : limitVelocityGradient.factor, limitVelocityGradient.factor2);\n }\n particleSystem.limitVelocityDamping = parsedParticleSystem.limitVelocityDamping;\n }\n if (parsedParticleSystem.noiseTexture && scene) {\n const internalClass = GetClass(\"BABYLON.ProceduralTexture\");\n particleSystem.noiseTexture = internalClass.Parse(parsedParticleSystem.noiseTexture, scene, rootUrl);\n }\n // Emitter\n let emitterType;\n if (parsedParticleSystem.particleEmitterType) {\n switch (parsedParticleSystem.particleEmitterType.type) {\n case \"SphereParticleEmitter\":\n emitterType = new SphereParticleEmitter();\n break;\n case \"SphereDirectedParticleEmitter\":\n emitterType = new SphereDirectedParticleEmitter();\n break;\n case \"ConeEmitter\":\n case \"ConeParticleEmitter\":\n emitterType = new ConeParticleEmitter();\n break;\n case \"ConeDirectedParticleEmitter\":\n emitterType = new ConeDirectedParticleEmitter();\n break;\n case \"CylinderParticleEmitter\":\n emitterType = new CylinderParticleEmitter();\n break;\n case \"CylinderDirectedParticleEmitter\":\n emitterType = new CylinderDirectedParticleEmitter();\n break;\n case \"HemisphericParticleEmitter\":\n emitterType = new HemisphericParticleEmitter();\n break;\n case \"PointParticleEmitter\":\n emitterType = new PointParticleEmitter();\n break;\n case \"MeshParticleEmitter\":\n emitterType = new MeshParticleEmitter();\n break;\n case \"CustomParticleEmitter\":\n emitterType = new CustomParticleEmitter();\n break;\n case \"BoxEmitter\":\n case \"BoxParticleEmitter\":\n default:\n emitterType = new BoxParticleEmitter();\n break;\n }\n emitterType.parse(parsedParticleSystem.particleEmitterType, scene);\n }\n else {\n emitterType = new BoxParticleEmitter();\n emitterType.parse(parsedParticleSystem, scene);\n }\n particleSystem.particleEmitterType = emitterType;\n // Animation sheet\n particleSystem.startSpriteCellID = parsedParticleSystem.startSpriteCellID;\n particleSystem.endSpriteCellID = parsedParticleSystem.endSpriteCellID;\n particleSystem.spriteCellLoop = parsedParticleSystem.spriteCellLoop ?? true;\n particleSystem.spriteCellWidth = parsedParticleSystem.spriteCellWidth;\n particleSystem.spriteCellHeight = parsedParticleSystem.spriteCellHeight;\n particleSystem.spriteCellChangeSpeed = parsedParticleSystem.spriteCellChangeSpeed;\n particleSystem.spriteRandomStartCell = parsedParticleSystem.spriteRandomStartCell;\n particleSystem.disposeOnStop = parsedParticleSystem.disposeOnStop ?? false;\n particleSystem.manualEmitCount = parsedParticleSystem.manualEmitCount ?? -1;\n }\n /**\n * Parses a JSON object to create a particle system.\n * @param parsedParticleSystem The JSON object to parse\n * @param sceneOrEngine The scene or the engine to create the particle system in\n * @param rootUrl The root url to use to load external dependencies like texture\n * @param doNotStart Ignore the preventAutoStart attribute and does not start\n * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)\n * @returns the Parsed particle system\n */\n static Parse(parsedParticleSystem, sceneOrEngine, rootUrl, doNotStart = false, capacity) {\n const name = parsedParticleSystem.name;\n let custom = null;\n let program = null;\n let engine;\n let scene;\n if (sceneOrEngine instanceof AbstractEngine) {\n engine = sceneOrEngine;\n }\n else {\n scene = sceneOrEngine;\n engine = scene.getEngine();\n }\n if (parsedParticleSystem.customShader && engine.createEffectForParticles) {\n program = parsedParticleSystem.customShader;\n const defines = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\n custom = engine.createEffectForParticles(program.shaderPath.fragmentElement, program.shaderOptions.uniforms, program.shaderOptions.samplers, defines);\n }\n const particleSystem = new ParticleSystem(name, capacity || parsedParticleSystem.capacity, sceneOrEngine, custom, parsedParticleSystem.isAnimationSheetEnabled);\n particleSystem.customShader = program;\n particleSystem._rootUrl = rootUrl;\n if (parsedParticleSystem.id) {\n particleSystem.id = parsedParticleSystem.id;\n }\n // SubEmitters\n if (parsedParticleSystem.subEmitters) {\n particleSystem.subEmitters = [];\n for (const cell of parsedParticleSystem.subEmitters) {\n const cellArray = [];\n for (const sub of cell) {\n cellArray.push(SubEmitter.Parse(sub, sceneOrEngine, rootUrl));\n }\n particleSystem.subEmitters.push(cellArray);\n }\n }\n ParticleSystem._Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl);\n if (parsedParticleSystem.textureMask) {\n particleSystem.textureMask = Color4.FromArray(parsedParticleSystem.textureMask);\n }\n if (parsedParticleSystem.worldOffset) {\n particleSystem.worldOffset = Vector3.FromArray(parsedParticleSystem.worldOffset);\n }\n // Auto start\n if (parsedParticleSystem.preventAutoStart) {\n particleSystem.preventAutoStart = parsedParticleSystem.preventAutoStart;\n }\n if (!doNotStart && !particleSystem.preventAutoStart) {\n particleSystem.start();\n }\n return particleSystem;\n }\n /**\n * Serializes the particle system to a JSON object\n * @param serializeTexture defines if the texture must be serialized as well\n * @returns the JSON object\n */\n serialize(serializeTexture = false) {\n const serializationObject = {};\n ParticleSystem._Serialize(serializationObject, this, serializeTexture);\n serializationObject.textureMask = this.textureMask.asArray();\n serializationObject.customShader = this.customShader;\n serializationObject.preventAutoStart = this.preventAutoStart;\n serializationObject.worldOffset = this.worldOffset.asArray();\n // SubEmitters\n if (this.subEmitters) {\n serializationObject.subEmitters = [];\n if (!this._subEmitters) {\n this._prepareSubEmitterInternalArray();\n }\n for (const subs of this._subEmitters) {\n const cell = [];\n for (const sub of subs) {\n cell.push(sub.serialize(serializeTexture));\n }\n serializationObject.subEmitters.push(cell);\n }\n }\n return serializationObject;\n }\n /**\n * @internal\n */\n static _Serialize(serializationObject, particleSystem, serializeTexture) {\n serializationObject.name = particleSystem.name;\n serializationObject.id = particleSystem.id;\n serializationObject.capacity = particleSystem.getCapacity();\n serializationObject.disposeOnStop = particleSystem.disposeOnStop;\n serializationObject.manualEmitCount = particleSystem.manualEmitCount;\n // Emitter\n if (particleSystem.emitter.position) {\n const emitterMesh = particleSystem.emitter;\n serializationObject.emitterId = emitterMesh.id;\n }\n else {\n const emitterPosition = particleSystem.emitter;\n serializationObject.emitter = emitterPosition.asArray();\n }\n // Emitter\n if (particleSystem.particleEmitterType) {\n serializationObject.particleEmitterType = particleSystem.particleEmitterType.serialize();\n }\n if (particleSystem.particleTexture) {\n if (serializeTexture) {\n serializationObject.texture = particleSystem.particleTexture.serialize();\n }\n else {\n serializationObject.textureName = particleSystem.particleTexture.name;\n serializationObject.invertY = !!particleSystem.particleTexture._invertY;\n }\n }\n serializationObject.isLocal = particleSystem.isLocal;\n // Animations\n SerializationHelper.AppendSerializedAnimations(particleSystem, serializationObject);\n serializationObject.beginAnimationOnStart = particleSystem.beginAnimationOnStart;\n serializationObject.beginAnimationFrom = particleSystem.beginAnimationFrom;\n serializationObject.beginAnimationTo = particleSystem.beginAnimationTo;\n serializationObject.beginAnimationLoop = particleSystem.beginAnimationLoop;\n // Particle system\n serializationObject.startDelay = particleSystem.startDelay;\n serializationObject.renderingGroupId = particleSystem.renderingGroupId;\n serializationObject.isBillboardBased = particleSystem.isBillboardBased;\n serializationObject.billboardMode = particleSystem.billboardMode;\n serializationObject.minAngularSpeed = particleSystem.minAngularSpeed;\n serializationObject.maxAngularSpeed = particleSystem.maxAngularSpeed;\n serializationObject.minSize = particleSystem.minSize;\n serializationObject.maxSize = particleSystem.maxSize;\n serializationObject.minScaleX = particleSystem.minScaleX;\n serializationObject.maxScaleX = particleSystem.maxScaleX;\n serializationObject.minScaleY = particleSystem.minScaleY;\n serializationObject.maxScaleY = particleSystem.maxScaleY;\n serializationObject.minEmitPower = particleSystem.minEmitPower;\n serializationObject.maxEmitPower = particleSystem.maxEmitPower;\n serializationObject.minLifeTime = particleSystem.minLifeTime;\n serializationObject.maxLifeTime = particleSystem.maxLifeTime;\n serializationObject.emitRate = particleSystem.emitRate;\n serializationObject.gravity = particleSystem.gravity.asArray();\n serializationObject.noiseStrength = particleSystem.noiseStrength.asArray();\n serializationObject.color1 = particleSystem.color1.asArray();\n serializationObject.color2 = particleSystem.color2.asArray();\n serializationObject.colorDead = particleSystem.colorDead.asArray();\n serializationObject.updateSpeed = particleSystem.updateSpeed;\n serializationObject.targetStopDuration = particleSystem.targetStopDuration;\n serializationObject.blendMode = particleSystem.blendMode;\n serializationObject.preWarmCycles = particleSystem.preWarmCycles;\n serializationObject.preWarmStepOffset = particleSystem.preWarmStepOffset;\n serializationObject.minInitialRotation = particleSystem.minInitialRotation;\n serializationObject.maxInitialRotation = particleSystem.maxInitialRotation;\n serializationObject.startSpriteCellID = particleSystem.startSpriteCellID;\n serializationObject.spriteCellLoop = particleSystem.spriteCellLoop;\n serializationObject.endSpriteCellID = particleSystem.endSpriteCellID;\n serializationObject.spriteCellChangeSpeed = particleSystem.spriteCellChangeSpeed;\n serializationObject.spriteCellWidth = particleSystem.spriteCellWidth;\n serializationObject.spriteCellHeight = particleSystem.spriteCellHeight;\n serializationObject.spriteRandomStartCell = particleSystem.spriteRandomStartCell;\n serializationObject.isAnimationSheetEnabled = particleSystem.isAnimationSheetEnabled;\n serializationObject.useLogarithmicDepth = particleSystem.useLogarithmicDepth;\n const colorGradients = particleSystem.getColorGradients();\n if (colorGradients) {\n serializationObject.colorGradients = [];\n for (const colorGradient of colorGradients) {\n const serializedGradient = {\n gradient: colorGradient.gradient,\n color1: colorGradient.color1.asArray(),\n };\n if (colorGradient.color2) {\n serializedGradient.color2 = colorGradient.color2.asArray();\n }\n else {\n serializedGradient.color2 = colorGradient.color1.asArray();\n }\n serializationObject.colorGradients.push(serializedGradient);\n }\n }\n const rampGradients = particleSystem.getRampGradients();\n if (rampGradients) {\n serializationObject.rampGradients = [];\n for (const rampGradient of rampGradients) {\n const serializedGradient = {\n gradient: rampGradient.gradient,\n color: rampGradient.color.asArray(),\n };\n serializationObject.rampGradients.push(serializedGradient);\n }\n serializationObject.useRampGradients = particleSystem.useRampGradients;\n }\n const colorRemapGradients = particleSystem.getColorRemapGradients();\n if (colorRemapGradients) {\n serializationObject.colorRemapGradients = [];\n for (const colorRemapGradient of colorRemapGradients) {\n const serializedGradient = {\n gradient: colorRemapGradient.gradient,\n factor1: colorRemapGradient.factor1,\n };\n if (colorRemapGradient.factor2 !== undefined) {\n serializedGradient.factor2 = colorRemapGradient.factor2;\n }\n else {\n serializedGradient.factor2 = colorRemapGradient.factor1;\n }\n serializationObject.colorRemapGradients.push(serializedGradient);\n }\n }\n const alphaRemapGradients = particleSystem.getAlphaRemapGradients();\n if (alphaRemapGradients) {\n serializationObject.alphaRemapGradients = [];\n for (const alphaRemapGradient of alphaRemapGradients) {\n const serializedGradient = {\n gradient: alphaRemapGradient.gradient,\n factor1: alphaRemapGradient.factor1,\n };\n if (alphaRemapGradient.factor2 !== undefined) {\n serializedGradient.factor2 = alphaRemapGradient.factor2;\n }\n else {\n serializedGradient.factor2 = alphaRemapGradient.factor1;\n }\n serializationObject.alphaRemapGradients.push(serializedGradient);\n }\n }\n const sizeGradients = particleSystem.getSizeGradients();\n if (sizeGradients) {\n serializationObject.sizeGradients = [];\n for (const sizeGradient of sizeGradients) {\n const serializedGradient = {\n gradient: sizeGradient.gradient,\n factor1: sizeGradient.factor1,\n };\n if (sizeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = sizeGradient.factor2;\n }\n else {\n serializedGradient.factor2 = sizeGradient.factor1;\n }\n serializationObject.sizeGradients.push(serializedGradient);\n }\n }\n const angularSpeedGradients = particleSystem.getAngularSpeedGradients();\n if (angularSpeedGradients) {\n serializationObject.angularSpeedGradients = [];\n for (const angularSpeedGradient of angularSpeedGradients) {\n const serializedGradient = {\n gradient: angularSpeedGradient.gradient,\n factor1: angularSpeedGradient.factor1,\n };\n if (angularSpeedGradient.factor2 !== undefined) {\n serializedGradient.factor2 = angularSpeedGradient.factor2;\n }\n else {\n serializedGradient.factor2 = angularSpeedGradient.factor1;\n }\n serializationObject.angularSpeedGradients.push(serializedGradient);\n }\n }\n const velocityGradients = particleSystem.getVelocityGradients();\n if (velocityGradients) {\n serializationObject.velocityGradients = [];\n for (const velocityGradient of velocityGradients) {\n const serializedGradient = {\n gradient: velocityGradient.gradient,\n factor1: velocityGradient.factor1,\n };\n if (velocityGradient.factor2 !== undefined) {\n serializedGradient.factor2 = velocityGradient.factor2;\n }\n else {\n serializedGradient.factor2 = velocityGradient.factor1;\n }\n serializationObject.velocityGradients.push(serializedGradient);\n }\n }\n const dragGradients = particleSystem.getDragGradients();\n if (dragGradients) {\n serializationObject.dragGradients = [];\n for (const dragGradient of dragGradients) {\n const serializedGradient = {\n gradient: dragGradient.gradient,\n factor1: dragGradient.factor1,\n };\n if (dragGradient.factor2 !== undefined) {\n serializedGradient.factor2 = dragGradient.factor2;\n }\n else {\n serializedGradient.factor2 = dragGradient.factor1;\n }\n serializationObject.dragGradients.push(serializedGradient);\n }\n }\n const emitRateGradients = particleSystem.getEmitRateGradients();\n if (emitRateGradients) {\n serializationObject.emitRateGradients = [];\n for (const emitRateGradient of emitRateGradients) {\n const serializedGradient = {\n gradient: emitRateGradient.gradient,\n factor1: emitRateGradient.factor1,\n };\n if (emitRateGradient.factor2 !== undefined) {\n serializedGradient.factor2 = emitRateGradient.factor2;\n }\n else {\n serializedGradient.factor2 = emitRateGradient.factor1;\n }\n serializationObject.emitRateGradients.push(serializedGradient);\n }\n }\n const startSizeGradients = particleSystem.getStartSizeGradients();\n if (startSizeGradients) {\n serializationObject.startSizeGradients = [];\n for (const startSizeGradient of startSizeGradients) {\n const serializedGradient = {\n gradient: startSizeGradient.gradient,\n factor1: startSizeGradient.factor1,\n };\n if (startSizeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = startSizeGradient.factor2;\n }\n else {\n serializedGradient.factor2 = startSizeGradient.factor1;\n }\n serializationObject.startSizeGradients.push(serializedGradient);\n }\n }\n const lifeTimeGradients = particleSystem.getLifeTimeGradients();\n if (lifeTimeGradients) {\n serializationObject.lifeTimeGradients = [];\n for (const lifeTimeGradient of lifeTimeGradients) {\n const serializedGradient = {\n gradient: lifeTimeGradient.gradient,\n factor1: lifeTimeGradient.factor1,\n };\n if (lifeTimeGradient.factor2 !== undefined) {\n serializedGradient.factor2 = lifeTimeGradient.factor2;\n }\n else {\n serializedGradient.factor2 = lifeTimeGradient.factor1;\n }\n serializationObject.lifeTimeGradients.push(serializedGradient);\n }\n }\n const limitVelocityGradients = particleSystem.getLimitVelocityGradients();\n if (limitVelocityGradients) {\n serializationObject.limitVelocityGradients = [];\n for (const limitVelocityGradient of limitVelocityGradients) {\n const serializedGradient = {\n gradient: limitVelocityGradient.gradient,\n factor1: limitVelocityGradient.factor1,\n };\n if (limitVelocityGradient.factor2 !== undefined) {\n serializedGradient.factor2 = limitVelocityGradient.factor2;\n }\n else {\n serializedGradient.factor2 = limitVelocityGradient.factor1;\n }\n serializationObject.limitVelocityGradients.push(serializedGradient);\n }\n serializationObject.limitVelocityDamping = particleSystem.limitVelocityDamping;\n }\n if (particleSystem.noiseTexture) {\n serializationObject.noiseTexture = particleSystem.noiseTexture.serialize();\n }\n }\n // Clone\n /**\n * Clones the particle system.\n * @param name The name of the cloned object\n * @param newEmitter The new emitter to use\n * @param cloneTexture Also clone the textures if true\n * @returns the cloned particle system\n */\n clone(name, newEmitter, cloneTexture = false) {\n const custom = { ...this._customWrappers };\n let program = null;\n const engine = this._engine;\n if (engine.createEffectForParticles) {\n if (this.customShader != null) {\n program = this.customShader;\n const defines = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\n const effect = engine.createEffectForParticles(program.shaderPath.fragmentElement, program.shaderOptions.uniforms, program.shaderOptions.samplers, defines);\n if (!custom[0]) {\n this.setCustomEffect(effect, 0);\n }\n else {\n custom[0].effect = effect;\n }\n }\n }\n const serialization = this.serialize(cloneTexture);\n const result = ParticleSystem.Parse(serialization, this._scene || this._engine, this._rootUrl);\n result.name = name;\n result.customShader = program;\n result._customWrappers = custom;\n if (newEmitter === undefined) {\n newEmitter = this.emitter;\n }\n if (this.noiseTexture) {\n result.noiseTexture = this.noiseTexture.clone();\n }\n result.emitter = newEmitter;\n if (!this.preventAutoStart) {\n result.start();\n }\n return result;\n }\n}\n/**\n * Billboard mode will only apply to Y axis\n */\nParticleSystem.BILLBOARDMODE_Y = 2;\n/**\n * Billboard mode will apply to all axes\n */\nParticleSystem.BILLBOARDMODE_ALL = 7;\n/**\n * Special billboard mode where the particle will be biilboard to the camera but rotated to align with direction\n */\nParticleSystem.BILLBOARDMODE_STRETCHED = 8;\n/**\n * Special billboard mode where the particle will be billboard to the camera but only around the axis of the direction of particle emission\n */\nParticleSystem.BILLBOARDMODE_STRETCHED_LOCAL = 9;\nSubEmitter._ParseParticleSystem = ParticleSystem.Parse;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|