public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, double rotation, double throttle, double ispMultiplier) { double retrograde = rotation + Math.PI + _angle; int particles = (int)((throttle * _particleRate) / timeStep.UpdateLoops); // Interpolate between spreads based on ISP double spreadMultiplier = (1.0 - ispMultiplier) * _minSpread + ispMultiplier * _maxSpread; // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(200, 300); double spread = _random.NextDouble() - 0.5; DVector2 velocity = DVector2.FromAngle(retrograde + spread * spreadMultiplier); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() * 0.05 + _maxAge; particle.Position = enginePosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity * velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public void Update(TimeStep timeStep, DVector2 shipPosition, DVector2 shipVelocity, double pitch, double heatingRate) { double rotation = pitch - _offsetAngle; DVector2 offset = new DVector2(Math.Cos(rotation), Math.Sin(rotation)) * _offsetLength; DVector2 shockPosition = shipPosition - offset; double normalizedHeating = Math.Max((heatingRate - 500000) * 0.0005, 0); int particles = (int)(normalizedHeating * _particleRate) / timeStep.UpdateLoops; // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(50, 200); double spread = _random.NextDouble() * 2.5 - 1.25; DVector2 velocity = DVector2.FromAngle(rotation + spread); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble()*0.01 + 0.02; particle.Position = shockPosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity*velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity*timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }
public void Update(TimeStep timeStep, DVector2 enginePosition, DVector2 shipVelocity, double rotation, double throttle) { double retrograde = rotation + Math.PI; int particles = (int)((throttle * _particleRate) / timeStep.UpdateLoops); // Add new particles if nessecary for (int i = 0; i < particles; i++) { if (_availableParticles.Count > 0) { double velocityFactor = _random.Next(150, 250); double spread = _random.NextDouble() - 0.5; DVector2 velocity = DVector2.FromAngle(retrograde + spread * _spreadFactor); int id = _availableParticles.Dequeue(); Particle particle = _particles[id]; particle.IsActive = true; particle.Age = 0; particle.MaxAge = _random.NextDouble() * 0.1 + 0.05; particle.Position = enginePosition.Clone(); particle.Velocity = shipVelocity.Clone() + velocity * velocityFactor; } } // Update the particles for (int i = 0; i < _particles.Length; i++) { Particle particle = _particles[i]; if (particle.IsActive) { particle.Position += particle.Velocity * timeStep.Dt; particle.Age += timeStep.Dt; if (particle.Age > particle.MaxAge) { particle.IsActive = false; _availableParticles.Enqueue(i); } } } }