예제 #1
0
        private void RenderSunSystemPreview(SunSystemFactory factory)
        {
            if (!SetPreviews(PreviewType.Default, factory))
            {
                return;
            }
            if (factory == null)
            {
                return;
            }

            pbPreview.Resize += PreviewOnResize;

            // Get furthest out orbit to know how to scale.
            var   sunFactory = FactoryManager.GetFactory(factory.Sun) as SunFactory;
            float padding, scale;

            ComputeScaleAndOffset(Engine.Util.UnitConversion.ToScreenUnits(CellSystem.CellSize) / 2f, out scale, out padding);

            // Render all objects from left to right, starting with the sun.
            using (var g = System.Drawing.Graphics.FromImage(pbPreview.Image))
            {
                g.SmoothingMode     = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode   = PixelOffsetMode.HighQuality;
                using (var brush = new SolidBrush(System.Drawing.Color.White))
                {
                    if (sunFactory != null && sunFactory.Radius != null)
                    {
                        var sunColor = System.Drawing.Color.FromArgb(
                            sunFactory.OffsetRadius != null ? 200 : 255, 255, 255, 224);
                        brush.Color = sunColor;
                        var diameter = scale * sunFactory.Radius.Low * 2;
                        g.FillEllipse(brush, padding - diameter / 2f, pbPreview.Image.Height / 2f - diameter / 2f, diameter, diameter);
                        if (sunFactory.OffsetRadius != null)
                        {
                            diameter = scale * (sunFactory.Radius.High + sunFactory.OffsetRadius.High) * 2;
                            g.FillEllipse(brush, padding - diameter / 2f, pbPreview.Image.Height / 2f - diameter / 2f, diameter, diameter);
                        }
                    }
                    RenderOrbit(factory.Planets, padding, scale, g, brush);
                }
            }
        }
예제 #2
0
 public static void AddResource(SunSystemFactory sunSystem)
 {
     Search(sunSystem);
 }
예제 #3
0
        /// <summary>
        /// Checks orbits for validity.
        /// </summary>
        /// <param name="factory">The factory.</param>
        private void ScanFactory(SunSystemFactory factory)
        {
            if (factory == null)
            {
                return;
            }

            // Get sun factory, to extract base radius offset, if possible.
            var sunFactory = FactoryManager.GetFactory(factory.Sun) as SunFactory;
            var orbits     = new Stack <Tuple <Orbit, float, string> >();

            orbits.Push(Tuple.Create(factory.Planets, sunFactory != null && sunFactory.OffsetRadius != null ? sunFactory.OffsetRadius.High : 0f, "Planets"));
            while (orbits.Count > 0)
            {
                var data   = orbits.Pop();
                var orbit  = data.Item1;
                var radius = data.Item2;
                var prefix = string.IsNullOrWhiteSpace(data.Item3) ? "" : (data.Item3 + ".");
                if (orbit == null)
                {
                    continue;
                }

                for (var i = 0; i < orbit.Orbiters.Length; i++)
                {
                    var orbiter     = orbit.Orbiters[i];
                    var localPrefix = prefix + "Orbiters[" + i + "].";
                    var childRadius = radius;

                    ScanReferences(factory, orbiter, localPrefix);

                    if (orbiter.ChanceToExist <= 0)
                    {
                        AddIssue("Planet will never be generated (probability <= 0).", factory, localPrefix + "ChanceToExist", IssueType.Information);
                    }

                    if (orbiter.Eccentricity != null &&
                        (orbiter.Eccentricity.Low < 0 || orbiter.Eccentricity.High < 0 ||
                         orbiter.Eccentricity.Low > 1 || orbiter.Eccentricity.High > 1))
                    {
                        AddIssue("Planet orbit ellipse eccentricity is in invalid value-range (should be in [0, 1]).", factory, localPrefix + "Eccentricity", IssueType.Warning);
                    }

                    if (orbiter.OrbitRadius == null)
                    {
                        AddIssue("Nor orbit radius set for planet.", factory, localPrefix + "OrbitRadius", IssueType.Error);
                    }
                    else
                    {
                        // Check if we're too large (exceeding cell size). Only trigger this message
                        // for the first object exceeding the bounds, not for its children.
                        childRadius += orbiter.OrbitRadius.High;
                        if (radius < Engine.Util.UnitConversion.ToScreenUnits(CellSystem.CellSize) / 2f &&
                            childRadius >= Engine.Util.UnitConversion.ToScreenUnits(CellSystem.CellSize) / 2f)
                        {
                            AddIssue("Accumulative radii of orbits potentially exceed cell size.", factory, localPrefix + "OrbitRadius", IssueType.Warning);
                        }

                        if (orbiter.OrbitRadius.Low <= 0 || orbiter.OrbitRadius.High <= 0)
                        {
                            AddIssue("Orbit radius should be larger than zero for planet.", factory,
                                     localPrefix + "OrbitRadius", IssueType.Warning);
                        }
                    }

                    orbits.Push(Tuple.Create(orbiter.Moons, childRadius, localPrefix + "Moons"));
                }
            }
        }