private void LoadSolarSystem() { _sun = new Sun(); var mercury = new Mercury(); var venus = new Venus(); var earth = new Earth(); var moon = new Moon(earth.Position, earth.Velocity); var mars = new Mars(); var jupiter = new Jupiter(); var europa = new Europa(jupiter.Position, jupiter.Velocity); var saturn = new Saturn(); _massiveBodies = new List <IMassiveBody> { _sun, mercury, venus, earth, moon, mars, jupiter, europa, saturn }; ResolveMassiveBodyParents(); _spaceCrafts = new List <ISpaceCraft>(); _structures = new List <StructureBase>(); MissionConfig primaryMission = MissionConfig.Load(ProfilePaths[0]); _originTime = primaryMission.GetLaunchDate(); OrbitHelper.SimulateToTime(_massiveBodies, _originTime, 300); // Load missions for (int i = 0; i < ProfilePaths.Count; i++) { MissionConfig missionConfig = MissionConfig.Load(ProfilePaths[i]); IMassiveBody targetPlanet = LocatePlanet(missionConfig.ParentPlanet); double launchAngle = targetPlanet.GetSurfaceAngle(_originTime, _sun); _spaceCrafts.AddRange(SpacecraftFactory.BuildSpaceCraft(targetPlanet, launchAngle, missionConfig, ProfilePaths[i])); _structures.AddRange(StructureFactory.Load(targetPlanet, launchAngle, ProfilePaths[i])); } // Initialize the spacecraft controllers foreach (ISpaceCraft spaceCraft in _spaceCrafts) { spaceCraft.InitializeController(_eventManager); } _gravitationalBodies = new List <IGravitationalBody> { _sun, mercury, venus, earth, moon, mars, jupiter, europa, saturn }; foreach (ISpaceCraft spaceCraft in _spaceCrafts) { _gravitationalBodies.Add(spaceCraft); } // Target the spacecraft _targetIndex = _gravitationalBodies.IndexOf(_spaceCrafts.FirstOrDefault()); ResolveSpaceCraftParents(); }
/// <summary> /// Draws all the physics bodies and UI elements. /// </summary> private unsafe void DrawFrame(TimeStep timeStep, FpsManager frameTimer) { var font = new Font("Verdana Bold", 14); var brush = new SolidBrush(Color.White); RectangleD cameraBounds = _camera.GetBounds(); IGravitationalBody target = _gravitationalBodies[_targetIndex]; var targetSpaceCraft = target as SpaceCraftBase; // If openCL is supported render all cl bodies if (_renderingType == RenderingType.OpenCLHardware || _renderingType == RenderingType.OpenCLSoftware) { _gpuClear.RenderCl(_clProxy); foreach (MassiveBodyBase renderable in _massiveBodies) { if (renderable.Visibility(cameraBounds) > 0) { renderable.RenderCl(_clProxy, cameraBounds, _sun); } } int[] frameData = _clProxy.ReadIntBuffer("image", RenderUtils.ScreenArea); var rect = new Rectangle(0, 0, _imageBitmap.Width, _imageBitmap.Height); BitmapData bmpData = _imageBitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(frameData, 0, bmpData.Scan0, RenderUtils.ScreenArea); var ptr = (byte *)bmpData.Scan0; // Hack to force full alpha for now for (int i = 0; i < RenderUtils.ScreenArea; i++) { ptr[i * 4 + 3] = 255; } _imageBitmap.UnlockBits(bmpData); } else { // Fall back to gdi for cl renderables using (var graphics = Graphics.FromImage(_imageBitmap)) { graphics.Clear(Color.Black); foreach (MassiveBodyBase renderable in _massiveBodies) { if (renderable.Visibility(cameraBounds) > 0) { renderable.RenderGdiFallback(graphics, cameraBounds, _sun); } } } } // Draw all orbit traces, spacecrafts, and GDI objects using (var graphics = Graphics.FromImage(_imageBitmap)) { graphics.SmoothingMode = SmoothingMode.HighSpeed; graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; graphics.CompositingQuality = CompositingQuality.HighSpeed; graphics.InterpolationMode = InterpolationMode.NearestNeighbor; RenderUtils.DrawLine(graphics, cameraBounds, new DVector2(0, -10e12), new DVector2(0, 10e12), Color.FromArgb(40, 255, 255, 255)); RenderUtils.DrawLine(graphics, cameraBounds, new DVector2(-10e12, 0), new DVector2(10e12, 0), Color.FromArgb(40, 255, 255, 255)); double apogee = 0; double perigee = 0; // Draw orbit traces foreach (MassiveBodyBase massiveBody in _massiveBodies) { if (massiveBody is Sun) { continue; } OrbitTrace trace = OrbitHelper.TraceMassiveBody(massiveBody); if (target == massiveBody) { apogee = trace.Apogee; perigee = trace.Perigee; } trace.Draw(graphics, cameraBounds, massiveBody); } // Draw structures foreach (StructureBase structure in _structures) { structure.RenderGdi(graphics, cameraBounds); } // Draw spacecraft foreach (SpaceCraftBase spaceCraft in _spaceCrafts) { if (spaceCraft.Visibility(cameraBounds) > 0) { RectangleD bounds = spaceCraft.ComputeBoundingBox(); // In range for render if (cameraBounds.IntersectsWith(bounds)) { spaceCraft.RenderGdi(graphics, cameraBounds); } } if (spaceCraft.Parent != null) { continue; } OrbitTrace trace = OrbitHelper.TraceSpaceCraft(spaceCraft); if (target == spaceCraft) { apogee = trace.Apogee; perigee = trace.Perigee; } trace.Draw(graphics, cameraBounds, spaceCraft); } var elapsedTime = TimeSpan.FromSeconds(_totalElapsedSeconds); int elapsedYears = elapsedTime.Days / 365; int elapsedDays = elapsedTime.Days % 365; graphics.DrawString("Elapsed Time: " + string.Format("Y: {0} D: {1} H: {2} M: {3} S: {4}", elapsedYears, elapsedDays, elapsedTime.Hours, elapsedTime.Minutes, elapsedTime.Seconds), font, brush, 5, 5); graphics.DrawString("Update Speed: " + timeStep.Multiplier + " X", font, brush, 5, 35); double altitude = target.GetRelativeAltitude(); graphics.DrawString("Altitude: " + UnitDisplay.Distance(altitude), font, brush, 5, 90); graphics.DrawString(string.Format("Target: {0}", target), font, brush, RenderUtils.ScreenWidth / 2.0f, 5, new StringFormat { Alignment = StringAlignment.Center }); double targetVelocity = target.GetRelativeVelocity().Length(); graphics.DrawString("Relative Speed: " + UnitDisplay.Speed(targetVelocity, false), font, brush, 5, 175); graphics.DrawString("Relative Acceleration: " + UnitDisplay.Acceleration(target.GetRelativeAcceleration().Length()), font, brush, 5, 205); graphics.DrawString("Apogee: " + UnitDisplay.Distance(apogee), font, brush, 5, 345); graphics.DrawString("Perigee: " + UnitDisplay.Distance(perigee), font, brush, 5, 375); graphics.DrawString("Mass: " + UnitDisplay.Mass(target.Mass), font, brush, 5, 260); if (targetSpaceCraft != null) { double downrangeDistance = targetSpaceCraft.GetDownrangeDistance(_strongback.Position); graphics.DrawString("Downrange: " + UnitDisplay.Distance(downrangeDistance), font, brush, 5, 120); graphics.DrawString("Thrust: " + UnitDisplay.Force(targetSpaceCraft.Thrust), font, brush, 5, 290); double density = targetSpaceCraft.GravitationalParent.GetAtmosphericDensity(altitude); graphics.DrawString("Air Density: " + UnitDisplay.Density(density), font, brush, 5, 430); double dynamicPressure = 0.5 * density * targetVelocity * targetVelocity; graphics.DrawString("Dynamic Pressure: " + UnitDisplay.Pressure(dynamicPressure), font, brush, 5, 460); } graphics.DrawString("FPS: " + frameTimer.CurrentFps, font, brush, RenderUtils.ScreenWidth - 80, 5); } // Draw all GUI elements (higher quality) using (var graphics = Graphics.FromImage(_imageBitmap)) { graphics.SmoothingMode = SmoothingMode.HighQuality; double throttle = 0; if (targetSpaceCraft != null) { throttle = targetSpaceCraft.Throttle; } foreach (IGauge gauge in _gauges) { if (targetSpaceCraft != null) { gauge.Update(_gravitationalBodies[_targetIndex].Rotation, throttle / 100.0); } gauge.Render(graphics, cameraBounds); } _eventManager.Render(graphics); } }
private void LoadSolarSystem() { _sun = new Sun(); var mercury = new Mercury(); var venus = new Venus(); var earth = new Earth(); var moon = new Moon(earth.Position, earth.Velocity); var mars = new Mars(); var jupiter = new Jupiter(); var europa = new Europa(jupiter.Position, jupiter.Velocity); var saturn = new Saturn(); _massiveBodies = new List <IMassiveBody> { _sun, mercury, venus, earth, moon, mars, jupiter, europa, saturn }; ResolveMassiveBodyParents(); // Simulate the planets out to May 2018 with a 6000 second time step OrbitHelper.SimulateToTime(_massiveBodies, new DateTime(2018, 5, 1), 300); _spaceCrafts = new List <ISpaceCraft>(); for (int i = 0; i < ProfileDirectories.Count; i++) { string profileDirectory = ProfileDirectories[i]; //List<ISpaceCraft> spaceCraft = SpacecraftFactory.BuildSpaceCraft(mars, profileDirectory, i * 30); List <ISpaceCraft> spaceCraft = SpacecraftFactory.BuildSpaceCraft(earth, profileDirectory, i * -60); _spaceCrafts.AddRange(spaceCraft); } // Initialize the spacecraft controllers foreach (ISpaceCraft spaceCraft in _spaceCrafts) { spaceCraft.InitializeController(_eventManager); } // Start at nearly -Math.Pi / 2 var itsMount = new ITSMount(-1.570795, -69, earth); var strongback = new Strongback(-1.5708048, -32, earth); // Start downrange at ~300km //var asds = new ASDS(-1.8303485, 26, earth); _gravitationalBodies = new List <IGravitationalBody> { _sun, mercury, venus, earth, moon, mars, jupiter, europa, saturn }; foreach (ISpaceCraft spaceCraft in _spaceCrafts) { _gravitationalBodies.Add(spaceCraft); } _structures = new List <StructureBase> { itsMount, strongback, //asds }; // Target the spacecraft _targetIndex = _gravitationalBodies.IndexOf(_spaceCrafts.FirstOrDefault()); ResolveSpaceCraftParents(); }
protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; g.InterpolationMode = InterpolationMode.HighQualityBilinear; g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; // DRAW SPACEITEMS foreach (KeyValuePair <string, SpaceItem> kvp in list) { SpaceItem s = kvp.Value; float cX = (float)((this.Width / 2f) + (s.position.Item1 * scale) - (s.radius * scale) + (offsetX * scale)); float cY = (float)((this.Height / 2f) - (s.position.Item2 * scale) - (s.radius * scale) + (offsetY * scale)); float size = (float)(2 * (s.radius * scale)); g.FillEllipse(center, cX, cY, size, size); if (s.type == SpaceItem.SpaceItemType.SPACECRAFT || s.type == SpaceItem.SpaceItemType.MOON) { List <Tuple <double, double, double> > future = OrbitHelper.IteratePosition(s, list, iterations); for (int i = 0; i < future.Count - 1; i++) { g.DrawLine(orbitPen, (float)((this.Width / 2f) + (future[i].Item1 * scale)), (float)((this.Height / 2f) + (future[i].Item2 * -scale)), (float)((this.Width / 2f) + (future[i + 1].Item1 * scale)), (float)((this.Height / 2f) + (future[i + 1].Item2 * -scale)) ); } List <Tuple <double, double, double> > points = s.orbitPoints.ToList(); PointF[] pointsXY = new PointF[points.Count]; for (int i = 0; i < points.Count; i++) { pointsXY[i] = new PointF( (float)((this.Width / 2f) + (points[i].Item1 * scale) + (offsetX * scale)), (float)((this.Height / 2f) + (points[i].Item2 * -scale) + (offsetY * scale)) ); } if (pointsXY.Count() >= 2) { g.DrawLines(orbitPenG, pointsXY); } } } // DRAW EARTH //g.FillEllipse(center, (float)((this.Width / 2f) - (earthRadius * scale)), (float)((this.Height / 2f) - (earthRadius * scale)), (float)(2 * (earthRadius * scale)), (float)(2 * (earthRadius * scale))); // DRAW PAST POSITIONS /** * if(orbitPointsXY.Count > 1) * { * for(int i = 0; i < orbitPointsXY.Count - 1; i++) * { * g.DrawLine(orbitPen, * (float)((this.Width / 2f) + (orbitPointsXY[i].Item1 * scale)), * (float)((this.Height / 2f) + (orbitPointsXY[i].Item2 * -scale)), * (float)((this.Width / 2f) + (orbitPointsXY[i+1].Item1 * scale)), * (float)((this.Height / 2f) + (orbitPointsXY[i+1].Item2 * -scale)) * ); * } * }**/ // DRAW SPACECRAFT-DOTS foreach (KeyValuePair <string, SpaceItem> kvp in list) { SpaceItem s = kvp.Value; if (s.type == SpaceItem.SpaceItemType.SPACECRAFT) { float size = 2f; float cX = (float)((this.Width / 2f) + (s.position.Item1 * scale) - (size / 2f) + (offsetX * scale)); float cY = (float)((this.Height / 2f) - (s.position.Item2 * scale) - (size / 2f) + (offsetY * scale)); g.FillEllipse(craft, cX, cY, size, size); } } }
private void LoadSolarSystem() { _sun = new Sun(); var mercury = new Mercury(); var venus = new Venus(); var earth = new Earth(); var moon = new Moon(earth.Position, earth.Velocity); var mars = new Mars(); var jupiter = new Jupiter(); var callisto = new Callisto(jupiter.Position, jupiter.Velocity); var europa = new Europa(jupiter.Position, jupiter.Velocity); var ganymede = new Ganymede(jupiter.Position, jupiter.Velocity); var io = new Io(jupiter.Position, jupiter.Velocity); var saturn = new Saturn(); _massiveBodies = new List <IMassiveBody> { _sun, mercury, venus, earth, moon, mars, jupiter, callisto, europa, ganymede, io, saturn }; ResolveMassiveBodyParents(); _gravitationalBodies = new List <IGravitationalBody> { _sun, mercury, venus, earth, moon, mars, jupiter, callisto, europa, ganymede, io, saturn }; _spaceCraftManager = new SpaceCraftManager(_gravitationalBodies); _structures = new List <StructureBase>(); MissionConfig primaryMission = MissionConfig.Load(ProfilePaths[0]); _originTime = primaryMission.GetLaunchDate(); UpdateLoadingPercentage(20); OrbitHelper.SimulateToTime(_massiveBodies, _originTime, 300, UpdateLoadingPercentage); UpdateLoadingPercentage(80); // Load missions for (int i = 0; i < ProfilePaths.Count; i++) { MissionConfig missionConfig = MissionConfig.Load(ProfilePaths[i]); if (missionConfig.ClockDelay > _clockDelay) { _clockDelay = missionConfig.ClockDelay; } IMassiveBody targetPlanet = LocatePlanet(missionConfig.ParentPlanet); // Get the launch angle relative to the sun for the given time at the origin // and offset each vehicle by a certain amount on the surface double launchAngle = targetPlanet.GetSurfaceAngle(_originTime, _sun) + i * 0.00002; _spaceCraftManager.Add(SpacecraftFactory.BuildSpaceCraft(targetPlanet, launchAngle, missionConfig, ProfilePaths[i])); _structures.AddRange(StructureFactory.Load(targetPlanet, launchAngle, ProfilePaths[i])); } _spaceCraftManager.Initialize(_eventManager, _clockDelay); // Target the spacecraft _targetIndex = _gravitationalBodies.IndexOf(_spaceCraftManager.First); _spaceCraftManager.ResolveGravitionalParents(_massiveBodies); UpdateLoadingPercentage(90); }