@onerjs/core 8.34.8 → 8.34.9
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.
|
@@ -36,7 +36,7 @@ export class BaseParticleSystem {
|
|
|
36
36
|
return this._noiseTexture;
|
|
37
37
|
}
|
|
38
38
|
set noiseTexture(value) {
|
|
39
|
-
if (this._noiseTexture === value) {
|
|
39
|
+
if (this._noiseTexture === (value ?? null)) {
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
this._noiseTexture = value;
|
|
@@ -438,6 +438,10 @@ export class BaseParticleSystem {
|
|
|
438
438
|
* Maximum angular speed of emitting particles (Z-axis rotation for each particle).
|
|
439
439
|
*/
|
|
440
440
|
this.maxAngularSpeed = 0;
|
|
441
|
+
/**
|
|
442
|
+
* The texture used to render each particle. (this can be a spritesheet)
|
|
443
|
+
*/
|
|
444
|
+
this.particleTexture = null;
|
|
441
445
|
/**
|
|
442
446
|
* The layer mask we are rendering the particles through.
|
|
443
447
|
*/
|
|
@@ -459,6 +463,7 @@ export class BaseParticleSystem {
|
|
|
459
463
|
/** @internal */
|
|
460
464
|
this._wasDispatched = false;
|
|
461
465
|
this._rootUrl = "";
|
|
466
|
+
this._noiseTexture = null;
|
|
462
467
|
/** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */
|
|
463
468
|
this.noiseStrength = new Vector3(10, 10, 10);
|
|
464
469
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/baseParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { ImageProcessingConfigurationDefines } from \"../Materials/imageProcessingConfiguration.defines\";\r\nimport type { ColorGradient, FactorGradient, Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport type { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { IParticleEmitterType } from \"./EmitterTypes/IParticleEmitterType\";\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 { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This represents the base class for particle system in Babylon.\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 * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class BaseParticleSystem implements IClipPlanesHolder {\r\n /**\r\n * Source color is added to the destination color without alpha affecting the result. Great for additive glow effects (fire, magic, lasers)\r\n */\r\n public static BLENDMODE_ONEONE = 0;\r\n /**\r\n * Blend current color and particle color using particle’s alpha. Same as Constants.ALPHA_COMBINE, the go-to for transparency. 100% alpha means source, 0% alpha means background. Glass, UI fade, smoke\r\n */\r\n public static BLENDMODE_STANDARD = 1;\r\n /**\r\n * Add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_ADD = 2;\r\n /**\r\n * Multiply current color with particle color\r\n */\r\n public static BLENDMODE_MULTIPLY = 3;\r\n /**\r\n * Multiply current color with particle color then add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_MULTIPLYADD = 4;\r\n /**\r\n * Subtracts source (particle) from destination (current color), leading to darker results\r\n * - NOTE: Init as -1 so we can properly map all modes to Engine Const's (otherwise ALPHA_SUBTRACT will conflict with BLENDMODE_MULTIPLY since both use 3)\r\n */\r\n public static BLENDMODE_SUBTRACT = -1;\r\n\r\n /**\r\n * List of animations used by the particle system.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Gets or sets the unique id of the particle system\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * The id of the Particle system.\r\n */\r\n public id: string;\r\n\r\n /**\r\n * The friendly name of the Particle system.\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Snippet ID if the particle system was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The rendering group used by the Particle system to chose when to render.\r\n */\r\n public renderingGroupId = 0;\r\n\r\n /**\r\n * The emitter represents the Mesh or position we are attaching the particle system to.\r\n */\r\n public emitter: Nullable<AbstractMesh | Vector3> = Vector3.Zero();\r\n\r\n /**\r\n * The maximum number of particles to emit per frame\r\n */\r\n public emitRate = 10;\r\n\r\n /**\r\n * If you want to launch only a few particles at once, that can be done, as well.\r\n */\r\n public manualEmitCount = -1;\r\n\r\n /**\r\n * The overall motion speed (0.01 is default update speed, faster updates = faster animation)\r\n */\r\n public updateSpeed = 0.01;\r\n\r\n /** @internal */\r\n public _targetStopDuration = 0;\r\n /**\r\n * The amount of time the particle system is running (depends of the overall update speed).\r\n */\r\n public get targetStopDuration() {\r\n return this._targetStopDuration;\r\n }\r\n\r\n public set targetStopDuration(value: number) {\r\n if (this._targetStopDuration === value) {\r\n return;\r\n }\r\n\r\n this._targetStopDuration = value;\r\n }\r\n\r\n /**\r\n * Specifies whether the particle system will be disposed once it reaches the end of the animation.\r\n */\r\n public disposeOnStop = false;\r\n\r\n /**\r\n * Minimum power of emitting particles.\r\n */\r\n public minEmitPower = 1;\r\n /**\r\n * Maximum power of emitting particles.\r\n */\r\n public maxEmitPower = 1;\r\n\r\n /**\r\n * Minimum life time of emitting particles.\r\n */\r\n public minLifeTime = 1;\r\n /**\r\n * Maximum life time of emitting particles.\r\n */\r\n public maxLifeTime = 1;\r\n\r\n /**\r\n * Minimum Size of emitting particles.\r\n */\r\n public minSize = 1;\r\n /**\r\n * Maximum Size of emitting particles.\r\n */\r\n public maxSize = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on X axis.\r\n */\r\n public minScaleX = 1;\r\n /**\r\n * Maximum scale of emitting particles on X axis.\r\n */\r\n public maxScaleX = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on Y axis.\r\n */\r\n public minScaleY = 1;\r\n /**\r\n * Maximum scale of emitting particles on Y axis.\r\n */\r\n public maxScaleY = 1;\r\n\r\n /**\r\n * Gets or sets the minimal initial rotation in radians.\r\n */\r\n public minInitialRotation = 0;\r\n /**\r\n * Gets or sets the maximal initial rotation in radians.\r\n */\r\n public maxInitialRotation = 0;\r\n\r\n /**\r\n * Minimum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public minAngularSpeed = 0;\r\n /**\r\n * Maximum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public maxAngularSpeed = 0;\r\n\r\n /**\r\n * The texture used to render each particle. (this can be a spritesheet)\r\n */\r\n public particleTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * This can help using your own shader to render the particle system.\r\n * The according effect will be created\r\n */\r\n public customShader: any = null;\r\n\r\n /**\r\n * By default particle system starts as soon as they are created. This prevents the\r\n * automatic start to happen and let you decide when to start emitting particles.\r\n */\r\n public preventAutoStart: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)\r\n */\r\n public applyFog = false;\r\n\r\n /** @internal */\r\n _wasDispatched = false;\r\n\r\n protected _rootUrl = \"\";\r\n protected _noiseTexture: Nullable<ProceduralTexture>;\r\n\r\n /**\r\n * Returns true if the particle system was generated by a node particle system set\r\n */\r\n public get isNodeGenerated(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets or sets a texture used to add random noise to particle positions\r\n */\r\n public get noiseTexture(): Nullable<ProceduralTexture> {\r\n return this._noiseTexture;\r\n }\r\n\r\n public set noiseTexture(value: Nullable<ProceduralTexture>) {\r\n if (this._noiseTexture === value) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value;\r\n this._reset();\r\n }\r\n\r\n /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */\r\n public noiseStrength = new Vector3(10, 10, 10);\r\n\r\n /**\r\n * Callback triggered when the particle animation is ending.\r\n */\r\n public onAnimationEnd: Nullable<() => void> = null;\r\n\r\n /**\r\n * Blend mode use to render the particle\r\n * For original blend modes which are exposed from ParticleSystem (OneOne, Standard, Add, Multiply, MultiplyAdd, and Subtract), use ParticleSystem.BLENDMODE_FOO\r\n * For all other blend modes, use Engine Constants.ALPHA_FOO blend modes\r\n */\r\n public blendMode = BaseParticleSystem.BLENDMODE_ONEONE;\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 forceDepthWrite = false;\r\n\r\n /** Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0 */\r\n public preWarmCycles = 0;\r\n\r\n /** Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1) */\r\n public preWarmStepOffset = 1;\r\n\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)\r\n */\r\n public spriteCellChangeSpeed = 1;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public startSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public endSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use\r\n */\r\n public spriteCellWidth = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use\r\n */\r\n public spriteCellHeight = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines wether the sprite animation is looping\r\n */\r\n public spriteCellLoop = true;\r\n /**\r\n * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID\r\n */\r\n public spriteRandomStartCell = false;\r\n\r\n /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */\r\n public translationPivot = new Vector2(0, 0);\r\n\r\n protected _animationSheetEnabled = false;\r\n /** @internal */\r\n public get _isAnimationSheetEnabled() {\r\n return this._animationSheetEnabled;\r\n }\r\n\r\n public set _isAnimationSheetEnabled(value: boolean) {\r\n if (this._animationSheetEnabled === value) {\r\n return;\r\n }\r\n\r\n this._animationSheetEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called\r\n */\r\n public beginAnimationOnStart = false;\r\n\r\n /**\r\n * Gets or sets the frame to start the animation from when beginAnimationOnStart is true\r\n */\r\n public beginAnimationFrom = 0;\r\n\r\n /**\r\n * Gets or sets the frame to end the animation on when beginAnimationOnStart is true\r\n */\r\n public beginAnimationTo = 60;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true\r\n */\r\n public beginAnimationLoop = false;\r\n\r\n /**\r\n * Gets or sets a world offset applied to all particles\r\n */\r\n public worldOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable<Plane>;\r\n\r\n protected _isDisposed = false;\r\n /**\r\n * Indicates that the particle system is disposed\r\n */\r\n public get isDisposed() {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets whether an animation sprite sheet is enabled or not on the particle system\r\n */\r\n public get isAnimationSheetEnabled(): boolean {\r\n return this._isAnimationSheetEnabled;\r\n }\r\n\r\n public set isAnimationSheetEnabled(value: boolean) {\r\n if (this._isAnimationSheetEnabled == value) {\r\n return;\r\n }\r\n\r\n this._isAnimationSheetEnabled = value;\r\n\r\n this._reset();\r\n }\r\n\r\n private _useLogarithmicDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._useLogarithmicDepth = value && this.getScene()!.getEngine().getCaps().fragmentDepthSupported;\r\n }\r\n\r\n /**\r\n * Get hosting scene\r\n * @returns the scene\r\n */\r\n public getScene(): Nullable<Scene> {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * You can use gravity if you want to give an orientation to your particles.\r\n */\r\n public gravity = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _colorGradients: Nullable<Array<ColorGradient>> = null;\r\n /** @internal */\r\n public _sizeGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _lifeTimeGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _angularSpeedGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _velocityGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _limitVelocityGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _dragGradients: Nullable<Array<FactorGradient>> = null;\r\n protected _emitRateGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _startSizeGradients: Nullable<Array<FactorGradient>> = null;\r\n protected _rampGradients: Nullable<Array<Color3Gradient>> = null;\r\n /** @internal */\r\n public _colorRemapGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _alphaRemapGradients: Nullable<Array<FactorGradient>> = null;\r\n\r\n protected _hasTargetStopDurationDependantGradient() {\r\n return (\r\n (this._startSizeGradients && this._startSizeGradients.length > 0) ||\r\n (this._emitRateGradients && this._emitRateGradients.length > 0) ||\r\n (this._lifeTimeGradients && this._lifeTimeGradients.length > 0)\r\n );\r\n }\r\n\r\n protected _setEngineBasedOnBlendMode(blendMode: number): void {\r\n switch (blendMode) {\r\n case BaseParticleSystem.BLENDMODE_MULTIPLYADD:\r\n // Don't want to update engine since there is no equivalent engine alpha mode, instead it gets handled within particleSystem\r\n return;\r\n case BaseParticleSystem.BLENDMODE_ADD:\r\n blendMode = Constants.ALPHA_ADD;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_ONEONE:\r\n blendMode = Constants.ALPHA_ONEONE;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_STANDARD:\r\n blendMode = Constants.ALPHA_COMBINE;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_MULTIPLY:\r\n blendMode = Constants.ALPHA_MULTIPLY;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_SUBTRACT:\r\n blendMode = Constants.ALPHA_SUBTRACT;\r\n break;\r\n default:\r\n // For all other blend modes that were added after the initial particleSystem implementation,\r\n // the ParticleSystem.BLENDMODE_FOO are already mapped to the underlying Constants.ALPHA_FOO\r\n break;\r\n }\r\n this._engine.setAlphaMode(blendMode);\r\n }\r\n\r\n /**\r\n * Defines the delay in milliseconds before starting the system (0 by default)\r\n */\r\n public startDelay = 0;\r\n\r\n /**\r\n * Gets the current list of drag gradients.\r\n * You must use addDragGradient and removeDragGradient to update this list\r\n * @returns the list of drag gradients\r\n */\r\n public getDragGradients(): Nullable<Array<FactorGradient>> {\r\n return this._dragGradients;\r\n }\r\n\r\n /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */\r\n public limitVelocityDamping = 0.4;\r\n\r\n /**\r\n * Gets the current list of limit velocity gradients.\r\n * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list\r\n * @returns the list of limit velocity gradients\r\n */\r\n public getLimitVelocityGradients(): Nullable<Array<FactorGradient>> {\r\n return this._limitVelocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color gradients.\r\n * You must use addColorGradient and removeColorGradient to update this list\r\n * @returns the list of color gradients\r\n */\r\n public getColorGradients(): Nullable<Array<ColorGradient>> {\r\n return this._colorGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of size gradients.\r\n * You must use addSizeGradient and removeSizeGradient to update this list\r\n * @returns the list of size gradients\r\n */\r\n public getSizeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._sizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color remap gradients.\r\n * You must use addColorRemapGradient and removeColorRemapGradient to update this list\r\n * @returns the list of color remap gradients\r\n */\r\n public getColorRemapGradients(): Nullable<Array<FactorGradient>> {\r\n return this._colorRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of alpha remap gradients.\r\n * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list\r\n * @returns the list of alpha remap gradients\r\n */\r\n public getAlphaRemapGradients(): Nullable<Array<FactorGradient>> {\r\n return this._alphaRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of life time gradients.\r\n * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list\r\n * @returns the list of life time gradients\r\n */\r\n public getLifeTimeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._lifeTimeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of angular speed gradients.\r\n * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list\r\n * @returns the list of angular speed gradients\r\n */\r\n public getAngularSpeedGradients(): Nullable<Array<FactorGradient>> {\r\n return this._angularSpeedGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of velocity gradients.\r\n * You must use addVelocityGradient and removeVelocityGradient to update this list\r\n * @returns the list of velocity gradients\r\n */\r\n public getVelocityGradients(): Nullable<Array<FactorGradient>> {\r\n return this._velocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of start size gradients.\r\n * You must use addStartSizeGradient and removeStartSizeGradient to update this list\r\n * @returns the list of start size gradients\r\n */\r\n public getStartSizeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._startSizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of emit rate gradients.\r\n * You must use addEmitRateGradient and removeEmitRateGradient to update this list\r\n * @returns the list of emit rate gradients\r\n */\r\n public getEmitRateGradients(): Nullable<Array<FactorGradient>> {\r\n return this._emitRateGradients;\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction1(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).direction1;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction1(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {\r\n (<BoxParticleEmitter>this.particleEmitterType).direction1 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction2(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).direction2;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction2(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {\r\n (<BoxParticleEmitter>this.particleEmitterType).direction2 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get minEmitBox(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).minEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set minEmitBox(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {\r\n (<BoxParticleEmitter>this.particleEmitterType).minEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get maxEmitBox(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set maxEmitBox(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {\r\n (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color1 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color2 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Color the particle will have at the end of its lifetime\r\n */\r\n public colorDead = new Color4(0, 0, 0, 1.0);\r\n\r\n /**\r\n * An optional mask to filter some colors out of the texture, or filter a part of the alpha channel\r\n */\r\n public textureMask = new Color4(1.0, 1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The particle emitter type defines the emitter used by the particle system.\r\n * It can be for example box, sphere, or cone...\r\n */\r\n public particleEmitterType: IParticleEmitterType;\r\n\r\n /** @internal */\r\n public _isSubEmitter = false;\r\n\r\n /** @internal */\r\n public _billboardMode = Constants.PARTICLES_BILLBOARDMODE_ALL;\r\n /**\r\n * Gets or sets the billboard mode to use when isBillboardBased = true.\r\n * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED\r\n */\r\n public get billboardMode(): number {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n\r\n this._billboardMode = value;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _isBillboardBased = true;\r\n /**\r\n * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction\r\n */\r\n public get isBillboardBased(): boolean {\r\n return this._isBillboardBased;\r\n }\r\n\r\n public set isBillboardBased(value: boolean) {\r\n if (this._isBillboardBased === value) {\r\n return;\r\n }\r\n\r\n this._isBillboardBased = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * The scene the particle system belongs to.\r\n */\r\n protected _scene: Nullable<Scene>;\r\n\r\n /**\r\n * The engine the particle system belongs to.\r\n */\r\n protected _engine: AbstractEngine;\r\n\r\n /**\r\n * Local cache of defines for image processing.\r\n */\r\n protected _imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines();\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: Nullable<ImageProcessingConfiguration>;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): Nullable<ImageProcessingConfiguration> {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: Nullable<ImageProcessingConfiguration>) {\r\n this._attachImageProcessingConfiguration(value);\r\n }\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration && this._scene) {\r\n this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reset() {}\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: Nullable<RawTexture>): BaseParticleSystem {\r\n if (!gradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const valueGradient of gradients) {\r\n if (valueGradient.gradient === gradient) {\r\n gradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (texture) {\r\n texture.dispose();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a 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 */\r\n public constructor(name: string) {\r\n this.id = name;\r\n this.name = name;\r\n }\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 */\r\n public createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public 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 throw new Error(\"Method not implemented.\");\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 */\r\n public createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n public createDirectedConeEmitter(radius = 1, angle = Math.PI / 4, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): ConeDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n// Register Class Name\r\nRegisterClass(\"BABYLON.BaseParticleSystem\", BaseParticleSystem);\r\n"]}
|
|
1
|
+
{"version":3,"file":"baseParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/baseParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { ImageProcessingConfigurationDefines } from \"../Materials/imageProcessingConfiguration.defines\";\r\nimport type { ColorGradient, FactorGradient, Color3Gradient, IValueGradient } from \"../Misc/gradients\";\r\nimport type { BoxParticleEmitter } from \"../Particles/EmitterTypes/boxParticleEmitter\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\nimport type { IClipPlanesHolder } from \"../Misc/interfaces/iClipPlanesHolder\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\nimport type { Animation } from \"../Animations/animation\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { IParticleEmitterType } from \"./EmitterTypes/IParticleEmitterType\";\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 { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * This represents the base class for particle system in Babylon.\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 * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class BaseParticleSystem implements IClipPlanesHolder {\r\n /**\r\n * Source color is added to the destination color without alpha affecting the result. Great for additive glow effects (fire, magic, lasers)\r\n */\r\n public static BLENDMODE_ONEONE = 0;\r\n /**\r\n * Blend current color and particle color using particle’s alpha. Same as Constants.ALPHA_COMBINE, the go-to for transparency. 100% alpha means source, 0% alpha means background. Glass, UI fade, smoke\r\n */\r\n public static BLENDMODE_STANDARD = 1;\r\n /**\r\n * Add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_ADD = 2;\r\n /**\r\n * Multiply current color with particle color\r\n */\r\n public static BLENDMODE_MULTIPLY = 3;\r\n /**\r\n * Multiply current color with particle color then add current color and particle color multiplied by particle’s alpha\r\n */\r\n public static BLENDMODE_MULTIPLYADD = 4;\r\n /**\r\n * Subtracts source (particle) from destination (current color), leading to darker results\r\n * - NOTE: Init as -1 so we can properly map all modes to Engine Const's (otherwise ALPHA_SUBTRACT will conflict with BLENDMODE_MULTIPLY since both use 3)\r\n */\r\n public static BLENDMODE_SUBTRACT = -1;\r\n\r\n /**\r\n * List of animations used by the particle system.\r\n */\r\n public animations: Animation[] = [];\r\n\r\n /**\r\n * Gets or sets the unique id of the particle system\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * The id of the Particle system.\r\n */\r\n public id: string;\r\n\r\n /**\r\n * The friendly name of the Particle system.\r\n */\r\n public name: string;\r\n\r\n /**\r\n * Snippet ID if the particle system was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The rendering group used by the Particle system to chose when to render.\r\n */\r\n public renderingGroupId = 0;\r\n\r\n /**\r\n * The emitter represents the Mesh or position we are attaching the particle system to.\r\n */\r\n public emitter: Nullable<AbstractMesh | Vector3> = Vector3.Zero();\r\n\r\n /**\r\n * The maximum number of particles to emit per frame\r\n */\r\n public emitRate = 10;\r\n\r\n /**\r\n * If you want to launch only a few particles at once, that can be done, as well.\r\n */\r\n public manualEmitCount = -1;\r\n\r\n /**\r\n * The overall motion speed (0.01 is default update speed, faster updates = faster animation)\r\n */\r\n public updateSpeed = 0.01;\r\n\r\n /** @internal */\r\n public _targetStopDuration = 0;\r\n /**\r\n * The amount of time the particle system is running (depends of the overall update speed).\r\n */\r\n public get targetStopDuration() {\r\n return this._targetStopDuration;\r\n }\r\n\r\n public set targetStopDuration(value: number) {\r\n if (this._targetStopDuration === value) {\r\n return;\r\n }\r\n\r\n this._targetStopDuration = value;\r\n }\r\n\r\n /**\r\n * Specifies whether the particle system will be disposed once it reaches the end of the animation.\r\n */\r\n public disposeOnStop = false;\r\n\r\n /**\r\n * Minimum power of emitting particles.\r\n */\r\n public minEmitPower = 1;\r\n /**\r\n * Maximum power of emitting particles.\r\n */\r\n public maxEmitPower = 1;\r\n\r\n /**\r\n * Minimum life time of emitting particles.\r\n */\r\n public minLifeTime = 1;\r\n /**\r\n * Maximum life time of emitting particles.\r\n */\r\n public maxLifeTime = 1;\r\n\r\n /**\r\n * Minimum Size of emitting particles.\r\n */\r\n public minSize = 1;\r\n /**\r\n * Maximum Size of emitting particles.\r\n */\r\n public maxSize = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on X axis.\r\n */\r\n public minScaleX = 1;\r\n /**\r\n * Maximum scale of emitting particles on X axis.\r\n */\r\n public maxScaleX = 1;\r\n\r\n /**\r\n * Minimum scale of emitting particles on Y axis.\r\n */\r\n public minScaleY = 1;\r\n /**\r\n * Maximum scale of emitting particles on Y axis.\r\n */\r\n public maxScaleY = 1;\r\n\r\n /**\r\n * Gets or sets the minimal initial rotation in radians.\r\n */\r\n public minInitialRotation = 0;\r\n /**\r\n * Gets or sets the maximal initial rotation in radians.\r\n */\r\n public maxInitialRotation = 0;\r\n\r\n /**\r\n * Minimum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public minAngularSpeed = 0;\r\n /**\r\n * Maximum angular speed of emitting particles (Z-axis rotation for each particle).\r\n */\r\n public maxAngularSpeed = 0;\r\n\r\n /**\r\n * The texture used to render each particle. (this can be a spritesheet)\r\n */\r\n public particleTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * The layer mask we are rendering the particles through.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * This can help using your own shader to render the particle system.\r\n * The according effect will be created\r\n */\r\n public customShader: any = null;\r\n\r\n /**\r\n * By default particle system starts as soon as they are created. This prevents the\r\n * automatic start to happen and let you decide when to start emitting particles.\r\n */\r\n public preventAutoStart: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)\r\n */\r\n public applyFog = false;\r\n\r\n /** @internal */\r\n _wasDispatched = false;\r\n\r\n protected _rootUrl = \"\";\r\n protected _noiseTexture: Nullable<ProceduralTexture> = null;\r\n\r\n /**\r\n * Returns true if the particle system was generated by a node particle system set\r\n */\r\n public get isNodeGenerated(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets or sets a texture used to add random noise to particle positions\r\n */\r\n public get noiseTexture(): Nullable<ProceduralTexture> {\r\n return this._noiseTexture;\r\n }\r\n\r\n public set noiseTexture(value: Nullable<ProceduralTexture>) {\r\n if (this._noiseTexture === (value ?? null)) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value;\r\n this._reset();\r\n }\r\n\r\n /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */\r\n public noiseStrength = new Vector3(10, 10, 10);\r\n\r\n /**\r\n * Callback triggered when the particle animation is ending.\r\n */\r\n public onAnimationEnd: Nullable<() => void> = null;\r\n\r\n /**\r\n * Blend mode use to render the particle\r\n * For original blend modes which are exposed from ParticleSystem (OneOne, Standard, Add, Multiply, MultiplyAdd, and Subtract), use ParticleSystem.BLENDMODE_FOO\r\n * For all other blend modes, use Engine Constants.ALPHA_FOO blend modes\r\n */\r\n public blendMode = BaseParticleSystem.BLENDMODE_ONEONE;\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 forceDepthWrite = false;\r\n\r\n /** Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0 */\r\n public preWarmCycles = 0;\r\n\r\n /** Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1) */\r\n public preWarmStepOffset = 1;\r\n\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)\r\n */\r\n public spriteCellChangeSpeed = 1;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public startSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public endSpriteCellID = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use\r\n */\r\n public spriteCellWidth = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use\r\n */\r\n public spriteCellHeight = 0;\r\n /**\r\n * If using a spritesheet (isAnimationSheetEnabled), defines wether the sprite animation is looping\r\n */\r\n public spriteCellLoop = true;\r\n /**\r\n * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID\r\n */\r\n public spriteRandomStartCell = false;\r\n\r\n /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */\r\n public translationPivot = new Vector2(0, 0);\r\n\r\n protected _animationSheetEnabled = false;\r\n /** @internal */\r\n public get _isAnimationSheetEnabled() {\r\n return this._animationSheetEnabled;\r\n }\r\n\r\n public set _isAnimationSheetEnabled(value: boolean) {\r\n if (this._animationSheetEnabled === value) {\r\n return;\r\n }\r\n\r\n this._animationSheetEnabled = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called\r\n */\r\n public beginAnimationOnStart = false;\r\n\r\n /**\r\n * Gets or sets the frame to start the animation from when beginAnimationOnStart is true\r\n */\r\n public beginAnimationFrom = 0;\r\n\r\n /**\r\n * Gets or sets the frame to end the animation on when beginAnimationOnStart is true\r\n */\r\n public beginAnimationTo = 60;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true\r\n */\r\n public beginAnimationLoop = false;\r\n\r\n /**\r\n * Gets or sets a world offset applied to all particles\r\n */\r\n public worldOffset = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the active clipplane 1\r\n */\r\n public clipPlane: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 2\r\n */\r\n public clipPlane2: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 3\r\n */\r\n public clipPlane3: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 4\r\n */\r\n public clipPlane4: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 5\r\n */\r\n public clipPlane5: Nullable<Plane>;\r\n\r\n /**\r\n * Gets or sets the active clipplane 6\r\n */\r\n public clipPlane6: Nullable<Plane>;\r\n\r\n protected _isDisposed = false;\r\n /**\r\n * Indicates that the particle system is disposed\r\n */\r\n public get isDisposed() {\r\n return this._isDisposed;\r\n }\r\n\r\n /**\r\n * Gets or sets whether an animation sprite sheet is enabled or not on the particle system\r\n */\r\n public get isAnimationSheetEnabled(): boolean {\r\n return this._isAnimationSheetEnabled;\r\n }\r\n\r\n public set isAnimationSheetEnabled(value: boolean) {\r\n if (this._isAnimationSheetEnabled == value) {\r\n return;\r\n }\r\n\r\n this._isAnimationSheetEnabled = value;\r\n\r\n this._reset();\r\n }\r\n\r\n private _useLogarithmicDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._useLogarithmicDepth = value && this.getScene()!.getEngine().getCaps().fragmentDepthSupported;\r\n }\r\n\r\n /**\r\n * Get hosting scene\r\n * @returns the scene\r\n */\r\n public getScene(): Nullable<Scene> {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * You can use gravity if you want to give an orientation to your particles.\r\n */\r\n public gravity = Vector3.Zero();\r\n\r\n /** @internal */\r\n public _colorGradients: Nullable<Array<ColorGradient>> = null;\r\n /** @internal */\r\n public _sizeGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _lifeTimeGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _angularSpeedGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _velocityGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _limitVelocityGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _dragGradients: Nullable<Array<FactorGradient>> = null;\r\n protected _emitRateGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _startSizeGradients: Nullable<Array<FactorGradient>> = null;\r\n protected _rampGradients: Nullable<Array<Color3Gradient>> = null;\r\n /** @internal */\r\n public _colorRemapGradients: Nullable<Array<FactorGradient>> = null;\r\n /** @internal */\r\n public _alphaRemapGradients: Nullable<Array<FactorGradient>> = null;\r\n\r\n protected _hasTargetStopDurationDependantGradient() {\r\n return (\r\n (this._startSizeGradients && this._startSizeGradients.length > 0) ||\r\n (this._emitRateGradients && this._emitRateGradients.length > 0) ||\r\n (this._lifeTimeGradients && this._lifeTimeGradients.length > 0)\r\n );\r\n }\r\n\r\n protected _setEngineBasedOnBlendMode(blendMode: number): void {\r\n switch (blendMode) {\r\n case BaseParticleSystem.BLENDMODE_MULTIPLYADD:\r\n // Don't want to update engine since there is no equivalent engine alpha mode, instead it gets handled within particleSystem\r\n return;\r\n case BaseParticleSystem.BLENDMODE_ADD:\r\n blendMode = Constants.ALPHA_ADD;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_ONEONE:\r\n blendMode = Constants.ALPHA_ONEONE;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_STANDARD:\r\n blendMode = Constants.ALPHA_COMBINE;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_MULTIPLY:\r\n blendMode = Constants.ALPHA_MULTIPLY;\r\n break;\r\n case BaseParticleSystem.BLENDMODE_SUBTRACT:\r\n blendMode = Constants.ALPHA_SUBTRACT;\r\n break;\r\n default:\r\n // For all other blend modes that were added after the initial particleSystem implementation,\r\n // the ParticleSystem.BLENDMODE_FOO are already mapped to the underlying Constants.ALPHA_FOO\r\n break;\r\n }\r\n this._engine.setAlphaMode(blendMode);\r\n }\r\n\r\n /**\r\n * Defines the delay in milliseconds before starting the system (0 by default)\r\n */\r\n public startDelay = 0;\r\n\r\n /**\r\n * Gets the current list of drag gradients.\r\n * You must use addDragGradient and removeDragGradient to update this list\r\n * @returns the list of drag gradients\r\n */\r\n public getDragGradients(): Nullable<Array<FactorGradient>> {\r\n return this._dragGradients;\r\n }\r\n\r\n /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */\r\n public limitVelocityDamping = 0.4;\r\n\r\n /**\r\n * Gets the current list of limit velocity gradients.\r\n * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list\r\n * @returns the list of limit velocity gradients\r\n */\r\n public getLimitVelocityGradients(): Nullable<Array<FactorGradient>> {\r\n return this._limitVelocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color gradients.\r\n * You must use addColorGradient and removeColorGradient to update this list\r\n * @returns the list of color gradients\r\n */\r\n public getColorGradients(): Nullable<Array<ColorGradient>> {\r\n return this._colorGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of size gradients.\r\n * You must use addSizeGradient and removeSizeGradient to update this list\r\n * @returns the list of size gradients\r\n */\r\n public getSizeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._sizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of color remap gradients.\r\n * You must use addColorRemapGradient and removeColorRemapGradient to update this list\r\n * @returns the list of color remap gradients\r\n */\r\n public getColorRemapGradients(): Nullable<Array<FactorGradient>> {\r\n return this._colorRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of alpha remap gradients.\r\n * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list\r\n * @returns the list of alpha remap gradients\r\n */\r\n public getAlphaRemapGradients(): Nullable<Array<FactorGradient>> {\r\n return this._alphaRemapGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of life time gradients.\r\n * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list\r\n * @returns the list of life time gradients\r\n */\r\n public getLifeTimeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._lifeTimeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of angular speed gradients.\r\n * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list\r\n * @returns the list of angular speed gradients\r\n */\r\n public getAngularSpeedGradients(): Nullable<Array<FactorGradient>> {\r\n return this._angularSpeedGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of velocity gradients.\r\n * You must use addVelocityGradient and removeVelocityGradient to update this list\r\n * @returns the list of velocity gradients\r\n */\r\n public getVelocityGradients(): Nullable<Array<FactorGradient>> {\r\n return this._velocityGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of start size gradients.\r\n * You must use addStartSizeGradient and removeStartSizeGradient to update this list\r\n * @returns the list of start size gradients\r\n */\r\n public getStartSizeGradients(): Nullable<Array<FactorGradient>> {\r\n return this._startSizeGradients;\r\n }\r\n\r\n /**\r\n * Gets the current list of emit rate gradients.\r\n * You must use addEmitRateGradient and removeEmitRateGradient to update this list\r\n * @returns the list of emit rate gradients\r\n */\r\n public getEmitRateGradients(): Nullable<Array<FactorGradient>> {\r\n return this._emitRateGradients;\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction1(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).direction1;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction1(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {\r\n (<BoxParticleEmitter>this.particleEmitterType).direction1 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get direction2(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).direction2;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set direction2(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {\r\n (<BoxParticleEmitter>this.particleEmitterType).direction2 = value;\r\n }\r\n }\r\n\r\n /**\r\n * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get minEmitBox(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).minEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set minEmitBox(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {\r\n (<BoxParticleEmitter>this.particleEmitterType).minEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.\r\n * This only works when particleEmitterTyps is a BoxParticleEmitter\r\n */\r\n public get maxEmitBox(): Vector3 {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {\r\n return (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox;\r\n }\r\n\r\n return Vector3.Zero();\r\n }\r\n\r\n public set maxEmitBox(value: Vector3) {\r\n if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {\r\n (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox = value;\r\n }\r\n }\r\n\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color1 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Random color of each particle after it has been emitted, between color1 and color2 vectors\r\n */\r\n public color2 = new Color4(1.0, 1.0, 1.0, 1.0);\r\n /**\r\n * Color the particle will have at the end of its lifetime\r\n */\r\n public colorDead = new Color4(0, 0, 0, 1.0);\r\n\r\n /**\r\n * An optional mask to filter some colors out of the texture, or filter a part of the alpha channel\r\n */\r\n public textureMask = new Color4(1.0, 1.0, 1.0, 1.0);\r\n\r\n /**\r\n * The particle emitter type defines the emitter used by the particle system.\r\n * It can be for example box, sphere, or cone...\r\n */\r\n public particleEmitterType: IParticleEmitterType;\r\n\r\n /** @internal */\r\n public _isSubEmitter = false;\r\n\r\n /** @internal */\r\n public _billboardMode = Constants.PARTICLES_BILLBOARDMODE_ALL;\r\n /**\r\n * Gets or sets the billboard mode to use when isBillboardBased = true.\r\n * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED\r\n */\r\n public get billboardMode(): number {\r\n return this._billboardMode;\r\n }\r\n\r\n public set billboardMode(value: number) {\r\n if (this._billboardMode === value) {\r\n return;\r\n }\r\n\r\n this._billboardMode = value;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _isBillboardBased = true;\r\n /**\r\n * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction\r\n */\r\n public get isBillboardBased(): boolean {\r\n return this._isBillboardBased;\r\n }\r\n\r\n public set isBillboardBased(value: boolean) {\r\n if (this._isBillboardBased === value) {\r\n return;\r\n }\r\n\r\n this._isBillboardBased = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * The scene the particle system belongs to.\r\n */\r\n protected _scene: Nullable<Scene>;\r\n\r\n /**\r\n * The engine the particle system belongs to.\r\n */\r\n protected _engine: AbstractEngine;\r\n\r\n /**\r\n * Local cache of defines for image processing.\r\n */\r\n protected _imageProcessingConfigurationDefines = new ImageProcessingConfigurationDefines();\r\n\r\n /**\r\n * Default configuration related to image processing available in the standard Material.\r\n */\r\n protected _imageProcessingConfiguration: Nullable<ImageProcessingConfiguration>;\r\n\r\n /**\r\n * Gets the image processing configuration used either in this material.\r\n */\r\n public get imageProcessingConfiguration(): Nullable<ImageProcessingConfiguration> {\r\n return this._imageProcessingConfiguration;\r\n }\r\n\r\n /**\r\n * Sets the Default image processing configuration used either in the this material.\r\n *\r\n * If sets to null, the scene one is in use.\r\n */\r\n public set imageProcessingConfiguration(value: Nullable<ImageProcessingConfiguration>) {\r\n this._attachImageProcessingConfiguration(value);\r\n }\r\n\r\n /**\r\n * Attaches a new image processing configuration to the Standard Material.\r\n * @param configuration\r\n */\r\n protected _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void {\r\n if (configuration === this._imageProcessingConfiguration) {\r\n return;\r\n }\r\n\r\n // Pick the scene configuration if needed.\r\n if (!configuration && this._scene) {\r\n this._imageProcessingConfiguration = this._scene.imageProcessingConfiguration;\r\n } else {\r\n this._imageProcessingConfiguration = configuration;\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _reset() {}\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: Nullable<RawTexture>): BaseParticleSystem {\r\n if (!gradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const valueGradient of gradients) {\r\n if (valueGradient.gradient === gradient) {\r\n gradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (texture) {\r\n texture.dispose();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Instantiates a 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 */\r\n public constructor(name: string) {\r\n this.id = name;\r\n this.name = name;\r\n }\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 */\r\n public createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createHemisphericEmitter(radius = 1, radiusRange = 1): HemisphericParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createSphereEmitter(radius = 1, radiusRange = 1): SphereParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createDirectedSphereEmitter(radius = 1, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): SphereDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createCylinderEmitter(radius = 1, height = 1, radiusRange = 1, directionRandomizer = 0): CylinderParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public 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 throw new Error(\"Method not implemented.\");\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 */\r\n public createConeEmitter(radius = 1, angle = Math.PI / 4): ConeParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n public createDirectedConeEmitter(radius = 1, angle = Math.PI / 4, direction1 = new Vector3(0, 1.0, 0), direction2 = new Vector3(0, 1.0, 0)): ConeDirectedParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\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 */\r\n public createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\n// Register Class Name\r\nRegisterClass(\"BABYLON.BaseParticleSystem\", BaseParticleSystem);\r\n"]}
|
|
@@ -238,16 +238,20 @@ export class ThinParticleSystem extends BaseParticleSystem {
|
|
|
238
238
|
return this._indexBuffer;
|
|
239
239
|
}
|
|
240
240
|
get noiseTexture() {
|
|
241
|
-
return this._noiseTexture;
|
|
241
|
+
return this._noiseTexture ?? null;
|
|
242
242
|
}
|
|
243
243
|
set noiseTexture(value) {
|
|
244
|
-
if (this.noiseTexture === value) {
|
|
244
|
+
if (this.noiseTexture === (value ?? null)) {
|
|
245
245
|
return;
|
|
246
246
|
}
|
|
247
|
-
this._noiseTexture = value;
|
|
247
|
+
this._noiseTexture = value ?? null;
|
|
248
248
|
if (!value) {
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
if (this._noiseCreation) {
|
|
250
|
+
_RemoveFromQueue(this._noiseCreation);
|
|
251
|
+
}
|
|
252
|
+
if (this._noiseProcessing) {
|
|
253
|
+
_RemoveFromQueue(this._noiseProcessing);
|
|
254
|
+
}
|
|
251
255
|
return;
|
|
252
256
|
}
|
|
253
257
|
this._noiseCreation = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/thinParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Immutable, Nullable } from \"../types\";\r\nimport { FactorGradient, ColorGradient, Color3Gradient, GradientHelper } from \"../Misc/gradients\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\n\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\n\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { BaseParticleSystem } from \"./baseParticleSystem\";\r\nimport { Particle } from \"./particle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Color4, Color3, TmpColors } from \"../Maths/math.color\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.alpha\";\r\nimport { AddClipPlaneUniforms, PrepareStringDefinesForClipPlanes, BindClipPlane } from \"../Materials/clipPlaneMaterialHelper\";\r\n\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { BindFogParameters, BindLogDepth } from \"../Materials/materialHelper.functions\";\r\nimport { BoxParticleEmitter } from \"./EmitterTypes/boxParticleEmitter\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport { PrepareSamplersForImageProcessing, PrepareUniformsForImageProcessing } from \"../Materials/imageProcessingConfiguration.functions\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport {\r\n _CreateAngleData,\r\n _CreateAngleGradientsData,\r\n _CreateColorData,\r\n _CreateColorDeadData,\r\n _CreateColorGradientsData,\r\n _CreateCustomDirectionData,\r\n _CreateCustomPositionData,\r\n _CreateDirectionData,\r\n _CreateDragData,\r\n _CreateEmitPowerData,\r\n _CreateIsLocalData,\r\n _CreateLifeGradientsData,\r\n _CreateLifetimeData,\r\n _CreateLimitVelocityGradients,\r\n _CreateNoiseData,\r\n _CreatePositionData,\r\n _CreateRampData,\r\n _CreateSheetData,\r\n _CreateSizeData,\r\n _CreateSizeGradientsData,\r\n _CreateStartSizeGradientsData,\r\n _CreateVelocityGradients,\r\n _ProcessAngularSpeed,\r\n _ProcessAngularSpeedGradients,\r\n _ProcessColor,\r\n _ProcessColorGradients,\r\n _ProcessDirection,\r\n _ProcessDragGradients,\r\n _ProcessGravity,\r\n _ProcessLimitVelocityGradients,\r\n _ProcessNoise,\r\n _ProcessPosition,\r\n _ProcessRemapGradients,\r\n _ProcessSizeGradients,\r\n _ProcessVelocityGradients,\r\n} from \"./thinParticleSystem.function\";\r\nimport type { _IExecutionQueueItem } from \"./Queue/executionQueue\";\r\nimport { _ConnectAfter, _ConnectBefore, _RemoveFromQueue } from \"./Queue/executionQueue\";\r\n\r\n/**\r\n * This represents a thin particle system in Babylon.\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 * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * This thin version contains a limited subset of the total features in order to provide users with a way to get particles but with a smaller footprint\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class ThinParticleSystem extends BaseParticleSystem implements IDisposable, IAnimatable, IParticleSystem {\r\n /**\r\n * Force all the particle systems to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * A flag to indicate whether an object or property should not be serialized.\r\n */\r\n public doNotSerialize = false;\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 * This function can be defined to provide custom update for active particles.\r\n * This function will be called instead of regular update (age, position, color, etc.).\r\n * Do not forget that this function will be called on every frame so try to keep it simple and fast :)\r\n */\r\n public updateFunction: (particles: Particle[]) => void;\r\n\r\n /** @internal */\r\n public _emitterWorldMatrix: Matrix;\r\n /** @internal */\r\n public _emitterInverseWorldMatrix: Matrix = Matrix.Identity();\r\n\r\n private _startDirectionFunction: Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> = null;\r\n\r\n /**\r\n * This function can be defined to specify initial direction for every new particle.\r\n * It by default use the emitterType defined function\r\n */\r\n public get startDirectionFunction(): Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> {\r\n return this._startDirectionFunction;\r\n }\r\n\r\n public set startDirectionFunction(value: Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>) {\r\n if (this._startDirectionFunction === value) {\r\n return;\r\n }\r\n this._startDirectionFunction = value;\r\n\r\n if (value) {\r\n this._directionProcessing.process = _CreateCustomDirectionData;\r\n } else {\r\n this._directionProcessing.process = _CreateDirectionData;\r\n }\r\n }\r\n\r\n private _startPositionFunction: Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> = null;\r\n\r\n /**\r\n * This function can be defined to specify initial position for every new particle.\r\n * It by default use the emitterType defined function\r\n */\r\n public get startPositionFunction(): Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> {\r\n return this._startPositionFunction;\r\n }\r\n\r\n public set startPositionFunction(value: Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>) {\r\n if (this._startPositionFunction === value) {\r\n return;\r\n }\r\n this._startPositionFunction = value;\r\n\r\n if (value) {\r\n this._positionCreation.process = _CreateCustomPositionData;\r\n } else {\r\n this._positionCreation.process = _CreatePositionData;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _inheritedVelocityOffset = new Vector3();\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 * An event triggered when the system is started\r\n */\r\n public onStartedObservable = new Observable<IParticleSystem>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<IParticleSystem>>;\r\n /**\r\n * Sets a callback that will be triggered when the system is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /** @internal */\r\n public _noiseTextureSize: Nullable<ISize> = null;\r\n /** @internal */\r\n public _noiseTextureData: Nullable<Uint8Array> = null;\r\n private _particles = new Array<Particle>();\r\n private _epsilon: number;\r\n private _capacity: number;\r\n private _stockParticles = new Array<Particle>();\r\n private _newPartsExcess = 0;\r\n private _vertexData: Float32Array;\r\n private _vertexBuffer: Nullable<Buffer>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _linesIndexBuffer: Nullable<DataBuffer>;\r\n private _linesIndexBufferUseInstancing: Nullable<DataBuffer>;\r\n private _drawWrappers: DrawWrapper[][]; // first index is render pass id, second index is blend mode\r\n /** @internal */\r\n public _customWrappers: { [blendMode: number]: Nullable<DrawWrapper> };\r\n /** @internal */\r\n public _scaledColorStep = new Color4(0, 0, 0, 0);\r\n /** @internal */\r\n public _colorDiff = new Color4(0, 0, 0, 0);\r\n /** @internal */\r\n public _scaledGravity = Vector3.Zero();\r\n private _currentRenderId = -1;\r\n private _alive: boolean;\r\n private _useInstancing = false;\r\n private _vertexArrayObject: Nullable<WebGLVertexArrayObject>;\r\n\r\n /**\r\n * Gets a boolean indicating that the particle system was disposed\r\n */\r\n public override get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n private _started = false;\r\n private _stopped = false;\r\n /** @internal */\r\n public _actualFrame = 0;\r\n /** @internal */\r\n public _scaledUpdateSpeed: number;\r\n private _vertexBufferSize: number;\r\n\r\n /** @internal */\r\n public _currentEmitRateGradient: Nullable<FactorGradient>;\r\n /** @internal */\r\n public _currentEmitRate1 = 0;\r\n /** @internal */\r\n public _currentEmitRate2 = 0;\r\n\r\n /** @internal */\r\n public _currentStartSizeGradient: Nullable<FactorGradient>;\r\n /** @internal */\r\n public _currentStartSize1 = 0;\r\n /** @internal */\r\n public _currentStartSize2 = 0;\r\n\r\n /** Indicates that the update of particles is done in the animate function */\r\n public readonly updateInAnimate = true;\r\n\r\n private readonly _rawTextureWidth = 256;\r\n private _rampGradientsTexture: Nullable<RawTexture>;\r\n private _useRampGradients = false;\r\n\r\n /** @internal */\r\n public _updateQueueStart: Nullable<_IExecutionQueueItem> = null;\r\n protected _colorProcessing: _IExecutionQueueItem;\r\n protected _angularSpeedGradientProcessing: _IExecutionQueueItem;\r\n protected _angularSpeedProcessing: _IExecutionQueueItem;\r\n protected _velocityGradientProcessing: _IExecutionQueueItem;\r\n protected _directionProcessing: _IExecutionQueueItem;\r\n protected _limitVelocityGradientProcessing: _IExecutionQueueItem;\r\n protected _positionProcessing: _IExecutionQueueItem;\r\n protected _dragGradientProcessing: _IExecutionQueueItem;\r\n protected _noiseProcessing: _IExecutionQueueItem;\r\n protected _gravityProcessing: _IExecutionQueueItem;\r\n protected _sizeGradientProcessing: _IExecutionQueueItem;\r\n protected _remapGradientProcessing: _IExecutionQueueItem;\r\n\r\n /** @internal */\r\n public _lifeTimeCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _positionCreation: _IExecutionQueueItem;\r\n private _isLocalCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _directionCreation: _IExecutionQueueItem;\r\n private _emitPowerCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _sizeCreation: _IExecutionQueueItem;\r\n private _startSizeCreation: Nullable<_IExecutionQueueItem> = null;\r\n /** @internal */\r\n public _angleCreation: _IExecutionQueueItem;\r\n private _velocityCreation: _IExecutionQueueItem;\r\n private _limitVelocityCreation: _IExecutionQueueItem;\r\n private _dragCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _colorCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _colorDeadCreation: _IExecutionQueueItem;\r\n private _sheetCreation: _IExecutionQueueItem;\r\n private _rampCreation: _IExecutionQueueItem;\r\n private _noiseCreation: _IExecutionQueueItem;\r\n private _createQueueStart: Nullable<_IExecutionQueueItem> = null;\r\n\r\n /** @internal */\r\n public _tempScaledUpdateSpeed: number;\r\n /** @internal */\r\n public _ratio: number;\r\n /** @internal */\r\n public _emitPower: number;\r\n\r\n /** Gets or sets a matrix to use to compute projection */\r\n public defaultProjectionMatrix: Matrix;\r\n\r\n /** Gets or sets a matrix to use to compute view */\r\n public defaultViewMatrix: Matrix;\r\n\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 return this._useRampGradients;\r\n }\r\n\r\n public set useRampGradients(value: boolean) {\r\n if (this._useRampGradients === value) {\r\n return;\r\n }\r\n\r\n this._useRampGradients = value;\r\n\r\n this._resetEffect();\r\n\r\n if (value) {\r\n this._rampCreation = {\r\n process: _CreateRampData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._rampCreation, this._colorDeadCreation);\r\n this._remapGradientProcessing = {\r\n process: _ProcessRemapGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._remapGradientProcessing, this._gravityProcessing);\r\n } else {\r\n _RemoveFromQueue(this._rampCreation);\r\n _RemoveFromQueue(this._remapGradientProcessing);\r\n }\r\n }\r\n\r\n private _isLocal = 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 get isLocal() {\r\n return this._isLocal;\r\n }\r\n\r\n public set isLocal(value: boolean) {\r\n if (this._isLocal === value) {\r\n return;\r\n }\r\n\r\n this._isLocal = value;\r\n\r\n if (value) {\r\n this._isLocalCreation = {\r\n process: _CreateIsLocalData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._isLocalCreation, this._positionCreation);\r\n } else {\r\n _RemoveFromQueue(this._isLocalCreation);\r\n }\r\n }\r\n\r\n /** Indicates that the particle system is CPU based */\r\n public readonly isGPU = false;\r\n\r\n /**\r\n * Gets the current list of active particles\r\n */\r\n public get particles(): Particle[] {\r\n return this._particles;\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /** @internal */\r\n public override get _isAnimationSheetEnabled() {\r\n return this._animationSheetEnabled;\r\n }\r\n\r\n public override set _isAnimationSheetEnabled(value: boolean) {\r\n if (this._animationSheetEnabled === value) {\r\n return;\r\n }\r\n\r\n this._animationSheetEnabled = value;\r\n\r\n if (value) {\r\n this._sheetCreation = {\r\n process: _CreateSheetData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._sheetCreation, this._colorDeadCreation);\r\n } else {\r\n _RemoveFromQueue(this._sheetCreation);\r\n }\r\n\r\n this._reset();\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._particles.length;\r\n }\r\n\r\n /**\r\n * Returns the string \"ParticleSystem\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"ParticleSystem\";\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 this._stopped && this.isAlive();\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 if (this._customWrappers[blendMode].drawContext) {\r\n this._customWrappers[blendMode].drawContext.useInstancing = this._useInstancing;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _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 \"particles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers used by the particle system\r\n */\r\n public get vertexBuffers(): Immutable<{ [key: string]: VertexBuffer }> {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Gets the index buffer used by the particle system (or null if no index buffer is used (if _useInstancing=true))\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return this._indexBuffer;\r\n }\r\n\r\n public override get noiseTexture() {\r\n return this._noiseTexture;\r\n }\r\n\r\n public override set noiseTexture(value: Nullable<ProceduralTexture>) {\r\n if (this.noiseTexture === value) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value;\r\n\r\n if (!value) {\r\n _RemoveFromQueue(this._noiseCreation);\r\n _RemoveFromQueue(this._noiseProcessing);\r\n return;\r\n }\r\n\r\n this._noiseCreation = {\r\n process: _CreateNoiseData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._noiseCreation, this._colorDeadCreation);\r\n\r\n this._noiseProcessing = {\r\n process: _ProcessNoise,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._noiseProcessing, this._positionProcessing);\r\n }\r\n\r\n /**\r\n * Instantiates a 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 capacity The max number of particles alive at the same time\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 * @param epsilon Offset used to render the particles\r\n * @param noUpdateQueue If true, the particle system will start with an empty update queue\r\n */\r\n constructor(\r\n name: string,\r\n capacity: number,\r\n sceneOrEngine: Scene | AbstractEngine,\r\n customEffect: Nullable<Effect> = null,\r\n isAnimationSheetEnabled: boolean = false,\r\n epsilon: number = 0.01,\r\n noUpdateQueue: boolean = false\r\n ) {\r\n super(name);\r\n\r\n this._capacity = capacity;\r\n\r\n this._epsilon = epsilon;\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!.addParticleSystem(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().vertexArrayObject) {\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._initShaderSourceAsync();\r\n\r\n // Creation queue\r\n this._lifeTimeCreation = {\r\n process: _CreateLifetimeData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n this._positionCreation = {\r\n process: _CreatePositionData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._positionCreation, this._lifeTimeCreation);\r\n\r\n this._directionCreation = {\r\n process: _CreateDirectionData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._directionCreation, this._positionCreation);\r\n\r\n this._emitPowerCreation = {\r\n process: _CreateEmitPowerData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._emitPowerCreation, this._directionCreation);\r\n\r\n this._sizeCreation = {\r\n process: _CreateSizeData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._sizeCreation, this._emitPowerCreation);\r\n\r\n this._angleCreation = {\r\n process: _CreateAngleData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._angleCreation, this._sizeCreation);\r\n\r\n this._colorCreation = {\r\n process: _CreateColorData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._colorCreation, this._angleCreation);\r\n\r\n this._colorDeadCreation = {\r\n process: _CreateColorDeadData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._colorDeadCreation, this._colorCreation);\r\n\r\n this._createQueueStart = this._lifeTimeCreation;\r\n\r\n // Processing queue\r\n if (!noUpdateQueue) {\r\n this._colorProcessing = {\r\n process: _ProcessColor,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n this._angularSpeedProcessing = {\r\n process: _ProcessAngularSpeed,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._angularSpeedProcessing, this._colorProcessing);\r\n\r\n this._directionProcessing = {\r\n process: _ProcessDirection,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._directionProcessing, this._angularSpeedProcessing);\r\n\r\n this._positionProcessing = {\r\n process: _ProcessPosition,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._positionProcessing, this._directionProcessing);\r\n\r\n this._gravityProcessing = {\r\n process: _ProcessGravity,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._gravityProcessing, this._positionProcessing);\r\n\r\n this._updateQueueStart = this._colorProcessing;\r\n }\r\n\r\n this._isAnimationSheetEnabled = isAnimationSheetEnabled;\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n this._customWrappers = { 0: new DrawWrapper(this._engine) };\r\n this._customWrappers[0]!.effect = customEffect;\r\n\r\n this._drawWrappers = [];\r\n this._useInstancing = this._engine.getCaps().instancedArrays;\r\n\r\n this._createIndexBuffer();\r\n this._createVertexBuffers();\r\n\r\n // Default emitter type\r\n this.particleEmitterType = new BoxParticleEmitter();\r\n\r\n // Update\r\n this.updateFunction = (particles: Particle[]): void => {\r\n if (this.noiseTexture) {\r\n // We need to get texture data back to CPU\r\n this._noiseTextureSize = this.noiseTexture.getSize();\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this.noiseTexture.getContent()?.then((data) => {\r\n this._noiseTextureData = data as Uint8Array;\r\n });\r\n }\r\n\r\n const sameParticleArray = particles === this._particles;\r\n\r\n for (let index = 0; index < particles.length; index++) {\r\n const particle = particles[index];\r\n\r\n this._tempScaledUpdateSpeed = this._scaledUpdateSpeed;\r\n const previousAge = particle.age;\r\n particle.age += this._tempScaledUpdateSpeed;\r\n\r\n // Evaluate step to death\r\n if (particle.age > particle.lifeTime) {\r\n const diff = particle.age - previousAge;\r\n const oldDiff = particle.lifeTime - previousAge;\r\n\r\n this._tempScaledUpdateSpeed = (oldDiff * this._tempScaledUpdateSpeed) / diff;\r\n\r\n particle.age = particle.lifeTime;\r\n }\r\n\r\n this._ratio = particle.age / particle.lifeTime;\r\n particle._directionScale = this._tempScaledUpdateSpeed;\r\n\r\n // Processing queue\r\n let currentQueueItem = this._updateQueueStart;\r\n\r\n while (currentQueueItem) {\r\n currentQueueItem.process(particle, this);\r\n currentQueueItem = currentQueueItem.nextItem;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled && !noUpdateQueue) {\r\n particle.updateCellIndex();\r\n }\r\n\r\n // Update the position of the attached sub-emitters to match their attached particle\r\n particle._inheritParticleInfoToSubEmitters();\r\n\r\n if (particle.age >= particle.lifeTime) {\r\n // Recycle by swapping with last particle\r\n this._emitFromParticle(particle);\r\n if (particle._attachedSubEmitters) {\r\n for (const subEmitter of particle._attachedSubEmitters) {\r\n subEmitter.particleSystem.disposeOnStop = true;\r\n subEmitter.particleSystem.stop();\r\n }\r\n particle._attachedSubEmitters = null;\r\n }\r\n this.recycleParticle(particle);\r\n if (sameParticleArray) {\r\n index--;\r\n }\r\n continue;\r\n }\r\n }\r\n };\r\n }\r\n\r\n /** @internal */\r\n public _emitFromParticle: (particle: Particle) => void = (_particle) => {\r\n // Do nothing\r\n };\r\n\r\n serialize(_serializeTexture: boolean) {\r\n throw new Error(\"Method not implemented.\");\r\n }\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 */\r\n public clone(name: string, newEmitter: any, _cloneTexture = false): ThinParticleSystem {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n private _addFactorGradient(factorGradients: FactorGradient[], gradient: number, factor: number, factor2?: number) {\r\n const newGradient = new FactorGradient(gradient, factor, factor2);\r\n factorGradients.push(newGradient);\r\n\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 private _removeFactorGradient(factorGradients: Nullable<FactorGradient[]>, gradient: number) {\r\n if (!factorGradients) {\r\n return;\r\n }\r\n\r\n let index = 0;\r\n for (const factorGradient of factorGradients) {\r\n if (factorGradient.gradient === gradient) {\r\n factorGradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n }\r\n\r\n private _syncLifeTimeCreation() {\r\n if (this.targetStopDuration && this._lifeTimeGradients && this._lifeTimeGradients.length > 0) {\r\n this._lifeTimeCreation.process = _CreateLifeGradientsData;\r\n return;\r\n }\r\n\r\n this._lifeTimeCreation.process = _CreateLifetimeData;\r\n }\r\n\r\n private _syncStartSizeCreation() {\r\n if (this._startSizeGradients && this._startSizeGradients[0] && this.targetStopDuration) {\r\n if (!this._startSizeCreation) {\r\n this._startSizeCreation = {\r\n process: _CreateStartSizeGradientsData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._startSizeCreation, this._sizeCreation);\r\n }\r\n return;\r\n }\r\n\r\n if (this._startSizeCreation) {\r\n _RemoveFromQueue(this._startSizeCreation);\r\n this._startSizeCreation = null;\r\n }\r\n }\r\n\r\n public override get targetStopDuration(): number {\r\n return this._targetStopDuration;\r\n }\r\n\r\n public override set targetStopDuration(value: number) {\r\n if (this.targetStopDuration === value) {\r\n return;\r\n }\r\n\r\n this._targetStopDuration = value;\r\n\r\n this._syncLifeTimeCreation();\r\n this._syncStartSizeCreation();\r\n }\r\n\r\n /**\r\n * Adds a new life time gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the life time factor to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addLifeTimeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._lifeTimeGradients) {\r\n this._lifeTimeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._lifeTimeGradients, gradient, factor, factor2);\r\n\r\n this._syncLifeTimeCreation();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific life time gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeLifeTimeGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._lifeTimeGradients, gradient);\r\n\r\n this._syncLifeTimeCreation();\r\n\r\n return this;\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._sizeGradients) {\r\n this._sizeGradients = [];\r\n }\r\n\r\n if (this._sizeGradients.length === 0) {\r\n this._sizeCreation.process = _CreateSizeGradientsData;\r\n\r\n this._sizeGradientProcessing = {\r\n process: _ProcessSizeGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._sizeGradientProcessing, this._gravityProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._sizeGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._sizeGradients, gradient);\r\n\r\n if (this._sizeGradients?.length === 0) {\r\n _RemoveFromQueue(this._sizeGradientProcessing);\r\n this._sizeCreation.process = _CreateSizeData;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new color remap gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param min defines the color remap minimal range\r\n * @param max defines the color remap maximal range\r\n * @returns the current particle system\r\n */\r\n public addColorRemapGradient(gradient: number, min: number, max: number): IParticleSystem {\r\n if (!this._colorRemapGradients) {\r\n this._colorRemapGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._colorRemapGradients, gradient, min, max);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific color remap gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeColorRemapGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._colorRemapGradients, gradient);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new alpha remap gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param min defines the alpha remap minimal range\r\n * @param max defines the alpha remap maximal range\r\n * @returns the current particle system\r\n */\r\n public addAlphaRemapGradient(gradient: number, min: number, max: number): IParticleSystem {\r\n if (!this._alphaRemapGradients) {\r\n this._alphaRemapGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._alphaRemapGradients, gradient, min, max);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific alpha remap gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeAlphaRemapGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._alphaRemapGradients, gradient);\r\n\r\n return this;\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._angularSpeedGradients) {\r\n this._angularSpeedGradients = [];\r\n }\r\n\r\n if (this._angularSpeedGradients.length === 0) {\r\n this._angleCreation.process = _CreateAngleGradientsData;\r\n\r\n this._angularSpeedGradientProcessing = {\r\n process: _ProcessAngularSpeedGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectBefore(this._angularSpeedGradientProcessing, this._angularSpeedProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._angularSpeedGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._angularSpeedGradients, gradient);\r\n\r\n if (this._angularSpeedGradients?.length === 0) {\r\n this._angleCreation.process = _CreateAngleData;\r\n _RemoveFromQueue(this._angularSpeedGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._velocityGradients) {\r\n this._velocityGradients = [];\r\n }\r\n\r\n if (this._velocityGradients.length === 0) {\r\n this._velocityCreation = {\r\n process: _CreateVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._velocityCreation, this._angleCreation);\r\n\r\n this._velocityGradientProcessing = {\r\n process: _ProcessVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._velocityGradientProcessing, this._directionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._velocityGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._velocityGradients, gradient);\r\n\r\n if (this._velocityGradients?.length === 0) {\r\n _RemoveFromQueue(this._velocityCreation);\r\n _RemoveFromQueue(this._velocityGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._limitVelocityGradients) {\r\n this._limitVelocityGradients = [];\r\n }\r\n\r\n if (this._limitVelocityGradients.length === 0) {\r\n this._limitVelocityCreation = {\r\n process: _CreateLimitVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._limitVelocityCreation, this._angleCreation);\r\n\r\n this._limitVelocityGradientProcessing = {\r\n process: _ProcessLimitVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._limitVelocityGradientProcessing, this._directionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._limitVelocityGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._limitVelocityGradients, gradient);\r\n\r\n if (this._limitVelocityGradients?.length === 0) {\r\n _RemoveFromQueue(this._limitVelocityCreation);\r\n _RemoveFromQueue(this._limitVelocityGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addDragGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._dragGradients) {\r\n this._dragGradients = [];\r\n }\r\n\r\n if (this._dragGradients.length === 0) {\r\n this._dragCreation = {\r\n process: _CreateDragData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._dragCreation, this._colorDeadCreation);\r\n\r\n this._dragGradientProcessing = {\r\n process: _ProcessDragGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._dragGradientProcessing, this._positionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._dragGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._dragGradients, gradient);\r\n\r\n if (this._dragGradients?.length === 0) {\r\n _RemoveFromQueue(this._dragCreation);\r\n _RemoveFromQueue(this._dragGradientProcessing);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new emit rate gradient (please note that this will only work if you set the targetStopDuration property)\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the emit rate value to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addEmitRateGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._emitRateGradients) {\r\n this._emitRateGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._emitRateGradients, gradient, factor, factor2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific emit rate gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeEmitRateGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._emitRateGradients, gradient);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new start size gradient (please note that this will only work if you set the targetStopDuration property)\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the start size value to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addStartSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._startSizeGradients) {\r\n this._startSizeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._startSizeGradients, gradient, factor, factor2);\r\n\r\n this._syncStartSizeCreation();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific start size gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeStartSizeGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._startSizeGradients, gradient);\r\n\r\n this._syncStartSizeCreation();\r\n\r\n return this;\r\n }\r\n\r\n private _createRampGradientTexture() {\r\n if (!this._rampGradients || !this._rampGradients.length || this._rampGradientsTexture || !this._scene) {\r\n return;\r\n }\r\n\r\n const data = new Uint8Array(this._rawTextureWidth * 4);\r\n const tmpColor = TmpColors.Color3[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._rampGradients, (currentGradient, nextGradient, scale) => {\r\n Color3.LerpToRef((<Color3Gradient>currentGradient).color, (<Color3Gradient>nextGradient).color, 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] = 255;\r\n });\r\n }\r\n\r\n this._rampGradientsTexture = RawTexture.CreateRGBATexture(data, this._rawTextureWidth, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n /**\r\n * Gets the current list of ramp gradients.\r\n * You must use addRampGradient and removeRampGradient to update this list\r\n * @returns the list of ramp gradients\r\n */\r\n public getRampGradients(): Nullable<Array<Color3Gradient>> {\r\n return this._rampGradients;\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._syncRampGradientTexture();\r\n }\r\n\r\n private _syncRampGradientTexture() {\r\n if (!this._rampGradients) {\r\n return;\r\n }\r\n\r\n this._rampGradients.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 if (this._rampGradientsTexture) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n\r\n this._createRampGradientTexture();\r\n }\r\n\r\n /**\r\n * Sets the capacity of the object.\r\n * @param value - The new capacity to be set.\r\n */\r\n public set capacity(value: number) {\r\n this._capacity = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * Returns the current capacity of the object.\r\n * @return {number} The capacity value.\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n /**\r\n * Adds a new ramp gradient used to remap particle colors\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param color defines the color to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addRampGradient(gradient: number, color: Color3): ThinParticleSystem {\r\n if (!this._rampGradients) {\r\n this._rampGradients = [];\r\n }\r\n\r\n const rampGradient = new Color3Gradient(gradient, color);\r\n this._rampGradients.push(rampGradient);\r\n\r\n this._syncRampGradientTexture();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific ramp gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeRampGradient(gradient: number): ThinParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._rampGradients, this._rampGradientsTexture);\r\n this._rampGradientsTexture = null;\r\n\r\n if (this._rampGradients && this._rampGradients.length > 0) {\r\n this._createRampGradientTexture();\r\n }\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 * @param color2 defines an additional color used to define a range ([color, color2]) with main color to pick the final color from\r\n * @returns this particle system\r\n */\r\n public addColorGradient(gradient: number, color1: Color4, color2?: Color4): IParticleSystem {\r\n if (!this._colorGradients) {\r\n this._colorGradients = [];\r\n }\r\n\r\n if (this._colorGradients.length === 0) {\r\n this._colorCreation.process = _CreateColorGradientsData;\r\n this._colorProcessing.process = _ProcessColorGradients;\r\n }\r\n\r\n const colorGradient = new ColorGradient(gradient, color1, color2);\r\n this._colorGradients.push(colorGradient);\r\n\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 return this;\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 this particle system\r\n */\r\n public removeColorGradient(gradient: number): IParticleSystem {\r\n if (!this._colorGradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const colorGradient of this._colorGradients) {\r\n if (colorGradient.gradient === gradient) {\r\n this._colorGradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (this._colorGradients.length === 0) {\r\n this._colorCreation.process = _CreateColorData;\r\n this._colorProcessing.process = _ProcessColor;\r\n }\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 if (!this._drawWrappers) {\r\n return;\r\n }\r\n for (const drawWrappers of this._drawWrappers) {\r\n if (drawWrappers) {\r\n for (const drawWrapper of drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _fetchR(u: number, v: number, width: number, height: number, pixels: Uint8Array | Uint8ClampedArray): number {\r\n u = Math.abs(u) * 0.5 + 0.5;\r\n v = Math.abs(v) * 0.5 + 0.5;\r\n\r\n const wrappedU = (u * width) % width | 0;\r\n const wrappedV = (v * height) % height | 0;\r\n\r\n const position = (wrappedU + wrappedV * width) * 4;\r\n return pixels[position] / 255;\r\n }\r\n\r\n protected override _reset() {\r\n this._resetEffect();\r\n }\r\n\r\n private _resetEffect() {\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.dispose();\r\n this._vertexBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n this._createVertexBuffers();\r\n }\r\n\r\n private _createVertexBuffers() {\r\n this._vertexBufferSize = this._useInstancing ? 10 : 12;\r\n if (this._isAnimationSheetEnabled) {\r\n this._vertexBufferSize += 1;\r\n }\r\n\r\n if (\r\n !this._isBillboardBased ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL\r\n ) {\r\n this._vertexBufferSize += 3;\r\n }\r\n\r\n if (this._useRampGradients) {\r\n this._vertexBufferSize += 4;\r\n }\r\n\r\n const engine = this._engine;\r\n const vertexSize = this._vertexBufferSize * (this._useInstancing ? 1 : 4);\r\n this._vertexData = new Float32Array(this._capacity * vertexSize);\r\n this._vertexBuffer = new Buffer(engine, this._vertexData, true, vertexSize);\r\n\r\n let dataOffset = 0;\r\n const positions = this._vertexBuffer.createVertexBuffer(VertexBuffer.PositionKind, dataOffset, 3, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n dataOffset += 3;\r\n\r\n const colors = this._vertexBuffer.createVertexBuffer(VertexBuffer.ColorKind, dataOffset, 4, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n dataOffset += 4;\r\n\r\n const options = this._vertexBuffer.createVertexBuffer(\"angle\", dataOffset, 1, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"angle\"] = options;\r\n dataOffset += 1;\r\n\r\n const size = this._vertexBuffer.createVertexBuffer(\"size\", dataOffset, 2, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"size\"] = size;\r\n dataOffset += 2;\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n const cellIndexBuffer = this._vertexBuffer.createVertexBuffer(\"cellIndex\", dataOffset, 1, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"cellIndex\"] = cellIndexBuffer;\r\n dataOffset += 1;\r\n }\r\n\r\n if (\r\n !this._isBillboardBased ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL\r\n ) {\r\n const directionBuffer = this._vertexBuffer.createVertexBuffer(\"direction\", dataOffset, 3, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"direction\"] = directionBuffer;\r\n dataOffset += 3;\r\n }\r\n\r\n if (this._useRampGradients) {\r\n const rampDataBuffer = this._vertexBuffer.createVertexBuffer(\"remapData\", dataOffset, 4, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"remapData\"] = rampDataBuffer;\r\n dataOffset += 4;\r\n }\r\n\r\n let offsets: VertexBuffer;\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offset\", 0, 2);\r\n } else {\r\n offsets = this._vertexBuffer.createVertexBuffer(\"offset\", dataOffset, 2, this._vertexBufferSize, this._useInstancing);\r\n dataOffset += 2;\r\n }\r\n this._vertexBuffers[\"offset\"] = offsets;\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _createIndexBuffer() {\r\n if (this._useInstancing) {\r\n this._linesIndexBufferUseInstancing = this._engine.createIndexBuffer(new Uint32Array([0, 1, 1, 3, 3, 2, 2, 0, 0, 3]));\r\n return;\r\n }\r\n const indices = [];\r\n const indicesWireframe = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n indicesWireframe.push(index, index + 1, index + 1, index + 2, index + 2, index + 3, index + 3, index, index, index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n this._linesIndexBuffer = this._engine.createIndexBuffer(indicesWireframe);\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 * Gets whether there are still active particles in the system.\r\n * @returns True if it is alive, otherwise false.\r\n */\r\n public isAlive(): boolean {\r\n return this._alive;\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 /** @internal */\r\n public _preStart() {\r\n // Do nothing\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 this.startDelay = 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\r\n this._preStart();\r\n\r\n // Reset emit gradient so it acts the same on every start\r\n if (this._emitRateGradients) {\r\n if (this._emitRateGradients.length > 0) {\r\n this._currentEmitRateGradient = this._emitRateGradients[0];\r\n this._currentEmitRate1 = this._currentEmitRateGradient.getFactor();\r\n this._currentEmitRate2 = this._currentEmitRate1;\r\n }\r\n if (this._emitRateGradients.length > 1) {\r\n this._currentEmitRate2 = this._emitRateGradients[1].getFactor();\r\n }\r\n }\r\n // Reset start size gradient so it acts the same on every start\r\n if (this._startSizeGradients) {\r\n if (this._startSizeGradients.length > 0) {\r\n this._currentStartSizeGradient = this._startSizeGradients[0];\r\n this._currentStartSize1 = this._currentStartSizeGradient.getFactor();\r\n this._currentStartSize2 = this._currentStartSize1;\r\n }\r\n if (this._startSizeGradients.length > 1) {\r\n this._currentStartSize2 = this._startSizeGradients[1].getFactor();\r\n }\r\n }\r\n\r\n if (this.preWarmCycles) {\r\n if (this.emitter?.getClassName().indexOf(\"Mesh\") !== -1) {\r\n (this.emitter as any).computeWorldMatrix(true);\r\n }\r\n\r\n const noiseTextureAsProcedural = this.noiseTexture as ProceduralTexture;\r\n\r\n if (noiseTextureAsProcedural && noiseTextureAsProcedural.onGeneratedObservable) {\r\n noiseTextureAsProcedural.onGeneratedObservable.addOnce(() => {\r\n setTimeout(() => {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n noiseTextureAsProcedural.render();\r\n }\r\n });\r\n });\r\n } else {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n }\r\n }\r\n }\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 this.onStartedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Stops the particle system.\r\n * @param stopSubEmitters if true it will stop the current system and all created sub-Systems if false it will stop the current root system only, this param is used by the root particle system only. The default value is true.\r\n */\r\n public stop(stopSubEmitters = true): 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 this._postStop(stopSubEmitters);\r\n }\r\n\r\n /** @internal */\r\n public _postStop(_stopSubEmitters: boolean) {\r\n // Do nothing\r\n }\r\n\r\n // Animation sheet\r\n\r\n /**\r\n * Remove all active particles\r\n */\r\n public reset(): void {\r\n this._stockParticles.length = 0;\r\n this._particles.length = 0;\r\n }\r\n\r\n /**\r\n * @internal (for internal use only)\r\n */\r\n public _appendParticleVertex(index: number, particle: Particle, offsetX: number, offsetY: number): void {\r\n let offset = index * this._vertexBufferSize;\r\n\r\n const floatingOriginOffset = TmpVectors.Vector3[0].copyFrom(this._scene?.floatingOriginOffset || Vector3.ZeroReadOnly);\r\n this._vertexData[offset++] = particle.position.x + this.worldOffset.x - floatingOriginOffset.x;\r\n this._vertexData[offset++] = particle.position.y + this.worldOffset.y - floatingOriginOffset.y;\r\n this._vertexData[offset++] = particle.position.z + this.worldOffset.z - floatingOriginOffset.z;\r\n this._vertexData[offset++] = particle.color.r;\r\n this._vertexData[offset++] = particle.color.g;\r\n this._vertexData[offset++] = particle.color.b;\r\n this._vertexData[offset++] = particle.color.a;\r\n this._vertexData[offset++] = particle.angle;\r\n\r\n this._vertexData[offset++] = particle.scale.x * particle.size;\r\n this._vertexData[offset++] = particle.scale.y * particle.size;\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n this._vertexData[offset++] = particle.cellIndex;\r\n }\r\n\r\n if (!this._isBillboardBased) {\r\n if (particle._initialDirection) {\r\n let initialDirection = particle._initialDirection;\r\n if (this.isLocal) {\r\n Vector3.TransformNormalToRef(initialDirection, this._emitterWorldMatrix, TmpVectors.Vector3[0]);\r\n initialDirection = TmpVectors.Vector3[0];\r\n }\r\n if (initialDirection.x === 0 && initialDirection.z === 0) {\r\n initialDirection.x = 0.001;\r\n }\r\n\r\n this._vertexData[offset++] = initialDirection.x;\r\n this._vertexData[offset++] = initialDirection.y;\r\n this._vertexData[offset++] = initialDirection.z;\r\n } else {\r\n let direction = particle.direction;\r\n if (this.isLocal) {\r\n Vector3.TransformNormalToRef(direction, this._emitterWorldMatrix, TmpVectors.Vector3[0]);\r\n direction = TmpVectors.Vector3[0];\r\n }\r\n\r\n if (direction.x === 0 && direction.z === 0) {\r\n direction.x = 0.001;\r\n }\r\n this._vertexData[offset++] = direction.x;\r\n this._vertexData[offset++] = direction.y;\r\n this._vertexData[offset++] = direction.z;\r\n }\r\n } else if (this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED || this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL) {\r\n this._vertexData[offset++] = particle.direction.x;\r\n this._vertexData[offset++] = particle.direction.y;\r\n this._vertexData[offset++] = particle.direction.z;\r\n }\r\n\r\n if (this._useRampGradients && particle.remapData) {\r\n this._vertexData[offset++] = particle.remapData.x;\r\n this._vertexData[offset++] = particle.remapData.y;\r\n this._vertexData[offset++] = particle.remapData.z;\r\n this._vertexData[offset++] = particle.remapData.w;\r\n }\r\n\r\n if (!this._useInstancing) {\r\n if (this._isAnimationSheetEnabled) {\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n }\r\n\r\n this._vertexData[offset++] = offsetX;\r\n this._vertexData[offset++] = offsetY;\r\n }\r\n }\r\n\r\n // start of sub system methods\r\n\r\n /**\r\n * \"Recycles\" one of the particle by copying it back to the \"stock\" of particles and removing it from the active list.\r\n * Its lifetime will start back at 0.\r\n * @param particle\r\n */\r\n public recycleParticle: (particle: Particle) => void = (particle) => {\r\n // move particle from activeParticle list to stock particles\r\n const lastParticle = <Particle>this._particles.pop();\r\n if (lastParticle !== particle) {\r\n lastParticle.copyTo(particle);\r\n }\r\n this._stockParticles.push(lastParticle);\r\n };\r\n\r\n private _createParticle: () => Particle = () => {\r\n let particle: Particle;\r\n if (this._stockParticles.length !== 0) {\r\n particle = <Particle>this._stockParticles.pop();\r\n particle._reset();\r\n } else {\r\n particle = new Particle(this);\r\n }\r\n\r\n this._prepareParticle(particle);\r\n return particle;\r\n };\r\n\r\n /** @internal */\r\n public _prepareParticle(_particle: Particle) {\r\n //Do nothing\r\n }\r\n\r\n private _createNewOnes(newParticles: number) {\r\n // Add new ones\r\n let particle: Particle;\r\n for (let index = 0; index < newParticles; index++) {\r\n if (this._particles.length === this._capacity) {\r\n break;\r\n }\r\n\r\n particle = this._createParticle();\r\n\r\n this._particles.push(particle);\r\n\r\n // Creation queue\r\n let currentQueueItem = this._createQueueStart;\r\n\r\n while (currentQueueItem) {\r\n currentQueueItem.process(particle, this);\r\n currentQueueItem = currentQueueItem.nextItem;\r\n }\r\n\r\n // Update the position of the attached sub-emitters to match their attached particle\r\n particle._inheritParticleInfoToSubEmitters();\r\n }\r\n }\r\n\r\n private _update(newParticles: number): void {\r\n // Update current\r\n this._alive = this._particles.length > 0;\r\n\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n this._emitterWorldMatrix = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n this._emitterWorldMatrix = Matrix.Translation(emitterPosition.x, emitterPosition.y, emitterPosition.z);\r\n }\r\n\r\n this._emitterWorldMatrix.invertToRef(this._emitterInverseWorldMatrix);\r\n this.updateFunction(this._particles);\r\n\r\n this._createNewOnes(newParticles);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetAttributeNamesOrOptions(isAnimationSheetEnabled = false, isBillboardBased = false, useRampGradients = false): string[] {\r\n const attributeNamesOrOptions = [VertexBuffer.PositionKind, VertexBuffer.ColorKind, \"angle\", \"offset\", \"size\"];\r\n\r\n if (isAnimationSheetEnabled) {\r\n attributeNamesOrOptions.push(\"cellIndex\");\r\n }\r\n\r\n if (!isBillboardBased) {\r\n attributeNamesOrOptions.push(\"direction\");\r\n }\r\n\r\n if (useRampGradients) {\r\n attributeNamesOrOptions.push(\"remapData\");\r\n }\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 = [\"invView\", \"view\", \"projection\", \"textureMask\", \"translationPivot\", \"eyePosition\"];\r\n\r\n AddClipPlaneUniforms(effectCreationOption);\r\n\r\n if (isAnimationSheetEnabled) {\r\n effectCreationOption.push(\"particlesInfos\");\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, 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 !== Constants.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n }\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n defines.push(\"#define ANIMATESHEET\");\r\n }\r\n\r\n if (this.useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n\r\n if (blendMode === BaseParticleSystem.BLENDMODE_MULTIPLY) {\r\n defines.push(\"#define BLENDMULTIPLYMODE\");\r\n }\r\n\r\n if (this._useRampGradients) {\r\n defines.push(\"#define RAMPGRADIENT\");\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 Constants.PARTICLES_BILLBOARDMODE_Y:\r\n defines.push(\"#define BILLBOARDY\");\r\n break;\r\n case Constants.PARTICLES_BILLBOARDMODE_STRETCHED:\r\n case Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL:\r\n defines.push(\"#define BILLBOARDSTRETCHED\");\r\n if (this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL) {\r\n defines.push(\"#define BILLBOARDSTRETCHED_LOCAL\");\r\n }\r\n break;\r\n case Constants.PARTICLES_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 (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 ...ThinParticleSystem._GetAttributeNamesOrOptions(\r\n this._isAnimationSheetEnabled,\r\n this._isBillboardBased &&\r\n this.billboardMode !== Constants.PARTICLES_BILLBOARDMODE_STRETCHED &&\r\n this.billboardMode !== Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL,\r\n this._useRampGradients\r\n )\r\n );\r\n\r\n uniforms.push(...ThinParticleSystem._GetEffectCreationOptions(this._isAnimationSheetEnabled, this.useLogarithmicDepth, this.applyFog));\r\n\r\n samplers.push(\"diffuseSampler\", \"rampSampler\");\r\n\r\n if (this._imageProcessingConfiguration) {\r\n PrepareUniformsForImageProcessing(uniforms, this._imageProcessingConfigurationDefines);\r\n PrepareSamplersForImageProcessing(samplers, this._imageProcessingConfigurationDefines);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _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 const currentRenderPassId = this._engine._features.supportRenderPasses ? this._engine.currentRenderPassId : Constants.RENDERPASS_MAIN;\r\n let drawWrappers = this._drawWrappers[currentRenderPassId];\r\n if (!drawWrappers) {\r\n drawWrappers = this._drawWrappers[currentRenderPassId] = [];\r\n }\r\n let drawWrapper = drawWrappers[blendMode];\r\n if (!drawWrapper) {\r\n drawWrapper = new DrawWrapper(this._engine);\r\n if (drawWrapper.drawContext) {\r\n drawWrapper.drawContext.useInstancing = this._useInstancing;\r\n }\r\n drawWrappers[blendMode] = drawWrapper;\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (drawWrapper.defines !== join) {\r\n const attributesNamesOrOptions: Array<string> = [];\r\n const effectCreationOption: Array<string> = [];\r\n const samplers: Array<string> = [];\r\n\r\n this.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, samplers);\r\n\r\n drawWrapper.setEffect(\r\n this._engine.createEffect(\r\n \"particles\",\r\n attributesNamesOrOptions,\r\n effectCreationOption,\r\n samplers,\r\n join,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the particle system is paused (no animation will be done).\r\n */\r\n public paused = false;\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 preWarmOnly will prevent the system from updating the vertex buffer (default is false)\r\n */\r\n public animate(preWarmOnly = false): void {\r\n if (!this._started || this.paused) {\r\n return;\r\n }\r\n\r\n if (!preWarmOnly && this._scene) {\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n if (this._currentRenderId === this._scene.getFrameId()) {\r\n return;\r\n }\r\n this._currentRenderId = this._scene.getFrameId();\r\n }\r\n\r\n this._scaledUpdateSpeed = this.updateSpeed * (preWarmOnly ? this.preWarmStepOffset : this._scene?.getAnimationRatio() || 1);\r\n\r\n // Determine the number of particles we need to create\r\n let newParticles;\r\n\r\n if (this.manualEmitCount > -1) {\r\n newParticles = this.manualEmitCount;\r\n this._newPartsExcess = 0;\r\n this.manualEmitCount = 0;\r\n } else {\r\n const rate = this._calculateEmitRate();\r\n newParticles = (rate * this._scaledUpdateSpeed) >> 0;\r\n this._newPartsExcess += rate * this._scaledUpdateSpeed - newParticles;\r\n }\r\n\r\n if (this._newPartsExcess > 1.0) {\r\n newParticles += this._newPartsExcess >> 0;\r\n this._newPartsExcess -= this._newPartsExcess >> 0;\r\n }\r\n\r\n this._alive = false;\r\n\r\n if (!this._stopped) {\r\n this._actualFrame += this._scaledUpdateSpeed;\r\n\r\n if (this.targetStopDuration && this._actualFrame >= this.targetStopDuration) {\r\n this.stop();\r\n }\r\n } else {\r\n newParticles = 0;\r\n }\r\n this._update(newParticles);\r\n\r\n // Stopped?\r\n if (this._stopped) {\r\n if (!this._alive) {\r\n this._started = false;\r\n if (this.onAnimationEnd) {\r\n this.onAnimationEnd();\r\n }\r\n if (this.disposeOnStop && this._scene) {\r\n this._scene._toBeDisposed.push(this);\r\n }\r\n }\r\n }\r\n\r\n if (!preWarmOnly) {\r\n // Update VBO\r\n let offset = 0;\r\n for (let index = 0; index < this._particles.length; index++) {\r\n const particle = this._particles[index];\r\n this._appendParticleVertices(offset, particle);\r\n offset += this._useInstancing ? 1 : 4;\r\n }\r\n\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.updateDirectly(this._vertexData, 0, this._particles.length);\r\n }\r\n }\r\n\r\n if (this.manualEmitCount === 0 && this.disposeOnStop) {\r\n this.stop();\r\n }\r\n }\r\n\r\n /**\r\n * Internal only. Calculates the current emit rate based on the gradients if any.\r\n * @returns The emit rate\r\n * @internal\r\n */\r\n public _calculateEmitRate(): number {\r\n let rate = this.emitRate;\r\n\r\n if (this._emitRateGradients && this._emitRateGradients.length > 0 && this.targetStopDuration) {\r\n const ratio = this._actualFrame / this.targetStopDuration;\r\n GradientHelper.GetCurrentGradient(ratio, this._emitRateGradients, (currentGradient, nextGradient, scale) => {\r\n if (currentGradient !== this._currentEmitRateGradient) {\r\n this._currentEmitRate1 = this._currentEmitRate2;\r\n this._currentEmitRate2 = (<FactorGradient>nextGradient).getFactor();\r\n this._currentEmitRateGradient = <FactorGradient>currentGradient;\r\n }\r\n\r\n rate = Lerp(this._currentEmitRate1, this._currentEmitRate2, scale);\r\n });\r\n }\r\n\r\n return rate;\r\n }\r\n\r\n private _appendParticleVertices(offset: number, particle: Particle) {\r\n this._appendParticleVertex(offset++, particle, 0, 0);\r\n if (!this._useInstancing) {\r\n this._appendParticleVertex(offset++, particle, 1, 0);\r\n this._appendParticleVertex(offset++, particle, 1, 1);\r\n this._appendParticleVertex(offset++, particle, 0, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the particle system.\r\n */\r\n public rebuild(): void {\r\n if (this._engine.getCaps().vertexArrayObject) {\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n this._spriteBuffer?._rebuild();\r\n\r\n this._createVertexBuffers();\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU && !ThinParticleSystem.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([import(\"../ShadersWGSL/particles.vertex\"), import(\"../ShadersWGSL/particles.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/particles.vertex\"), import(\"../Shaders/particles.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\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 (!this._shadersLoaded) {\r\n return false;\r\n }\r\n if (!this.emitter || (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady()) || !this.particleTexture || !this.particleTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this.blendMode !== BaseParticleSystem.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(BaseParticleSystem.BLENDMODE_MULTIPLY).effect!.isReady()) {\r\n return false;\r\n }\r\n if (!this._getWrapper(BaseParticleSystem.BLENDMODE_ADD).effect!.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _render(blendMode: number) {\r\n const drawWrapper = this._getWrapper(blendMode);\r\n const effect = drawWrapper.effect!;\r\n\r\n const engine = this._engine;\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n const viewMatrix = this.defaultViewMatrix ?? this._scene!.getViewMatrix();\r\n effect.setTexture(\"diffuseSampler\", this.particleTexture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", this.defaultProjectionMatrix ?? this._scene!.getProjectionMatrix());\r\n\r\n if (this._isAnimationSheetEnabled && this.particleTexture) {\r\n const baseSize = this.particleTexture.getBaseSize();\r\n effect.setFloat3(\"particlesInfos\", this.spriteCellWidth / baseSize.width, this.spriteCellHeight / baseSize.height, this.spriteCellWidth / baseSize.width);\r\n }\r\n\r\n effect.setVector2(\"translationPivot\", this.translationPivot);\r\n effect.setFloat4(\"textureMask\", this.textureMask.r, this.textureMask.g, this.textureMask.b, this.textureMask.a);\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 if (this._rampGradientsTexture) {\r\n if (!this._rampGradients || !this._rampGradients.length) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n effect.setTexture(\"rampSampler\", this._rampGradientsTexture);\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 viewMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n effect.setMatrix(\"invView\", TmpVectors.Matrix[0]);\r\n }\r\n\r\n if (this._vertexArrayObject !== undefined) {\r\n if (this._scene?.forceWireframe) {\r\n engine.bindBuffers(this._vertexBuffers, this._linesIndexBufferUseInstancing, effect);\r\n } else {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (this._engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n (this._engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n }\r\n } else {\r\n if (!this._indexBuffer) {\r\n // Use instancing mode\r\n engine.bindBuffers(this._vertexBuffers, this._scene?.forceWireframe ? this._linesIndexBufferUseInstancing : null, effect);\r\n } else {\r\n engine.bindBuffers(this._vertexBuffers, this._scene?.forceWireframe ? this._linesIndexBuffer : this._indexBuffer, effect);\r\n }\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 if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.notifyObservers(effect);\r\n }\r\n\r\n if (this._useInstancing) {\r\n if (this._scene?.forceWireframe) {\r\n engine.drawElementsType(Constants.MATERIAL_LineStripDrawMode, 0, 10, this._particles.length);\r\n } else {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, this._particles.length);\r\n }\r\n } else {\r\n if (this._scene?.forceWireframe) {\r\n engine.drawElementsType(Constants.MATERIAL_WireFrameFillMode, 0, this._particles.length * 10);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, this._particles.length * 6);\r\n }\r\n }\r\n\r\n return this._particles.length;\r\n }\r\n\r\n /**\r\n * Renders the particle system in its current state.\r\n * @returns the current number of particles\r\n */\r\n public render(): number {\r\n // Check\r\n if (!this.isReady() || !this._particles.length) {\r\n return 0;\r\n }\r\n\r\n const engine = this._engine as any;\r\n if (engine.setState) {\r\n engine.setState(false);\r\n\r\n if (this.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n }\r\n\r\n let outparticles = 0;\r\n\r\n if (this.blendMode === BaseParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n outparticles = this._render(BaseParticleSystem.BLENDMODE_MULTIPLY) + this._render(BaseParticleSystem.BLENDMODE_ADD);\r\n } else {\r\n outparticles = this._render(this.blendMode);\r\n }\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return outparticles;\r\n }\r\n\r\n /** @internal */\r\n public _onDispose(_disposeAttachedSubEmitters = false, _disposeEndSubEmitters = false) {\r\n // Do Nothing\r\n }\r\n\r\n /**\r\n * Disposes the particle system and free the associated resources\r\n * @param disposeTexture defines if the particle texture must be disposed as well (true by default)\r\n * @param disposeAttachedSubEmitters defines if the attached sub-emitters must be disposed as well (false by default)\r\n * @param disposeEndSubEmitters defines if the end type sub-emitters must be disposed as well (false by default)\r\n */\r\n public dispose(disposeTexture = true, disposeAttachedSubEmitters = false, disposeEndSubEmitters = false): void {\r\n this.resetDrawCache();\r\n\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.dispose();\r\n this._vertexBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this._linesIndexBuffer) {\r\n this._engine._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n if (this._linesIndexBufferUseInstancing) {\r\n this._engine._releaseBuffer(this._linesIndexBufferUseInstancing);\r\n this._linesIndexBufferUseInstancing = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n this._vertexArrayObject = 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 if (this._rampGradientsTexture) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n\r\n this._onDispose(disposeAttachedSubEmitters, disposeEndSubEmitters);\r\n\r\n if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.clear();\r\n }\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeParticleSystem(this);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n this.onStoppedObservable.clear();\r\n this.onStartedObservable.clear();\r\n\r\n this.reset();\r\n\r\n this._isDisposed = true;\r\n this.metadata = null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"thinParticleSystem.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/thinParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Immutable, Nullable } from \"../types\";\r\nimport { FactorGradient, ColorGradient, Color3Gradient, GradientHelper } from \"../Misc/gradients\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { VertexBuffer, Buffer } from \"../Buffers/buffer\";\r\n\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\n\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { BaseParticleSystem } from \"./baseParticleSystem\";\r\nimport { Particle } from \"./particle\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Color4, Color3, TmpColors } from \"../Maths/math.color\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.alpha\";\r\nimport { AddClipPlaneUniforms, PrepareStringDefinesForClipPlanes, BindClipPlane } from \"../Materials/clipPlaneMaterialHelper\";\r\n\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { ProceduralTexture } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { BindFogParameters, BindLogDepth } from \"../Materials/materialHelper.functions\";\r\nimport { BoxParticleEmitter } from \"./EmitterTypes/boxParticleEmitter\";\r\nimport { Lerp } from \"../Maths/math.scalar.functions\";\r\nimport { PrepareSamplersForImageProcessing, PrepareUniformsForImageProcessing } from \"../Materials/imageProcessingConfiguration.functions\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport {\r\n _CreateAngleData,\r\n _CreateAngleGradientsData,\r\n _CreateColorData,\r\n _CreateColorDeadData,\r\n _CreateColorGradientsData,\r\n _CreateCustomDirectionData,\r\n _CreateCustomPositionData,\r\n _CreateDirectionData,\r\n _CreateDragData,\r\n _CreateEmitPowerData,\r\n _CreateIsLocalData,\r\n _CreateLifeGradientsData,\r\n _CreateLifetimeData,\r\n _CreateLimitVelocityGradients,\r\n _CreateNoiseData,\r\n _CreatePositionData,\r\n _CreateRampData,\r\n _CreateSheetData,\r\n _CreateSizeData,\r\n _CreateSizeGradientsData,\r\n _CreateStartSizeGradientsData,\r\n _CreateVelocityGradients,\r\n _ProcessAngularSpeed,\r\n _ProcessAngularSpeedGradients,\r\n _ProcessColor,\r\n _ProcessColorGradients,\r\n _ProcessDirection,\r\n _ProcessDragGradients,\r\n _ProcessGravity,\r\n _ProcessLimitVelocityGradients,\r\n _ProcessNoise,\r\n _ProcessPosition,\r\n _ProcessRemapGradients,\r\n _ProcessSizeGradients,\r\n _ProcessVelocityGradients,\r\n} from \"./thinParticleSystem.function\";\r\nimport type { _IExecutionQueueItem } from \"./Queue/executionQueue\";\r\nimport { _ConnectAfter, _ConnectBefore, _RemoveFromQueue } from \"./Queue/executionQueue\";\r\n\r\n/**\r\n * This represents a thin particle system in Babylon.\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 * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.\r\n * This thin version contains a limited subset of the total features in order to provide users with a way to get particles but with a smaller footprint\r\n * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro\r\n */\r\nexport class ThinParticleSystem extends BaseParticleSystem implements IDisposable, IAnimatable, IParticleSystem {\r\n /**\r\n * Force all the particle systems to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * A flag to indicate whether an object or property should not be serialized.\r\n */\r\n public doNotSerialize = false;\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 * This function can be defined to provide custom update for active particles.\r\n * This function will be called instead of regular update (age, position, color, etc.).\r\n * Do not forget that this function will be called on every frame so try to keep it simple and fast :)\r\n */\r\n public updateFunction: (particles: Particle[]) => void;\r\n\r\n /** @internal */\r\n public _emitterWorldMatrix: Matrix;\r\n /** @internal */\r\n public _emitterInverseWorldMatrix: Matrix = Matrix.Identity();\r\n\r\n private _startDirectionFunction: Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> = null;\r\n\r\n /**\r\n * This function can be defined to specify initial direction for every new particle.\r\n * It by default use the emitterType defined function\r\n */\r\n public get startDirectionFunction(): Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> {\r\n return this._startDirectionFunction;\r\n }\r\n\r\n public set startDirectionFunction(value: Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>) {\r\n if (this._startDirectionFunction === value) {\r\n return;\r\n }\r\n this._startDirectionFunction = value;\r\n\r\n if (value) {\r\n this._directionProcessing.process = _CreateCustomDirectionData;\r\n } else {\r\n this._directionProcessing.process = _CreateDirectionData;\r\n }\r\n }\r\n\r\n private _startPositionFunction: Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> = null;\r\n\r\n /**\r\n * This function can be defined to specify initial position for every new particle.\r\n * It by default use the emitterType defined function\r\n */\r\n public get startPositionFunction(): Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void> {\r\n return this._startPositionFunction;\r\n }\r\n\r\n public set startPositionFunction(value: Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>) {\r\n if (this._startPositionFunction === value) {\r\n return;\r\n }\r\n this._startPositionFunction = value;\r\n\r\n if (value) {\r\n this._positionCreation.process = _CreateCustomPositionData;\r\n } else {\r\n this._positionCreation.process = _CreatePositionData;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _inheritedVelocityOffset = new Vector3();\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 * An event triggered when the system is started\r\n */\r\n public onStartedObservable = new Observable<IParticleSystem>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<IParticleSystem>>;\r\n /**\r\n * Sets a callback that will be triggered when the system is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /** @internal */\r\n public _noiseTextureSize: Nullable<ISize> = null;\r\n /** @internal */\r\n public _noiseTextureData: Nullable<Uint8Array> = null;\r\n private _particles = new Array<Particle>();\r\n private _epsilon: number;\r\n private _capacity: number;\r\n private _stockParticles = new Array<Particle>();\r\n private _newPartsExcess = 0;\r\n private _vertexData: Float32Array;\r\n private _vertexBuffer: Nullable<Buffer>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _linesIndexBuffer: Nullable<DataBuffer>;\r\n private _linesIndexBufferUseInstancing: Nullable<DataBuffer>;\r\n private _drawWrappers: DrawWrapper[][]; // first index is render pass id, second index is blend mode\r\n /** @internal */\r\n public _customWrappers: { [blendMode: number]: Nullable<DrawWrapper> };\r\n /** @internal */\r\n public _scaledColorStep = new Color4(0, 0, 0, 0);\r\n /** @internal */\r\n public _colorDiff = new Color4(0, 0, 0, 0);\r\n /** @internal */\r\n public _scaledGravity = Vector3.Zero();\r\n private _currentRenderId = -1;\r\n private _alive: boolean;\r\n private _useInstancing = false;\r\n private _vertexArrayObject: Nullable<WebGLVertexArrayObject>;\r\n\r\n /**\r\n * Gets a boolean indicating that the particle system was disposed\r\n */\r\n public override get isDisposed(): boolean {\r\n return this._isDisposed;\r\n }\r\n\r\n private _started = false;\r\n private _stopped = false;\r\n /** @internal */\r\n public _actualFrame = 0;\r\n /** @internal */\r\n public _scaledUpdateSpeed: number;\r\n private _vertexBufferSize: number;\r\n\r\n /** @internal */\r\n public _currentEmitRateGradient: Nullable<FactorGradient>;\r\n /** @internal */\r\n public _currentEmitRate1 = 0;\r\n /** @internal */\r\n public _currentEmitRate2 = 0;\r\n\r\n /** @internal */\r\n public _currentStartSizeGradient: Nullable<FactorGradient>;\r\n /** @internal */\r\n public _currentStartSize1 = 0;\r\n /** @internal */\r\n public _currentStartSize2 = 0;\r\n\r\n /** Indicates that the update of particles is done in the animate function */\r\n public readonly updateInAnimate = true;\r\n\r\n private readonly _rawTextureWidth = 256;\r\n private _rampGradientsTexture: Nullable<RawTexture>;\r\n private _useRampGradients = false;\r\n\r\n /** @internal */\r\n public _updateQueueStart: Nullable<_IExecutionQueueItem> = null;\r\n protected _colorProcessing: _IExecutionQueueItem;\r\n protected _angularSpeedGradientProcessing: _IExecutionQueueItem;\r\n protected _angularSpeedProcessing: _IExecutionQueueItem;\r\n protected _velocityGradientProcessing: _IExecutionQueueItem;\r\n protected _directionProcessing: _IExecutionQueueItem;\r\n protected _limitVelocityGradientProcessing: _IExecutionQueueItem;\r\n protected _positionProcessing: _IExecutionQueueItem;\r\n protected _dragGradientProcessing: _IExecutionQueueItem;\r\n protected _noiseProcessing: _IExecutionQueueItem;\r\n protected _gravityProcessing: _IExecutionQueueItem;\r\n protected _sizeGradientProcessing: _IExecutionQueueItem;\r\n protected _remapGradientProcessing: _IExecutionQueueItem;\r\n\r\n /** @internal */\r\n public _lifeTimeCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _positionCreation: _IExecutionQueueItem;\r\n private _isLocalCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _directionCreation: _IExecutionQueueItem;\r\n private _emitPowerCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _sizeCreation: _IExecutionQueueItem;\r\n private _startSizeCreation: Nullable<_IExecutionQueueItem> = null;\r\n /** @internal */\r\n public _angleCreation: _IExecutionQueueItem;\r\n private _velocityCreation: _IExecutionQueueItem;\r\n private _limitVelocityCreation: _IExecutionQueueItem;\r\n private _dragCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _colorCreation: _IExecutionQueueItem;\r\n /** @internal */\r\n public _colorDeadCreation: _IExecutionQueueItem;\r\n private _sheetCreation: _IExecutionQueueItem;\r\n private _rampCreation: _IExecutionQueueItem;\r\n private _noiseCreation: _IExecutionQueueItem;\r\n private _createQueueStart: Nullable<_IExecutionQueueItem> = null;\r\n\r\n /** @internal */\r\n public _tempScaledUpdateSpeed: number;\r\n /** @internal */\r\n public _ratio: number;\r\n /** @internal */\r\n public _emitPower: number;\r\n\r\n /** Gets or sets a matrix to use to compute projection */\r\n public defaultProjectionMatrix: Matrix;\r\n\r\n /** Gets or sets a matrix to use to compute view */\r\n public defaultViewMatrix: Matrix;\r\n\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 return this._useRampGradients;\r\n }\r\n\r\n public set useRampGradients(value: boolean) {\r\n if (this._useRampGradients === value) {\r\n return;\r\n }\r\n\r\n this._useRampGradients = value;\r\n\r\n this._resetEffect();\r\n\r\n if (value) {\r\n this._rampCreation = {\r\n process: _CreateRampData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._rampCreation, this._colorDeadCreation);\r\n this._remapGradientProcessing = {\r\n process: _ProcessRemapGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._remapGradientProcessing, this._gravityProcessing);\r\n } else {\r\n _RemoveFromQueue(this._rampCreation);\r\n _RemoveFromQueue(this._remapGradientProcessing);\r\n }\r\n }\r\n\r\n private _isLocal = 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 get isLocal() {\r\n return this._isLocal;\r\n }\r\n\r\n public set isLocal(value: boolean) {\r\n if (this._isLocal === value) {\r\n return;\r\n }\r\n\r\n this._isLocal = value;\r\n\r\n if (value) {\r\n this._isLocalCreation = {\r\n process: _CreateIsLocalData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._isLocalCreation, this._positionCreation);\r\n } else {\r\n _RemoveFromQueue(this._isLocalCreation);\r\n }\r\n }\r\n\r\n /** Indicates that the particle system is CPU based */\r\n public readonly isGPU = false;\r\n\r\n /**\r\n * Gets the current list of active particles\r\n */\r\n public get particles(): Particle[] {\r\n return this._particles;\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /** @internal */\r\n public override get _isAnimationSheetEnabled() {\r\n return this._animationSheetEnabled;\r\n }\r\n\r\n public override set _isAnimationSheetEnabled(value: boolean) {\r\n if (this._animationSheetEnabled === value) {\r\n return;\r\n }\r\n\r\n this._animationSheetEnabled = value;\r\n\r\n if (value) {\r\n this._sheetCreation = {\r\n process: _CreateSheetData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._sheetCreation, this._colorDeadCreation);\r\n } else {\r\n _RemoveFromQueue(this._sheetCreation);\r\n }\r\n\r\n this._reset();\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._particles.length;\r\n }\r\n\r\n /**\r\n * Returns the string \"ParticleSystem\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"ParticleSystem\";\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 this._stopped && this.isAlive();\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 if (this._customWrappers[blendMode].drawContext) {\r\n this._customWrappers[blendMode].drawContext.useInstancing = this._useInstancing;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _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 \"particles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers used by the particle system\r\n */\r\n public get vertexBuffers(): Immutable<{ [key: string]: VertexBuffer }> {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Gets the index buffer used by the particle system (or null if no index buffer is used (if _useInstancing=true))\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return this._indexBuffer;\r\n }\r\n\r\n public override get noiseTexture() {\r\n return this._noiseTexture ?? null;\r\n }\r\n\r\n public override set noiseTexture(value: Nullable<ProceduralTexture>) {\r\n if (this.noiseTexture === (value ?? null)) {\r\n return;\r\n }\r\n\r\n this._noiseTexture = value ?? null;\r\n\r\n if (!value) {\r\n if (this._noiseCreation) {\r\n _RemoveFromQueue(this._noiseCreation);\r\n }\r\n if (this._noiseProcessing) {\r\n _RemoveFromQueue(this._noiseProcessing);\r\n }\r\n return;\r\n }\r\n\r\n this._noiseCreation = {\r\n process: _CreateNoiseData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._noiseCreation, this._colorDeadCreation);\r\n\r\n this._noiseProcessing = {\r\n process: _ProcessNoise,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._noiseProcessing, this._positionProcessing);\r\n }\r\n\r\n /**\r\n * Instantiates a 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 capacity The max number of particles alive at the same time\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 * @param epsilon Offset used to render the particles\r\n * @param noUpdateQueue If true, the particle system will start with an empty update queue\r\n */\r\n constructor(\r\n name: string,\r\n capacity: number,\r\n sceneOrEngine: Scene | AbstractEngine,\r\n customEffect: Nullable<Effect> = null,\r\n isAnimationSheetEnabled: boolean = false,\r\n epsilon: number = 0.01,\r\n noUpdateQueue: boolean = false\r\n ) {\r\n super(name);\r\n\r\n this._capacity = capacity;\r\n\r\n this._epsilon = epsilon;\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!.addParticleSystem(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().vertexArrayObject) {\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._initShaderSourceAsync();\r\n\r\n // Creation queue\r\n this._lifeTimeCreation = {\r\n process: _CreateLifetimeData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n this._positionCreation = {\r\n process: _CreatePositionData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._positionCreation, this._lifeTimeCreation);\r\n\r\n this._directionCreation = {\r\n process: _CreateDirectionData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._directionCreation, this._positionCreation);\r\n\r\n this._emitPowerCreation = {\r\n process: _CreateEmitPowerData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._emitPowerCreation, this._directionCreation);\r\n\r\n this._sizeCreation = {\r\n process: _CreateSizeData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._sizeCreation, this._emitPowerCreation);\r\n\r\n this._angleCreation = {\r\n process: _CreateAngleData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._angleCreation, this._sizeCreation);\r\n\r\n this._colorCreation = {\r\n process: _CreateColorData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._colorCreation, this._angleCreation);\r\n\r\n this._colorDeadCreation = {\r\n process: _CreateColorDeadData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._colorDeadCreation, this._colorCreation);\r\n\r\n this._createQueueStart = this._lifeTimeCreation;\r\n\r\n // Processing queue\r\n if (!noUpdateQueue) {\r\n this._colorProcessing = {\r\n process: _ProcessColor,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n this._angularSpeedProcessing = {\r\n process: _ProcessAngularSpeed,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._angularSpeedProcessing, this._colorProcessing);\r\n\r\n this._directionProcessing = {\r\n process: _ProcessDirection,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._directionProcessing, this._angularSpeedProcessing);\r\n\r\n this._positionProcessing = {\r\n process: _ProcessPosition,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._positionProcessing, this._directionProcessing);\r\n\r\n this._gravityProcessing = {\r\n process: _ProcessGravity,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectAfter(this._gravityProcessing, this._positionProcessing);\r\n\r\n this._updateQueueStart = this._colorProcessing;\r\n }\r\n\r\n this._isAnimationSheetEnabled = isAnimationSheetEnabled;\r\n\r\n // Setup the default processing configuration to the scene.\r\n this._attachImageProcessingConfiguration(null);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n this._customWrappers = { 0: new DrawWrapper(this._engine) };\r\n this._customWrappers[0]!.effect = customEffect;\r\n\r\n this._drawWrappers = [];\r\n this._useInstancing = this._engine.getCaps().instancedArrays;\r\n\r\n this._createIndexBuffer();\r\n this._createVertexBuffers();\r\n\r\n // Default emitter type\r\n this.particleEmitterType = new BoxParticleEmitter();\r\n\r\n // Update\r\n this.updateFunction = (particles: Particle[]): void => {\r\n if (this.noiseTexture) {\r\n // We need to get texture data back to CPU\r\n this._noiseTextureSize = this.noiseTexture.getSize();\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this.noiseTexture.getContent()?.then((data) => {\r\n this._noiseTextureData = data as Uint8Array;\r\n });\r\n }\r\n\r\n const sameParticleArray = particles === this._particles;\r\n\r\n for (let index = 0; index < particles.length; index++) {\r\n const particle = particles[index];\r\n\r\n this._tempScaledUpdateSpeed = this._scaledUpdateSpeed;\r\n const previousAge = particle.age;\r\n particle.age += this._tempScaledUpdateSpeed;\r\n\r\n // Evaluate step to death\r\n if (particle.age > particle.lifeTime) {\r\n const diff = particle.age - previousAge;\r\n const oldDiff = particle.lifeTime - previousAge;\r\n\r\n this._tempScaledUpdateSpeed = (oldDiff * this._tempScaledUpdateSpeed) / diff;\r\n\r\n particle.age = particle.lifeTime;\r\n }\r\n\r\n this._ratio = particle.age / particle.lifeTime;\r\n particle._directionScale = this._tempScaledUpdateSpeed;\r\n\r\n // Processing queue\r\n let currentQueueItem = this._updateQueueStart;\r\n\r\n while (currentQueueItem) {\r\n currentQueueItem.process(particle, this);\r\n currentQueueItem = currentQueueItem.nextItem;\r\n }\r\n\r\n if (this._isAnimationSheetEnabled && !noUpdateQueue) {\r\n particle.updateCellIndex();\r\n }\r\n\r\n // Update the position of the attached sub-emitters to match their attached particle\r\n particle._inheritParticleInfoToSubEmitters();\r\n\r\n if (particle.age >= particle.lifeTime) {\r\n // Recycle by swapping with last particle\r\n this._emitFromParticle(particle);\r\n if (particle._attachedSubEmitters) {\r\n for (const subEmitter of particle._attachedSubEmitters) {\r\n subEmitter.particleSystem.disposeOnStop = true;\r\n subEmitter.particleSystem.stop();\r\n }\r\n particle._attachedSubEmitters = null;\r\n }\r\n this.recycleParticle(particle);\r\n if (sameParticleArray) {\r\n index--;\r\n }\r\n continue;\r\n }\r\n }\r\n };\r\n }\r\n\r\n /** @internal */\r\n public _emitFromParticle: (particle: Particle) => void = (_particle) => {\r\n // Do nothing\r\n };\r\n\r\n serialize(_serializeTexture: boolean) {\r\n throw new Error(\"Method not implemented.\");\r\n }\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 */\r\n public clone(name: string, newEmitter: any, _cloneTexture = false): ThinParticleSystem {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n private _addFactorGradient(factorGradients: FactorGradient[], gradient: number, factor: number, factor2?: number) {\r\n const newGradient = new FactorGradient(gradient, factor, factor2);\r\n factorGradients.push(newGradient);\r\n\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 private _removeFactorGradient(factorGradients: Nullable<FactorGradient[]>, gradient: number) {\r\n if (!factorGradients) {\r\n return;\r\n }\r\n\r\n let index = 0;\r\n for (const factorGradient of factorGradients) {\r\n if (factorGradient.gradient === gradient) {\r\n factorGradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n }\r\n\r\n private _syncLifeTimeCreation() {\r\n if (this.targetStopDuration && this._lifeTimeGradients && this._lifeTimeGradients.length > 0) {\r\n this._lifeTimeCreation.process = _CreateLifeGradientsData;\r\n return;\r\n }\r\n\r\n this._lifeTimeCreation.process = _CreateLifetimeData;\r\n }\r\n\r\n private _syncStartSizeCreation() {\r\n if (this._startSizeGradients && this._startSizeGradients[0] && this.targetStopDuration) {\r\n if (!this._startSizeCreation) {\r\n this._startSizeCreation = {\r\n process: _CreateStartSizeGradientsData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._startSizeCreation, this._sizeCreation);\r\n }\r\n return;\r\n }\r\n\r\n if (this._startSizeCreation) {\r\n _RemoveFromQueue(this._startSizeCreation);\r\n this._startSizeCreation = null;\r\n }\r\n }\r\n\r\n public override get targetStopDuration(): number {\r\n return this._targetStopDuration;\r\n }\r\n\r\n public override set targetStopDuration(value: number) {\r\n if (this.targetStopDuration === value) {\r\n return;\r\n }\r\n\r\n this._targetStopDuration = value;\r\n\r\n this._syncLifeTimeCreation();\r\n this._syncStartSizeCreation();\r\n }\r\n\r\n /**\r\n * Adds a new life time gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the life time factor to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addLifeTimeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._lifeTimeGradients) {\r\n this._lifeTimeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._lifeTimeGradients, gradient, factor, factor2);\r\n\r\n this._syncLifeTimeCreation();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific life time gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeLifeTimeGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._lifeTimeGradients, gradient);\r\n\r\n this._syncLifeTimeCreation();\r\n\r\n return this;\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._sizeGradients) {\r\n this._sizeGradients = [];\r\n }\r\n\r\n if (this._sizeGradients.length === 0) {\r\n this._sizeCreation.process = _CreateSizeGradientsData;\r\n\r\n this._sizeGradientProcessing = {\r\n process: _ProcessSizeGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._sizeGradientProcessing, this._gravityProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._sizeGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._sizeGradients, gradient);\r\n\r\n if (this._sizeGradients?.length === 0) {\r\n _RemoveFromQueue(this._sizeGradientProcessing);\r\n this._sizeCreation.process = _CreateSizeData;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new color remap gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param min defines the color remap minimal range\r\n * @param max defines the color remap maximal range\r\n * @returns the current particle system\r\n */\r\n public addColorRemapGradient(gradient: number, min: number, max: number): IParticleSystem {\r\n if (!this._colorRemapGradients) {\r\n this._colorRemapGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._colorRemapGradients, gradient, min, max);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific color remap gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeColorRemapGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._colorRemapGradients, gradient);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new alpha remap gradient\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param min defines the alpha remap minimal range\r\n * @param max defines the alpha remap maximal range\r\n * @returns the current particle system\r\n */\r\n public addAlphaRemapGradient(gradient: number, min: number, max: number): IParticleSystem {\r\n if (!this._alphaRemapGradients) {\r\n this._alphaRemapGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._alphaRemapGradients, gradient, min, max);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific alpha remap gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeAlphaRemapGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._alphaRemapGradients, gradient);\r\n\r\n return this;\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._angularSpeedGradients) {\r\n this._angularSpeedGradients = [];\r\n }\r\n\r\n if (this._angularSpeedGradients.length === 0) {\r\n this._angleCreation.process = _CreateAngleGradientsData;\r\n\r\n this._angularSpeedGradientProcessing = {\r\n process: _ProcessAngularSpeedGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n _ConnectBefore(this._angularSpeedGradientProcessing, this._angularSpeedProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._angularSpeedGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._angularSpeedGradients, gradient);\r\n\r\n if (this._angularSpeedGradients?.length === 0) {\r\n this._angleCreation.process = _CreateAngleData;\r\n _RemoveFromQueue(this._angularSpeedGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._velocityGradients) {\r\n this._velocityGradients = [];\r\n }\r\n\r\n if (this._velocityGradients.length === 0) {\r\n this._velocityCreation = {\r\n process: _CreateVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._velocityCreation, this._angleCreation);\r\n\r\n this._velocityGradientProcessing = {\r\n process: _ProcessVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._velocityGradientProcessing, this._directionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._velocityGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._velocityGradients, gradient);\r\n\r\n if (this._velocityGradients?.length === 0) {\r\n _RemoveFromQueue(this._velocityCreation);\r\n _RemoveFromQueue(this._velocityGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._limitVelocityGradients) {\r\n this._limitVelocityGradients = [];\r\n }\r\n\r\n if (this._limitVelocityGradients.length === 0) {\r\n this._limitVelocityCreation = {\r\n process: _CreateLimitVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._limitVelocityCreation, this._angleCreation);\r\n\r\n this._limitVelocityGradientProcessing = {\r\n process: _ProcessLimitVelocityGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectAfter(this._limitVelocityGradientProcessing, this._directionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._limitVelocityGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._limitVelocityGradients, gradient);\r\n\r\n if (this._limitVelocityGradients?.length === 0) {\r\n _RemoveFromQueue(this._limitVelocityCreation);\r\n _RemoveFromQueue(this._limitVelocityGradientProcessing);\r\n }\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 * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addDragGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._dragGradients) {\r\n this._dragGradients = [];\r\n }\r\n\r\n if (this._dragGradients.length === 0) {\r\n this._dragCreation = {\r\n process: _CreateDragData,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._dragCreation, this._colorDeadCreation);\r\n\r\n this._dragGradientProcessing = {\r\n process: _ProcessDragGradients,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n _ConnectBefore(this._dragGradientProcessing, this._positionProcessing);\r\n }\r\n\r\n this._addFactorGradient(this._dragGradients, gradient, factor, factor2);\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): IParticleSystem {\r\n this._removeFactorGradient(this._dragGradients, gradient);\r\n\r\n if (this._dragGradients?.length === 0) {\r\n _RemoveFromQueue(this._dragCreation);\r\n _RemoveFromQueue(this._dragGradientProcessing);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new emit rate gradient (please note that this will only work if you set the targetStopDuration property)\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the emit rate value to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addEmitRateGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._emitRateGradients) {\r\n this._emitRateGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._emitRateGradients, gradient, factor, factor2);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific emit rate gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeEmitRateGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._emitRateGradients, gradient);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new start size gradient (please note that this will only work if you set the targetStopDuration property)\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param factor defines the start size value to affect to the specified gradient\r\n * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from\r\n * @returns the current particle system\r\n */\r\n public addStartSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem {\r\n if (!this._startSizeGradients) {\r\n this._startSizeGradients = [];\r\n }\r\n\r\n this._addFactorGradient(this._startSizeGradients, gradient, factor, factor2);\r\n\r\n this._syncStartSizeCreation();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific start size gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeStartSizeGradient(gradient: number): IParticleSystem {\r\n this._removeFactorGradient(this._startSizeGradients, gradient);\r\n\r\n this._syncStartSizeCreation();\r\n\r\n return this;\r\n }\r\n\r\n private _createRampGradientTexture() {\r\n if (!this._rampGradients || !this._rampGradients.length || this._rampGradientsTexture || !this._scene) {\r\n return;\r\n }\r\n\r\n const data = new Uint8Array(this._rawTextureWidth * 4);\r\n const tmpColor = TmpColors.Color3[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._rampGradients, (currentGradient, nextGradient, scale) => {\r\n Color3.LerpToRef((<Color3Gradient>currentGradient).color, (<Color3Gradient>nextGradient).color, 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] = 255;\r\n });\r\n }\r\n\r\n this._rampGradientsTexture = RawTexture.CreateRGBATexture(data, this._rawTextureWidth, 1, this._scene, false, false, Constants.TEXTURE_NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n /**\r\n * Gets the current list of ramp gradients.\r\n * You must use addRampGradient and removeRampGradient to update this list\r\n * @returns the list of ramp gradients\r\n */\r\n public getRampGradients(): Nullable<Array<Color3Gradient>> {\r\n return this._rampGradients;\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._syncRampGradientTexture();\r\n }\r\n\r\n private _syncRampGradientTexture() {\r\n if (!this._rampGradients) {\r\n return;\r\n }\r\n\r\n this._rampGradients.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 if (this._rampGradientsTexture) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n\r\n this._createRampGradientTexture();\r\n }\r\n\r\n /**\r\n * Sets the capacity of the object.\r\n * @param value - The new capacity to be set.\r\n */\r\n public set capacity(value: number) {\r\n this._capacity = value;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * Returns the current capacity of the object.\r\n * @return {number} The capacity value.\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n /**\r\n * Adds a new ramp gradient used to remap particle colors\r\n * @param gradient defines the gradient to use (between 0 and 1)\r\n * @param color defines the color to affect to the specified gradient\r\n * @returns the current particle system\r\n */\r\n public addRampGradient(gradient: number, color: Color3): ThinParticleSystem {\r\n if (!this._rampGradients) {\r\n this._rampGradients = [];\r\n }\r\n\r\n const rampGradient = new Color3Gradient(gradient, color);\r\n this._rampGradients.push(rampGradient);\r\n\r\n this._syncRampGradientTexture();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a specific ramp gradient\r\n * @param gradient defines the gradient to remove\r\n * @returns the current particle system\r\n */\r\n public removeRampGradient(gradient: number): ThinParticleSystem {\r\n this._removeGradientAndTexture(gradient, this._rampGradients, this._rampGradientsTexture);\r\n this._rampGradientsTexture = null;\r\n\r\n if (this._rampGradients && this._rampGradients.length > 0) {\r\n this._createRampGradientTexture();\r\n }\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 * @param color2 defines an additional color used to define a range ([color, color2]) with main color to pick the final color from\r\n * @returns this particle system\r\n */\r\n public addColorGradient(gradient: number, color1: Color4, color2?: Color4): IParticleSystem {\r\n if (!this._colorGradients) {\r\n this._colorGradients = [];\r\n }\r\n\r\n if (this._colorGradients.length === 0) {\r\n this._colorCreation.process = _CreateColorGradientsData;\r\n this._colorProcessing.process = _ProcessColorGradients;\r\n }\r\n\r\n const colorGradient = new ColorGradient(gradient, color1, color2);\r\n this._colorGradients.push(colorGradient);\r\n\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 return this;\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 this particle system\r\n */\r\n public removeColorGradient(gradient: number): IParticleSystem {\r\n if (!this._colorGradients) {\r\n return this;\r\n }\r\n\r\n let index = 0;\r\n for (const colorGradient of this._colorGradients) {\r\n if (colorGradient.gradient === gradient) {\r\n this._colorGradients.splice(index, 1);\r\n break;\r\n }\r\n index++;\r\n }\r\n\r\n if (this._colorGradients.length === 0) {\r\n this._colorCreation.process = _CreateColorData;\r\n this._colorProcessing.process = _ProcessColor;\r\n }\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 if (!this._drawWrappers) {\r\n return;\r\n }\r\n for (const drawWrappers of this._drawWrappers) {\r\n if (drawWrappers) {\r\n for (const drawWrapper of drawWrappers) {\r\n drawWrapper?.dispose();\r\n }\r\n }\r\n }\r\n\r\n this._drawWrappers = [];\r\n }\r\n\r\n /** @internal */\r\n public _fetchR(u: number, v: number, width: number, height: number, pixels: Uint8Array | Uint8ClampedArray): number {\r\n u = Math.abs(u) * 0.5 + 0.5;\r\n v = Math.abs(v) * 0.5 + 0.5;\r\n\r\n const wrappedU = (u * width) % width | 0;\r\n const wrappedV = (v * height) % height | 0;\r\n\r\n const position = (wrappedU + wrappedV * width) * 4;\r\n return pixels[position] / 255;\r\n }\r\n\r\n protected override _reset() {\r\n this._resetEffect();\r\n }\r\n\r\n private _resetEffect() {\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.dispose();\r\n this._vertexBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n this._createVertexBuffers();\r\n }\r\n\r\n private _createVertexBuffers() {\r\n this._vertexBufferSize = this._useInstancing ? 10 : 12;\r\n if (this._isAnimationSheetEnabled) {\r\n this._vertexBufferSize += 1;\r\n }\r\n\r\n if (\r\n !this._isBillboardBased ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL\r\n ) {\r\n this._vertexBufferSize += 3;\r\n }\r\n\r\n if (this._useRampGradients) {\r\n this._vertexBufferSize += 4;\r\n }\r\n\r\n const engine = this._engine;\r\n const vertexSize = this._vertexBufferSize * (this._useInstancing ? 1 : 4);\r\n this._vertexData = new Float32Array(this._capacity * vertexSize);\r\n this._vertexBuffer = new Buffer(engine, this._vertexData, true, vertexSize);\r\n\r\n let dataOffset = 0;\r\n const positions = this._vertexBuffer.createVertexBuffer(VertexBuffer.PositionKind, dataOffset, 3, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n dataOffset += 3;\r\n\r\n const colors = this._vertexBuffer.createVertexBuffer(VertexBuffer.ColorKind, dataOffset, 4, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n dataOffset += 4;\r\n\r\n const options = this._vertexBuffer.createVertexBuffer(\"angle\", dataOffset, 1, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"angle\"] = options;\r\n dataOffset += 1;\r\n\r\n const size = this._vertexBuffer.createVertexBuffer(\"size\", dataOffset, 2, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"size\"] = size;\r\n dataOffset += 2;\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n const cellIndexBuffer = this._vertexBuffer.createVertexBuffer(\"cellIndex\", dataOffset, 1, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"cellIndex\"] = cellIndexBuffer;\r\n dataOffset += 1;\r\n }\r\n\r\n if (\r\n !this._isBillboardBased ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED ||\r\n this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL\r\n ) {\r\n const directionBuffer = this._vertexBuffer.createVertexBuffer(\"direction\", dataOffset, 3, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"direction\"] = directionBuffer;\r\n dataOffset += 3;\r\n }\r\n\r\n if (this._useRampGradients) {\r\n const rampDataBuffer = this._vertexBuffer.createVertexBuffer(\"remapData\", dataOffset, 4, this._vertexBufferSize, this._useInstancing);\r\n this._vertexBuffers[\"remapData\"] = rampDataBuffer;\r\n dataOffset += 4;\r\n }\r\n\r\n let offsets: VertexBuffer;\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offset\", 0, 2);\r\n } else {\r\n offsets = this._vertexBuffer.createVertexBuffer(\"offset\", dataOffset, 2, this._vertexBufferSize, this._useInstancing);\r\n dataOffset += 2;\r\n }\r\n this._vertexBuffers[\"offset\"] = offsets;\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _createIndexBuffer() {\r\n if (this._useInstancing) {\r\n this._linesIndexBufferUseInstancing = this._engine.createIndexBuffer(new Uint32Array([0, 1, 1, 3, 3, 2, 2, 0, 0, 3]));\r\n return;\r\n }\r\n const indices = [];\r\n const indicesWireframe = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n indicesWireframe.push(index, index + 1, index + 1, index + 2, index + 2, index + 3, index + 3, index, index, index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n this._linesIndexBuffer = this._engine.createIndexBuffer(indicesWireframe);\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 * Gets whether there are still active particles in the system.\r\n * @returns True if it is alive, otherwise false.\r\n */\r\n public isAlive(): boolean {\r\n return this._alive;\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 /** @internal */\r\n public _preStart() {\r\n // Do nothing\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 this.startDelay = 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\r\n this._preStart();\r\n\r\n // Reset emit gradient so it acts the same on every start\r\n if (this._emitRateGradients) {\r\n if (this._emitRateGradients.length > 0) {\r\n this._currentEmitRateGradient = this._emitRateGradients[0];\r\n this._currentEmitRate1 = this._currentEmitRateGradient.getFactor();\r\n this._currentEmitRate2 = this._currentEmitRate1;\r\n }\r\n if (this._emitRateGradients.length > 1) {\r\n this._currentEmitRate2 = this._emitRateGradients[1].getFactor();\r\n }\r\n }\r\n // Reset start size gradient so it acts the same on every start\r\n if (this._startSizeGradients) {\r\n if (this._startSizeGradients.length > 0) {\r\n this._currentStartSizeGradient = this._startSizeGradients[0];\r\n this._currentStartSize1 = this._currentStartSizeGradient.getFactor();\r\n this._currentStartSize2 = this._currentStartSize1;\r\n }\r\n if (this._startSizeGradients.length > 1) {\r\n this._currentStartSize2 = this._startSizeGradients[1].getFactor();\r\n }\r\n }\r\n\r\n if (this.preWarmCycles) {\r\n if (this.emitter?.getClassName().indexOf(\"Mesh\") !== -1) {\r\n (this.emitter as any).computeWorldMatrix(true);\r\n }\r\n\r\n const noiseTextureAsProcedural = this.noiseTexture as ProceduralTexture;\r\n\r\n if (noiseTextureAsProcedural && noiseTextureAsProcedural.onGeneratedObservable) {\r\n noiseTextureAsProcedural.onGeneratedObservable.addOnce(() => {\r\n setTimeout(() => {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n noiseTextureAsProcedural.render();\r\n }\r\n });\r\n });\r\n } else {\r\n for (let index = 0; index < this.preWarmCycles; index++) {\r\n this.animate(true);\r\n }\r\n }\r\n }\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 this.onStartedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Stops the particle system.\r\n * @param stopSubEmitters if true it will stop the current system and all created sub-Systems if false it will stop the current root system only, this param is used by the root particle system only. The default value is true.\r\n */\r\n public stop(stopSubEmitters = true): 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 this._postStop(stopSubEmitters);\r\n }\r\n\r\n /** @internal */\r\n public _postStop(_stopSubEmitters: boolean) {\r\n // Do nothing\r\n }\r\n\r\n // Animation sheet\r\n\r\n /**\r\n * Remove all active particles\r\n */\r\n public reset(): void {\r\n this._stockParticles.length = 0;\r\n this._particles.length = 0;\r\n }\r\n\r\n /**\r\n * @internal (for internal use only)\r\n */\r\n public _appendParticleVertex(index: number, particle: Particle, offsetX: number, offsetY: number): void {\r\n let offset = index * this._vertexBufferSize;\r\n\r\n const floatingOriginOffset = TmpVectors.Vector3[0].copyFrom(this._scene?.floatingOriginOffset || Vector3.ZeroReadOnly);\r\n this._vertexData[offset++] = particle.position.x + this.worldOffset.x - floatingOriginOffset.x;\r\n this._vertexData[offset++] = particle.position.y + this.worldOffset.y - floatingOriginOffset.y;\r\n this._vertexData[offset++] = particle.position.z + this.worldOffset.z - floatingOriginOffset.z;\r\n this._vertexData[offset++] = particle.color.r;\r\n this._vertexData[offset++] = particle.color.g;\r\n this._vertexData[offset++] = particle.color.b;\r\n this._vertexData[offset++] = particle.color.a;\r\n this._vertexData[offset++] = particle.angle;\r\n\r\n this._vertexData[offset++] = particle.scale.x * particle.size;\r\n this._vertexData[offset++] = particle.scale.y * particle.size;\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n this._vertexData[offset++] = particle.cellIndex;\r\n }\r\n\r\n if (!this._isBillboardBased) {\r\n if (particle._initialDirection) {\r\n let initialDirection = particle._initialDirection;\r\n if (this.isLocal) {\r\n Vector3.TransformNormalToRef(initialDirection, this._emitterWorldMatrix, TmpVectors.Vector3[0]);\r\n initialDirection = TmpVectors.Vector3[0];\r\n }\r\n if (initialDirection.x === 0 && initialDirection.z === 0) {\r\n initialDirection.x = 0.001;\r\n }\r\n\r\n this._vertexData[offset++] = initialDirection.x;\r\n this._vertexData[offset++] = initialDirection.y;\r\n this._vertexData[offset++] = initialDirection.z;\r\n } else {\r\n let direction = particle.direction;\r\n if (this.isLocal) {\r\n Vector3.TransformNormalToRef(direction, this._emitterWorldMatrix, TmpVectors.Vector3[0]);\r\n direction = TmpVectors.Vector3[0];\r\n }\r\n\r\n if (direction.x === 0 && direction.z === 0) {\r\n direction.x = 0.001;\r\n }\r\n this._vertexData[offset++] = direction.x;\r\n this._vertexData[offset++] = direction.y;\r\n this._vertexData[offset++] = direction.z;\r\n }\r\n } else if (this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED || this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL) {\r\n this._vertexData[offset++] = particle.direction.x;\r\n this._vertexData[offset++] = particle.direction.y;\r\n this._vertexData[offset++] = particle.direction.z;\r\n }\r\n\r\n if (this._useRampGradients && particle.remapData) {\r\n this._vertexData[offset++] = particle.remapData.x;\r\n this._vertexData[offset++] = particle.remapData.y;\r\n this._vertexData[offset++] = particle.remapData.z;\r\n this._vertexData[offset++] = particle.remapData.w;\r\n }\r\n\r\n if (!this._useInstancing) {\r\n if (this._isAnimationSheetEnabled) {\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n }\r\n\r\n this._vertexData[offset++] = offsetX;\r\n this._vertexData[offset++] = offsetY;\r\n }\r\n }\r\n\r\n // start of sub system methods\r\n\r\n /**\r\n * \"Recycles\" one of the particle by copying it back to the \"stock\" of particles and removing it from the active list.\r\n * Its lifetime will start back at 0.\r\n * @param particle\r\n */\r\n public recycleParticle: (particle: Particle) => void = (particle) => {\r\n // move particle from activeParticle list to stock particles\r\n const lastParticle = <Particle>this._particles.pop();\r\n if (lastParticle !== particle) {\r\n lastParticle.copyTo(particle);\r\n }\r\n this._stockParticles.push(lastParticle);\r\n };\r\n\r\n private _createParticle: () => Particle = () => {\r\n let particle: Particle;\r\n if (this._stockParticles.length !== 0) {\r\n particle = <Particle>this._stockParticles.pop();\r\n particle._reset();\r\n } else {\r\n particle = new Particle(this);\r\n }\r\n\r\n this._prepareParticle(particle);\r\n return particle;\r\n };\r\n\r\n /** @internal */\r\n public _prepareParticle(_particle: Particle) {\r\n //Do nothing\r\n }\r\n\r\n private _createNewOnes(newParticles: number) {\r\n // Add new ones\r\n let particle: Particle;\r\n for (let index = 0; index < newParticles; index++) {\r\n if (this._particles.length === this._capacity) {\r\n break;\r\n }\r\n\r\n particle = this._createParticle();\r\n\r\n this._particles.push(particle);\r\n\r\n // Creation queue\r\n let currentQueueItem = this._createQueueStart;\r\n\r\n while (currentQueueItem) {\r\n currentQueueItem.process(particle, this);\r\n currentQueueItem = currentQueueItem.nextItem;\r\n }\r\n\r\n // Update the position of the attached sub-emitters to match their attached particle\r\n particle._inheritParticleInfoToSubEmitters();\r\n }\r\n }\r\n\r\n private _update(newParticles: number): void {\r\n // Update current\r\n this._alive = this._particles.length > 0;\r\n\r\n if ((<AbstractMesh>this.emitter).position) {\r\n const emitterMesh = <AbstractMesh>this.emitter;\r\n this._emitterWorldMatrix = emitterMesh.getWorldMatrix();\r\n } else {\r\n const emitterPosition = <Vector3>this.emitter;\r\n this._emitterWorldMatrix = Matrix.Translation(emitterPosition.x, emitterPosition.y, emitterPosition.z);\r\n }\r\n\r\n this._emitterWorldMatrix.invertToRef(this._emitterInverseWorldMatrix);\r\n this.updateFunction(this._particles);\r\n\r\n this._createNewOnes(newParticles);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetAttributeNamesOrOptions(isAnimationSheetEnabled = false, isBillboardBased = false, useRampGradients = false): string[] {\r\n const attributeNamesOrOptions = [VertexBuffer.PositionKind, VertexBuffer.ColorKind, \"angle\", \"offset\", \"size\"];\r\n\r\n if (isAnimationSheetEnabled) {\r\n attributeNamesOrOptions.push(\"cellIndex\");\r\n }\r\n\r\n if (!isBillboardBased) {\r\n attributeNamesOrOptions.push(\"direction\");\r\n }\r\n\r\n if (useRampGradients) {\r\n attributeNamesOrOptions.push(\"remapData\");\r\n }\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 = [\"invView\", \"view\", \"projection\", \"textureMask\", \"translationPivot\", \"eyePosition\"];\r\n\r\n AddClipPlaneUniforms(effectCreationOption);\r\n\r\n if (isAnimationSheetEnabled) {\r\n effectCreationOption.push(\"particlesInfos\");\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, 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 !== Constants.FOGMODE_NONE) {\r\n defines.push(\"#define FOG\");\r\n }\r\n }\r\n\r\n if (this._isAnimationSheetEnabled) {\r\n defines.push(\"#define ANIMATESHEET\");\r\n }\r\n\r\n if (this.useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n\r\n if (blendMode === BaseParticleSystem.BLENDMODE_MULTIPLY) {\r\n defines.push(\"#define BLENDMULTIPLYMODE\");\r\n }\r\n\r\n if (this._useRampGradients) {\r\n defines.push(\"#define RAMPGRADIENT\");\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 Constants.PARTICLES_BILLBOARDMODE_Y:\r\n defines.push(\"#define BILLBOARDY\");\r\n break;\r\n case Constants.PARTICLES_BILLBOARDMODE_STRETCHED:\r\n case Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL:\r\n defines.push(\"#define BILLBOARDSTRETCHED\");\r\n if (this.billboardMode === Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL) {\r\n defines.push(\"#define BILLBOARDSTRETCHED_LOCAL\");\r\n }\r\n break;\r\n case Constants.PARTICLES_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 (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 ...ThinParticleSystem._GetAttributeNamesOrOptions(\r\n this._isAnimationSheetEnabled,\r\n this._isBillboardBased &&\r\n this.billboardMode !== Constants.PARTICLES_BILLBOARDMODE_STRETCHED &&\r\n this.billboardMode !== Constants.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL,\r\n this._useRampGradients\r\n )\r\n );\r\n\r\n uniforms.push(...ThinParticleSystem._GetEffectCreationOptions(this._isAnimationSheetEnabled, this.useLogarithmicDepth, this.applyFog));\r\n\r\n samplers.push(\"diffuseSampler\", \"rampSampler\");\r\n\r\n if (this._imageProcessingConfiguration) {\r\n PrepareUniformsForImageProcessing(uniforms, this._imageProcessingConfigurationDefines);\r\n PrepareSamplersForImageProcessing(samplers, this._imageProcessingConfigurationDefines);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _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 const currentRenderPassId = this._engine._features.supportRenderPasses ? this._engine.currentRenderPassId : Constants.RENDERPASS_MAIN;\r\n let drawWrappers = this._drawWrappers[currentRenderPassId];\r\n if (!drawWrappers) {\r\n drawWrappers = this._drawWrappers[currentRenderPassId] = [];\r\n }\r\n let drawWrapper = drawWrappers[blendMode];\r\n if (!drawWrapper) {\r\n drawWrapper = new DrawWrapper(this._engine);\r\n if (drawWrapper.drawContext) {\r\n drawWrapper.drawContext.useInstancing = this._useInstancing;\r\n }\r\n drawWrappers[blendMode] = drawWrapper;\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (drawWrapper.defines !== join) {\r\n const attributesNamesOrOptions: Array<string> = [];\r\n const effectCreationOption: Array<string> = [];\r\n const samplers: Array<string> = [];\r\n\r\n this.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, samplers);\r\n\r\n drawWrapper.setEffect(\r\n this._engine.createEffect(\r\n \"particles\",\r\n attributesNamesOrOptions,\r\n effectCreationOption,\r\n samplers,\r\n join,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the particle system is paused (no animation will be done).\r\n */\r\n public paused = false;\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 preWarmOnly will prevent the system from updating the vertex buffer (default is false)\r\n */\r\n public animate(preWarmOnly = false): void {\r\n if (!this._started || this.paused) {\r\n return;\r\n }\r\n\r\n if (!preWarmOnly && this._scene) {\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n if (this._currentRenderId === this._scene.getFrameId()) {\r\n return;\r\n }\r\n this._currentRenderId = this._scene.getFrameId();\r\n }\r\n\r\n this._scaledUpdateSpeed = this.updateSpeed * (preWarmOnly ? this.preWarmStepOffset : this._scene?.getAnimationRatio() || 1);\r\n\r\n // Determine the number of particles we need to create\r\n let newParticles;\r\n\r\n if (this.manualEmitCount > -1) {\r\n newParticles = this.manualEmitCount;\r\n this._newPartsExcess = 0;\r\n this.manualEmitCount = 0;\r\n } else {\r\n const rate = this._calculateEmitRate();\r\n newParticles = (rate * this._scaledUpdateSpeed) >> 0;\r\n this._newPartsExcess += rate * this._scaledUpdateSpeed - newParticles;\r\n }\r\n\r\n if (this._newPartsExcess > 1.0) {\r\n newParticles += this._newPartsExcess >> 0;\r\n this._newPartsExcess -= this._newPartsExcess >> 0;\r\n }\r\n\r\n this._alive = false;\r\n\r\n if (!this._stopped) {\r\n this._actualFrame += this._scaledUpdateSpeed;\r\n\r\n if (this.targetStopDuration && this._actualFrame >= this.targetStopDuration) {\r\n this.stop();\r\n }\r\n } else {\r\n newParticles = 0;\r\n }\r\n this._update(newParticles);\r\n\r\n // Stopped?\r\n if (this._stopped) {\r\n if (!this._alive) {\r\n this._started = false;\r\n if (this.onAnimationEnd) {\r\n this.onAnimationEnd();\r\n }\r\n if (this.disposeOnStop && this._scene) {\r\n this._scene._toBeDisposed.push(this);\r\n }\r\n }\r\n }\r\n\r\n if (!preWarmOnly) {\r\n // Update VBO\r\n let offset = 0;\r\n for (let index = 0; index < this._particles.length; index++) {\r\n const particle = this._particles[index];\r\n this._appendParticleVertices(offset, particle);\r\n offset += this._useInstancing ? 1 : 4;\r\n }\r\n\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.updateDirectly(this._vertexData, 0, this._particles.length);\r\n }\r\n }\r\n\r\n if (this.manualEmitCount === 0 && this.disposeOnStop) {\r\n this.stop();\r\n }\r\n }\r\n\r\n /**\r\n * Internal only. Calculates the current emit rate based on the gradients if any.\r\n * @returns The emit rate\r\n * @internal\r\n */\r\n public _calculateEmitRate(): number {\r\n let rate = this.emitRate;\r\n\r\n if (this._emitRateGradients && this._emitRateGradients.length > 0 && this.targetStopDuration) {\r\n const ratio = this._actualFrame / this.targetStopDuration;\r\n GradientHelper.GetCurrentGradient(ratio, this._emitRateGradients, (currentGradient, nextGradient, scale) => {\r\n if (currentGradient !== this._currentEmitRateGradient) {\r\n this._currentEmitRate1 = this._currentEmitRate2;\r\n this._currentEmitRate2 = (<FactorGradient>nextGradient).getFactor();\r\n this._currentEmitRateGradient = <FactorGradient>currentGradient;\r\n }\r\n\r\n rate = Lerp(this._currentEmitRate1, this._currentEmitRate2, scale);\r\n });\r\n }\r\n\r\n return rate;\r\n }\r\n\r\n private _appendParticleVertices(offset: number, particle: Particle) {\r\n this._appendParticleVertex(offset++, particle, 0, 0);\r\n if (!this._useInstancing) {\r\n this._appendParticleVertex(offset++, particle, 1, 0);\r\n this._appendParticleVertex(offset++, particle, 1, 1);\r\n this._appendParticleVertex(offset++, particle, 0, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the particle system.\r\n */\r\n public rebuild(): void {\r\n if (this._engine.getCaps().vertexArrayObject) {\r\n this._vertexArrayObject = null;\r\n }\r\n\r\n this._createIndexBuffer();\r\n\r\n this._spriteBuffer?._rebuild();\r\n\r\n this._createVertexBuffers();\r\n\r\n this.resetDrawCache();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU && !ThinParticleSystem.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([import(\"../ShadersWGSL/particles.vertex\"), import(\"../ShadersWGSL/particles.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/particles.vertex\"), import(\"../Shaders/particles.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\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 (!this._shadersLoaded) {\r\n return false;\r\n }\r\n if (!this.emitter || (this._imageProcessingConfiguration && !this._imageProcessingConfiguration.isReady()) || !this.particleTexture || !this.particleTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this.blendMode !== BaseParticleSystem.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(BaseParticleSystem.BLENDMODE_MULTIPLY).effect!.isReady()) {\r\n return false;\r\n }\r\n if (!this._getWrapper(BaseParticleSystem.BLENDMODE_ADD).effect!.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _render(blendMode: number) {\r\n const drawWrapper = this._getWrapper(blendMode);\r\n const effect = drawWrapper.effect!;\r\n\r\n const engine = this._engine;\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n const viewMatrix = this.defaultViewMatrix ?? this._scene!.getViewMatrix();\r\n effect.setTexture(\"diffuseSampler\", this.particleTexture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", this.defaultProjectionMatrix ?? this._scene!.getProjectionMatrix());\r\n\r\n if (this._isAnimationSheetEnabled && this.particleTexture) {\r\n const baseSize = this.particleTexture.getBaseSize();\r\n effect.setFloat3(\"particlesInfos\", this.spriteCellWidth / baseSize.width, this.spriteCellHeight / baseSize.height, this.spriteCellWidth / baseSize.width);\r\n }\r\n\r\n effect.setVector2(\"translationPivot\", this.translationPivot);\r\n effect.setFloat4(\"textureMask\", this.textureMask.r, this.textureMask.g, this.textureMask.b, this.textureMask.a);\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 if (this._rampGradientsTexture) {\r\n if (!this._rampGradients || !this._rampGradients.length) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n effect.setTexture(\"rampSampler\", this._rampGradientsTexture);\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 viewMatrix.invertToRef(TmpVectors.Matrix[0]);\r\n effect.setMatrix(\"invView\", TmpVectors.Matrix[0]);\r\n }\r\n\r\n if (this._vertexArrayObject !== undefined) {\r\n if (this._scene?.forceWireframe) {\r\n engine.bindBuffers(this._vertexBuffers, this._linesIndexBufferUseInstancing, effect);\r\n } else {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (this._engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n (this._engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n }\r\n } else {\r\n if (!this._indexBuffer) {\r\n // Use instancing mode\r\n engine.bindBuffers(this._vertexBuffers, this._scene?.forceWireframe ? this._linesIndexBufferUseInstancing : null, effect);\r\n } else {\r\n engine.bindBuffers(this._vertexBuffers, this._scene?.forceWireframe ? this._linesIndexBuffer : this._indexBuffer, effect);\r\n }\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 if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.notifyObservers(effect);\r\n }\r\n\r\n if (this._useInstancing) {\r\n if (this._scene?.forceWireframe) {\r\n engine.drawElementsType(Constants.MATERIAL_LineStripDrawMode, 0, 10, this._particles.length);\r\n } else {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, this._particles.length);\r\n }\r\n } else {\r\n if (this._scene?.forceWireframe) {\r\n engine.drawElementsType(Constants.MATERIAL_WireFrameFillMode, 0, this._particles.length * 10);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, this._particles.length * 6);\r\n }\r\n }\r\n\r\n return this._particles.length;\r\n }\r\n\r\n /**\r\n * Renders the particle system in its current state.\r\n * @returns the current number of particles\r\n */\r\n public render(): number {\r\n // Check\r\n if (!this.isReady() || !this._particles.length) {\r\n return 0;\r\n }\r\n\r\n const engine = this._engine as any;\r\n if (engine.setState) {\r\n engine.setState(false);\r\n\r\n if (this.forceDepthWrite) {\r\n engine.setDepthWrite(true);\r\n }\r\n }\r\n\r\n let outparticles = 0;\r\n\r\n if (this.blendMode === BaseParticleSystem.BLENDMODE_MULTIPLYADD) {\r\n outparticles = this._render(BaseParticleSystem.BLENDMODE_MULTIPLY) + this._render(BaseParticleSystem.BLENDMODE_ADD);\r\n } else {\r\n outparticles = this._render(this.blendMode);\r\n }\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return outparticles;\r\n }\r\n\r\n /** @internal */\r\n public _onDispose(_disposeAttachedSubEmitters = false, _disposeEndSubEmitters = false) {\r\n // Do Nothing\r\n }\r\n\r\n /**\r\n * Disposes the particle system and free the associated resources\r\n * @param disposeTexture defines if the particle texture must be disposed as well (true by default)\r\n * @param disposeAttachedSubEmitters defines if the attached sub-emitters must be disposed as well (false by default)\r\n * @param disposeEndSubEmitters defines if the end type sub-emitters must be disposed as well (false by default)\r\n */\r\n public dispose(disposeTexture = true, disposeAttachedSubEmitters = false, disposeEndSubEmitters = false): void {\r\n this.resetDrawCache();\r\n\r\n if (this._vertexBuffer) {\r\n this._vertexBuffer.dispose();\r\n this._vertexBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this._linesIndexBuffer) {\r\n this._engine._releaseBuffer(this._linesIndexBuffer);\r\n this._linesIndexBuffer = null;\r\n }\r\n\r\n if (this._linesIndexBufferUseInstancing) {\r\n this._engine._releaseBuffer(this._linesIndexBufferUseInstancing);\r\n this._linesIndexBufferUseInstancing = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n this._vertexArrayObject = 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 if (this._rampGradientsTexture) {\r\n this._rampGradientsTexture.dispose();\r\n this._rampGradientsTexture = null;\r\n }\r\n\r\n this._onDispose(disposeAttachedSubEmitters, disposeEndSubEmitters);\r\n\r\n if (this._onBeforeDrawParticlesObservable) {\r\n this._onBeforeDrawParticlesObservable.clear();\r\n }\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeParticleSystem(this);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n this.onStoppedObservable.clear();\r\n this.onStartedObservable.clear();\r\n\r\n this.reset();\r\n\r\n this._isDisposed = true;\r\n this.metadata = null;\r\n }\r\n}\r\n"]}
|