public void Add(ChangeMessage msg)
 {
     Messages.Add(msg);
 }
        public void Update(GameTime gameTime)
        {
            MessageBuffer.Clear();

            for (int i = 0; i < ParticleDataObjects.Count; i++)
            {
                ParticleData gameData = ParticleDataObjects[i];
                float        Rot;



                #region Handle particle rotation
                if (gameData.RotateVelocity == true)
                {
                    Rot = (float)Math.Atan2(gameData.Velocity.Y, gameData.Velocity.X);
                }
                else
                {
                    Rot = gameData.Rotation + MathHelper.ToRadians(gameData.RotationIncrement) * ((float)gameTime.ElapsedGameTime.TotalSeconds * 60.0f);
                }
                #endregion


                gameData.Update(gameTime);


                #region Update position

                Vector2 newPos = gameData.Position + gameData.Velocity;
                #endregion



                float percTime = gameData.CurrentTime / gameData.MaxTime;

                #region Fade transparency
                float transparency = gameData.StartingTransparency;
                if (gameData.Fade == true)
                {
                    transparency = MathHelper.Lerp(gameData.StartingTransparency, 0, percTime);
                    //transparency = gameData.StartingTransparency * (1.0f - ((1 / (gameData.MaxTime + gameData.FadeDelay)) * (gameData.CurrentTime + gameData.CurrentFadeDelay)));
                }
                #endregion

                #region Scale particles
                float newScale = gameData.CurrentScale;

                if (gameData.Shrink == true && gameData.Grow == false)
                {
                    newScale = gameData.MaxScale * (1.0f - ((1 / gameData.MaxTime) * (gameData.CurrentTime)));
                }

                if (gameData.Grow == true && gameData.Shrink == false)
                {
                    newScale = gameData.MaxScale * ((1 / gameData.MaxTime) * (gameData.CurrentTime));
                }

                if (gameData.Shrink == true && gameData.Grow == true)
                {
                    newScale = gameData.MaxScale * (float)Math.Sin(Math.PI * percTime);
                }
                #endregion

                #region Fade Colours
                Color newCol = Color.Lerp(gameData.StartColor, gameData.EndColor, percTime);
                #endregion



                //transparency = MathHelper.Lerp(gameData.StartingTransparency, 0, percTime);

                ChangeMessage msg = new ChangeMessage()
                {
                    ID = i
                };

                if (gameData.Active == false)
                {
                    msg.MessageType = ChangeMessageType.DeleteRenderData;
                    ParticleDataObjects.Remove(gameData);
                    MessageBuffer.Add(msg);
                    i--;
                }

                if (gameData.CurrentTime <= gameData.MaxTime)
                {
                    msg.MessageType  = ChangeMessageType.UpdateParticle;
                    msg.Position     = newPos;
                    msg.Rotation     = Rot;
                    msg.Color        = newCol;
                    msg.Scale        = newScale;
                    msg.Transparency = transparency;
                    MessageBuffer.Add(msg);

                    gameData.Position = newPos;
                    gameData.Rotation = Rot;
                }
            }
        }