/// <summary> /// Adds particles to the particle emitter at the specified time interval. /// </summary> /// <param name="time">The elapsed time of the past frame.</param> /// <param name="updateToggle">Makes sure that this entity only updated once per global Update() call.</param> public override void Update(bool updateToggle) { if (updateToggle != HasUpdated) { currentTime += GraphicOptions.FrameLength; if ((!Settings.Continuous && (currentTime > Settings.LifeSpan)) || stopped) { emitting = false; } previousPosition = Position; base.Update(updateToggle); if (GraphicOptions.FrameLength > 0 && Emitting) { velocity = (Position - previousPosition) / GraphicOptions.FrameLength; float totalTime = extraTime + GraphicOptions.FrameLength; float particleTime = -extraTime; while (totalTime > Settings.IntervalBetweenParticles) { particleTime += Settings.IntervalBetweenParticles; totalTime -= Settings.IntervalBetweenParticles; float delta = particleTime / GraphicOptions.FrameLength; Vector3 partPosition = Vector3.Lerp(previousPosition, position, delta); if (Settings.VaryX) { partPosition += Vector3.UnitX * random.Next(-Settings.Radius, Settings.Radius); } if (Settings.VaryY) { partPosition += Vector3.UnitY * random.Next(-Settings.Radius, Settings.Radius); } if (Settings.VaryZ) { partPosition += Vector3.UnitZ * random.Next(-Settings.Radius, Settings.Radius); } particles.AddParticle(partPosition, velocity, this.Front); } extraTime = totalTime; } particles.Update(); } }