//----------------------------------------------------------------------------
        //----------------------------------------------------------------------------
        public virtual void Update(DeltaTime deltaTime)
        {
            if ((m_bActive || !m_bActive && (m_freeParticleList.Count != m_Particles.Count)) && ParticleController != null)
            {
                if (m_bAllowGeneration)
                {
                    //We create new ones
                    GenerateParticles(deltaTime);

                    if (!m_bContinuosEmission)
                    {
                        m_bAllowGeneration = false;
                    }
                }

                ParticleController.UpdateController(deltaTime, this);

                //We update each active particle.
                foreach (IParticle particle in m_Particles)
                {
                    if (particle.Active)
                    {
                        particle.UpdateParticle(deltaTime);
                    }
                }
            }
        }
        //----------------------------------------------------------------------------
        //----------------------------------------------------------------------------
        public ParticleEmitter(IRenderLayer <TInfoType> renderLayer, Type particleType, ParticleController <TInfoType> controller, string szAssetName, Vector3 v3Position, int nMaxSprites)
        {
            m_RenderLayer      = renderLayer;
            m_Particles        = new List <IParticle>(nMaxSprites);
            m_freeParticleList = new Queue <IParticle>(nMaxSprites);

            SaveSerializationData("MaxSprites", nMaxSprites);
            SaveSerializationData("AssetName", szAssetName);
            SaveSerializationData("ParticleType", particleType);

            ParticleController = controller;

            m_bActive            = false;
            m_bContinuosEmission = false;
            m_bAllowGeneration   = false;
            Position             = v3Position;
            Enabled = true;

            EngineServices.GetSystem <IGameSystems>().Components.Add(this);

            for (int nCounter = 0; nCounter < nMaxSprites; ++nCounter)
            {
                IParticle particle = Activator.CreateInstance(particleType, new object[] { m_RenderLayer, szAssetName, Position, Vector3.Zero, 0, 0, false }) as IParticle;
                particle.ParticleDead += DeadParticle_Event;
                m_Particles.Add(particle);
                m_freeParticleList.Enqueue(particle);
            }
        }
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 private void GenerateParticles(DeltaTime deltaTime)
 {
     if (deltaTime.ElapsedGameTime.Milliseconds > ParticleController.GenerationTimer)
     {
         for (int nCounter = 0; nCounter < ParticleController.GenerationRate; ++nCounter)
         {
             if (m_freeParticleList.Count > 0)
             {
                 IParticle particle = m_freeParticleList.Dequeue();
                 particle.Scale = ParticleController.InitialScale;
                 ParticleController.InitializeParticle(ref particle, this);
                 particle.OnInitilized();
                 particle.Active = true;
             }
             else
             {
                 break;
             }
         }
     }
 }