/// <summary>
        /// Emits a single particle
        /// </summary>
        /// <param name="init">Particle creation parameters to adjust</param>
        internal override void Emit(ref ParticleInitParams init)
        {
            float angle = _direction + ((float)_rnd.NextDouble() * _spread) - (_spread / 2f);

            init.Angle = angle;
            init.Position = new Vector2(Position.X, Position.Y);
            init.Rotation = angle;
        }
        /// <summary>
        /// Emits a single particle
        /// </summary>
        /// <param name="init">Particle init parameters to modify</param>
        internal override void Emit(ref ParticleInitParams init)
        {
            float angle = (float)_rnd.NextDouble() * MathHelper.TwoPi;

            init.Angle = angle;
            init.Position = new Vector2(
                Position.X + (float)Math.Sin(angle) * _radius,
                Position.Y + (float)Math.Cos(angle) * _radius);
            init.Rotation = angle;
        }
        /// <summary>
        /// Emits a single particle
        /// </summary>
        /// <param name="init">Particle init parameters to modify</param>
        internal override void Emit(ref ParticleInitParams init)
        {
            init.Position.X = Position.X;
            init.Position.Y = Position.Y;

            float angle = (float)_rnd.NextDouble() * MathHelper.TwoPi;

            init.Angle = angle;
            init.Rotation = angle;
        }
        /// <summary>
        /// Emits a single particle
        /// </summary>
        /// <param name="createParams">Particle init parameters to modify</param>
        internal override void Emit(ref ParticleInitParams init)
        {
            //Go to the next segment in the spiral
            if (_dir == SpiralDirection.AntiClockwise)
            {
                _currentSegment++;
                if (_currentSegment >= _segments) { _currentSegment = 0; }
            }
            else
            {
                _currentSegment--;
                if (_currentSegment <= 0) { _currentSegment = _segments; }
            }

            float angle = (MathHelper.TwoPi / _segments) * _currentSegment;

            init.Angle = angle;
            init.Position = new Vector2(
                Position.X + (float)Math.Sin(angle) * _radius,
                Position.Y + (float)Math.Cos(angle) * _radius);
            init.Rotation = angle;
        }
        /// <summary>
        /// Reincarnates the particle with new properties
        /// </summary>
        public void Reincarnate( ParticleInitParams init)
        {
            _creationTime = Environment.TickCount;
            _lifespan = _emitter.ParticleLifespanVariated;

            _baseRotation = init.Rotation;
            _additionalRotation = 0f;

            _position = init.Position;
            _speed = _emitter.ParticleSpeedVariated;
            _angle = init.Angle;
            _scale = _emitter.InitialScale;
            _color = new Vector4();
            //_color = new Vector4(
            //    _emitter.StartingAlpha, _emitter.StartingRed,
            //    _emitter.StartingGreen, _emitter.StartingBlue);

            _alive = true;
            _emitter.ActiveParticles.Add(this);
        }
 /// <summary>
 /// Emits a single particle
 /// </summary>
 internal abstract void Emit(ref ParticleInitParams init);
        /// <summary>
        /// Triggers the particles emitter
        /// </summary>
        public void Trigger()
        {
            ParticleInitParams init = new ParticleInitParams();

            for (int i = 0; i < _emitQuantity; i++)
            {
                Emit(ref init);

                if (_limbo.Count > 0)
                {
                    _limbo.Dequeue().Reincarnate(init);
                }
                else
                {
                    _activeParticles.Add(new Particle(this, init));
                }
            }
        }