using System; using OpenTK; using SM.Base.Drawing.Particles; using SM.Base.Utility; using SM2D.Types; namespace SM2D.Drawing { /// /// Creates particles. /// public class DrawParticles : ParticleDrawingBasis { /// public override Func, Vector2> MovementCalculation { get; set; } = ParticleMovement.Default2D; /// /// The direction the particles should travel. /// public Vector2? Direction; /// /// The radius the direction is randomized /// public float DirectionRadius = 25; /// public DrawParticles(TimeSpan duration) : base(duration) { } /// protected override ParticleInstance CreateObject(int index) { Vector2 dir; if (Direction.HasValue) { Vector2 direction = Direction.Value; dir = (new Vector4(direction.X, direction.Y, 1, 1) * Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(Randomize.GetFloat(-DirectionRadius / 2, DirectionRadius / 2)))).Xy; } else dir = new Vector2(Randomize.GetFloat(-1, 1), Randomize.GetFloat(-1, 1)); var particle = new ParticleInstance() { Matrix = DetachedParticles ? Transform.GetMatrix() : Matrix4.CreateScale(1), Direction = dir, StartPosition = Transform.Position, Speed = Randomize.GetFloat(MaxSpeed), StartLifetime = Lifetime - Randomize.GetFloat(LifetimeRandomize) }; particle.Lifetime = particle.StartLifetime; return particle; } /// protected override Matrix4 CreateMatrix(ParticleInstance Struct, Vector2 direction) { Vector2 pos = direction; return Struct.Matrix * Matrix4.CreateTranslation(pos.X, pos.Y, 0); } } }