@onerjs/core 8.29.2 → 8.29.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +15 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.d.ts +3 -1
- package/FrameGraph/Node/nodeRenderGraph.js +3 -0
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +5 -0
- package/Materials/Textures/baseTexture.js +18 -1
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/texture.js +5 -1
- package/Materials/Textures/texture.js.map +1 -1
- package/Misc/sceneSerializer.js +3 -2
- package/Misc/sceneSerializer.js.map +1 -1
- package/Particles/IParticleSystem.d.ts +4 -6
- package/Particles/IParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +4 -4
- package/Particles/gpuParticleSystem.js +4 -4
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +4 -0
- package/Particles/particleSystem.js +7 -1
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/particleSystemSet.js +3 -1
- package/Particles/particleSystemSet.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +4 -2
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +64 -37
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js +1 -1
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js +6 -7
- package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.vertex.d.ts +0 -8
- package/ShadersWGSL/iblVoxelGrid.vertex.js +33 -22
- package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid3dDebug.fragment.js +1 -2
- package/ShadersWGSL/iblVoxelGrid3dDebug.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/gpuParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Immutable, Nullable, float, DataArray } from \"../types\";\r\nimport type { Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport { FactorGradient, ColorGradient, GradientHelper } from \"../Misc/gradients\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color4, TmpColors } from \"../Maths/math.color\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\n\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { BaseParticleSystem } from \"./baseParticleSystem\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { CustomParticleEmitter } from \"./EmitterTypes/customParticleEmitter\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\r\n\r\nimport { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\nimport \"../Engines/Extensions/engine.transformFeedback\";\r\n\r\nimport \"../Shaders/gpuRenderParticles.fragment\";\r\nimport \"../Shaders/gpuRenderParticles.vertex\";\r\nimport { BindFogParameters, BindLogDepth } from \"../Materials/materialHelper.functions\";\r\nimport type { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter\";\r\nimport type { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter\";\r\nimport type { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter\";\r\nimport type { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter\";\r\nimport type { ConeDirectedParticleEmitter, ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter\";\r\nimport {\r\n CreateConeEmitter,\r\n CreateCylinderEmitter,\r\n CreateDirectedCylinderEmitter,\r\n CreateDirectedSphereEmitter,\r\n CreateDirectedConeEmitter,\r\n CreateHemisphericEmitter,\r\n CreatePointEmitter,\r\n CreateSphereEmitter,\r\n} from \"./particleSystem.functions\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\n\r\n/**\r\n * This represents a GPU particle system in Babylon\r\n * This is the fastest particle system in Babylon as it uses the GPU to update the individual particle data\r\n * @see https://www.babylonjs-playground.com/#PU4WYI#4\r\n */\r\nexport class GPUParticleSystem extends BaseParticleSystem implements IDisposable, IParticleSystem, IAnimatable {\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public override layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * Serialize control\r\n */\r\n public doNotSerialize = false;\r\n\r\n private _capacity: number;\r\n private _maxActiveParticleCount: number;\r\n private _currentActiveCount: number;\r\n private _accumulatedCount = 0;\r\n private _updateBuffer: UniformBufferEffectCommonAccessor;\r\n\r\n private _buffer0: Buffer;\r\n private _buffer1: Buffer;\r\n private _spriteBuffer: Buffer;\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n private _linesIndexBufferUseInstancing: Nullable<DataBuffer>;\r\n\r\n private _targetIndex = 0;\r\n private _sourceBuffer: Buffer;\r\n private _targetBuffer: Buffer;\r\n\r\n private _currentRenderId = -1;\r\n private _currentRenderingCameraUniqueId = -1;\r\n private _started = false;\r\n private _stopped = false;\r\n\r\n private _timeDelta = 0;\r\n\r\n /** @internal */\r\n public _randomTexture: RawTexture;\r\n /** @internal */\r\n public _randomTexture2: RawTexture;\r\n\r\n /** Indicates that the update of particles is done in the animate function (and not in render). Default: false */\r\n public updateInAnimate = false;\r\n\r\n private _attributesStrideSize: number;\r\n private _cachedUpdateDefines: string;\r\n\r\n private _randomTextureSize: number;\r\n private _actualFrame = 0;\r\n private _drawWrappers: { [blendMode: number]: DrawWrapper };\r\n private _customWrappers: { [blendMode: number]: Nullable<DrawWrapper> };\r\n\r\n private readonly _rawTextureWidth = 256;\r\n\r\n private _platform: IGPUParticleSystemPlatform;\r\n private _rebuildingAfterContextLost = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the GPU particles can be rendered on current browser\r\n */\r\n public static get IsSupported(): boolean {\r\n if (!EngineStore.LastCreatedEngine) {\r\n return false;\r\n }\r\n const caps = EngineStore.LastCreatedEngine.getCaps();\r\n\r\n return caps.supportTransformFeedbacks || caps.supportComputeShaders;\r\n }\r\n\r\n /**\r\n * An event triggered when the system is disposed.\r\n */\r\n public onDisposeObservable = new Observable<IParticleSystem>();\r\n /**\r\n * An event triggered when the system is stopped\r\n */\r\n public onStoppedObservable = new Observable<IParticleSystem>();\r\n\r\n /**\r\n * An event triggered when the system is started\r\n */\r\n public onStartedObservable = new Observable<IParticleSystem>();\r\n\r\n private _createIndexBuffer() {\r\n this._linesIndexBufferUseInstancing = this._engine.createIndexBuffer(new Uint32Array([0, 1, 1, 3, 3, 2, 2, 0, 0, 3]), undefined, \"GPUParticleSystemLinesIndexBuffer\");\r\n }\r\n\r\n /**\r\n * Gets the maximum number of particles active at the same time.\r\n * @returns The max number of active particles.\r\n */\r\n public getCapacity(): number {\r\n return this._capacity;\r\n }\r\n\r\n /**\r\n * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls\r\n * to override the particles.\r\n */\r\n public override forceDepthWrite = false;\r\n\r\n /**\r\n * Gets or set the number of active particles\r\n * The value cannot be greater than \"capacity\" (if it is, it will be limited to \"capacity\").\r\n */\r\n public get maxActiveParticleCount(): number {\r\n return this._maxActiveParticleCount;\r\n }\r\n\r\n public set maxActiveParticleCount(value: number) {\r\n this._maxActiveParticleCount = Math.min(value, this._capacity);\r\n }\r\n\r\n /**\r\n * Gets or set the number of active particles\r\n * @deprecated Please use maxActiveParticleCount instead.\r\n */\r\n public get activeParticleCount(): number {\r\n return this.maxActiveParticleCount;\r\n }\r\n\r\n public set activeParticleCount(value: number) {\r\n this.maxActiveParticleCount = value;\r\n }\r\n\r\n private _preWarmDone = false;\r\n\r\n /**\r\n * Specifies if the particles are updated in emitter local space or world space.\r\n */\r\n public isLocal = false;\r\n\r\n /** Indicates that the particle system is GPU based */\r\n public readonly isGPU = true;\r\n\r\n /** Gets or sets a matrix to use to compute projection */\r\n public defaultProjectionMatrix: Matrix;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the particle system\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @returns the emitter\r\n */\r\n public override createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n const particleEmitter = CreatePointEmitter(direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\r\n * @param radius The radius of the hemisphere to emit from\r\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n * @returns the emitter\r\n */\r\n public override createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n const particleEmitter = CreateHemisphericEmitter(radius, radiusRange);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\r\n * @param radius The radius of the sphere to emit from\r\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n * @returns the emitter\r\n */\r\n public override createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n const particleEmitter = CreateSphereEmitter(radius, radiusRange);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the sphere to emit from\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @returns the emitter\r\n */\r\n public override createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedSphereEmitter(radius, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\r\n * @param radius The radius of the emission cylinder\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\r\n * @param directionRandomizer How much to randomize the particle direction [0-1]\r\n * @returns the emitter\r\n */\r\n public override createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n const particleEmitter = CreateCylinderEmitter(radius, height, radiusRange, directionRandomizer);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the cylinder to emit from\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @returns the emitter\r\n */\r\n public override createDirectedCylinderEmitter(\r\n radius = 1,\r\n height = 1,\r\n radiusRange = 1,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): CylinderDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedCylinderEmitter(radius, height, radiusRange, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\r\n * @param radius The radius of the cone to emit from\r\n * @param angle The base angle of the cone\r\n * @returns the emitter\r\n */\r\n public override createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n const particleEmitter = CreateConeEmitter(radius, angle);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n public override createDirectedConeEmitter(\r\n radius = 1,\r\n angle = Math.PI / 4,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): ConeDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedConeEmitter(radius, angle, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @returns the emitter\r\n */\r\n public override createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n const particleEmitter = new BoxParticleEmitter();\r\n this.particleEmitterType = particleEmitter;\r\n this.direction1 = direction1;\r\n this.direction2 = direction2;\r\n this.minEmitBox = minEmitBox;\r\n this.maxEmitBox = maxEmitBox;\r\n return particleEmitter;\r\n }\r\n\r\n /** Flow map */\r\n\r\n /** @internal */\r\n public _flowMap: Nullable<Texture> = null;\r\n\r\n /**\r\n * The strength of the flow map\r\n */\r\n public flowMapStrength = 1.0;\r\n\r\n /** Gets or sets the current flow map */\r\n public get flowMap(): Nullable<Texture> {\r\n return this._flowMap;\r\n }\r\n\r\n public set flowMap(value: Nullable<Texture>) {\r\n if (this._flowMap === value) {\r\n return;\r\n }\r\n\r\n this._flowMap = value;\r\n }\r\n\r\n /**\r\n * Is this system ready to be used/rendered\r\n * @returns true if the system is ready\r\n */\r\n public isReady(): boolean {\r\n if (\r\n !this.emitter ||\r\n (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady()) ||\r\n (this._flowMap && !this._flowMap.isReady()) ||\r\n !this.particleTexture ||\r\n !this.particleTexture.isReady() ||\r\n this._rebuildingAfterContextLost\r\n ) {\r\n return false;\r\n }\r\n\r\n if (this.blendMode !== ParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n if (!this._getWrapper(this.blendMode).effect!.isReady()) {\r\n return false;\r\n }\r\n } else {\r\n if (!this._getWrapper(ParticleSystem.BLENDMODE_MULTIPLY).effect!.isReady()) {\r\n return false;\r\n }\r\n if (!this._getWrapper(ParticleSystem.BLENDMODE_ADD).effect!.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!this._platform.isUpdateBufferCreated()) {\r\n this._recreateUpdateEffect();\r\n return false;\r\n }\r\n\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n /**\r\n * Gets if the system has been started. (Note: this will still be true after stop is called)\r\n * @returns True if it has been started, otherwise false.\r\n */\r\n public isStarted(): boolean {\r\n return this._started;\r\n }\r\n\r\n /**\r\n * Gets if the system has been stopped. (Note: rendering is still happening but the system is frozen)\r\n * @returns True if it has been stopped, otherwise false.\r\n */\r\n public isStopped(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the system is stopping\r\n * @returns true if the system is currently stopping\r\n */\r\n public isStopping() {\r\n return false; // Stop is immediate on GPU\r\n }\r\n\r\n /**\r\n * Gets the number of particles active at the same time.\r\n * @returns The number of active particles.\r\n */\r\n public getActiveCount() {\r\n return this._currentActiveCount;\r\n }\r\n\r\n /**\r\n * Starts the particle system and begins to emit\r\n * @param delay defines the delay in milliseconds before starting the system (this.startDelay by default)\r\n */\r\n public start(delay = this.startDelay): void {\r\n if (!this.targetStopDuration && this._hasTargetStopDurationDependantGradient()) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Particle system started with a targetStopDuration dependant gradient (eg. startSizeGradients) but no targetStopDuration set\";\r\n }\r\n if (delay) {\r\n setTimeout(() => {\r\n this.start(0);\r\n }, delay);\r\n return;\r\n }\r\n this._started = true;\r\n this._stopped = false;\r\n this._actualFrame = 0;\r\n this._preWarmDone = false;\r\n\r\n // Animations\r\n if (this.beginAnimationOnStart && this.animations && this.animations.length > 0 && this._scene) {\r\n this._scene.beginAnimation(this, this.beginAnimationFrom, this.beginAnimationTo, this.beginAnimationLoop);\r\n }\r\n }\r\n\r\n /**\r\n * Stops the particle system.\r\n */\r\n public stop(): void {\r\n if (this._stopped) {\r\n return;\r\n }\r\n\r\n this.onStoppedObservable.notifyObservers(this);\r\n\r\n this._stopped = true;\r\n }\r\n\r\n /**\r\n * Remove all active particles\r\n */\r\n public reset(): void {\r\n this._releaseBuffers();\r\n this._platform.releaseVertexBuffers();\r\n this._currentActiveCount = 0;\r\n this._targetIndex = 0;\r\n }\r\n\r\n /**\r\n * Returns the string \"GPUParticleSystem\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"GPUParticleSystem\";\r\n }\r\n\r\n /**\r\n * Gets the custom effect used to render the particles\r\n * @param blendMode Blend mode for which the effect should be retrieved\r\n * @returns The effect\r\n */\r\n public getCustomEffect(blendMode: number = 0): Nullable<Effect> {\r\n return this._customWrappers[blendMode]?.effect ?? this._customWrappers[0]!.effect;\r\n }\r\n\r\n private _getCustomDrawWrapper(blendMode: number = 0): Nullable<DrawWrapper> {\r\n return this._customWrappers[blendMode] ?? this._customWrappers[0];\r\n }\r\n\r\n /**\r\n * Sets the custom effect used to render the particles\r\n * @param effect The effect to set\r\n * @param blendMode Blend mode for which the effect should be set\r\n */\r\n public setCustomEffect(effect: Nullable<Effect>, blendMode: number = 0) {\r\n this._customWrappers[blendMode] = new DrawWrapper(this._engine);\r\n this._customWrappers[blendMode].effect = effect;\r\n }\r\n\r\n /** @internal */\r\n protected _onBeforeDrawParticlesObservable: Nullable<Observable<Nullable<Effect>>> = null;\r\n\r\n /**\r\n * Observable that will be called just before the particles are drawn\r\n */\r\n public get onBeforeDrawParticlesObservable(): Observable<Nullable<Effect>> {\r\n if (!this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable = new Observable<Nullable<Effect>>();\r\n }\r\n\r\n return this._onBeforeDrawParticlesObservable;\r\n }\r\n\r\n /**\r\n * Gets the name of the particle vertex shader\r\n */\r\n public get vertexShaderName(): string {\r\n return \"gpuRenderParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers used by the particle system\r\n * Should be called after render() has been called for the current frame so that the buffers returned are the ones that have been updated\r\n * in the current frame (there's a ping-pong between two sets of buffers - for a given frame, one set is used as the source and the other as the destination)\r\n */\r\n public get vertexBuffers(): Immutable<{ [key: string]: VertexBuffer }> {\r\n // We return the other buffers than those corresponding to this._targetIndex because it is assumed vertexBuffers will be called in the current frame\r\n // after render() has been called, meaning that the buffers have already been swapped and this._targetIndex points to the buffers that will be updated\r\n // in the next frame (and which are the sources in this frame) and (this._targetIndex ^ 1) points to the buffers that have been updated this frame\r\n // (and that will be the source buffers in the next frame)\r\n return this._renderVertexBuffers[this._targetIndex ^ 1];\r\n }\r\n\r\n /**\r\n * Gets the index buffer used by the particle system (null for GPU particle systems)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _colorGradientsTexture: RawTexture;\r\n\r\n protected override _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: RawTexture): BaseParticleSystem {\r\n super._removeGradientAndTexture(gradient, gradients, texture);\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new color gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param color1 defines the color to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addColorGradient(gradient: number, color1: Color4): GPUParticleSystem {\r\n if (!this._colorGradients) {\r\n this._colorGradients = [];\r\n }\r\n\r\n const colorGradient = new ColorGradient(gradient, color1);\r\n this._colorGradients.push(colorGradient);\r\n\r\n this._refreshColorGradient(true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n private _refreshColorGradient(reorder = false) {\r\n if (this._colorGradients) {\r\n if (reorder) {\r\n this._colorGradients.sort((a, b) => {\r\n if (a.gradient < b.gradient) {\r\n return -1;\r\n } else if (a.gradient > b.gradient) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n this._colorGradientsTexture.dispose();\r\n (<any>this._colorGradientsTexture) = null;\r\n }\r\n }\r\n }\r\n\r\n /** Force the system to rebuild all gradients that need to be resync */\r\n public forceRefreshGradients() {\r\n this._refreshColorGradient();\r\n this._refreshFactorGradient(this._sizeGradients, \"_sizeGradientsTexture\");\r\n this._refreshFactorGradient(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\");\r\n this._refreshFactorGradient(this._velocityGradients, \"_velocityGradientsTexture\");\r\n this._refreshFactorGradient(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\");\r\n this._refreshFactorGradient(this._dragGradients, \"_dragGradientsTexture\");\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Remove a specific color gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeColorGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._colorGradients, this._colorGradientsTexture);\r\n (<any>this._colorGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n */\r\n public resetDrawCache(): void {\r\n for (const blendMode in this._drawWrappers) {\r\n const drawWrapper = this._drawWrappers[blendMode];\r\n drawWrapper.drawContext?.reset();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _angularSpeedGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _sizeGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _velocityGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _limitVelocityGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _dragGradientsTexture: RawTexture;\r\n\r\n private _addFactorGradient(factorGradients: FactorGradient[], gradient: number, factor: number) {\r\n const valueGradient = new FactorGradient(gradient, factor);\r\n factorGradients.push(valueGradient);\r\n\r\n this._releaseBuffers();\r\n }\r\n\r\n /**\r\n * Adds a new size gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the size factor to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addSizeGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._sizeGradients) {\r\n this._sizeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._sizeGradients, gradient, factor);\r\n\r\n this._refreshFactorGradient(this._sizeGradients, \"_sizeGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific size gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeSizeGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._sizeGradients, this._sizeGradientsTexture);\r\n (<any>this._sizeGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n private _refreshFactorGradient(factorGradients: Nullable<FactorGradient[]>, textureName: string, reorder = false) {\r\n if (!factorGradients) {\r\n return;\r\n }\r\n\r\n if (reorder) {\r\n factorGradients.sort((a, b) => {\r\n if (a.gradient < b.gradient) {\r\n return -1;\r\n } else if (a.gradient > b.gradient) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n const that = this as any;\r\n if (that[textureName]) {\r\n that[textureName].dispose();\r\n that[textureName] = null;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a new angular speed gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the angular speed to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addAngularSpeedGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._angularSpeedGradients) {\r\n this._angularSpeedGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._angularSpeedGradients, gradient, factor);\r\n this._refreshFactorGradient(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific angular speed gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeAngularSpeedGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._angularSpeedGradients, this._angularSpeedGradientsTexture);\r\n (<any>this._angularSpeedGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new velocity gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the velocity to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addVelocityGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._velocityGradients) {\r\n this._velocityGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._velocityGradients, gradient, factor);\r\n this._refreshFactorGradient(this._velocityGradients, \"_velocityGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific velocity gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeVelocityGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._velocityGradients, this._velocityGradientsTexture);\r\n (<any>this._velocityGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new limit velocity gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the limit velocity value to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addLimitVelocityGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._limitVelocityGradients) {\r\n this._limitVelocityGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._limitVelocityGradients, gradient, factor);\r\n this._refreshFactorGradient(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific limit velocity gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeLimitVelocityGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._limitVelocityGradients, this._limitVelocityGradientsTexture);\r\n (<any>this._limitVelocityGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new drag gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the drag value to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addDragGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._dragGradients) {\r\n this._dragGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._dragGradients, gradient, factor);\r\n this._refreshFactorGradient(this._dragGradients, \"_dragGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific drag gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeDragGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._dragGradients, this._dragGradientsTexture);\r\n (<any>this._dragGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addEmitRateGradient(): IParticleSystem {\r\n // Do nothing as emit rate is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeEmitRateGradient(): IParticleSystem {\r\n // Do nothing as emit rate is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addStartSizeGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeStartSizeGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addColorRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeColorRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addAlphaRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeAlphaRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addRampGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeRampGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the list of ramp gradients\r\n */\r\n public getRampGradients(): Nullable<Array<Color3Gradient>> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * Gets or sets a boolean indicating that ramp gradients must be used\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro#ramp-gradients\r\n */\r\n public get useRampGradients(): boolean {\r\n //Not supported by GPUParticleSystem\r\n return false;\r\n }\r\n\r\n public set useRampGradients(value: boolean) {\r\n //Not supported by GPUParticleSystem\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addLifeTimeGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeLifeTimeGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a GPU particle system.\r\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.\r\n * @param name The name of the particle system\r\n * @param options The options used to create the system\r\n * @param sceneOrEngine The scene the particle system belongs to or the engine to use if no scene\r\n * @param customEffect a custom effect used to change the way particles are rendered by default\r\n * @param isAnimationSheetEnabled Must be true if using a spritesheet to animate the particles texture\r\n */\r\n constructor(\r\n name: string,\r\n options: Partial<{\r\n capacity: number;\r\n randomTextureSize: number;\r\n }>,\r\n sceneOrEngine: Scene | AbstractEngine,\r\n customEffect: Nullable<Effect> = null,\r\n isAnimationSheetEnabled: boolean = false\r\n ) {\r\n super(name);\r\n\r\n if (!sceneOrEngine || sceneOrEngine.getClassName() === \"Scene\") {\r\n this._scene = (sceneOrEngine as Scene) || EngineStore.LastCreatedScene;\r\n this._engine = this._scene.getEngine();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._scene.particleSystems.push(this);\r\n } else {\r\n this._engine = sceneOrEngine as AbstractEngine;\r\n this.defaultProjectionMatrix = Matrix.PerspectiveFovLH(0.8, 1, 0.1, 100, this._engine.isNDCHalfZRange);\r\n }\r\n\r\n if (this._engine.getCaps().supportComputeShaders) {\r\n if (!GetClass(\"BABYLON.ComputeShaderParticleSystem\")) {\r\n throw new Error(\"The ComputeShaderParticleSystem class is not available! Make sure you have imported it.\");\r\n }\r\n this._platform = new (GetClass(\"BABYLON.ComputeShaderParticleSystem\"))(this, this._engine);\r\n } else {\r\n if (!GetClass(\"BABYLON.WebGL2ParticleSystem\")) {\r\n throw new Error(\"The WebGL2ParticleSystem class is not available! Make sure you have imported it.\");\r\n }\r\n this._platform = new (GetClass(\"BABYLON.WebGL2ParticleSystem\"))(this, this._engine);\r\n }\r\n\r\n this._customWrappers = { 0: new DrawWrapper(this._engine) };\r\n this._customWrappers[0]!.effect = customEffect;\r\n\r\n this._drawWrappers = { 0: new DrawWrapper(this._engine) };\r\n if (this._drawWrappers[0].drawContext) {\r\n this._drawWrappers[0].drawContext.useInstancing = true;\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n\r\n options = options ?? {};\r\n\r\n if (!options.randomTextureSize) {\r\n delete options.randomTextureSize;\r\n }\r\n\r\n const fullOptions = {\r\n capacity: 50000,\r\n randomTextureSize: this._engine.getCaps().maxTextureSize,\r\n ...options,\r\n };\r\n\r\n const optionsAsNumber = <number>options;\r\n if (isFinite(optionsAsNumber)) {\r\n fullOptions.capacity = optionsAsNumber;\r\n }\r\n\r\n this._capacity = fullOptions.capacity;\r\n this._maxActiveParticleCount = fullOptions.capacity;\r\n this._currentActiveCount = 0;\r\n this._isAnimationSheetEnabled = isAnimationSheetEnabled;\r\n\r\n this.particleEmitterType = new BoxParticleEmitter();\r\n\r\n // Random data\r\n const maxTextureSize = Math.min(this._engine.getCaps().maxTextureSize, fullOptions.randomTextureSize);\r\n let d = [];\r\n for (let i = 0; i < maxTextureSize; ++i) {\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n }\r\n this._randomTexture = new RawTexture(\r\n new Float32Array(d),\r\n maxTextureSize,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n sceneOrEngine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._randomTexture.name = \"GPUParticleSystem_random1\";\r\n this._randomTexture.wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n this._randomTexture.wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n d = [];\r\n for (let i = 0; i < maxTextureSize; ++i) {\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n }\r\n this._randomTexture2 = new RawTexture(\r\n new Float32Array(d),\r\n maxTextureSize,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n sceneOrEngine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._randomTexture2.name = \"GPUParticleSystem_random2\";\r\n this._randomTexture2.wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n this._randomTexture2.wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n this._randomTextureSize = maxTextureSize;\r\n }\r\n\r\n protected override _reset() {\r\n this._releaseBuffers();\r\n }\r\n\r\n private _createVertexBuffers(updateBuffer: Buffer, renderBuffer: Buffer, spriteSource: Buffer): void {\r\n const renderVertexBuffers: { [key: string]: VertexBuffer } = {};\r\n renderVertexBuffers[\"position\"] = renderBuffer.createVertexBuffer(\"position\", 0, 3, this._attributesStrideSize, true);\r\n let offset = 3;\r\n renderVertexBuffers[\"age\"] = renderBuffer.createVertexBuffer(\"age\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n renderVertexBuffers[\"size\"] = renderBuffer.createVertexBuffer(\"size\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n renderVertexBuffers[\"life\"] = renderBuffer.createVertexBuffer(\"life\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n offset += 4; // seed\r\n if (this.billboardMode === ParticleSystem.BILLBOARDMODE_STRETCHED) {\r\n renderVertexBuffers[\"direction\"] = renderBuffer.createVertexBuffer(\"direction\", offset, 3, this._attributesStrideSize, true);\r\n }\r\n offset += 3; // direction\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n\r\n if (this.particleEmitterType instanceof CustomParticleEmitter) {\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (!this._colorGradientsTexture) {\r\n renderVertexBuffers[\"color\"] = renderBuffer.createVertexBuffer(\"color\", offset, 4, this._attributesStrideSize, true);\r\n offset += 4;\r\n }\r\n\r\n if (!this._isBillboardBased) {\r\n renderVertexBuffers[\"initialDirection\"] = renderBuffer.createVertexBuffer(\"initialDirection\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n renderVertexBuffers[\"noiseCoordinates1\"] = renderBuffer.createVertexBuffer(\"noiseCoordinates1\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n renderVertexBuffers[\"noiseCoordinates2\"] = renderBuffer.createVertexBuffer(\"noiseCoordinates2\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n renderVertexBuffers[\"angle\"] = renderBuffer.createVertexBuffer(\"angle\", offset, 1, this._attributesStrideSize, true);\r\n if (this._angularSpeedGradientsTexture) {\r\n offset++;\r\n } else {\r\n offset += 2;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n renderVertexBuffers[\"cellIndex\"] = renderBuffer.createVertexBuffer(\"cellIndex\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n if (this.spriteRandomStartCell) {\r\n renderVertexBuffers[\"cellStartOffset\"] = renderBuffer.createVertexBuffer(\"cellStartOffset\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n }\r\n }\r\n\r\n renderVertexBuffers[\"offset\"] = spriteSource.createVertexBuffer(\"offset\", 0, 2);\r\n renderVertexBuffers[\"uv\"] = spriteSource.createVertexBuffer(\"uv\", 2, 2);\r\n\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n\r\n this._platform.createVertexBuffers(updateBuffer, renderVertexBuffers);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _initialize(force = false): void {\r\n if (this._buffer0 && !force) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const data: float[] = [];\r\n\r\n this._attributesStrideSize = 21;\r\n this._targetIndex = 0;\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n\r\n if (this.particleEmitterType instanceof CustomParticleEmitter) {\r\n this._attributesStrideSize += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (!this.isBillboardBased) {\r\n this._attributesStrideSize += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n this._attributesStrideSize -= 4;\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n this._attributesStrideSize -= 1;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n this._attributesStrideSize += 1;\r\n if (this.spriteRandomStartCell) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n this._attributesStrideSize += 6;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 2;\r\n }\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 3 - ((this._attributesStrideSize + 3) & 3); // round to multiple of 4\r\n }\r\n\r\n const usingCustomEmitter = this.particleEmitterType instanceof CustomParticleEmitter;\r\n const tmpVector = TmpVectors.Vector3[0];\r\n\r\n let offset = 0;\r\n for (let particleIndex = 0; particleIndex < this._capacity; particleIndex++) {\r\n // position\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n\r\n // Age\r\n data.push(0.0); // create the particle as a dead one to create a new one at start\r\n\r\n // Size\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n\r\n // life\r\n data.push(0.0);\r\n\r\n // Seed\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n\r\n // direction\r\n if (usingCustomEmitter) {\r\n (this.particleEmitterType as CustomParticleEmitter).particleDestinationGenerator(particleIndex, null, tmpVector);\r\n data.push(tmpVector.x);\r\n data.push(tmpVector.y);\r\n data.push(tmpVector.z);\r\n } else {\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy0\r\n }\r\n\r\n offset += 16; // position, age, size, life, seed, direction, dummy0\r\n\r\n if (usingCustomEmitter) {\r\n (this.particleEmitterType as CustomParticleEmitter).particlePositionGenerator(particleIndex, null, tmpVector);\r\n data.push(tmpVector.x);\r\n data.push(tmpVector.y);\r\n data.push(tmpVector.z);\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy1\r\n }\r\n offset += 4;\r\n }\r\n\r\n if (!this._colorGradientsTexture) {\r\n // color\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n offset += 4;\r\n }\r\n\r\n if (!this.isBillboardBased) {\r\n // initialDirection\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy2\r\n }\r\n offset += 4;\r\n }\r\n\r\n if (this.noiseTexture) {\r\n // Random coordinates for reading into noise texture\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy3\r\n }\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy4\r\n }\r\n offset += 8;\r\n }\r\n\r\n // angle\r\n data.push(0.0);\r\n offset += 1;\r\n\r\n if (!this._angularSpeedGradientsTexture) {\r\n data.push(0.0);\r\n offset += 1;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n data.push(0.0);\r\n offset += 1;\r\n if (this.spriteRandomStartCell) {\r\n data.push(0.0);\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n let numDummies = 3 - ((offset + 3) & 3);\r\n offset += numDummies;\r\n while (numDummies-- > 0) {\r\n data.push(0.0);\r\n }\r\n }\r\n }\r\n\r\n // Sprite data\r\n const spriteData = new Float32Array([0.5, 0.5, 1, 1, -0.5, 0.5, 0, 1, 0.5, -0.5, 1, 0, -0.5, -0.5, 0, 0]);\r\n\r\n const bufferData1: DataArray | DataBuffer = this._platform.createParticleBuffer(data);\r\n const bufferData2: DataArray | DataBuffer = this._platform.createParticleBuffer(data);\r\n\r\n // Buffers\r\n this._buffer0 = new Buffer(engine, bufferData1, false, this._attributesStrideSize);\r\n this._buffer1 = new Buffer(engine, bufferData2, false, this._attributesStrideSize);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 4);\r\n\r\n // Update & Render vertex buffers\r\n this._renderVertexBuffers = [];\r\n this._createVertexBuffers(this._buffer0, this._buffer1, this._spriteBuffer);\r\n this._createVertexBuffers(this._buffer1, this._buffer0, this._spriteBuffer);\r\n\r\n // Links\r\n this._sourceBuffer = this._buffer0;\r\n this._targetBuffer = this._buffer1;\r\n }\r\n\r\n /** @internal */\r\n public _recreateUpdateEffect() {\r\n this._createColorGradientTexture();\r\n this._createSizeGradientTexture();\r\n this._createAngularSpeedGradientTexture();\r\n this._createVelocityGradientTexture();\r\n this._createLimitVelocityGradientTexture();\r\n this._createDragGradientTexture();\r\n\r\n let defines = this.particleEmitterType ? this.particleEmitterType.getEffectDefines() : \"\";\r\n\r\n if (this._isBillboardBased) {\r\n defines += \"\\n#define BILLBOARD\";\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n defines += \"\\n#define COLORGRADIENTS\";\r\n }\r\n\r\n if (this._sizeGradientsTexture) {\r\n defines += \"\\n#define SIZEGRADIENTS\";\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n defines += \"\\n#define ANGULARSPEEDGRADIENTS\";\r\n }\r\n\r\n if (this._velocityGradientsTexture) {\r\n defines += \"\\n#define VELOCITYGRADIENTS\";\r\n }\r\n\r\n if (this._limitVelocityGradientsTexture) {\r\n defines += \"\\n#define LIMITVELOCITYGRADIENTS\";\r\n }\r\n\r\n if (this._dragGradientsTexture) {\r\n defines += \"\\n#define DRAGGRADIENTS\";\r\n }\r\n\r\n if (this._flowMap) {\r\n defines += \"\\n#define FLOWMAP\";\r\n }\r\n\r\n if (this.isAnimationSheetEnabled) {\r\n defines += \"\\n#define ANIMATESHEET\";\r\n if (this.spriteRandomStartCell) {\r\n defines += \"\\n#define ANIMATESHEETRANDOMSTART\";\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n defines += \"\\n#define NOISE\";\r\n }\r\n\r\n if (this.isLocal) {\r\n defines += \"\\n#define LOCAL\";\r\n }\r\n\r\n if (this._platform.isUpdateBufferCreated() && this._cachedUpdateDefines === defines) {\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n this._cachedUpdateDefines = defines;\r\n this._updateBuffer = this._platform.createUpdateBuffer(defines);\r\n\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getWrapper(blendMode: number): DrawWrapper {\r\n const customWrapper = this._getCustomDrawWrapper(blendMode);\r\n\r\n if (customWrapper?.effect) {\r\n return customWrapper;\r\n }\r\n\r\n const defines: Array<string> = [];\r\n\r\n this.fillDefines(defines, blendMode);\r\n\r\n // Effect\r\n let drawWrapper = this._drawWrappers[blendMode];\r\n if (!drawWrapper) {\r\n drawWrapper = new DrawWrapper(this._engine);\r\n if (drawWrapper.drawContext) {\r\n drawWrapper.drawContext.useInstancing = true;\r\n }\r\n this._drawWrappers[blendMode] = drawWrapper;\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (drawWrapper.defines !== join) {\r\n const attributes: Array<string> = [];\r\n const uniforms: Array<string> = [];\r\n const samplers: Array<string> = [];\r\n\r\n this.fillUniformsAttributesAndSamplerNames(uniforms, attributes, samplers);\r\n\r\n drawWrapper.setEffect(this._engine.createEffect(\"gpuRenderParticles\", attributes, uniforms, samplers, join), join);\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetAttributeNamesOrOptions(hasColorGradients = false, isAnimationSheetEnabled = false, isBillboardBased = false, isBillboardStretched = false): string[] {\r\n const attributeNamesOrOptions = [VertexBuffer.PositionKind, \"age\", \"life\", \"size\", \"angle\"];\r\n\r\n if (!hasColorGradients) {\r\n attributeNamesOrOptions.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (isAnimationSheetEnabled) {\r\n attributeNamesOrOptions.push(\"cellIndex\");\r\n }\r\n\r\n if (!isBillboardBased) {\r\n attributeNamesOrOptions.push(\"initialDirection\");\r\n }\r\n\r\n if (isBillboardStretched) {\r\n attributeNamesOrOptions.push(\"direction\");\r\n }\r\n\r\n attributeNamesOrOptions.push(\"offset\", VertexBuffer.UVKind);\r\n\r\n return attributeNamesOrOptions;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetEffectCreationOptions(isAnimationSheetEnabled = false, useLogarithmicDepth = false, applyFog = false): string[] {\r\n const effectCreationOption = [\"emitterWM\", \"worldOffset\", \"view\", \"projection\", \"colorDead\", \"invView\", \"translationPivot\", \"eyePosition\"];\r\n AddClipPlaneUniforms(effectCreationOption);\r\n\r\n if (isAnimationSheetEnabled) {\r\n effectCreationOption.push(\"sheetInfos\");\r\n }\r\n if (useLogarithmicDepth) {\r\n effectCreationOption.push(\"logarithmicDepthConstant\");\r\n }\r\n\r\n if (applyFog) {\r\n effectCreationOption.push(\"vFogInfos\");\r\n effectCreationOption.push(\"vFogColor\");\r\n }\r\n\r\n return effectCreationOption;\r\n }\r\n\r\n /**\r\n * Fill the defines array according to the current settings of the particle system\r\n * @param defines Array to be updated\r\n * @param blendMode blend mode to take into account when updating the array\r\n * @param fillImageProcessing fills the image processing defines\r\n */\r\n public fillDefines(defines: Array<string>, blendMode: number = 0, fillImageProcessing: boolean = true): void {\r\n if (this._scene) {\r\n PrepareStringDefinesForClipPlanes(this, this._scene, defines);\r\n if (this.applyFog && this._scene.fogEnabled && this._scene.fogMode !== Scene.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n }\r\n }\r\n\r\n if (blendMode === ParticleSystem.BLENDMODE_MULTIPLY) {\r\n defines.push(\"#define BLENDMULTIPLYMODE\");\r\n }\r\n\r\n if (this.isLocal) {\r\n defines.push(\"#define LOCAL\");\r\n }\r\n\r\n if (this.useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n\r\n if (this._isBillboardBased) {\r\n defines.push(\"#define BILLBOARD\");\r\n\r\n switch (this.billboardMode) {\r\n case ParticleSystem.BILLBOARDMODE_Y:\r\n defines.push(\"#define BILLBOARDY\");\r\n break;\r\n case ParticleSystem.BILLBOARDMODE_STRETCHED:\r\n defines.push(\"#define BILLBOARDSTRETCHED\");\r\n break;\r\n case ParticleSystem.BILLBOARDMODE_ALL:\r\n defines.push(\"#define BILLBOARDMODE_ALL\");\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n defines.push(\"#define COLORGRADIENTS\");\r\n }\r\n\r\n if (this.isAnimationSheetEnabled) {\r\n defines.push(\"#define ANIMATESHEET\");\r\n }\r\n\r\n if (fillImageProcessing && this._imageProcessingConfiguration) {\r\n this._imageProcessingConfiguration.prepareDefines(this._imageProcessingConfigurationDefines);\r\n defines.push(\"\" + this._imageProcessingConfigurationDefines.toString());\r\n }\r\n }\r\n\r\n /**\r\n * Fill the uniforms, attributes and samplers arrays according to the current settings of the particle system\r\n * @param uniforms Uniforms array to fill\r\n * @param attributes Attributes array to fill\r\n * @param samplers Samplers array to fill\r\n */\r\n public fillUniformsAttributesAndSamplerNames(uniforms: Array<string>, attributes: Array<string>, samplers: Array<string>) {\r\n attributes.push(\r\n ...GPUParticleSystem._GetAttributeNamesOrOptions(\r\n !!this._colorGradientsTexture,\r\n this._isAnimationSheetEnabled,\r\n this._isBillboardBased,\r\n this._isBillboardBased && this.billboardMode === ParticleSystem.BILLBOARDMODE_STRETCHED\r\n )\r\n );\r\n\r\n uniforms.push(...GPUParticleSystem._GetEffectCreationOptions(this._isAnimationSheetEnabled, this.useLogarithmicDepth, this.applyFog));\r\n\r\n samplers.push(\"diffuseSampler\", \"colorGradientSampler\");\r\n\r\n if (this._imageProcessingConfiguration) {\r\n ImageProcessingConfiguration.PrepareUniforms(uniforms, this._imageProcessingConfigurationDefines);\r\n ImageProcessingConfiguration.PrepareSamplers(samplers, this._imageProcessingConfigurationDefines);\r\n }\r\n }\r\n\r\n /**\r\n * Animates the particle system for the current frame by emitting new particles and or animating the living ones.\r\n * @param preWarm defines if we are in the pre-warmimg phase\r\n */\r\n public animate(preWarm = false): void {\r\n this._timeDelta = this.updateSpeed * (preWarm ? this.preWarmStepOffset : this._scene?.getAnimationRatio() || 1);\r\n this._actualFrame += this._timeDelta;\r\n\r\n if (!this._stopped) {\r\n if (this.targetStopDuration && this._actualFrame >= this.targetStopDuration) {\r\n this.stop();\r\n }\r\n }\r\n\r\n if (this.updateInAnimate) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _createFactorGradientTexture(factorGradients: Nullable<IValueGradient[]>, textureName: string) {\r\n const texture: RawTexture = (<any>this)[textureName];\r\n\r\n if (!factorGradients || !factorGradients.length || texture) {\r\n return;\r\n }\r\n\r\n const data = new Float32Array(this._rawTextureWidth);\r\n\r\n for (let x = 0; x < this._rawTextureWidth; x++) {\r\n const ratio = x / this._rawTextureWidth;\r\n\r\n GradientHelper.GetCurrentGradient(ratio, factorGradients, (currentGradient, nextGradient, scale) => {\r\n data[x] = Lerp((<FactorGradient>currentGradient).factor1, (<FactorGradient>nextGradient).factor1, scale);\r\n });\r\n }\r\n\r\n (<any>this)[textureName] = RawTexture.CreateRTexture(data, this._rawTextureWidth, 1, this._scene || this._engine, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n (<any>this)[textureName].name = textureName.substring(1);\r\n }\r\n\r\n private _createSizeGradientTexture() {\r\n this._createFactorGradientTexture(this._sizeGradients, \"_sizeGradientsTexture\");\r\n }\r\n\r\n private _createAngularSpeedGradientTexture() {\r\n this._createFactorGradientTexture(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\");\r\n }\r\n\r\n private _createVelocityGradientTexture() {\r\n this._createFactorGradientTexture(this._velocityGradients, \"_velocityGradientsTexture\");\r\n }\r\n\r\n private _createLimitVelocityGradientTexture() {\r\n this._createFactorGradientTexture(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\");\r\n }\r\n\r\n private _createDragGradientTexture() {\r\n this._createFactorGradientTexture(this._dragGradients, \"_dragGradientsTexture\");\r\n }\r\n\r\n private _createColorGradientTexture() {\r\n if (!this._colorGradients || !this._colorGradients.length || this._colorGradientsTexture) {\r\n return;\r\n }\r\n\r\n const data = new Uint8Array(this._rawTextureWidth * 4);\r\n const tmpColor = TmpColors.Color4[0];\r\n\r\n for (let x = 0; x < this._rawTextureWidth; x++) {\r\n const ratio = x / this._rawTextureWidth;\r\n\r\n GradientHelper.GetCurrentGradient(ratio, this._colorGradients, (currentGradient, nextGradient, scale) => {\r\n Color4.LerpToRef((<ColorGradient>currentGradient).color1, (<ColorGradient>nextGradient).color1, scale, tmpColor);\r\n data[x * 4] = tmpColor.r * 255;\r\n data[x * 4 + 1] = tmpColor.g * 255;\r\n data[x * 4 + 2] = tmpColor.b * 255;\r\n data[x * 4 + 3] = tmpColor.a * 255;\r\n });\r\n }\r\n\r\n this._colorGradientsTexture = RawTexture.CreateRGBATexture(data, this._rawTextureWidth, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._colorGradientsTexture.name = \"colorGradients\";\r\n }\r\n\r\n private _render(blendMode: number, emitterWM: Matrix): number {\r\n // Enable render effect\r\n const drawWrapper = this._getWrapper(blendMode);\r\n const effect = drawWrapper.effect!;\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n const viewMatrix = this._scene?.getViewMatrix() || Matrix.IdentityReadOnly;\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", this.defaultProjectionMatrix ?? this._scene!.getProjectionMatrix());\r\n effect.setTexture(\"diffuseSampler\", this.particleTexture);\r\n effect.setVector2(\"translationPivot\", this.translationPivot);\r\n const worldOffset = this.worldOffset.subtractToRef(this._scene?.floatingOriginOffset || Vector3.ZeroReadOnly, TmpVectors.Vector3[0]);\r\n effect.setVector3(\"worldOffset\", worldOffset);\r\n if (this.isLocal) {\r\n effect.setMatrix(\"emitterWM\", emitterWM);\r\n }\r\n if (this._colorGradientsTexture) {\r\n effect.setTexture(\"colorGradientSampler\", this._colorGradientsTexture);\r\n } else {\r\n effect.setDirectColor4(\"colorDead\", this.colorDead);\r\n }\r\n\r\n if (this._isAnimationSheetEnabled && this.particleTexture) {\r\n const baseSize = this.particleTexture.getBaseSize();\r\n effect.setFloat3(\"sheetInfos\", this.spriteCellWidth / baseSize.width, this.spriteCellHeight / baseSize.height, baseSize.width / this.spriteCellWidth);\r\n }\r\n\r\n if (this._isBillboardBased && this._scene) {\r\n const camera = this._scene.activeCamera!;\r\n effect.setVector3(\"eyePosition\", camera.globalPosition);\r\n }\r\n\r\n const defines = effect.defines;\r\n\r\n if (this._scene) {\r\n BindClipPlane(effect, this, this._scene);\r\n\r\n if (this.applyFog) {\r\n BindFogParameters(this._scene, undefined, effect);\r\n }\r\n }\r\n\r\n if (defines.indexOf(\"#define BILLBOARDMODE_ALL\") >= 0) {\r\n const invView = viewMatrix.clone();\r\n invView.invert();\r\n effect.setMatrix(\"invView\", invView);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth && this._scene) {\r\n BindLogDepth(defines, effect, this._scene);\r\n }\r\n\r\n // image processing\r\n if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) {\r\n this._imageProcessingConfiguration.bind(effect);\r\n }\r\n\r\n // Draw order\r\n this._setEngineBasedOnBlendMode(blendMode);\r\n\r\n // Bind source VAO\r\n this._platform.bindDrawBuffers(this._targetIndex, effect, this._scene?.forceWireframe ? this._linesIndexBufferUseInstancing : null);\r\n\r\n if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.notifyObservers(effect);\r\n }\r\n\r\n // Render\r\n if (this._scene?.forceWireframe) {\r\n this._engine.drawElementsType(Constants.MATERIAL_LineStripDrawMode, 0, 10, this._currentActiveCount);\r\n } else {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, this._currentActiveCount);\r\n }\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this._scene?.forceWireframe) {\r\n this._engine.unbindInstanceAttributes();\r\n }\r\n\r\n return this._currentActiveCount;\r\n }\r\n\r\n /** @internal */\r\n public _update(emitterWM?: Matrix): void {\r\n if (!this.emitter || !this._targetBuffer) {\r\n return;\r\n }\r\n\r\n if (!this._recreateUpdateEffect() || this._rebuildingAfterContextLost) {\r\n return;\r\n }\r\n\r\n if (!emitterWM) {\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n emitterWM = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n emitterWM = TmpVectors.Matrix[0];\r\n Matrix.TranslationToRef(emitterPosition.x, emitterPosition.y, emitterPosition.z, emitterWM);\r\n }\r\n }\r\n\r\n const engine = this._engine as Engine;\r\n const depthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n\r\n this._platform.preUpdateParticleBuffer();\r\n\r\n this._updateBuffer.setFloat(\"currentCount\", this._currentActiveCount);\r\n this._updateBuffer.setFloat(\"timeDelta\", this._timeDelta);\r\n this._updateBuffer.setFloat(\"stopFactor\", this._stopped ? 0 : 1);\r\n this._updateBuffer.setInt(\"randomTextureSize\", this._randomTextureSize);\r\n this._updateBuffer.setFloat2(\"lifeTime\", this.minLifeTime, this.maxLifeTime);\r\n this._updateBuffer.setFloat2(\"emitPower\", this.minEmitPower, this.maxEmitPower);\r\n if (!this._colorGradientsTexture) {\r\n this._updateBuffer.setDirectColor4(\"color1\", this.color1);\r\n this._updateBuffer.setDirectColor4(\"color2\", this.color2);\r\n }\r\n this._updateBuffer.setFloat2(\"sizeRange\", this.minSize, this.maxSize);\r\n this._updateBuffer.setFloat4(\"scaleRange\", this.minScaleX, this.maxScaleX, this.minScaleY, this.maxScaleY);\r\n this._updateBuffer.setFloat4(\"angleRange\", this.minAngularSpeed, this.maxAngularSpeed, this.minInitialRotation, this.maxInitialRotation);\r\n this._updateBuffer.setVector3(\"gravity\", this.gravity);\r\n if (this._limitVelocityGradientsTexture) {\r\n this._updateBuffer.setFloat(\"limitVelocityDamping\", this.limitVelocityDamping);\r\n }\r\n if (this.particleEmitterType) {\r\n this.particleEmitterType.applyToShader(this._updateBuffer);\r\n }\r\n if (this._isAnimationSheetEnabled) {\r\n this._updateBuffer.setFloat4(\"cellInfos\", this.startSpriteCellID, this.endSpriteCellID, this.spriteCellChangeSpeed, this.spriteCellLoop ? 1 : 0);\r\n }\r\n if (this.noiseTexture) {\r\n this._updateBuffer.setVector3(\"noiseStrength\", this.noiseStrength);\r\n }\r\n if (this._flowMap) {\r\n const scene = this.getScene()!;\r\n this._updateBuffer.setFloat(\"flowMapStrength\", this.flowMapStrength);\r\n this._updateBuffer.setMatrix(\"flowMapProjection\", scene.getTransformMatrix());\r\n }\r\n\r\n if (!this.isLocal) {\r\n this._updateBuffer.setMatrix(\"emitterWM\", emitterWM);\r\n }\r\n\r\n this._platform.updateParticleBuffer(this._targetIndex, this._targetBuffer, this._currentActiveCount);\r\n\r\n // Switch VAOs\r\n this._targetIndex++;\r\n if (this._targetIndex === 2) {\r\n this._targetIndex = 0;\r\n }\r\n\r\n // Switch buffers\r\n const tmpBuffer = this._sourceBuffer;\r\n this._sourceBuffer = this._targetBuffer;\r\n this._targetBuffer = tmpBuffer;\r\n\r\n engine.setDepthWrite(depthWriteState);\r\n }\r\n\r\n /**\r\n * Renders the particle system in its current state\r\n * @param preWarm defines if the system should only update the particles but not render them\r\n * @param forceUpdateOnly if true, force to only update the particles and never display them (meaning, even if preWarm=false, when forceUpdateOnly=true the particles won't be displayed)\r\n * @returns the current number of particles\r\n */\r\n public render(preWarm = false, forceUpdateOnly = false): number {\r\n if (!this._started) {\r\n return 0;\r\n }\r\n\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n\r\n if (!preWarm && this._scene) {\r\n if (!this._preWarmDone && this.preWarmCycles) {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n this.render(true, true);\r\n }\r\n\r\n this._preWarmDone = true;\r\n }\r\n\r\n if (\r\n this._currentRenderId === this._scene.getRenderId() &&\r\n (!this._scene.activeCamera || (this._scene.activeCamera && this._currentRenderingCameraUniqueId === this._scene.activeCamera.uniqueId))\r\n ) {\r\n return 0;\r\n }\r\n\r\n this._currentRenderId = this._scene.getRenderId();\r\n if (this._scene.activeCamera) {\r\n this._currentRenderingCameraUniqueId = this._scene.activeCamera.uniqueId;\r\n }\r\n }\r\n\r\n // Get everything ready to render\r\n this._initialize();\r\n\r\n if (this.manualEmitCount > -1) {\r\n this._accumulatedCount += this.manualEmitCount;\r\n this.manualEmitCount = 0;\r\n } else {\r\n this._accumulatedCount += this.emitRate * this._timeDelta;\r\n }\r\n if (this._accumulatedCount >= 1) {\r\n const intPart = this._accumulatedCount | 0;\r\n this._accumulatedCount -= intPart;\r\n this._currentActiveCount += intPart;\r\n }\r\n\r\n this._currentActiveCount = Math.min(this._maxActiveParticleCount, this._currentActiveCount);\r\n\r\n if (!this._currentActiveCount) {\r\n return 0;\r\n }\r\n\r\n // Enable update effect\r\n let emitterWM: Matrix;\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n emitterWM = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n emitterWM = TmpVectors.Matrix[0];\r\n Matrix.TranslationToRef(emitterPosition.x, emitterPosition.y, emitterPosition.z, emitterWM);\r\n }\r\n\r\n const engine = this._engine as Engine;\r\n\r\n if (!this.updateInAnimate) {\r\n this._update(emitterWM);\r\n }\r\n\r\n let outparticles = 0;\r\n if (!preWarm && !forceUpdateOnly) {\r\n engine.setState(false);\r\n\r\n if (this.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n if (this.blendMode === ParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n outparticles = this._render(ParticleSystem.BLENDMODE_MULTIPLY, emitterWM) + this._render(ParticleSystem.BLENDMODE_ADD, emitterWM);\r\n } else {\r\n outparticles = this._render(this.blendMode, emitterWM);\r\n }\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n return outparticles;\r\n }\r\n\r\n /**\r\n * Rebuilds the particle system\r\n */\r\n public rebuild(): void {\r\n const checkUpdateEffect = () => {\r\n if (!this._recreateUpdateEffect() || !this._platform.isUpdateBufferReady()) {\r\n setTimeout(checkUpdateEffect, 10);\r\n } else {\r\n this._initialize(true);\r\n this._rebuildingAfterContextLost = false;\r\n }\r\n };\r\n\r\n this._createIndexBuffer();\r\n\r\n this._cachedUpdateDefines = \"\";\r\n this._platform.contextLost();\r\n this._rebuildingAfterContextLost = true;\r\n\r\n checkUpdateEffect();\r\n }\r\n\r\n private _releaseBuffers() {\r\n if (this._buffer0) {\r\n this._buffer0.dispose();\r\n (<any>this._buffer0) = null;\r\n }\r\n if (this._buffer1) {\r\n this._buffer1.dispose();\r\n (<any>this._buffer1) = null;\r\n }\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n this._platform.releaseBuffers();\r\n }\r\n\r\n /**\r\n * Disposes the particle system and free the associated resources\r\n * @param disposeTexture defines if the particule texture must be disposed as well (true by default)\r\n */\r\n public dispose(disposeTexture = true): void {\r\n for (const blendMode in this._drawWrappers) {\r\n const drawWrapper = this._drawWrappers[blendMode];\r\n drawWrapper.dispose();\r\n }\r\n\r\n this._drawWrappers = {};\r\n\r\n if (this._scene) {\r\n const index = this._scene.particleSystems.indexOf(this);\r\n if (index > -1) {\r\n this._scene.particleSystems.splice(index, 1);\r\n }\r\n }\r\n\r\n this._releaseBuffers();\r\n this._platform.releaseVertexBuffers();\r\n\r\n for (let i = 0; i < this._renderVertexBuffers.length; ++i) {\r\n const rvb = this._renderVertexBuffers[i];\r\n for (const key in rvb) {\r\n rvb[key].dispose();\r\n }\r\n }\r\n\r\n this._renderVertexBuffers = [];\r\n\r\n if (this._colorGradientsTexture) {\r\n this._colorGradientsTexture.dispose();\r\n (<any>this._colorGradientsTexture) = null;\r\n }\r\n\r\n if (this._sizeGradientsTexture) {\r\n this._sizeGradientsTexture.dispose();\r\n (<any>this._sizeGradientsTexture) = null;\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n this._angularSpeedGradientsTexture.dispose();\r\n (<any>this._angularSpeedGradientsTexture) = null;\r\n }\r\n\r\n if (this._velocityGradientsTexture) {\r\n this._velocityGradientsTexture.dispose();\r\n (<any>this._velocityGradientsTexture) = null;\r\n }\r\n\r\n if (this._limitVelocityGradientsTexture) {\r\n this._limitVelocityGradientsTexture.dispose();\r\n (<any>this._limitVelocityGradientsTexture) = null;\r\n }\r\n\r\n if (this._dragGradientsTexture) {\r\n this._dragGradientsTexture.dispose();\r\n (<any>this._dragGradientsTexture) = null;\r\n }\r\n\r\n if (this._randomTexture) {\r\n this._randomTexture.dispose();\r\n (<any>this._randomTexture) = null;\r\n }\r\n\r\n if (this._randomTexture2) {\r\n this._randomTexture2.dispose();\r\n (<any>this._randomTexture2) = null;\r\n }\r\n\r\n if (disposeTexture && this.particleTexture) {\r\n this.particleTexture.dispose();\r\n this.particleTexture = null;\r\n }\r\n\r\n if (disposeTexture && this.noiseTexture) {\r\n this.noiseTexture.dispose();\r\n this.noiseTexture = null;\r\n }\r\n\r\n // Callback\r\n this.onStoppedObservable.clear();\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n /**\r\n * Clones the particle system.\r\n * @param name The name of the cloned object\r\n * @param newEmitter The new emitter to use\r\n * @param cloneTexture Also clone the textures if true\r\n * @returns the cloned particle system\r\n */\r\n public clone(name: string, newEmitter: any, cloneTexture = false): GPUParticleSystem {\r\n const custom = { ...this._customWrappers };\r\n let program: any = null;\r\n const engine = this._engine as any;\r\n if (engine.createEffectForParticles) {\r\n if (this.customShader != null) {\r\n program = this.customShader;\r\n const defines: string = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\r\n custom[0] = engine.createEffectForParticles(\r\n program.shaderPath.fragmentElement,\r\n program.shaderOptions.uniforms,\r\n program.shaderOptions.samplers,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this\r\n );\r\n }\r\n }\r\n\r\n const serialization = this.serialize(cloneTexture);\r\n const result = GPUParticleSystem.Parse(serialization, this._scene || this._engine, this._rootUrl);\r\n result.name = name;\r\n result.customShader = program;\r\n result._customWrappers = custom;\r\n\r\n if (newEmitter === undefined) {\r\n newEmitter = this.emitter;\r\n }\r\n\r\n if (this.noiseTexture) {\r\n result.noiseTexture = this.noiseTexture.clone();\r\n }\r\n\r\n result.emitter = newEmitter;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n ParticleSystem._Serialize(serializationObject, this, serializeTexture);\r\n\r\n serializationObject.activeParticleCount = this.activeParticleCount;\r\n serializationObject.randomTextureSize = this._randomTextureSize;\r\n serializationObject.customShader = this.customShader;\r\n\r\n serializationObject.preventAutoStart = this.preventAutoStart;\r\n serializationObject.worldOffset = this.worldOffset.asArray();\r\n\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a GPU particle system.\r\n * @param parsedParticleSystem The JSON object to parse\r\n * @param sceneOrEngine The scene or the engine to create the particle system in\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @param doNotStart Ignore the preventAutoStart attribute and does not start\r\n * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)\r\n * @returns the parsed GPU particle system\r\n */\r\n public static Parse(parsedParticleSystem: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string, doNotStart = false, capacity?: number): GPUParticleSystem {\r\n const name = parsedParticleSystem.name;\r\n let engine: AbstractEngine;\r\n let scene: Nullable<Scene>;\r\n\r\n if (sceneOrEngine instanceof AbstractEngine) {\r\n engine = sceneOrEngine;\r\n } else {\r\n scene = sceneOrEngine;\r\n engine = scene.getEngine();\r\n }\r\n\r\n const particleSystem = new GPUParticleSystem(\r\n name,\r\n { capacity: capacity || parsedParticleSystem.capacity, randomTextureSize: parsedParticleSystem.randomTextureSize },\r\n sceneOrEngine,\r\n null,\r\n parsedParticleSystem.isAnimationSheetEnabled\r\n );\r\n particleSystem._rootUrl = rootUrl;\r\n\r\n if (parsedParticleSystem.customShader && (engine as any).createEffectForParticles) {\r\n const program = parsedParticleSystem.customShader;\r\n const defines: string = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\r\n const custom: Nullable<Effect> = (engine as any).createEffectForParticles(\r\n program.shaderPath.fragmentElement,\r\n program.shaderOptions.uniforms,\r\n program.shaderOptions.samplers,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n particleSystem\r\n );\r\n particleSystem.setCustomEffect(custom, 0);\r\n particleSystem.customShader = program;\r\n }\r\n\r\n if (parsedParticleSystem.id) {\r\n particleSystem.id = parsedParticleSystem.id;\r\n }\r\n\r\n if (parsedParticleSystem.activeParticleCount) {\r\n particleSystem.activeParticleCount = parsedParticleSystem.activeParticleCount;\r\n }\r\n\r\n ParticleSystem._Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl);\r\n\r\n if (parsedParticleSystem.worldOffset) {\r\n particleSystem.worldOffset = Vector3.FromArray(parsedParticleSystem.worldOffset);\r\n }\r\n\r\n // Auto start\r\n if (parsedParticleSystem.preventAutoStart) {\r\n particleSystem.preventAutoStart = parsedParticleSystem.preventAutoStart;\r\n }\r\n\r\n if (parsedParticleSystem.metadata) {\r\n particleSystem.metadata = parsedParticleSystem.metadata;\r\n }\r\n\r\n if (!doNotStart && !particleSystem.preventAutoStart) {\r\n particleSystem.start();\r\n }\r\n\r\n return particleSystem;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"gpuParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/gpuParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Immutable, Nullable, float, DataArray } from \"../types\";\r\nimport type { Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport { FactorGradient, ColorGradient, GradientHelper } from \"../Misc/gradients\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color4, TmpColors } from \"../Maths/math.color\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\n\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { BaseParticleSystem } from \"./baseParticleSystem\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { CustomParticleEmitter } from \"./EmitterTypes/customParticleEmitter\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport { GetClass } from \"../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\r\n\r\nimport { Scene } from \"../scene\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\n\r\nimport \"../Engines/Extensions/engine.transformFeedback\";\r\n\r\nimport \"../Shaders/gpuRenderParticles.fragment\";\r\nimport \"../Shaders/gpuRenderParticles.vertex\";\r\nimport { BindFogParameters, BindLogDepth } from \"../Materials/materialHelper.functions\";\r\nimport type { PointParticleEmitter } from \"./EmitterTypes/pointParticleEmitter\";\r\nimport type { HemisphericParticleEmitter } from \"./EmitterTypes/hemisphericParticleEmitter\";\r\nimport type { SphereDirectedParticleEmitter, SphereParticleEmitter } from \"./EmitterTypes/sphereParticleEmitter\";\r\nimport type { CylinderDirectedParticleEmitter, CylinderParticleEmitter } from \"./EmitterTypes/cylinderParticleEmitter\";\r\nimport type { ConeDirectedParticleEmitter, ConeParticleEmitter } from \"./EmitterTypes/coneParticleEmitter\";\r\nimport {\r\n CreateConeEmitter,\r\n CreateCylinderEmitter,\r\n CreateDirectedCylinderEmitter,\r\n CreateDirectedSphereEmitter,\r\n CreateDirectedConeEmitter,\r\n CreateHemisphericEmitter,\r\n CreatePointEmitter,\r\n CreateSphereEmitter,\r\n} from \"./particleSystem.functions\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\n\r\n/**\r\n * This represents a GPU particle system in Babylon\r\n * This is the fastest particle system in Babylon as it uses the GPU to update the individual particle data\r\n * @see https://www.babylonjs-playground.com/#PU4WYI#4\r\n */\r\nexport class GPUParticleSystem extends BaseParticleSystem implements IDisposable, IParticleSystem, IAnimatable {\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public override layerMask: number = 0x0fffffff;\r\n\r\n private _capacity: number;\r\n private _maxActiveParticleCount: number;\r\n private _currentActiveCount: number;\r\n private _accumulatedCount = 0;\r\n private _updateBuffer: UniformBufferEffectCommonAccessor;\r\n\r\n private _buffer0: Buffer;\r\n private _buffer1: Buffer;\r\n private _spriteBuffer: Buffer;\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n private _linesIndexBufferUseInstancing: Nullable<DataBuffer>;\r\n\r\n private _targetIndex = 0;\r\n private _sourceBuffer: Buffer;\r\n private _targetBuffer: Buffer;\r\n\r\n private _currentRenderId = -1;\r\n private _currentRenderingCameraUniqueId = -1;\r\n private _started = false;\r\n private _stopped = false;\r\n\r\n private _timeDelta = 0;\r\n\r\n /** @internal */\r\n public _randomTexture: RawTexture;\r\n /** @internal */\r\n public _randomTexture2: RawTexture;\r\n\r\n /** Indicates that the update of particles is done in the animate function (and not in render). Default: false */\r\n public updateInAnimate = false;\r\n\r\n private _attributesStrideSize: number;\r\n private _cachedUpdateDefines: string;\r\n\r\n private _randomTextureSize: number;\r\n private _actualFrame = 0;\r\n private _drawWrappers: { [blendMode: number]: DrawWrapper };\r\n private _customWrappers: { [blendMode: number]: Nullable<DrawWrapper> };\r\n\r\n private readonly _rawTextureWidth = 256;\r\n\r\n private _platform: IGPUParticleSystemPlatform;\r\n private _rebuildingAfterContextLost = false;\r\n\r\n /**\r\n * Specifies if the particle system should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the GPU particles can be rendered on current browser\r\n */\r\n public static get IsSupported(): boolean {\r\n if (!EngineStore.LastCreatedEngine) {\r\n return false;\r\n }\r\n const caps = EngineStore.LastCreatedEngine.getCaps();\r\n\r\n return caps.supportTransformFeedbacks || caps.supportComputeShaders;\r\n }\r\n\r\n /**\r\n * An event triggered when the system is disposed.\r\n */\r\n public onDisposeObservable = new Observable<IParticleSystem>();\r\n /**\r\n * An event triggered when the system is stopped\r\n */\r\n public onStoppedObservable = new Observable<IParticleSystem>();\r\n\r\n /**\r\n * An event triggered when the system is started\r\n */\r\n public onStartedObservable = new Observable<IParticleSystem>();\r\n\r\n private _createIndexBuffer() {\r\n this._linesIndexBufferUseInstancing = this._engine.createIndexBuffer(new Uint32Array([0, 1, 1, 3, 3, 2, 2, 0, 0, 3]), undefined, \"GPUParticleSystemLinesIndexBuffer\");\r\n }\r\n\r\n /**\r\n * Gets the maximum number of particles active at the same time.\r\n * @returns The max number of active particles.\r\n */\r\n public getCapacity(): number {\r\n return this._capacity;\r\n }\r\n\r\n /**\r\n * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls\r\n * to override the particles.\r\n */\r\n public override forceDepthWrite = false;\r\n\r\n /**\r\n * Gets or set the number of active particles\r\n * The value cannot be greater than \"capacity\" (if it is, it will be limited to \"capacity\").\r\n */\r\n public get maxActiveParticleCount(): number {\r\n return this._maxActiveParticleCount;\r\n }\r\n\r\n public set maxActiveParticleCount(value: number) {\r\n this._maxActiveParticleCount = Math.min(value, this._capacity);\r\n }\r\n\r\n /**\r\n * Gets or set the number of active particles\r\n * @deprecated Please use maxActiveParticleCount instead.\r\n */\r\n public get activeParticleCount(): number {\r\n return this.maxActiveParticleCount;\r\n }\r\n\r\n public set activeParticleCount(value: number) {\r\n this.maxActiveParticleCount = value;\r\n }\r\n\r\n private _preWarmDone = false;\r\n\r\n /**\r\n * Specifies if the particles are updated in emitter local space or world space.\r\n */\r\n public isLocal = false;\r\n\r\n /** Indicates that the particle system is GPU based */\r\n public readonly isGPU = true;\r\n\r\n /** Gets or sets a matrix to use to compute projection */\r\n public defaultProjectionMatrix: Matrix;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the particle system\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * Creates a Point Emitter for the particle system (emits directly from the emitter position)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @returns the emitter\r\n */\r\n public override createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n const particleEmitter = CreatePointEmitter(direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)\r\n * @param radius The radius of the hemisphere to emit from\r\n * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n * @returns the emitter\r\n */\r\n public override createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n const particleEmitter = CreateHemisphericEmitter(radius, radiusRange);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Sphere Emitter for the particle system (emits along the sphere radius)\r\n * @param radius The radius of the sphere to emit from\r\n * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius\r\n * @returns the emitter\r\n */\r\n public override createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n const particleEmitter = CreateSphereEmitter(radius, radiusRange);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the sphere to emit from\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere\r\n * @returns the emitter\r\n */\r\n public override createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedSphereEmitter(radius, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)\r\n * @param radius The radius of the emission cylinder\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius\r\n * @param directionRandomizer How much to randomize the particle direction [0-1]\r\n * @returns the emitter\r\n */\r\n public override createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n const particleEmitter = CreateCylinderEmitter(radius, height, radiusRange, directionRandomizer);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)\r\n * @param radius The radius of the cylinder to emit from\r\n * @param height The height of the emission cylinder\r\n * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder\r\n * @returns the emitter\r\n */\r\n public override createDirectedCylinderEmitter(\r\n radius = 1,\r\n height = 1,\r\n radiusRange = 1,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): CylinderDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedCylinderEmitter(radius, height, radiusRange, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)\r\n * @param radius The radius of the cone to emit from\r\n * @param angle The base angle of the cone\r\n * @returns the emitter\r\n */\r\n public override createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n const particleEmitter = CreateConeEmitter(radius, angle);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n public override createDirectedConeEmitter(\r\n radius = 1,\r\n angle = Math.PI / 4,\r\n direction1 = new Vector3(0, 1.0, 0),\r\n direction2 = new Vector3(0, 1.0, 0)\r\n ): ConeDirectedParticleEmitter {\r\n const particleEmitter = CreateDirectedConeEmitter(radius, angle, direction1, direction2);\r\n this.particleEmitterType = particleEmitter;\r\n return particleEmitter;\r\n }\r\n\r\n /**\r\n * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)\r\n * @param direction1 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param direction2 Particles are emitted between the direction1 and direction2 from within the box\r\n * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @param maxEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox\r\n * @returns the emitter\r\n */\r\n public override createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n const particleEmitter = new BoxParticleEmitter();\r\n this.particleEmitterType = particleEmitter;\r\n this.direction1 = direction1;\r\n this.direction2 = direction2;\r\n this.minEmitBox = minEmitBox;\r\n this.maxEmitBox = maxEmitBox;\r\n return particleEmitter;\r\n }\r\n\r\n /** Flow map */\r\n\r\n /** @internal */\r\n public _flowMap: Nullable<Texture> = null;\r\n\r\n /**\r\n * The strength of the flow map\r\n */\r\n public flowMapStrength = 1.0;\r\n\r\n /** Gets or sets the current flow map */\r\n public get flowMap(): Nullable<Texture> {\r\n return this._flowMap;\r\n }\r\n\r\n public set flowMap(value: Nullable<Texture>) {\r\n if (this._flowMap === value) {\r\n return;\r\n }\r\n\r\n this._flowMap = value;\r\n }\r\n\r\n /**\r\n * Is this system ready to be used/rendered\r\n * @returns true if the system is ready\r\n */\r\n public isReady(): boolean {\r\n if (\r\n !this.emitter ||\r\n (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady()) ||\r\n (this._flowMap && !this._flowMap.isReady()) ||\r\n !this.particleTexture ||\r\n !this.particleTexture.isReady() ||\r\n this._rebuildingAfterContextLost\r\n ) {\r\n return false;\r\n }\r\n\r\n if (this.blendMode !== ParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n if (!this._getWrapper(this.blendMode).effect!.isReady()) {\r\n return false;\r\n }\r\n } else {\r\n if (!this._getWrapper(ParticleSystem.BLENDMODE_MULTIPLY).effect!.isReady()) {\r\n return false;\r\n }\r\n if (!this._getWrapper(ParticleSystem.BLENDMODE_ADD).effect!.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!this._platform.isUpdateBufferCreated()) {\r\n this._recreateUpdateEffect();\r\n return false;\r\n }\r\n\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n /**\r\n * Gets if the system has been started. (Note: this will still be true after stop is called)\r\n * @returns True if it has been started, otherwise false.\r\n */\r\n public isStarted(): boolean {\r\n return this._started;\r\n }\r\n\r\n /**\r\n * Gets if the system has been stopped. (Note: rendering is still happening but the system is frozen)\r\n * @returns True if it has been stopped, otherwise false.\r\n */\r\n public isStopped(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the system is stopping\r\n * @returns true if the system is currently stopping\r\n */\r\n public isStopping() {\r\n return false; // Stop is immediate on GPU\r\n }\r\n\r\n /**\r\n * Gets the number of particles active at the same time.\r\n * @returns The number of active particles.\r\n */\r\n public getActiveCount() {\r\n return this._currentActiveCount;\r\n }\r\n\r\n /**\r\n * Starts the particle system and begins to emit\r\n * @param delay defines the delay in milliseconds before starting the system (this.startDelay by default)\r\n */\r\n public start(delay = this.startDelay): void {\r\n if (!this.targetStopDuration && this._hasTargetStopDurationDependantGradient()) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Particle system started with a targetStopDuration dependant gradient (eg. startSizeGradients) but no targetStopDuration set\";\r\n }\r\n if (delay) {\r\n setTimeout(() => {\r\n this.start(0);\r\n }, delay);\r\n return;\r\n }\r\n this._started = true;\r\n this._stopped = false;\r\n this._actualFrame = 0;\r\n this._preWarmDone = false;\r\n\r\n // Animations\r\n if (this.beginAnimationOnStart && this.animations && this.animations.length > 0 && this._scene) {\r\n this._scene.beginAnimation(this, this.beginAnimationFrom, this.beginAnimationTo, this.beginAnimationLoop);\r\n }\r\n }\r\n\r\n /**\r\n * Stops the particle system.\r\n */\r\n public stop(): void {\r\n if (this._stopped) {\r\n return;\r\n }\r\n\r\n this.onStoppedObservable.notifyObservers(this);\r\n\r\n this._stopped = true;\r\n }\r\n\r\n /**\r\n * Remove all active particles\r\n */\r\n public reset(): void {\r\n this._releaseBuffers();\r\n this._platform.releaseVertexBuffers();\r\n this._currentActiveCount = 0;\r\n this._targetIndex = 0;\r\n }\r\n\r\n /**\r\n * Returns the string \"GPUParticleSystem\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"GPUParticleSystem\";\r\n }\r\n\r\n /**\r\n * Gets the custom effect used to render the particles\r\n * @param blendMode Blend mode for which the effect should be retrieved\r\n * @returns The effect\r\n */\r\n public getCustomEffect(blendMode: number = 0): Nullable<Effect> {\r\n return this._customWrappers[blendMode]?.effect ?? this._customWrappers[0]!.effect;\r\n }\r\n\r\n private _getCustomDrawWrapper(blendMode: number = 0): Nullable<DrawWrapper> {\r\n return this._customWrappers[blendMode] ?? this._customWrappers[0];\r\n }\r\n\r\n /**\r\n * Sets the custom effect used to render the particles\r\n * @param effect The effect to set\r\n * @param blendMode Blend mode for which the effect should be set\r\n */\r\n public setCustomEffect(effect: Nullable<Effect>, blendMode: number = 0) {\r\n this._customWrappers[blendMode] = new DrawWrapper(this._engine);\r\n this._customWrappers[blendMode].effect = effect;\r\n }\r\n\r\n /** @internal */\r\n protected _onBeforeDrawParticlesObservable: Nullable<Observable<Nullable<Effect>>> = null;\r\n\r\n /**\r\n * Observable that will be called just before the particles are drawn\r\n */\r\n public get onBeforeDrawParticlesObservable(): Observable<Nullable<Effect>> {\r\n if (!this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable = new Observable<Nullable<Effect>>();\r\n }\r\n\r\n return this._onBeforeDrawParticlesObservable;\r\n }\r\n\r\n /**\r\n * Gets the name of the particle vertex shader\r\n */\r\n public get vertexShaderName(): string {\r\n return \"gpuRenderParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers used by the particle system\r\n * Should be called after render() has been called for the current frame so that the buffers returned are the ones that have been updated\r\n * in the current frame (there's a ping-pong between two sets of buffers - for a given frame, one set is used as the source and the other as the destination)\r\n */\r\n public get vertexBuffers(): Immutable<{ [key: string]: VertexBuffer }> {\r\n // We return the other buffers than those corresponding to this._targetIndex because it is assumed vertexBuffers will be called in the current frame\r\n // after render() has been called, meaning that the buffers have already been swapped and this._targetIndex points to the buffers that will be updated\r\n // in the next frame (and which are the sources in this frame) and (this._targetIndex ^ 1) points to the buffers that have been updated this frame\r\n // (and that will be the source buffers in the next frame)\r\n return this._renderVertexBuffers[this._targetIndex ^ 1];\r\n }\r\n\r\n /**\r\n * Gets the index buffer used by the particle system (null for GPU particle systems)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /** @internal */\r\n public _colorGradientsTexture: RawTexture;\r\n\r\n protected override _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: RawTexture): BaseParticleSystem {\r\n super._removeGradientAndTexture(gradient, gradients, texture);\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new color gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param color1 defines the color to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addColorGradient(gradient: number, color1: Color4): GPUParticleSystem {\r\n if (!this._colorGradients) {\r\n this._colorGradients = [];\r\n }\r\n\r\n const colorGradient = new ColorGradient(gradient, color1);\r\n this._colorGradients.push(colorGradient);\r\n\r\n this._refreshColorGradient(true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n private _refreshColorGradient(reorder = false) {\r\n if (this._colorGradients) {\r\n if (reorder) {\r\n this._colorGradients.sort((a, b) => {\r\n if (a.gradient < b.gradient) {\r\n return -1;\r\n } else if (a.gradient > b.gradient) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n this._colorGradientsTexture.dispose();\r\n (<any>this._colorGradientsTexture) = null;\r\n }\r\n }\r\n }\r\n\r\n /** Force the system to rebuild all gradients that need to be resync */\r\n public forceRefreshGradients() {\r\n this._refreshColorGradient();\r\n this._refreshFactorGradient(this._sizeGradients, \"_sizeGradientsTexture\");\r\n this._refreshFactorGradient(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\");\r\n this._refreshFactorGradient(this._velocityGradients, \"_velocityGradientsTexture\");\r\n this._refreshFactorGradient(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\");\r\n this._refreshFactorGradient(this._dragGradients, \"_dragGradientsTexture\");\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Remove a specific color gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeColorGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._colorGradients, this._colorGradientsTexture);\r\n (<any>this._colorGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resets the draw wrappers cache\r\n */\r\n public resetDrawCache(): void {\r\n for (const blendMode in this._drawWrappers) {\r\n const drawWrapper = this._drawWrappers[blendMode];\r\n drawWrapper.drawContext?.reset();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _angularSpeedGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _sizeGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _velocityGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _limitVelocityGradientsTexture: RawTexture;\r\n /** @internal */\r\n public _dragGradientsTexture: RawTexture;\r\n\r\n private _addFactorGradient(factorGradients: FactorGradient[], gradient: number, factor: number) {\r\n const valueGradient = new FactorGradient(gradient, factor);\r\n factorGradients.push(valueGradient);\r\n\r\n this._releaseBuffers();\r\n }\r\n\r\n /**\r\n * Adds a new size gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the size factor to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addSizeGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._sizeGradients) {\r\n this._sizeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._sizeGradients, gradient, factor);\r\n\r\n this._refreshFactorGradient(this._sizeGradients, \"_sizeGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific size gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeSizeGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._sizeGradients, this._sizeGradientsTexture);\r\n (<any>this._sizeGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n private _refreshFactorGradient(factorGradients: Nullable<FactorGradient[]>, textureName: string, reorder = false) {\r\n if (!factorGradients) {\r\n return;\r\n }\r\n\r\n if (reorder) {\r\n factorGradients.sort((a, b) => {\r\n if (a.gradient < b.gradient) {\r\n return -1;\r\n } else if (a.gradient > b.gradient) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n\r\n const that = this as any;\r\n if (that[textureName]) {\r\n that[textureName].dispose();\r\n that[textureName] = null;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a new angular speed gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the angular speed to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addAngularSpeedGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._angularSpeedGradients) {\r\n this._angularSpeedGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._angularSpeedGradients, gradient, factor);\r\n this._refreshFactorGradient(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific angular speed gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeAngularSpeedGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._angularSpeedGradients, this._angularSpeedGradientsTexture);\r\n (<any>this._angularSpeedGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new velocity gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the velocity to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addVelocityGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._velocityGradients) {\r\n this._velocityGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._velocityGradients, gradient, factor);\r\n this._refreshFactorGradient(this._velocityGradients, \"_velocityGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific velocity gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeVelocityGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._velocityGradients, this._velocityGradientsTexture);\r\n (<any>this._velocityGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new limit velocity gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the limit velocity value to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addLimitVelocityGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._limitVelocityGradients) {\r\n this._limitVelocityGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._limitVelocityGradients, gradient, factor);\r\n this._refreshFactorGradient(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific limit velocity gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeLimitVelocityGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._limitVelocityGradients, this._limitVelocityGradientsTexture);\r\n (<any>this._limitVelocityGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new drag gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the drag value to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addDragGradient(gradient: number, factor: number): GPUParticleSystem {\r\n if (!this._dragGradients) {\r\n this._dragGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._dragGradients, gradient, factor);\r\n this._refreshFactorGradient(this._dragGradients, \"_dragGradientsTexture\", true);\r\n\r\n this._releaseBuffers();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific drag gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeDragGradient(gradient: number): GPUParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._dragGradients, this._dragGradientsTexture);\r\n (<any>this._dragGradientsTexture) = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addEmitRateGradient(): IParticleSystem {\r\n // Do nothing as emit rate is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeEmitRateGradient(): IParticleSystem {\r\n // Do nothing as emit rate is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addStartSizeGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeStartSizeGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addColorRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeColorRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addAlphaRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeAlphaRemapGradient(): IParticleSystem {\r\n // Do nothing as start size is not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addRampGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeRampGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the list of ramp gradients\r\n */\r\n public getRampGradients(): Nullable<Array<Color3Gradient>> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * Gets or sets a boolean indicating that ramp gradients must be used\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro#ramp-gradients\r\n */\r\n public get useRampGradients(): boolean {\r\n //Not supported by GPUParticleSystem\r\n return false;\r\n }\r\n\r\n public set useRampGradients(value: boolean) {\r\n //Not supported by GPUParticleSystem\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public addLifeTimeGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Not supported by GPUParticleSystem\r\n * @returns the current particle system\r\n */\r\n public removeLifeTimeGradient(): IParticleSystem {\r\n //Not supported by GPUParticleSystem\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a GPU particle system.\r\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.\r\n * @param name The name of the particle system\r\n * @param options The options used to create the system\r\n * @param sceneOrEngine The scene the particle system belongs to or the engine to use if no scene\r\n * @param customEffect a custom effect used to change the way particles are rendered by default\r\n * @param isAnimationSheetEnabled Must be true if using a spritesheet to animate the particles texture\r\n */\r\n constructor(\r\n name: string,\r\n options: Partial<{\r\n capacity: number;\r\n randomTextureSize: number;\r\n }>,\r\n sceneOrEngine: Scene | AbstractEngine,\r\n customEffect: Nullable<Effect> = null,\r\n isAnimationSheetEnabled: boolean = false\r\n ) {\r\n super(name);\r\n\r\n if (!sceneOrEngine || sceneOrEngine.getClassName() === \"Scene\") {\r\n this._scene = (sceneOrEngine as Scene) || EngineStore.LastCreatedScene;\r\n this._engine = this._scene.getEngine();\r\n this.uniqueId = this._scene.getUniqueId();\r\n this._scene.particleSystems.push(this);\r\n } else {\r\n this._engine = sceneOrEngine as AbstractEngine;\r\n this.defaultProjectionMatrix = Matrix.PerspectiveFovLH(0.8, 1, 0.1, 100, this._engine.isNDCHalfZRange);\r\n }\r\n\r\n if (this._engine.getCaps().supportComputeShaders) {\r\n if (!GetClass(\"BABYLON.ComputeShaderParticleSystem\")) {\r\n throw new Error(\"The ComputeShaderParticleSystem class is not available! Make sure you have imported it.\");\r\n }\r\n this._platform = new (GetClass(\"BABYLON.ComputeShaderParticleSystem\"))(this, this._engine);\r\n } else {\r\n if (!GetClass(\"BABYLON.WebGL2ParticleSystem\")) {\r\n throw new Error(\"The WebGL2ParticleSystem class is not available! Make sure you have imported it.\");\r\n }\r\n this._platform = new (GetClass(\"BABYLON.WebGL2ParticleSystem\"))(this, this._engine);\r\n }\r\n\r\n this._customWrappers = { 0: new DrawWrapper(this._engine) };\r\n this._customWrappers[0]!.effect = customEffect;\r\n\r\n this._drawWrappers = { 0: new DrawWrapper(this._engine) };\r\n if (this._drawWrappers[0].drawContext) {\r\n this._drawWrappers[0].drawContext.useInstancing = true;\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n\r\n options = options ?? {};\r\n\r\n if (!options.randomTextureSize) {\r\n delete options.randomTextureSize;\r\n }\r\n\r\n const fullOptions = {\r\n capacity: 50000,\r\n randomTextureSize: this._engine.getCaps().maxTextureSize,\r\n ...options,\r\n };\r\n\r\n const optionsAsNumber = <number>options;\r\n if (isFinite(optionsAsNumber)) {\r\n fullOptions.capacity = optionsAsNumber;\r\n }\r\n\r\n this._capacity = fullOptions.capacity;\r\n this._maxActiveParticleCount = fullOptions.capacity;\r\n this._currentActiveCount = 0;\r\n this._isAnimationSheetEnabled = isAnimationSheetEnabled;\r\n\r\n this.particleEmitterType = new BoxParticleEmitter();\r\n\r\n // Random data\r\n const maxTextureSize = Math.min(this._engine.getCaps().maxTextureSize, fullOptions.randomTextureSize);\r\n let d = [];\r\n for (let i = 0; i < maxTextureSize; ++i) {\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n }\r\n this._randomTexture = new RawTexture(\r\n new Float32Array(d),\r\n maxTextureSize,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n sceneOrEngine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._randomTexture.name = \"GPUParticleSystem_random1\";\r\n this._randomTexture.wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n this._randomTexture.wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n d = [];\r\n for (let i = 0; i < maxTextureSize; ++i) {\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n d.push(Math.random());\r\n }\r\n this._randomTexture2 = new RawTexture(\r\n new Float32Array(d),\r\n maxTextureSize,\r\n 1,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n sceneOrEngine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n this._randomTexture2.name = \"GPUParticleSystem_random2\";\r\n this._randomTexture2.wrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n this._randomTexture2.wrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n\r\n this._randomTextureSize = maxTextureSize;\r\n }\r\n\r\n protected override _reset() {\r\n this._releaseBuffers();\r\n }\r\n\r\n private _createVertexBuffers(updateBuffer: Buffer, renderBuffer: Buffer, spriteSource: Buffer): void {\r\n const renderVertexBuffers: { [key: string]: VertexBuffer } = {};\r\n renderVertexBuffers[\"position\"] = renderBuffer.createVertexBuffer(\"position\", 0, 3, this._attributesStrideSize, true);\r\n let offset = 3;\r\n renderVertexBuffers[\"age\"] = renderBuffer.createVertexBuffer(\"age\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n renderVertexBuffers[\"size\"] = renderBuffer.createVertexBuffer(\"size\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n renderVertexBuffers[\"life\"] = renderBuffer.createVertexBuffer(\"life\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n offset += 4; // seed\r\n if (this.billboardMode === ParticleSystem.BILLBOARDMODE_STRETCHED) {\r\n renderVertexBuffers[\"direction\"] = renderBuffer.createVertexBuffer(\"direction\", offset, 3, this._attributesStrideSize, true);\r\n }\r\n offset += 3; // direction\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n\r\n if (this.particleEmitterType instanceof CustomParticleEmitter) {\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (!this._colorGradientsTexture) {\r\n renderVertexBuffers[\"color\"] = renderBuffer.createVertexBuffer(\"color\", offset, 4, this._attributesStrideSize, true);\r\n offset += 4;\r\n }\r\n\r\n if (!this._isBillboardBased) {\r\n renderVertexBuffers[\"initialDirection\"] = renderBuffer.createVertexBuffer(\"initialDirection\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n renderVertexBuffers[\"noiseCoordinates1\"] = renderBuffer.createVertexBuffer(\"noiseCoordinates1\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n renderVertexBuffers[\"noiseCoordinates2\"] = renderBuffer.createVertexBuffer(\"noiseCoordinates2\", offset, 3, this._attributesStrideSize, true);\r\n offset += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n offset += 1;\r\n }\r\n }\r\n\r\n renderVertexBuffers[\"angle\"] = renderBuffer.createVertexBuffer(\"angle\", offset, 1, this._attributesStrideSize, true);\r\n if (this._angularSpeedGradientsTexture) {\r\n offset++;\r\n } else {\r\n offset += 2;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n renderVertexBuffers[\"cellIndex\"] = renderBuffer.createVertexBuffer(\"cellIndex\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n if (this.spriteRandomStartCell) {\r\n renderVertexBuffers[\"cellStartOffset\"] = renderBuffer.createVertexBuffer(\"cellStartOffset\", offset, 1, this._attributesStrideSize, true);\r\n offset += 1;\r\n }\r\n }\r\n\r\n renderVertexBuffers[\"offset\"] = spriteSource.createVertexBuffer(\"offset\", 0, 2);\r\n renderVertexBuffers[\"uv\"] = spriteSource.createVertexBuffer(\"uv\", 2, 2);\r\n\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n\r\n this._platform.createVertexBuffers(updateBuffer, renderVertexBuffers);\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _initialize(force = false): void {\r\n if (this._buffer0 && !force) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const data: float[] = [];\r\n\r\n this._attributesStrideSize = 21;\r\n this._targetIndex = 0;\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n\r\n if (this.particleEmitterType instanceof CustomParticleEmitter) {\r\n this._attributesStrideSize += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (!this.isBillboardBased) {\r\n this._attributesStrideSize += 3;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n this._attributesStrideSize -= 4;\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n this._attributesStrideSize -= 1;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n this._attributesStrideSize += 1;\r\n if (this.spriteRandomStartCell) {\r\n this._attributesStrideSize += 1;\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n this._attributesStrideSize += 6;\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 2;\r\n }\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n this._attributesStrideSize += 3 - ((this._attributesStrideSize + 3) & 3); // round to multiple of 4\r\n }\r\n\r\n const usingCustomEmitter = this.particleEmitterType instanceof CustomParticleEmitter;\r\n const tmpVector = TmpVectors.Vector3[0];\r\n\r\n let offset = 0;\r\n for (let particleIndex = 0; particleIndex < this._capacity; particleIndex++) {\r\n // position\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n\r\n // Age\r\n data.push(0.0); // create the particle as a dead one to create a new one at start\r\n\r\n // Size\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n\r\n // life\r\n data.push(0.0);\r\n\r\n // Seed\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n\r\n // direction\r\n if (usingCustomEmitter) {\r\n (this.particleEmitterType as CustomParticleEmitter).particleDestinationGenerator(particleIndex, null, tmpVector);\r\n data.push(tmpVector.x);\r\n data.push(tmpVector.y);\r\n data.push(tmpVector.z);\r\n } else {\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy0\r\n }\r\n\r\n offset += 16; // position, age, size, life, seed, direction, dummy0\r\n\r\n if (usingCustomEmitter) {\r\n (this.particleEmitterType as CustomParticleEmitter).particlePositionGenerator(particleIndex, null, tmpVector);\r\n data.push(tmpVector.x);\r\n data.push(tmpVector.y);\r\n data.push(tmpVector.z);\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy1\r\n }\r\n offset += 4;\r\n }\r\n\r\n if (!this._colorGradientsTexture) {\r\n // color\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n offset += 4;\r\n }\r\n\r\n if (!this.isBillboardBased) {\r\n // initialDirection\r\n data.push(0.0);\r\n data.push(0.0);\r\n data.push(0.0);\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy2\r\n }\r\n offset += 4;\r\n }\r\n\r\n if (this.noiseTexture) {\r\n // Random coordinates for reading into noise texture\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy3\r\n }\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n data.push(Math.random());\r\n if (this._platform.alignDataInBuffer) {\r\n data.push(0.0); // dummy4\r\n }\r\n offset += 8;\r\n }\r\n\r\n // angle\r\n data.push(0.0);\r\n offset += 1;\r\n\r\n if (!this._angularSpeedGradientsTexture) {\r\n data.push(0.0);\r\n offset += 1;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n data.push(0.0);\r\n offset += 1;\r\n if (this.spriteRandomStartCell) {\r\n data.push(0.0);\r\n offset += 1;\r\n }\r\n }\r\n\r\n if (this._platform.alignDataInBuffer) {\r\n let numDummies = 3 - ((offset + 3) & 3);\r\n offset += numDummies;\r\n while (numDummies-- > 0) {\r\n data.push(0.0);\r\n }\r\n }\r\n }\r\n\r\n // Sprite data\r\n const spriteData = new Float32Array([0.5, 0.5, 1, 1, -0.5, 0.5, 0, 1, 0.5, -0.5, 1, 0, -0.5, -0.5, 0, 0]);\r\n\r\n const bufferData1: DataArray | DataBuffer = this._platform.createParticleBuffer(data);\r\n const bufferData2: DataArray | DataBuffer = this._platform.createParticleBuffer(data);\r\n\r\n // Buffers\r\n this._buffer0 = new Buffer(engine, bufferData1, false, this._attributesStrideSize);\r\n this._buffer1 = new Buffer(engine, bufferData2, false, this._attributesStrideSize);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 4);\r\n\r\n // Update & Render vertex buffers\r\n this._renderVertexBuffers = [];\r\n this._createVertexBuffers(this._buffer0, this._buffer1, this._spriteBuffer);\r\n this._createVertexBuffers(this._buffer1, this._buffer0, this._spriteBuffer);\r\n\r\n // Links\r\n this._sourceBuffer = this._buffer0;\r\n this._targetBuffer = this._buffer1;\r\n }\r\n\r\n /** @internal */\r\n public _recreateUpdateEffect() {\r\n this._createColorGradientTexture();\r\n this._createSizeGradientTexture();\r\n this._createAngularSpeedGradientTexture();\r\n this._createVelocityGradientTexture();\r\n this._createLimitVelocityGradientTexture();\r\n this._createDragGradientTexture();\r\n\r\n let defines = this.particleEmitterType ? this.particleEmitterType.getEffectDefines() : \"\";\r\n\r\n if (this._isBillboardBased) {\r\n defines += \"\\n#define BILLBOARD\";\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n defines += \"\\n#define COLORGRADIENTS\";\r\n }\r\n\r\n if (this._sizeGradientsTexture) {\r\n defines += \"\\n#define SIZEGRADIENTS\";\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n defines += \"\\n#define ANGULARSPEEDGRADIENTS\";\r\n }\r\n\r\n if (this._velocityGradientsTexture) {\r\n defines += \"\\n#define VELOCITYGRADIENTS\";\r\n }\r\n\r\n if (this._limitVelocityGradientsTexture) {\r\n defines += \"\\n#define LIMITVELOCITYGRADIENTS\";\r\n }\r\n\r\n if (this._dragGradientsTexture) {\r\n defines += \"\\n#define DRAGGRADIENTS\";\r\n }\r\n\r\n if (this._flowMap) {\r\n defines += \"\\n#define FLOWMAP\";\r\n }\r\n\r\n if (this.isAnimationSheetEnabled) {\r\n defines += \"\\n#define ANIMATESHEET\";\r\n if (this.spriteRandomStartCell) {\r\n defines += \"\\n#define ANIMATESHEETRANDOMSTART\";\r\n }\r\n }\r\n\r\n if (this.noiseTexture) {\r\n defines += \"\\n#define NOISE\";\r\n }\r\n\r\n if (this.isLocal) {\r\n defines += \"\\n#define LOCAL\";\r\n }\r\n\r\n if (this._platform.isUpdateBufferCreated() && this._cachedUpdateDefines === defines) {\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n this._cachedUpdateDefines = defines;\r\n this._updateBuffer = this._platform.createUpdateBuffer(defines);\r\n\r\n return this._platform.isUpdateBufferReady();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getWrapper(blendMode: number): DrawWrapper {\r\n const customWrapper = this._getCustomDrawWrapper(blendMode);\r\n\r\n if (customWrapper?.effect) {\r\n return customWrapper;\r\n }\r\n\r\n const defines: Array<string> = [];\r\n\r\n this.fillDefines(defines, blendMode);\r\n\r\n // Effect\r\n let drawWrapper = this._drawWrappers[blendMode];\r\n if (!drawWrapper) {\r\n drawWrapper = new DrawWrapper(this._engine);\r\n if (drawWrapper.drawContext) {\r\n drawWrapper.drawContext.useInstancing = true;\r\n }\r\n this._drawWrappers[blendMode] = drawWrapper;\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (drawWrapper.defines !== join) {\r\n const attributes: Array<string> = [];\r\n const uniforms: Array<string> = [];\r\n const samplers: Array<string> = [];\r\n\r\n this.fillUniformsAttributesAndSamplerNames(uniforms, attributes, samplers);\r\n\r\n drawWrapper.setEffect(this._engine.createEffect(\"gpuRenderParticles\", attributes, uniforms, samplers, join), join);\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetAttributeNamesOrOptions(hasColorGradients = false, isAnimationSheetEnabled = false, isBillboardBased = false, isBillboardStretched = false): string[] {\r\n const attributeNamesOrOptions = [VertexBuffer.PositionKind, \"age\", \"life\", \"size\", \"angle\"];\r\n\r\n if (!hasColorGradients) {\r\n attributeNamesOrOptions.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (isAnimationSheetEnabled) {\r\n attributeNamesOrOptions.push(\"cellIndex\");\r\n }\r\n\r\n if (!isBillboardBased) {\r\n attributeNamesOrOptions.push(\"initialDirection\");\r\n }\r\n\r\n if (isBillboardStretched) {\r\n attributeNamesOrOptions.push(\"direction\");\r\n }\r\n\r\n attributeNamesOrOptions.push(\"offset\", VertexBuffer.UVKind);\r\n\r\n return attributeNamesOrOptions;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetEffectCreationOptions(isAnimationSheetEnabled = false, useLogarithmicDepth = false, applyFog = false): string[] {\r\n const effectCreationOption = [\"emitterWM\", \"worldOffset\", \"view\", \"projection\", \"colorDead\", \"invView\", \"translationPivot\", \"eyePosition\"];\r\n AddClipPlaneUniforms(effectCreationOption);\r\n\r\n if (isAnimationSheetEnabled) {\r\n effectCreationOption.push(\"sheetInfos\");\r\n }\r\n if (useLogarithmicDepth) {\r\n effectCreationOption.push(\"logarithmicDepthConstant\");\r\n }\r\n\r\n if (applyFog) {\r\n effectCreationOption.push(\"vFogInfos\");\r\n effectCreationOption.push(\"vFogColor\");\r\n }\r\n\r\n return effectCreationOption;\r\n }\r\n\r\n /**\r\n * Fill the defines array according to the current settings of the particle system\r\n * @param defines Array to be updated\r\n * @param blendMode blend mode to take into account when updating the array\r\n * @param fillImageProcessing fills the image processing defines\r\n */\r\n public fillDefines(defines: Array<string>, blendMode: number = 0, fillImageProcessing: boolean = true): void {\r\n if (this._scene) {\r\n PrepareStringDefinesForClipPlanes(this, this._scene, defines);\r\n if (this.applyFog && this._scene.fogEnabled && this._scene.fogMode !== Scene.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n }\r\n }\r\n\r\n if (blendMode === ParticleSystem.BLENDMODE_MULTIPLY) {\r\n defines.push(\"#define BLENDMULTIPLYMODE\");\r\n }\r\n\r\n if (this.isLocal) {\r\n defines.push(\"#define LOCAL\");\r\n }\r\n\r\n if (this.useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n\r\n if (this._isBillboardBased) {\r\n defines.push(\"#define BILLBOARD\");\r\n\r\n switch (this.billboardMode) {\r\n case ParticleSystem.BILLBOARDMODE_Y:\r\n defines.push(\"#define BILLBOARDY\");\r\n break;\r\n case ParticleSystem.BILLBOARDMODE_STRETCHED:\r\n defines.push(\"#define BILLBOARDSTRETCHED\");\r\n break;\r\n case ParticleSystem.BILLBOARDMODE_ALL:\r\n defines.push(\"#define BILLBOARDMODE_ALL\");\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n if (this._colorGradientsTexture) {\r\n defines.push(\"#define COLORGRADIENTS\");\r\n }\r\n\r\n if (this.isAnimationSheetEnabled) {\r\n defines.push(\"#define ANIMATESHEET\");\r\n }\r\n\r\n if (fillImageProcessing && this._imageProcessingConfiguration) {\r\n this._imageProcessingConfiguration.prepareDefines(this._imageProcessingConfigurationDefines);\r\n defines.push(\"\" + this._imageProcessingConfigurationDefines.toString());\r\n }\r\n }\r\n\r\n /**\r\n * Fill the uniforms, attributes and samplers arrays according to the current settings of the particle system\r\n * @param uniforms Uniforms array to fill\r\n * @param attributes Attributes array to fill\r\n * @param samplers Samplers array to fill\r\n */\r\n public fillUniformsAttributesAndSamplerNames(uniforms: Array<string>, attributes: Array<string>, samplers: Array<string>) {\r\n attributes.push(\r\n ...GPUParticleSystem._GetAttributeNamesOrOptions(\r\n !!this._colorGradientsTexture,\r\n this._isAnimationSheetEnabled,\r\n this._isBillboardBased,\r\n this._isBillboardBased && this.billboardMode === ParticleSystem.BILLBOARDMODE_STRETCHED\r\n )\r\n );\r\n\r\n uniforms.push(...GPUParticleSystem._GetEffectCreationOptions(this._isAnimationSheetEnabled, this.useLogarithmicDepth, this.applyFog));\r\n\r\n samplers.push(\"diffuseSampler\", \"colorGradientSampler\");\r\n\r\n if (this._imageProcessingConfiguration) {\r\n ImageProcessingConfiguration.PrepareUniforms(uniforms, this._imageProcessingConfigurationDefines);\r\n ImageProcessingConfiguration.PrepareSamplers(samplers, this._imageProcessingConfigurationDefines);\r\n }\r\n }\r\n\r\n /**\r\n * Animates the particle system for the current frame by emitting new particles and or animating the living ones.\r\n * @param preWarm defines if we are in the pre-warmimg phase\r\n */\r\n public animate(preWarm = false): void {\r\n this._timeDelta = this.updateSpeed * (preWarm ? this.preWarmStepOffset : this._scene?.getAnimationRatio() || 1);\r\n this._actualFrame += this._timeDelta;\r\n\r\n if (!this._stopped) {\r\n if (this.targetStopDuration && this._actualFrame >= this.targetStopDuration) {\r\n this.stop();\r\n }\r\n }\r\n\r\n if (this.updateInAnimate) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _createFactorGradientTexture(factorGradients: Nullable<IValueGradient[]>, textureName: string) {\r\n const texture: RawTexture = (<any>this)[textureName];\r\n\r\n if (!factorGradients || !factorGradients.length || texture) {\r\n return;\r\n }\r\n\r\n const data = new Float32Array(this._rawTextureWidth);\r\n\r\n for (let x = 0; x < this._rawTextureWidth; x++) {\r\n const ratio = x / this._rawTextureWidth;\r\n\r\n GradientHelper.GetCurrentGradient(ratio, factorGradients, (currentGradient, nextGradient, scale) => {\r\n data[x] = Lerp((<FactorGradient>currentGradient).factor1, (<FactorGradient>nextGradient).factor1, scale);\r\n });\r\n }\r\n\r\n (<any>this)[textureName] = RawTexture.CreateRTexture(data, this._rawTextureWidth, 1, this._scene || this._engine, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n (<any>this)[textureName].name = textureName.substring(1);\r\n }\r\n\r\n private _createSizeGradientTexture() {\r\n this._createFactorGradientTexture(this._sizeGradients, \"_sizeGradientsTexture\");\r\n }\r\n\r\n private _createAngularSpeedGradientTexture() {\r\n this._createFactorGradientTexture(this._angularSpeedGradients, \"_angularSpeedGradientsTexture\");\r\n }\r\n\r\n private _createVelocityGradientTexture() {\r\n this._createFactorGradientTexture(this._velocityGradients, \"_velocityGradientsTexture\");\r\n }\r\n\r\n private _createLimitVelocityGradientTexture() {\r\n this._createFactorGradientTexture(this._limitVelocityGradients, \"_limitVelocityGradientsTexture\");\r\n }\r\n\r\n private _createDragGradientTexture() {\r\n this._createFactorGradientTexture(this._dragGradients, \"_dragGradientsTexture\");\r\n }\r\n\r\n private _createColorGradientTexture() {\r\n if (!this._colorGradients || !this._colorGradients.length || this._colorGradientsTexture) {\r\n return;\r\n }\r\n\r\n const data = new Uint8Array(this._rawTextureWidth * 4);\r\n const tmpColor = TmpColors.Color4[0];\r\n\r\n for (let x = 0; x < this._rawTextureWidth; x++) {\r\n const ratio = x / this._rawTextureWidth;\r\n\r\n GradientHelper.GetCurrentGradient(ratio, this._colorGradients, (currentGradient, nextGradient, scale) => {\r\n Color4.LerpToRef((<ColorGradient>currentGradient).color1, (<ColorGradient>nextGradient).color1, scale, tmpColor);\r\n data[x * 4] = tmpColor.r * 255;\r\n data[x * 4 + 1] = tmpColor.g * 255;\r\n data[x * 4 + 2] = tmpColor.b * 255;\r\n data[x * 4 + 3] = tmpColor.a * 255;\r\n });\r\n }\r\n\r\n this._colorGradientsTexture = RawTexture.CreateRGBATexture(data, this._rawTextureWidth, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n this._colorGradientsTexture.name = \"colorGradients\";\r\n }\r\n\r\n private _render(blendMode: number, emitterWM: Matrix): number {\r\n // Enable render effect\r\n const drawWrapper = this._getWrapper(blendMode);\r\n const effect = drawWrapper.effect!;\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n const viewMatrix = this._scene?.getViewMatrix() || Matrix.IdentityReadOnly;\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", this.defaultProjectionMatrix ?? this._scene!.getProjectionMatrix());\r\n effect.setTexture(\"diffuseSampler\", this.particleTexture);\r\n effect.setVector2(\"translationPivot\", this.translationPivot);\r\n const worldOffset = this.worldOffset.subtractToRef(this._scene?.floatingOriginOffset || Vector3.ZeroReadOnly, TmpVectors.Vector3[0]);\r\n effect.setVector3(\"worldOffset\", worldOffset);\r\n if (this.isLocal) {\r\n effect.setMatrix(\"emitterWM\", emitterWM);\r\n }\r\n if (this._colorGradientsTexture) {\r\n effect.setTexture(\"colorGradientSampler\", this._colorGradientsTexture);\r\n } else {\r\n effect.setDirectColor4(\"colorDead\", this.colorDead);\r\n }\r\n\r\n if (this._isAnimationSheetEnabled && this.particleTexture) {\r\n const baseSize = this.particleTexture.getBaseSize();\r\n effect.setFloat3(\"sheetInfos\", this.spriteCellWidth / baseSize.width, this.spriteCellHeight / baseSize.height, baseSize.width / this.spriteCellWidth);\r\n }\r\n\r\n if (this._isBillboardBased && this._scene) {\r\n const camera = this._scene.activeCamera!;\r\n effect.setVector3(\"eyePosition\", camera.globalPosition);\r\n }\r\n\r\n const defines = effect.defines;\r\n\r\n if (this._scene) {\r\n BindClipPlane(effect, this, this._scene);\r\n\r\n if (this.applyFog) {\r\n BindFogParameters(this._scene, undefined, effect);\r\n }\r\n }\r\n\r\n if (defines.indexOf(\"#define BILLBOARDMODE_ALL\") >= 0) {\r\n const invView = viewMatrix.clone();\r\n invView.invert();\r\n effect.setMatrix(\"invView\", invView);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth && this._scene) {\r\n BindLogDepth(defines, effect, this._scene);\r\n }\r\n\r\n // image processing\r\n if (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.applyByPostProcess) {\r\n this._imageProcessingConfiguration.bind(effect);\r\n }\r\n\r\n // Draw order\r\n this._setEngineBasedOnBlendMode(blendMode);\r\n\r\n // Bind source VAO\r\n this._platform.bindDrawBuffers(this._targetIndex, effect, this._scene?.forceWireframe ? this._linesIndexBufferUseInstancing : null);\r\n\r\n if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.notifyObservers(effect);\r\n }\r\n\r\n // Render\r\n if (this._scene?.forceWireframe) {\r\n this._engine.drawElementsType(Constants.MATERIAL_LineStripDrawMode, 0, 10, this._currentActiveCount);\r\n } else {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, this._currentActiveCount);\r\n }\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this._scene?.forceWireframe) {\r\n this._engine.unbindInstanceAttributes();\r\n }\r\n\r\n return this._currentActiveCount;\r\n }\r\n\r\n /** @internal */\r\n public _update(emitterWM?: Matrix): void {\r\n if (!this.emitter || !this._targetBuffer) {\r\n return;\r\n }\r\n\r\n if (!this._recreateUpdateEffect() || this._rebuildingAfterContextLost) {\r\n return;\r\n }\r\n\r\n if (!emitterWM) {\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n emitterWM = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n emitterWM = TmpVectors.Matrix[0];\r\n Matrix.TranslationToRef(emitterPosition.x, emitterPosition.y, emitterPosition.z, emitterWM);\r\n }\r\n }\r\n\r\n const engine = this._engine as Engine;\r\n const depthWriteState = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n\r\n this._platform.preUpdateParticleBuffer();\r\n\r\n this._updateBuffer.setFloat(\"currentCount\", this._currentActiveCount);\r\n this._updateBuffer.setFloat(\"timeDelta\", this._timeDelta);\r\n this._updateBuffer.setFloat(\"stopFactor\", this._stopped ? 0 : 1);\r\n this._updateBuffer.setInt(\"randomTextureSize\", this._randomTextureSize);\r\n this._updateBuffer.setFloat2(\"lifeTime\", this.minLifeTime, this.maxLifeTime);\r\n this._updateBuffer.setFloat2(\"emitPower\", this.minEmitPower, this.maxEmitPower);\r\n if (!this._colorGradientsTexture) {\r\n this._updateBuffer.setDirectColor4(\"color1\", this.color1);\r\n this._updateBuffer.setDirectColor4(\"color2\", this.color2);\r\n }\r\n this._updateBuffer.setFloat2(\"sizeRange\", this.minSize, this.maxSize);\r\n this._updateBuffer.setFloat4(\"scaleRange\", this.minScaleX, this.maxScaleX, this.minScaleY, this.maxScaleY);\r\n this._updateBuffer.setFloat4(\"angleRange\", this.minAngularSpeed, this.maxAngularSpeed, this.minInitialRotation, this.maxInitialRotation);\r\n this._updateBuffer.setVector3(\"gravity\", this.gravity);\r\n if (this._limitVelocityGradientsTexture) {\r\n this._updateBuffer.setFloat(\"limitVelocityDamping\", this.limitVelocityDamping);\r\n }\r\n if (this.particleEmitterType) {\r\n this.particleEmitterType.applyToShader(this._updateBuffer);\r\n }\r\n if (this._isAnimationSheetEnabled) {\r\n this._updateBuffer.setFloat4(\"cellInfos\", this.startSpriteCellID, this.endSpriteCellID, this.spriteCellChangeSpeed, this.spriteCellLoop ? 1 : 0);\r\n }\r\n if (this.noiseTexture) {\r\n this._updateBuffer.setVector3(\"noiseStrength\", this.noiseStrength);\r\n }\r\n if (this._flowMap) {\r\n const scene = this.getScene()!;\r\n this._updateBuffer.setFloat(\"flowMapStrength\", this.flowMapStrength);\r\n this._updateBuffer.setMatrix(\"flowMapProjection\", scene.getTransformMatrix());\r\n }\r\n\r\n if (!this.isLocal) {\r\n this._updateBuffer.setMatrix(\"emitterWM\", emitterWM);\r\n }\r\n\r\n this._platform.updateParticleBuffer(this._targetIndex, this._targetBuffer, this._currentActiveCount);\r\n\r\n // Switch VAOs\r\n this._targetIndex++;\r\n if (this._targetIndex === 2) {\r\n this._targetIndex = 0;\r\n }\r\n\r\n // Switch buffers\r\n const tmpBuffer = this._sourceBuffer;\r\n this._sourceBuffer = this._targetBuffer;\r\n this._targetBuffer = tmpBuffer;\r\n\r\n engine.setDepthWrite(depthWriteState);\r\n }\r\n\r\n /**\r\n * Renders the particle system in its current state\r\n * @param preWarm defines if the system should only update the particles but not render them\r\n * @param forceUpdateOnly if true, force to only update the particles and never display them (meaning, even if preWarm=false, when forceUpdateOnly=true the particles won't be displayed)\r\n * @returns the current number of particles\r\n */\r\n public render(preWarm = false, forceUpdateOnly = false): number {\r\n if (!this._started) {\r\n return 0;\r\n }\r\n\r\n if (!this.isReady()) {\r\n return 0;\r\n }\r\n\r\n if (!preWarm && this._scene) {\r\n if (!this._preWarmDone && this.preWarmCycles) {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n this.render(true, true);\r\n }\r\n\r\n this._preWarmDone = true;\r\n }\r\n\r\n if (\r\n this._currentRenderId === this._scene.getRenderId() &&\r\n (!this._scene.activeCamera || (this._scene.activeCamera && this._currentRenderingCameraUniqueId === this._scene.activeCamera.uniqueId))\r\n ) {\r\n return 0;\r\n }\r\n\r\n this._currentRenderId = this._scene.getRenderId();\r\n if (this._scene.activeCamera) {\r\n this._currentRenderingCameraUniqueId = this._scene.activeCamera.uniqueId;\r\n }\r\n }\r\n\r\n // Get everything ready to render\r\n this._initialize();\r\n\r\n if (this.manualEmitCount > -1) {\r\n this._accumulatedCount += this.manualEmitCount;\r\n this.manualEmitCount = 0;\r\n } else {\r\n this._accumulatedCount += this.emitRate * this._timeDelta;\r\n }\r\n if (this._accumulatedCount >= 1) {\r\n const intPart = this._accumulatedCount | 0;\r\n this._accumulatedCount -= intPart;\r\n this._currentActiveCount += intPart;\r\n }\r\n\r\n this._currentActiveCount = Math.min(this._maxActiveParticleCount, this._currentActiveCount);\r\n\r\n if (!this._currentActiveCount) {\r\n return 0;\r\n }\r\n\r\n // Enable update effect\r\n let emitterWM: Matrix;\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n emitterWM = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n emitterWM = TmpVectors.Matrix[0];\r\n Matrix.TranslationToRef(emitterPosition.x, emitterPosition.y, emitterPosition.z, emitterWM);\r\n }\r\n\r\n const engine = this._engine as Engine;\r\n\r\n if (!this.updateInAnimate) {\r\n this._update(emitterWM);\r\n }\r\n\r\n let outparticles = 0;\r\n if (!preWarm && !forceUpdateOnly) {\r\n engine.setState(false);\r\n\r\n if (this.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n if (this.blendMode === ParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n outparticles = this._render(ParticleSystem.BLENDMODE_MULTIPLY, emitterWM) + this._render(ParticleSystem.BLENDMODE_ADD, emitterWM);\r\n } else {\r\n outparticles = this._render(this.blendMode, emitterWM);\r\n }\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n return outparticles;\r\n }\r\n\r\n /**\r\n * Rebuilds the particle system\r\n */\r\n public rebuild(): void {\r\n const checkUpdateEffect = () => {\r\n if (!this._recreateUpdateEffect() || !this._platform.isUpdateBufferReady()) {\r\n setTimeout(checkUpdateEffect, 10);\r\n } else {\r\n this._initialize(true);\r\n this._rebuildingAfterContextLost = false;\r\n }\r\n };\r\n\r\n this._createIndexBuffer();\r\n\r\n this._cachedUpdateDefines = \"\";\r\n this._platform.contextLost();\r\n this._rebuildingAfterContextLost = true;\r\n\r\n checkUpdateEffect();\r\n }\r\n\r\n private _releaseBuffers() {\r\n if (this._buffer0) {\r\n this._buffer0.dispose();\r\n (<any>this._buffer0) = null;\r\n }\r\n if (this._buffer1) {\r\n this._buffer1.dispose();\r\n (<any>this._buffer1) = null;\r\n }\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n this._platform.releaseBuffers();\r\n }\r\n\r\n /**\r\n * Disposes the particle system and free the associated resources\r\n * @param disposeTexture defines if the particule texture must be disposed as well (true by default)\r\n */\r\n public dispose(disposeTexture = true): void {\r\n for (const blendMode in this._drawWrappers) {\r\n const drawWrapper = this._drawWrappers[blendMode];\r\n drawWrapper.dispose();\r\n }\r\n\r\n this._drawWrappers = {};\r\n\r\n if (this._scene) {\r\n const index = this._scene.particleSystems.indexOf(this);\r\n if (index > -1) {\r\n this._scene.particleSystems.splice(index, 1);\r\n }\r\n }\r\n\r\n this._releaseBuffers();\r\n this._platform.releaseVertexBuffers();\r\n\r\n for (let i = 0; i < this._renderVertexBuffers.length; ++i) {\r\n const rvb = this._renderVertexBuffers[i];\r\n for (const key in rvb) {\r\n rvb[key].dispose();\r\n }\r\n }\r\n\r\n this._renderVertexBuffers = [];\r\n\r\n if (this._colorGradientsTexture) {\r\n this._colorGradientsTexture.dispose();\r\n (<any>this._colorGradientsTexture) = null;\r\n }\r\n\r\n if (this._sizeGradientsTexture) {\r\n this._sizeGradientsTexture.dispose();\r\n (<any>this._sizeGradientsTexture) = null;\r\n }\r\n\r\n if (this._angularSpeedGradientsTexture) {\r\n this._angularSpeedGradientsTexture.dispose();\r\n (<any>this._angularSpeedGradientsTexture) = null;\r\n }\r\n\r\n if (this._velocityGradientsTexture) {\r\n this._velocityGradientsTexture.dispose();\r\n (<any>this._velocityGradientsTexture) = null;\r\n }\r\n\r\n if (this._limitVelocityGradientsTexture) {\r\n this._limitVelocityGradientsTexture.dispose();\r\n (<any>this._limitVelocityGradientsTexture) = null;\r\n }\r\n\r\n if (this._dragGradientsTexture) {\r\n this._dragGradientsTexture.dispose();\r\n (<any>this._dragGradientsTexture) = null;\r\n }\r\n\r\n if (this._randomTexture) {\r\n this._randomTexture.dispose();\r\n (<any>this._randomTexture) = null;\r\n }\r\n\r\n if (this._randomTexture2) {\r\n this._randomTexture2.dispose();\r\n (<any>this._randomTexture2) = null;\r\n }\r\n\r\n if (disposeTexture && this.particleTexture) {\r\n this.particleTexture.dispose();\r\n this.particleTexture = null;\r\n }\r\n\r\n if (disposeTexture && this.noiseTexture) {\r\n this.noiseTexture.dispose();\r\n this.noiseTexture = null;\r\n }\r\n\r\n // Callback\r\n this.onStoppedObservable.clear();\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n /**\r\n * Clones the particle system.\r\n * @param name The name of the cloned object\r\n * @param newEmitter The new emitter to use\r\n * @param cloneTexture Also clone the textures if true\r\n * @returns the cloned particle system\r\n */\r\n public clone(name: string, newEmitter: any, cloneTexture = false): GPUParticleSystem {\r\n const custom = { ...this._customWrappers };\r\n let program: any = null;\r\n const engine = this._engine as any;\r\n if (engine.createEffectForParticles) {\r\n if (this.customShader != null) {\r\n program = this.customShader;\r\n const defines: string = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\r\n custom[0] = engine.createEffectForParticles(\r\n program.shaderPath.fragmentElement,\r\n program.shaderOptions.uniforms,\r\n program.shaderOptions.samplers,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this\r\n );\r\n }\r\n }\r\n\r\n const serialization = this.serialize(cloneTexture);\r\n const result = GPUParticleSystem.Parse(serialization, this._scene || this._engine, this._rootUrl);\r\n result.name = name;\r\n result.customShader = program;\r\n result._customWrappers = custom;\r\n\r\n if (newEmitter === undefined) {\r\n newEmitter = this.emitter;\r\n }\r\n\r\n if (this.noiseTexture) {\r\n result.noiseTexture = this.noiseTexture.clone();\r\n }\r\n\r\n result.emitter = newEmitter;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n ParticleSystem._Serialize(serializationObject, this, serializeTexture);\r\n\r\n serializationObject.activeParticleCount = this.activeParticleCount;\r\n serializationObject.randomTextureSize = this._randomTextureSize;\r\n serializationObject.customShader = this.customShader;\r\n\r\n serializationObject.preventAutoStart = this.preventAutoStart;\r\n serializationObject.worldOffset = this.worldOffset.asArray();\r\n\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a GPU particle system.\r\n * @param parsedParticleSystem The JSON object to parse\r\n * @param sceneOrEngine The scene or the engine to create the particle system in\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @param doNotStart Ignore the preventAutoStart attribute and does not start\r\n * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)\r\n * @returns the parsed GPU particle system\r\n */\r\n public static Parse(parsedParticleSystem: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string, doNotStart = false, capacity?: number): GPUParticleSystem {\r\n const name = parsedParticleSystem.name;\r\n let engine: AbstractEngine;\r\n let scene: Nullable<Scene>;\r\n\r\n if (sceneOrEngine instanceof AbstractEngine) {\r\n engine = sceneOrEngine;\r\n } else {\r\n scene = sceneOrEngine;\r\n engine = scene.getEngine();\r\n }\r\n\r\n const particleSystem = new GPUParticleSystem(\r\n name,\r\n { capacity: capacity || parsedParticleSystem.capacity, randomTextureSize: parsedParticleSystem.randomTextureSize },\r\n sceneOrEngine,\r\n null,\r\n parsedParticleSystem.isAnimationSheetEnabled\r\n );\r\n particleSystem._rootUrl = rootUrl;\r\n\r\n if (parsedParticleSystem.customShader && (engine as any).createEffectForParticles) {\r\n const program = parsedParticleSystem.customShader;\r\n const defines: string = program.shaderOptions.defines.length > 0 ? program.shaderOptions.defines.join(\"\\n\") : \"\";\r\n const custom: Nullable<Effect> = (engine as any).createEffectForParticles(\r\n program.shaderPath.fragmentElement,\r\n program.shaderOptions.uniforms,\r\n program.shaderOptions.samplers,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n particleSystem\r\n );\r\n particleSystem.setCustomEffect(custom, 0);\r\n particleSystem.customShader = program;\r\n }\r\n\r\n if (parsedParticleSystem.id) {\r\n particleSystem.id = parsedParticleSystem.id;\r\n }\r\n\r\n if (parsedParticleSystem.activeParticleCount) {\r\n particleSystem.activeParticleCount = parsedParticleSystem.activeParticleCount;\r\n }\r\n\r\n ParticleSystem._Parse(parsedParticleSystem, particleSystem, sceneOrEngine, rootUrl);\r\n\r\n if (parsedParticleSystem.worldOffset) {\r\n particleSystem.worldOffset = Vector3.FromArray(parsedParticleSystem.worldOffset);\r\n }\r\n\r\n // Auto start\r\n if (parsedParticleSystem.preventAutoStart) {\r\n particleSystem.preventAutoStart = parsedParticleSystem.preventAutoStart;\r\n }\r\n\r\n if (parsedParticleSystem.metadata) {\r\n particleSystem.metadata = parsedParticleSystem.metadata;\r\n }\r\n\r\n if (!doNotStart && !particleSystem.preventAutoStart) {\r\n particleSystem.start();\r\n }\r\n\r\n return particleSystem;\r\n }\r\n}\r\n"]}
|