Browse Source

[fx] Loop functional for emitters

Clément Espeute 1 tháng trước cách đây
mục cha
commit
15cc395f91
3 tập tin đã thay đổi với 43 bổ sung22 xóa
  1. 6 4
      hide/view/FXEditor.hx
  2. 37 16
      hrt/prefab/fx/Emitter.hx
  3. 0 2
      hrt/prefab/fx/FX.hx

+ 6 - 4
hide/view/FXEditor.hx

@@ -1759,10 +1759,12 @@ class FXEditor extends hide.view.FileView {
 				var localDt = scene.speed * dt;
 				var nextTime = currentTime + localDt;
 				if (nextTime > fx.duration) {
-					nextTime = 0;
-					localDt = 0;
-					hasJumped = true;
-					fx.reset();
+					if (!fx.loop) {
+						nextTime = 0;
+						localDt = 0;
+						hasJumped = true;
+						fx.reset();
+					}
 				}
 				@:privateAccess fx.setTime(nextTime, localDt, hasJumped);
 

+ 37 - 16
hrt/prefab/fx/Emitter.hx

@@ -789,6 +789,7 @@ class EmitterObject extends h3d.scene.Object {
 
 
 	public function softReset() {
+		trace("softReset");
 		totalBurstCount = 0;
 		enable = true;
 	}
@@ -797,7 +798,7 @@ class EmitterObject extends h3d.scene.Object {
 		softReset();
 		random.init(randomSeed);
 		numInstances = 0;
-		curTime = 0.0;
+		curTime = -delay;
 		emitCount = 0;
 		emitTarget = 0;
 		listHead = null;
@@ -1162,7 +1163,7 @@ class EmitterObject extends h3d.scene.Object {
 			invTransform.load(parentNonEmitter.getInvPos());
 		}
 
-		if( enable && emitScale > 0.) {
+		if( enable && emitScale > 0. && curTime >= 0) {
 			switch emitType {
 				case Infinity:
 					emitTarget += evaluator.getFloat(emitRate, curTime) * hxd.Math.clamp(emitScale) * dt;
@@ -1225,6 +1226,9 @@ class EmitterObject extends h3d.scene.Object {
 				case Burst:
 					if( burstDelay > 0 ) {
 						var burstTarget = hxd.Math.min(burstCount, 1 + hxd.Math.floor(curTime / burstDelay));
+						if (burstTarget > totalBurstCount) {
+							trace("bc:", burstCount, "curTime", curTime, "bt:", burstTarget);
+						}
 						while( totalBurstCount < burstTarget ) {
 							var delta = hxd.Math.ceil(hxd.Math.min(maxCount - numInstances, Std.int(evaluator.getFloat(burstParticleCount, curTime))));
 							doEmit(delta);
@@ -1480,20 +1484,41 @@ class EmitterObject extends h3d.scene.Object {
 	public var tickTime : Float = 0;
 	#end
 
+
+	var lastParentTime = 0.0;
 	public function setTime(parentTime: Float, dt: Float, seek: Bool) {
-		var time : Float = if (!seek) {
-			if (parentTime < curTime) {
+		var localTime = (parentTime-delay) * speedFactor;
+
+		if (seek && parentTime < lastParentTime) {
+			reset();
+			updateMeshBatch();  // Make sure mesh batch is reset even when no tick is called()
+			curTime = localTime;
+		}
+		else if (!seek) {
+			if (parentTime < lastParentTime) {
+				trace("softReset", parentTime, localTime, curTime);
 				softReset();
+				curTime = localTime;
 			}
-			curTime + dt * speedFactor;
-		} else {
-			if (parentTime < curTime) {
-				reset();
-				updateMeshBatch();  // Make sure mesh batch is reset even when no tick is called()
-			}
-			var time = parentTime * speedFactor + warmUpTime;
-			Math.max(0, time - delay * speedFactor);
 		}
+		lastParentTime = parentTime;
+
+		var abs = this.getAbsPos();
+		baseEmitterShader.emitPosition.set(abs.tx, abs.ty, abs.tz);
+
+		if (!seek) {
+			#if editor
+			var start = haxe.Timer.stamp();
+			#end
+			tick(dt * speedFactor, true);
+			#if editor
+			var end = haxe.Timer.stamp();
+			tickTime = end - start;
+			#end
+			return;
+		}
+
+		var time = localTime + warmUpTime;
 
 		if(hxd.Math.abs(time - curTime) < 1e-6) {  // Time imprecisions can occur during accumulation
 			updateAlignment();
@@ -1503,10 +1528,6 @@ class EmitterObject extends h3d.scene.Object {
 			return;
 		}
 
-		var abs = this.getAbsPos();
-		baseEmitterShader.emitPosition.set(abs.tx, abs.ty, abs.tz);
-
-
 		var catchupTime = time - curTime;
 
 		#if !editor  // Limit catchup time to avoid spikes when showing long running FX

+ 0 - 2
hrt/prefab/fx/FX.hx

@@ -317,8 +317,6 @@ class FXAnimation extends h3d.scene.Object {
 			localTime = ((localTime - loopStart) % (loopEnd - loopStart)) + loopStart;
 		}
 
-		visible = localTime >= 0;
-
 		for (subFX in subFXs) {
 			subFX.setTime(localTime, dt, isSeek, fullSync);
 		}