// Parameter Constructor.
        public T2DParticleEmitter(T2DParticleEffect effect, T2DParticleEmitterData emitterData)
            : this()
        {
            // Set Parent Effect.
            _parentEffect = effect;

            // Set Current Emitter Data.
            CurrentEmitterData = emitterData;
        }
        public override void CopyTo(TorqueObject obj)
        {
            base.CopyTo(obj);
            T2DParticleEffect obj2 = (T2DParticleEffect)(obj);

            // Create an actual clone of the emitters to allow runtime
            // changes to each single copy without affecting the others.

            obj2.CurrentEffectData = null;
            T2DParticleEffectData _ed = new T2DParticleEffectData();
            _ed.LifeMode = this.CurrentEffectData.LifeMode;
            _ed.Lifetime = this.CurrentEffectData.Lifetime;

            // Fetch Emitter Data List.
            foreach (T2DParticleEmitterData _p in this.CurrentEffectData.EmitterDataList)
            {
                T2DParticleEmitterData _t = new T2DParticleEmitterData(_p.Name);
                _t.AttachPositionToEmitter = _p.AttachPositionToEmitter;
                _t.AttachRotationToEmitter = _p.AttachRotationToEmitter;
                _t.BlueChannelLife = _p.BlueChannelLife;
                _t.EmissionAngleBase = _p.EmissionAngleBase;
                _t.EmissionAngleVariation = _p.EmissionAngleVariation;
                _t.EmissionArcBase = _p.EmissionArcBase;
                _t.EmissionArcVariation = _p.EmissionArcVariation;
                _t.EmissionForceBase = _p.EmissionForceBase;
                _t.EmissionForceVariation = _p.EmissionForceVariation;
                _t.EmitterArea = _p.EmitterArea;
                _t.FirstInFrontOrder = _p.FirstInFrontOrder;
                _t.FixedAreaAspect = _p.FixedAreaAspect;
                _t.FixedForceAngle = _p.FixedForceAngle;
                _t.FixedForceBase = _p.FixedForceBase;
                _t.FixedForceLife = _p.FixedForceLife;
                _t.FixedForceVariation = _p.FixedForceVariation;
                _t.FixedParticleAspect = _p.FixedParticleAspect;
                _t.GreenChannelLife = _p.GreenChannelLife;
                _t.Hidden = _p.Hidden;
                _t.InitialAge = _p.InitialAge;
                _t.LinkEmissionRotation = _p.LinkEmissionRotation;
                _t.Material = _p.Material;
                _t.MaterialRegionIndex = _p.MaterialRegionIndex;
                _t.OrientationAngleOffset = _p.OrientationAngleOffset;
                _t.OrientationRandomArc = _p.OrientationRandomArc;
                _t.ParticleLifeBase = _p.ParticleLifeBase;
                _t.ParticleLifeVariation = _p.ParticleLifeVariation;
                _t.ParticleOrientation = _p.ParticleOrientation;
                _t.ParticlePivotPoint = _p.ParticlePivotPoint;
                _t.QuantityBase = _p.QuantityBase;
                _t.QuantityVariation = _p.QuantityVariation;
                _t.RandomMotionBase = _p.RandomMotionBase;
                _t.RandomMotionLife = _p.RandomMotionLife;
                _t.RandomMotionVariation = _p.RandomMotionVariation;
                _t.RedChannelLife = _p.RedChannelLife;
                _t.SingleParticle = _p.SingleParticle;
                _t.SizeXBase = _p.SizeXBase;
                _t.SizeXLife = _p.SizeXLife;
                _t.SizeXVariation = _p.SizeXVariation;
                _t.SizeYBase = _p.SizeYBase;
                _t.SizeYLife = _p.SizeYLife;
                _t.SizeYVariation = _p.SizeYVariation;
                _t.SpeedBase = _p.SpeedBase;
                _t.SpeedLife = _p.SpeedLife;
                _t.SpeedVariation = _p.SpeedVariation;
                _t.SpinBase = _p.SpinBase;
                _t.SpinLife = _p.SpinLife;
                _t.SpinVariation = _p.SpinVariation;
                _t.TextureCoords = _p.TextureCoords;
                _t.UseEffectEmission = _p.UseEffectEmission;
                _t.VisibilityLife = _p.VisibilityLife;
                _ed.EmitterDataList.Add(_t);
            }

            obj2.CurrentEffectData = _ed;
            obj2._playOnLoad = _playOnLoad;
        }
        /// <summary>
        /// Remove an emitter description from the effect.
        /// </summary>
        /// <param name="emitterData"></param>
        public void RemoveEmitter(T2DParticleEmitterData emitterData)
        {
            // Remove emitter-data from list.
            _emitterDataList.Remove(emitterData);

            // Emitter List Changed.
            EmitterListChanged();
        }
        /// <summary>
        /// Change the order of an emitter in the list.  Returns new emitter index.
        /// </summary>
        /// <param name="emitterData">Emitter to move.</param>
        /// <param name="orderChange">Move operation.</param>
        /// <returns>New emitter index.</returns>
        public int MoveEmitterData(T2DParticleEmitterData emitterData, EmitterDataOrderChange orderChange)
        {
            // Sanity!
            Assert.Fatal(ContainsEmitterData(emitterData), "Cannot change emitter-data sequence; emitter not within effect!");

            // Find Emitter-Data Index.
            int emitterDataIndex = _emitterDataList.IndexOf(emitterData);

            // Sanity!
            Assert.Fatal(emitterDataIndex != -1, "Emitter-Data is not in the list; how can this happen?");

            // Handle emitter-data order change.
            switch (orderChange)
            {
                // FIRST in list.
                case EmitterDataOrderChange.First:
                    {
                        // Already first?
                        if (emitterDataIndex == 0)
                        {
                            // Yes, so finish!
                            return emitterDataIndex;
                        }

                        // Remove from emitter-data list.
                        _emitterDataList.Remove(emitterData);

                        // Insert emitter-data as FIRST.
                        _emitterDataList.Insert(0, emitterData);

                        // Emitter List Changed.
                        EmitterListChanged();

                        // Return new emitter-data index.
                        return 0;
                    };

                // LAST in list.
                case EmitterDataOrderChange.Last:
                    {
                        // Already last?
                        if (emitterDataIndex == _emitterDataList.Count - 1)
                        {
                            // Yes, so finish!
                            return emitterDataIndex;
                        }

                        // Remove from emitter-data list.
                        _emitterDataList.Remove(emitterData);

                        // Add emitter-data as LAST.
                        _emitterDataList.Add(emitterData);

                        // Emitter List Changed.
                        EmitterListChanged();

                        // Return new emitter-data index.
                        return emitterDataIndex;

                    };

                // NEXT in list.
                case EmitterDataOrderChange.Next:
                    {
                        // Already last?
                        if (emitterDataIndex == _emitterDataList.Count - 1)
                        {
                            // Yes, so finish!
                            return emitterDataIndex;
                        }

                        // Remove from emitter-data list.
                        _emitterDataList.Remove(emitterData);

                        // NEXT emitter-data index.
                        emitterDataIndex++;

                        // Insert as NEXT.
                        _emitterDataList.Insert(emitterDataIndex, emitterData);

                        // Emitter List Changed.
                        EmitterListChanged();

                        // Return new emitter-data index.
                        return emitterDataIndex;

                    };

                // PREVIOUS in list.
                case EmitterDataOrderChange.Previous:
                    {
                        // Already first?
                        if (emitterDataIndex == 0)
                        {
                            // Yes, so finish!
                            return emitterDataIndex;
                        }

                        // Remove from emitter-data list.
                        _emitterDataList.Remove(emitterData);

                        // PREVIOUS emitter-data index.
                        emitterDataIndex--;

                        // Insert as PREVIOUS.
                        _emitterDataList.Insert(emitterDataIndex, emitterData);

                        // Emitter List Changed.
                        EmitterListChanged();

                        // Return new emitter-data index.
                        return emitterDataIndex;

                    };
            }

            // No change so return emitter-data index.
            return emitterDataIndex;
        }
 /// <summary>
 /// Test to see if effect data contains the given emitter data.
 /// </summary>
 /// <param name="emitterData">Emitter data to test.</param>
 /// <returns>True if emitter data is in the effect.</returns>
 public bool ContainsEmitterData(T2DParticleEmitterData emitterData)
 {
     return _emitterDataList.Contains(emitterData);
 }
        /// <summary>
        ///  Add a new emitter description.
        /// </summary>
        /// <param name="emitterData">Emitter to add.</param>
        public void AddEmitterData(T2DParticleEmitterData emitterData)
        {
            // Add emitter-data to list.
            _emitterDataList.Add(emitterData);

            // Emitter List Changed.
            EmitterListChanged();
        }
 public void Dispose()
 {
     ClearParticles();
     _emitterData = null;
     _parentEffect = null;
 }