public void CreateNewParticle(Vector3 partSysPos) { var part = particles.New(); part.ResetParticle(); part.Alive = true; part.Lifetime = Lifetime.GetRandomNumInRange(); part.Position = partSysPos + EmitRadius.GetRandomNumInRange(); var i = 0; // process any initial events foreach (var ev in Events) { if (ev.ActualTime == 0) { ev.DoItToIt(ref part); i++; } } part.CurEvent = i; totalParticleLives++; }
protected virtual void Emit(ParticleEmitter emitter, Particle particle) { Matrix transform = Matrix.CreateRotationZ(emitter.WorldRotation); // Generating spawn position. float emitAngle = RandomHelper.Next(0, MathHelper.TwoPi); float emitRadius = EmitRadius.GetValue(); Vector2 p = EmitPosition.GetValue() + new Polar2(emitRadius, emitAngle).ToVector2(); // Generating initial velocity. float initialAngle = EmitAngle.GetValue(); float initialVelocity = InitialVelocity.GetValue(); Vector2 v; if (InitialVelocityMode == InitialVelocityMode.AwayFromCenter && p != Vector2.Zero) { v = Vector2.Normalize(p) * initialVelocity; } else { v = new Polar2(initialVelocity, initialAngle).ToVector2(); } particle.Position = emitter.WorldPosition + Vector2.Transform(p, transform); particle.Rotation = emitter.WorldRotation + InitialRotation.GetValue(); particle.Velocity = Vector2.Transform(v, transform); particle.AngularVelocity = InitialAngularVelocity.GetValue(); particle.Duration = Duration.GetValue(); particle.Timer = 0; particle.Scale = InitialScale.GetValue(); if (SpriteFrames != null) { particle.Data = RandomHelper.Next(0, SpriteFrames.Length); } if (ColorMode == ParticleColorMode.Random) { particle.Color = Colors[RandomHelper.Next(0, Colors.Length)].ToVector4(); } else { particle.Color = Colors[0].ToVector4(); } }