diff --git a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs index e34a3cd4..e7adae31 100644 --- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs +++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs @@ -122,8 +122,19 @@ static ReadoutLibrary() readouts.Add(new ImpactBiome()); // Vessel - readouts.Add(new Name()); - readouts.Add(new DeltaVStaged()); + readouts.Add(new Name()); + readouts.Add(new DecelerationDeltaV()); + readouts.Add(new DecelerationTime()); + readouts.Add(new DecelerationDistanceTotal()); + readouts.Add(new DecelerationDistanceHorizontal()); + readouts.Add(new DecelerationDistanceVertical()); + readouts.Add(new DecelerationAltitudeOverGround()); + readouts.Add(new DecelerationAltitude()); + readouts.Add(new DecelerationBiome()); + readouts.Add(new DecelerationLatitude()); + readouts.Add(new DecelerationLongitude()); + readouts.Add(new DecelerationSlope()); + readouts.Add(new DeltaVStaged()); readouts.Add(new DeltaVCurrent()); readouts.Add(new DeltaVTotal()); readouts.Add(new DeltaVCurrentTotal()); diff --git a/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs b/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs index 2bf4c4b3..1f315061 100644 --- a/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs +++ b/KerbalEngineer/Flight/Readouts/Surface/Longitude.cs @@ -35,7 +35,7 @@ public Longitude() public override void Draw(SectionModule section) { double angle = AngleHelper.Clamp180(FlightGlobals.ship_longitude); - DrawLine(Units.ToAngleDMS(angle) + (angle < 0.0 ? "W" : " E"), section.IsHud); + DrawLine(Units.ToAngleDMS(angle) + (angle < 0.0 ? " W" : " E"), section.IsHud); } } } \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitude.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitude.cs new file mode 100644 index 00000000..f810cf9f --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitude.cs @@ -0,0 +1,69 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationAltitude : ReadoutModule + { + #region Constructors + + public DecelerationAltitude() + { + this.Name = "Decel. Point: Alt. Terrain"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the terrain altitude/elevation at the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine(DecelerationProcessor.Altitude.ToDistance(), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitudeOverGround.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitudeOverGround.cs new file mode 100644 index 00000000..c0a98524 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationAltitudeOverGround.cs @@ -0,0 +1,69 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationAltitudeOverGround : ReadoutModule + { + #region Constructors + + public DecelerationAltitudeOverGround() + { + this.Name = "Decel. Point: Alt. Remaining"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the remaining altitude over the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine(DecelerationProcessor.AltitudeOverGround.ToDistance(), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationBiome.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationBiome.cs new file mode 100644 index 00000000..c92121e7 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationBiome.cs @@ -0,0 +1,64 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationBiome : ReadoutModule + { + #region Constructors + + public DecelerationBiome() + { + this.Name = "Decel. Point: Biome"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the biome at the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (DecelerationProcessor.ShowDetails) + { + this.DrawLine(DecelerationProcessor.Biome, section.IsHud); + } + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDeltaV.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDeltaV.cs new file mode 100644 index 00000000..64976fe5 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDeltaV.cs @@ -0,0 +1,69 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationDeltaV : ReadoutModule + { + #region Constructors + + public DecelerationDeltaV() + { + this.Name = "Decel. Burn: deltaV"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Total change in velocity to kill all surface velocity including potential velocity gained trough freefall."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine("Decel. Burn: deltaV", DecelerationProcessor.DecelerationDeltaV.ToSpeed() + " (" + (DecelerationProcessor.HasDeltaV ? "S" + DecelerationProcessor.FinalStage : "X") + ")", section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceHorizontal.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceHorizontal.cs new file mode 100644 index 00000000..d0f99b07 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceHorizontal.cs @@ -0,0 +1,67 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationDistanceHorizontal : ReadoutModule + { + #region Constructors + + public DecelerationDistanceHorizontal() + { + this.Name = "Decel. Burn: Horiz. Dist."; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Horizontal distance covered during Deceleration Burn."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine(DecelerationProcessor.HorizontalDistance.ToDistance(), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceTotal.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceTotal.cs new file mode 100644 index 00000000..397982af --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceTotal.cs @@ -0,0 +1,67 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationDistanceTotal : ReadoutModule + { + #region Constructors + + public DecelerationDistanceTotal() + { + this.Name = "Decel. Burn: Total Dist."; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Total distance covered during Deceleration Burn."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine(DecelerationProcessor.TotalDistance.ToDistance(), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceVertical.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceVertical.cs new file mode 100644 index 00000000..71ef99f8 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationDistanceVertical.cs @@ -0,0 +1,67 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationDistanceVertical : ReadoutModule + { + #region Constructors + + public DecelerationDistanceVertical() + { + this.Name = "Decel. Burn: Vert. Dist."; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Vertical distance covered during Deceleration Burn."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine(DecelerationProcessor.VerticalDistance.ToDistance(), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLatitude.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLatitude.cs new file mode 100644 index 00000000..5eb977cb --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLatitude.cs @@ -0,0 +1,66 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; +using KerbalEngineer.Helpers; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationLatitude : ReadoutModule + { + #region Constructors + + public DecelerationLatitude() + { + this.Name = "Decel. Point: Latitude"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the latitude at the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (DecelerationProcessor.ShowDetails) + { + this.DrawLine(Units.ToAngleDMS(DecelerationProcessor.Latitude) + (DecelerationProcessor.Latitude < 0.0 ? " S" : " N"), section.IsHud); + } + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLongditude.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLongditude.cs new file mode 100644 index 00000000..10a4d576 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationLongditude.cs @@ -0,0 +1,67 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Sections; +using KerbalEngineer.Helpers; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationLongitude : ReadoutModule + { + #region Constructors + + public DecelerationLongitude() + { + this.Name = "Decel. Point: Longditude"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the longditude at the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (DecelerationProcessor.ShowDetails) + { + double angle = AngleHelper.Clamp180(DecelerationProcessor.Longitude); + DrawLine(Units.ToAngleDMS(angle) + (angle < 0.0 ? " W" : " E"), section.IsHud); + } + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationProcessor.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationProcessor.cs new file mode 100644 index 00000000..58fff937 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationProcessor.cs @@ -0,0 +1,279 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Extensions; +using KerbalEngineer.Flight.Readouts.Vessel; + +using UnityEngine; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + using Helpers; + using System; + + // Shamelessly Stolen From Maneuver Node Processor by Harry Young + + public class DecelerationProcessor : IUpdatable, IUpdateRequest + { + #region Properties + + private static readonly DecelerationProcessor instance = new DecelerationProcessor(); + + // Burn Based Information + public static double DecelerationTime { get; private set; } + public static double DecelerationDeltaV { get; private set; } + public static double HorizontalDistance { get; private set; } + public static double VerticalDistance { get; private set; } + public static double TotalDistance { get; private set; } + // Internal Calculation Steps + private static double ProgradeDeltaV; + private static double RadialDeltaV; + private double m_Gravity; + private double m_RadarAltitude; + + // Additional DeltaV Information + public static int FinalStage { get; private set; } + public static double AvailableDeltaV { get; private set; } + public static bool HasDeltaV { get; private set; } + + // Landing Point Readouts + public static double Altitude { get; private set; } + public static string Biome { get; private set; } + public static double Latitude { get; private set; } + public static double Longitude { get; private set; } + public static double AltitudeOverGround { get; private set; } + public static string Slope { get; private set; } + // Internal Calculation Steps + private double impactAltitude; + private double impactLatitude; + private double impactLongitude; + private Quaternion surfaceRotation; + + // Execution Info + public static bool ShowDetails { get; set; } + public bool UpdateRequested { get; set; } + + #endregion + + #region Methods: public + + public static void RequestUpdate() + { + instance.UpdateRequested = true; + SimulationProcessor.RequestUpdate(); + } + + public static void Reset() + { + FlightEngineerCore.Instance.AddUpdatable(SimulationProcessor.Instance); + FlightEngineerCore.Instance.AddUpdatable(instance); + } + + public void Update() + { + //Check Background Logistics + if (FlightGlobals.currentMainBody == null || FlightGlobals.ActiveVessel == null || SimulationProcessor.LastStage == null || !SimulationProcessor.ShowDetails) + { + ShowDetails = false; + return; + } + // Check if we are actually moving + if (ScienceUtil.GetExperimentSituation(FlightGlobals.ActiveVessel) == ExperimentSituations.SrfLanded || ScienceUtil.GetExperimentSituation(FlightGlobals.ActiveVessel) == ExperimentSituations.SrfSplashed) + { + ShowDetails = false; + return; + } + + var dtime = 0.0; + + #region Burn Calculations + + // Calculate Required DeltaV and Required Parameters + m_Gravity = FlightGlobals.currentMainBody.gravParameter / Math.Pow(FlightGlobals.currentMainBody.Radius, 2.0); + m_RadarAltitude = FlightGlobals.ActiveVessel.terrainAltitude > 0.0 + ? FlightGlobals.ship_altitude - FlightGlobals.ActiveVessel.terrainAltitude + : FlightGlobals.ship_altitude; + ProgradeDeltaV = FlightGlobals.ActiveVessel.horizontalSrfSpeed; + RadialDeltaV = Math.Sqrt((2 * m_Gravity * m_RadarAltitude) + Math.Pow(FlightGlobals.ship_verticalSpeed, 2.0)); + DecelerationDeltaV = Math.Sqrt(Math.Pow(ProgradeDeltaV, 2.0)+Math.Pow(RadialDeltaV, 2.0)); + + // Get Burn Time + HasDeltaV = GetSuicideBurnTime(DecelerationDeltaV, ref dtime); + DecelerationTime = dtime; + + // Get Distance Traveled during Burn. Since we kill velocity I can assume average Velocity over burn. + HorizontalDistance = 0.5 * ProgradeDeltaV * DecelerationTime; + VerticalDistance = 0.5 * RadialDeltaV * DecelerationTime; + TotalDistance = 0.5 * DecelerationDeltaV * DecelerationTime; + + #endregion + + #region Landing Point Calculations + + // I now know my horizontal Distance and I know my Heading, so I can calculate a Landing Point, get it's slope and Altitude and from that predict the radar altitude after the burn. + if (FlightGlobals.ActiveVessel.mainBody.pqsController != null) + { + //do impact site calculations, special thanks to Muddr for Pointing me to http://www.movable-type.co.uk/scripts/latlong.html + surfaceRotation = GetSurfaceRotation(); + var incl = surfaceRotation.eulerAngles.y; + var currentlat = FlightGlobals.ActiveVessel.latitude; + var currentlon = FlightGlobals.ActiveVessel.longitude; + var angdst = 360 * HorizontalDistance / (2 * Math.PI * FlightGlobals.currentMainBody.Radius); + var bodyrot = 360 * DecelerationTime / FlightGlobals.ActiveVessel.mainBody.rotationPeriod; + + impactLatitude = currentlat + Math.Sin(incl) * angdst; + impactLongitude = currentlon + Math.Cos(incl) * angdst; + + //calculate the actual altitude of the impact site + //altitude for long/lat code stolen from some ISA MapSat forum post; who knows why this works, but it seems to. + var rad = QuaternionD.AngleAxis(this.impactLongitude, Vector3d.down) * QuaternionD.AngleAxis(this.impactLatitude, Vector3d.forward) * Vector3d.right; + this.impactAltitude = FlightGlobals.ActiveVessel.mainBody.pqsController.GetSurfaceHeight(rad) - FlightGlobals.ActiveVessel.mainBody.pqsController.radius; + if ((this.impactAltitude < 0) && FlightGlobals.ActiveVessel.mainBody.ocean) + { + this.impactAltitude = 0; + } + } + + // Set accessable properties. + Longitude = this.impactLongitude; + Latitude = this.impactLatitude; + Altitude = this.impactAltitude; + Slope = GetSlopeAngleAndHeadingLanding(FlightGlobals.currentMainBody.GetRelSurfacePosition(impactLatitude, impactLongitude, impactAltitude)); + AltitudeOverGround = FlightGlobals.ship_altitude - Altitude - VerticalDistance; + Biome = ScienceUtil.GetExperimentBiome(FlightGlobals.ActiveVessel.mainBody, this.impactLatitude, this.impactLongitude); + + #endregion + + ShowDetails = true; + + } + + #endregion + + #region Methods: private Additional Calculations + + //Suicide Burn time + private static bool GetSuicideBurnTime(double deltaV, ref double burnTime) + { + for (var i = SimulationProcessor.Stages.Length - 1; i > -1; i--) + { + var stage = SimulationProcessor.Stages[i]; + var stageDeltaV = stage.deltaV; + var startMass = stage.totalMass; + + //ProcessStageDrain + if (deltaV <= Double.Epsilon) + { + break; + } + if (stageDeltaV <= Double.Epsilon) + { + continue; + } + + FinalStage = i; + + double deltaVDrain = deltaV.Clamp(0.0, stageDeltaV); + + var exhaustVelocity = stage.isp * Units.GRAVITY; + var flowRate = stage.thrust / exhaustVelocity; + var endMass = Math.Exp(Math.Log(startMass) - deltaVDrain / exhaustVelocity); + var deltaMass = (startMass - endMass) * Math.Exp(-(deltaVDrain * 0.001) / exhaustVelocity); + burnTime += deltaMass / flowRate; + + deltaV -= deltaVDrain; + stageDeltaV -= deltaVDrain; + startMass -= deltaMass; + } + return deltaV <= Double.Epsilon; + } + + // Helper to get locas Surface Rotation, Required to get Heading, Taken From attitudeprocessor + private Quaternion GetSurfaceRotation() + { + // This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation. + var centreOfMass = FlightGlobals.ActiveVessel.CoMD; + var up = (centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized; + var north = Vector3.ProjectOnPlane((FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - centreOfMass, up).normalized; + + return Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(north, up)); + } + + // Slope at landing Point + private string GetSlopeAngleAndHeadingLanding(Vector3d LandingPoint) + { + try + { + var result = "--° @ ---°"; + var mainBody = FlightGlobals.ActiveVessel.mainBody; + var rad = (LandingPoint - mainBody.position).normalized; + RaycastHit hit; + if (Physics.Raycast(LandingPoint, -rad, out hit, Mathf.Infinity, 1 << 15)) // Just "Local Scenery" please + { + var norm = hit.normal; + norm = norm.normalized; + var raddotnorm = Vector3d.Dot(rad, norm); + if (raddotnorm > 1.0) + { + raddotnorm = 1.0; + } + else if (raddotnorm < 0.0) + { + raddotnorm = 0.0; + } + var slope = Math.Acos(raddotnorm) * 180 / Math.PI; + result = Units.ToAngle(slope, 1); + if (slope < 0.05) + { + result += " @ ---°"; + } + else + { + var side = Vector3d.Cross(rad, norm).normalized; + var east = Vector3d.Cross(rad, Vector3d.up).normalized; + var north = Vector3d.Cross(rad, east).normalized; + var sidedoteast = Vector3d.Dot(side, east); + var direction = Math.Acos(sidedoteast) * 180 / Math.PI; + var sidedotnorth = Vector3d.Dot(side, north); + if (sidedotnorth < 0) + { + direction = 360 - direction; + } + result += " @ " + Units.ToAngle(direction, 1); + } + } + + return result; + } + catch (Exception ex) + { + MyLogger.Exception(ex, "Surface->Slope->GetSlopeAngleAndHeading"); + return "--° @ ---°"; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationSlope.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationSlope.cs new file mode 100644 index 00000000..9b7cbf09 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationSlope.cs @@ -0,0 +1,69 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Flight.Sections; +using KerbalEngineer.Helpers; + +using UnityEngine; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationSlope : ReadoutModule + { + #region Constructors + + public DecelerationSlope() + { + this.Name = "Decel. Point: Slope"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Shows the slope at the point your Deceleration Burn will end."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + this.DrawLine(DecelerationProcessor.Slope, section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + } +} + #endregion \ No newline at end of file diff --git a/KerbalEngineer/Flight/Readouts/Vessel/DecelerationTime.cs b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationTime.cs new file mode 100644 index 00000000..4cdf5373 --- /dev/null +++ b/KerbalEngineer/Flight/Readouts/Vessel/DecelerationTime.cs @@ -0,0 +1,69 @@ +// +// Kerbal Engineer Redux +// +// Copyright (C) 2014 CYBUTEK +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#region Using Directives + +using System; + +using KerbalEngineer.Flight.Sections; +using KerbalEngineer.Helpers; + +#endregion + +namespace KerbalEngineer.Flight.Readouts.Vessel +{ + public class DecelerationTime : ReadoutModule + { + #region Constructors + + public DecelerationTime() + { + this.Name = "Decel. Burn: Duration"; + this.Category = ReadoutCategory.GetCategory("Vessel"); + this.HelpString = "Time required at 100% burn to kill all surface velocity including potential velocity gained trough free fall."; + this.IsDefault = false; + } + + #endregion + + #region Methods: public + + public override void Draw(SectionModule section) + { + if (!DecelerationProcessor.ShowDetails) + { + return; + } + + this.DrawLine("Decel. Burn: Duration", TimeFormatter.ConvertToString(DecelerationProcessor.DecelerationTime), section.IsHud); + } + + public override void Reset() + { + DecelerationProcessor.Reset(); + } + + public override void Update() + { + DecelerationProcessor.RequestUpdate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/KerbalEngineer/KerbalEngineer.csproj b/KerbalEngineer/KerbalEngineer.csproj index 84b8b30f..b16fb6b5 100644 --- a/KerbalEngineer/KerbalEngineer.csproj +++ b/KerbalEngineer/KerbalEngineer.csproj @@ -122,6 +122,15 @@ + + + + + + + + + @@ -245,6 +254,9 @@ + + + diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 00000000..a4721bbe Binary files /dev/null and b/UpgradeLog.htm differ