/// <summary>
        /// Setup constructor
        /// </summary>
        /// <param name="view">View to control</param>
        /// <param name="template">Template to control</param>
        /// <param name="model">Model to control</param>
        /// <exception cref="System.ArgumentNullException">Thrown if any argument is null</exception>
        public CloudModelTemplateViewController( ICloudModelTemplateView view, IPlanetSimpleCloudTemplate template, IPlanetSimpleCloudModel model )
        {
            Arguments.CheckNotNull( view, "view" );
            Arguments.CheckNotNull( template, "template" );

            m_Model = model;
            m_Template = template;

            view.TemplateCloudLayerHeightChanged += OnTemplateCloudLayerHeightChanged;
            view.TemplateLowCoverageChanged += OnTemplateLowCoverageChanged;
            view.TemplateHighCoverageChanged += OnTemplateHighCoverageChanged;
            view.ModelCloudLayerHeightChanged += OnModelCloudLayerHeightChanged;
            view.ModelLowCoverageChanged += OnModelLowCoverageChanged;
            view.ModelHighCoverageChanged += OnModelHighCoverageChanged;

            view.EnableModelChanges = ( model != null );
        }
        /// <summary>
        /// Creates a cloud shell renderable from a cloud model
        /// </summary>
        private void BuildCloudShell( IPlanetSimpleCloudModel simpleCloudModel )
        {
            DestroyCloudShell( );

            m_BuildRadius = ( simpleCloudModel.CloudLayerHeight + Planet.Model.Radius );

            Graphics.Draw.StartCache( );
            Graphics.Draw.Sphere( null, Point3.Origin, m_BuildRadius.ToRenderUnits, 50, 50 );
            m_CloudShell = Graphics.Draw.StopCache( );
        }
 /// <summary>
 /// Returns true if the cloud model parameters differ from those used to create the cloud shell renderable object
 /// </summary>
 private bool DoesCloudShellRequireRebuild( IPlanetSimpleCloudModel simpleCloudModel )
 {
     if ( m_CloudShell == null )
     {
         return true;
     }
     return m_BuildRadius != ( simpleCloudModel.CloudLayerHeight + Planet.Model.Radius );
 }
        /// <summary>
        /// Sets up a simple cloud model
        /// </summary>
        protected virtual void SetupCloudModel( IPlanetSimpleCloudModel model, ModelTemplateInstanceContext context )
        {
            model.CloudLayerHeight = Range.Mid( CloudLayerHeightRange, context.Random.NextDouble( ) );

            float min = Range.Mid( LowCoverageRange, ( float )context.Random.NextDouble( ) );
            float max = Range.Mid( HighCoverageRange, ( float )context.Random.NextDouble( ) );
            model.CloudCoverRange = new Range<float>( Utils.Min( min, max ), Utils.Max( min, max ) );
        }
 /// <summary>
 /// Creates a view used to edit flat cloud model templates
 /// </summary>
 public IFlatCloudModelTemplateView CreateCloudTemplateView( IPlanetSimpleCloudTemplate template, IPlanetSimpleCloudModel model )
 {
     FlatCloudModelTemplateControl view = new FlatCloudModelTemplateControl( );
     new CloudModelTemplateViewController( view, template, model );
     return view;
 }