public void SpawnParticle(Point3D position, double speed, double size, double duration, Particle particle) { if (_particleList.Count > _maxParticleCount) { return; } particle.Position = position; particle.StartDuration = duration; particle.Duration = duration; particle.StartSize = size; particle.Size = size; // #FELO: -1 to 1 for x and -1 to 1 for y coordinate creates 360 degree spread. float x = DirectionX - (float)_random.NextDouble() * DirectionDistortionX; float z = DirectionY - (float)_random.NextDouble() * DirectionDistortionY; var vector3D = new Vector3D( x, z, 0.0 ); vector3D.Normalize(); vector3D *= ( InitialSpeedConst + (float)_random.NextDouble() ) * (float)speed; particle.Velocity = new Vector3D( vector3D.X, vector3D.Y, vector3D.Z); particle.Decay = DecayAmount; _particleList.Add(particle); }