/// <summary>
 /// Remove the specified cloud layer
 /// </summary>
 /// <param name="cl"></param>
 public void Remove(CloudLayer cl)
 {
     if (_cloudLayers.Contains(cl))
     {
         _cloudLayers.Remove(cl);
     }
 }
 /// <summary>
 /// Unregister cloud layer
 /// </summary>
 /// <param name="cl">Cloud layer to unregister</param>
 public void Unregister(CloudLayer cl)
 {
     for (int k = 0; k < _cloudLayers.Count; k++)
     {
         if (_cloudLayers[k] == cl)
         {
             _cloudLayers[k].Unregister();
             break;
         }
     }
 }
        /// <summary>
        /// Add a cloud layer
        /// </summary>
        /// <param name="options">Cloud layer options</param>
        public CloudLayer Add(CloudLayer.Options options)
        {
            CloudLayer newCloudLayer = new CloudLayer(this.SkyX, options);

            // TODO
            using (MaterialPtr mat = (MaterialPtr)MaterialManager.Singleton.GetByName(this.SkyX.GpuManager.SkydomeMaterialName)) {
                newCloudLayer.RegisterCloudLayer(mat.GetTechnique(0).CreatePass());
                mat.Reload();
                _cloudLayers.Add(newCloudLayer);
            }
            bool changeOrder = false;

            // Short layers by height
            for (int k = 0; k < _cloudLayers.Count; k++)
            {
                if (k + 1 < _cloudLayers.Count)
                {
                    if (_cloudLayers[k].LayerOptions.Height < _cloudLayers[k + 1].LayerOptions.Height)
                    {
                        // Swap
                        CloudLayer cl = _cloudLayers[k];
                        _cloudLayers[k]     = _cloudLayers[k + 1];
                        _cloudLayers[k + 1] = cl;

                        changeOrder = true;
                        k           = 0;
                    }
                }
            }

            if (changeOrder)
            {
                UnregisterAll();
                RegisterAll();
            }

            return(newCloudLayer);
        }
        /// <summary>
        /// Add a cloud layer
        /// </summary>
        /// <param name="options">Cloud layer options</param>
        public CloudLayer Add(CloudLayer.Options options)
        {
            CloudLayer newCloudLayer = new CloudLayer(this.SkyX, options);

            // TODO
            using (MaterialPtr mat = (MaterialPtr)MaterialManager.Singleton.GetByName(this.SkyX.GpuManager.SkydomeMaterialName)) {
                newCloudLayer.RegisterCloudLayer(mat.GetTechnique(0).CreatePass());
                mat.Reload();
                _cloudLayers.Add(newCloudLayer);
            }
            bool changeOrder = false;
            // Short layers by height
            for (int k = 0; k < _cloudLayers.Count; k++)
            {
                if (k + 1 < _cloudLayers.Count)
                {
                    if (_cloudLayers[k].LayerOptions.Height < _cloudLayers[k + 1].LayerOptions.Height)
                    {
                        // Swap
                        CloudLayer cl = _cloudLayers[k];
                        _cloudLayers[k] = _cloudLayers[k + 1];
                        _cloudLayers[k + 1] = cl;

                        changeOrder = true;
                        k = 0;
                    }
                }
            }

            if (changeOrder)
            {
                UnregisterAll();
                RegisterAll();
            }

            return newCloudLayer;
        }
 /// <summary>
 /// Unregister cloud layer
 /// </summary>
 /// <param name="cl">Cloud layer to unregister</param>
 public void Unregister(CloudLayer cl)
 {
     for (int k = 0; k < _cloudLayers.Count; k++)
     {
         if (_cloudLayers[k] == cl)
         {
             _cloudLayers[k].Unregister();
             break;
         }
     }
 }
 /// <summary>
 /// Remove the specified cloud layer
 /// </summary>
 /// <param name="cl"></param>
 public void Remove(CloudLayer cl)
 {
     if (_cloudLayers.Contains(cl))
         _cloudLayers.Remove(cl);
 }