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); } } }
public static void AddResource(SunSystemFactory sunSystem) { Search(sunSystem); }
/// <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")); } } }