Selaa lähdekoodia

Revert to previous model

David Catuhe 7 vuotta sitten
vanhempi
commit
f4dff04ba0
2 muutettua tiedostoa jossa 34 lisäystä ja 9 poistoa
  1. 10 2
      src/Particles/babylon.particle.ts
  2. 24 7
      src/Particles/babylon.particleSystem.ts

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

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

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

@@ -490,7 +490,6 @@
             // 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];
@@ -526,10 +525,10 @@
                         }
                         particle.angle += particle.angularSpeed * this._scaledUpdateSpeed;
 
-                        particle.direction.scaleToRef(this._scaledUpdateSpeed * particle._emitPower, this._scaledDirection);
+                        particle.direction.scaleToRef(this._scaledUpdateSpeed, this._scaledDirection);
                         particle.position.addInPlace(this._scaledDirection);
 
-                        this.gravity.scaleToRef(this._scaledUpdateSpeed / particle._emitPower, this._scaledGravity);
+                        this.gravity.scaleToRef(this._scaledUpdateSpeed, this._scaledGravity);
                         particle.direction.addInPlace(this._scaledGravity);
 
                         // Gradient
@@ -863,9 +862,15 @@
             }
 
             if (!this._isBillboardBased) {
-                this._vertexData[offset++] = particle.direction.x;
-                this._vertexData[offset++] = particle.direction.y;
-                this._vertexData[offset++] = particle.direction.z;
+                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;
+                }
             }
 
             if (!this._useInstancing) {
@@ -977,7 +982,7 @@
                 this._particles.push(particle);
 
                 // Emitter
-                particle._emitPower = Scalar.RandomRange(this.minEmitPower, this.maxEmitPower);
+                let emitPower = Scalar.RandomRange(this.minEmitPower, this.maxEmitPower);
 
                 if (this.startPositionFunction) {
                     this.startPositionFunction(worldMatrix, particle.position, particle);
@@ -993,6 +998,18 @@
                     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);