Browse Source

Getting reay for emit power gradients for particles

David Catuhe 7 năm trước cách đây
mục cha
commit
deba940efe
2 tập tin đã thay đổi với 9 bổ sung34 xóa
  1. 2 10
      src/Particles/babylon.particle.ts
  2. 7 24
      src/Particles/babylon.particleSystem.ts

+ 2 - 10
src/Particles/babylon.particle.ts

@@ -61,7 +61,7 @@
         public cellIndex: number = 0;  
 
         /** @hidden */
-        public _initialDirection: Nullable<Vector3>;
+        public _emitPower: number = 0;
 
         /** @hidden */
         public _initialStartSpriteCellID: number;
@@ -117,15 +117,7 @@
          */
         public copyTo(other: Particle) {
             other.position.copyFrom(this.position);
-            if (this._initialDirection) {
-                if (other._initialDirection) {
-                    other._initialDirection.copyFrom(this._initialDirection);
-                } else {
-                    other._initialDirection = this._initialDirection.clone();
-                }
-            } else {
-                other._initialDirection = null;
-            }
+            other._emitPower = this._emitPower;
             other.direction.copyFrom(this.direction);
             other.color.copyFrom(this.color);
             other.colorStep.copyFrom(this.colorStep);

+ 7 - 24
src/Particles/babylon.particleSystem.ts

@@ -490,6 +490,7 @@
             // Default emitter type
             this.particleEmitterType = new BoxParticleEmitter();
 
+            // Default update function
             this.updateFunction = (particles: Particle[]): void => {
                 for (var index = 0; index < particles.length; index++) {
                     var particle = particles[index];
@@ -525,10 +526,10 @@
                         }
                         particle.angle += particle.angularSpeed * this._scaledUpdateSpeed;
 
-                        particle.direction.scaleToRef(this._scaledUpdateSpeed, this._scaledDirection);
+                        particle.direction.scaleToRef(this._scaledUpdateSpeed * particle._emitPower, this._scaledDirection);
                         particle.position.addInPlace(this._scaledDirection);
 
-                        this.gravity.scaleToRef(this._scaledUpdateSpeed, this._scaledGravity);
+                        this.gravity.scaleToRef(this._scaledUpdateSpeed / particle._emitPower, this._scaledGravity);
                         particle.direction.addInPlace(this._scaledGravity);
 
                         // Gradient
@@ -862,15 +863,9 @@
             }
 
             if (!this._isBillboardBased) {
-                if (particle._initialDirection) {
-                    this._vertexData[offset++] = particle._initialDirection.x;
-                    this._vertexData[offset++] = particle._initialDirection.y;
-                    this._vertexData[offset++] = particle._initialDirection.z;
-                } else {
-                    this._vertexData[offset++] = particle.direction.x;
-                    this._vertexData[offset++] = particle.direction.y;
-                    this._vertexData[offset++] = particle.direction.z;
-                }
+                this._vertexData[offset++] = particle.direction.x;
+                this._vertexData[offset++] = particle.direction.y;
+                this._vertexData[offset++] = particle.direction.z;
             }
 
             if (!this._useInstancing) {
@@ -982,7 +977,7 @@
                 this._particles.push(particle);
 
                 // Emitter
-                let emitPower = Scalar.RandomRange(this.minEmitPower, this.maxEmitPower);
+                particle._emitPower = Scalar.RandomRange(this.minEmitPower, this.maxEmitPower);
 
                 if (this.startPositionFunction) {
                     this.startPositionFunction(worldMatrix, particle.position, particle);
@@ -998,18 +993,6 @@
                     this.particleEmitterType.startDirectionFunction(worldMatrix, particle.direction, particle);
                 }
 
-                if (emitPower === 0) {
-                    if (!particle._initialDirection) {
-                        particle._initialDirection = particle.direction.clone();
-                    } else {
-                        particle._initialDirection.copyFrom(particle.direction);
-                    }
-                } else {
-                    particle._initialDirection = null;
-                }
-
-                particle.direction.scaleInPlace(emitPower);
-
                 // Life time
                 if (this.targetStopDuration && this._lifeTimeGradients && this._lifeTimeGradients.length > 0) {
                     let ratio = Scalar.Clamp(this._actualFrame / this.targetStopDuration);