/// <summary>
        /// Setup constructor
        /// </summary>
        /// <param name="projectType">Project type that created this project</param>
        /// <param name="name">Project name</param>
        /// <param name="modelFactory">Factory used for creating environment models from templates</param>
        /// <param name="renderFactory">Factory used for creating environment renderers from models</param>
        /// <param name="template">ProjectType to use</param>
        /// <param name="planet">Planet to use</param>
        protected PlanetProject( ProjectType projectType, string name, IPlanetEnvironmentModelFactory modelFactory, IPlanetEnvironmentRendererFactory renderFactory, IPlanetModelTemplate template, IPlanet planet )
            : base(projectType, name, null, null)
        {
            Arguments.CheckNotNull( template, "template" );
            Arguments.CheckNotNull( modelFactory, "modelFactory" );
            Arguments.CheckNotNull( renderFactory, "renderFactory" );
            Arguments.CheckNotNull( planet, "planet" );

            new PlanetTemplateWatcher( template, planet, modelFactory, renderFactory );

            m_Planet = planet;
            m_PlanetTemplate = template;
            template.CreateModelInstance( planet.Model, modelFactory, InstanceContext );
        }
        /// <summary>
        /// Setup constructor
        /// </summary>
        public PlanetTemplateWatcher( IPlanetModelTemplate planetTemplate, IPlanet planet, IPlanetEnvironmentModelFactory modelFactory, IPlanetEnvironmentRendererFactory rendererFactory )
        {
            Arguments.CheckNotNull( planetTemplate, "planetTemplate" );
            Arguments.CheckNotNull( planet, "planet" );
            m_ModelFactory = modelFactory;
            m_RendererFactory = rendererFactory;
            m_PlanetTemplate = planetTemplate;
            m_Planet = planet;

            m_PlanetTemplate.ComponentAdded += OnTemplateAdded;
            m_PlanetTemplate.ComponentRemoved += OnTemplateRemoved;

            m_Planet.Model.ComponentAdded += OnModelAdded;
            m_Planet.Model.ComponentRemoved += OnModelRemoved;
        }
 /// <summary>
 /// Builds a planet model
 /// </summary>
 protected override void BuildPlanetModel( IPlanetModel planetModel, IPlanetEnvironmentModelFactory modelFactory, ModelTemplateInstanceContext context )
 {
     Units.Metres radius = Range.Mid( m_Radius, context.Random.NextDouble( ) );
     ( ( ISpherePlanetModel )planetModel ).Radius = radius;
     base.BuildPlanetModel( planetModel, modelFactory, context );
 }