|
@@ -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
|