From: Andy Date: Thu, 21 Nov 2013 20:08:50 +0000 Subject: VOID_DataValue: Removed Invoke() call from ctor to avoid "object not set" exceptions. Added a toggle to DoGUIHorizontal(ushort) to disable the precision button. X-Git-Tag: 0.9.14 X-Git-Url: http://git.toad.homelinux.net/projects/VOID.git/commitdiff/d07c8e2 --- VOID_DataValue: Removed Invoke() call from ctor to avoid "object not set" exceptions. Added a toggle to DoGUIHorizontal(ushort) to disable the precision button. --- --- /dev/null +++ b/IntCollection.cs @@ -1,1 +1,83 @@ +// +// IntCollection.cs +// +// Author: +// toadicus <> +// +// Copyright (c) 2013 toadicus +// +// 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 . +using System; +namespace VOID +{ + public class IntCollection + { + public static implicit operator long(IntCollection c) + { + return c.collection; + } + + protected long mask; + + public long collection { get; protected set; } + public ushort maxCount { get; protected set; } + public ushort wordLength { get; protected set; } + + public IntCollection (ushort wordLength = 4, long initialCollection = 0) + { + this.collection = initialCollection; + this.wordLength = wordLength; + this.maxCount = (ushort)((sizeof(long) * 8 - 1) / wordLength); + this.mask = ((1 << this.wordLength) - 1); + } + + public ushort this[int idx] + { + get { + if (idx < 0) { + idx += this.maxCount; + } + + if (idx >= maxCount || idx < 0) { + throw new IndexOutOfRangeException (); + } + + idx *= wordLength; + + return (ushort)((this.collection & (this.mask << idx)) >> idx); + } + set { + Console.WriteLine (value); + if (idx < 0) { + idx += this.maxCount; + } + + if (idx >= maxCount || idx < 0) { + throw new IndexOutOfRangeException (); + } + + idx *= wordLength; + + long packvalue = value & this.mask; + Console.WriteLine (packvalue); + + this.collection &= ~(this.mask << idx); + this.collection |= packvalue << idx; + } + } + } +} + + --- a/Tools.cs +++ b/Tools.cs @@ -143,238 +143,247 @@ return string.Format("{0}° {1}", Math.Abs(v_lat).ToString(format), dir_lat); } - /////////////////////////////////////////////////////////////////////////////// - - //For MuMech_get_heading() - public class MuMech_MovingAverage - { - private double[] store; - private int storeSize; - private int nextIndex = 0; - - public double value - { - get - { - double tmp = 0; - foreach (double i in store) - { - tmp += i; - } - return tmp / storeSize; - } - set - { - store[nextIndex] = value; - nextIndex = (nextIndex + 1) % storeSize; - } - } - - public MuMech_MovingAverage(int size = 10, double startingValue = 0) - { - storeSize = size; - store = new double[size]; - force(startingValue); - } - - public void force(double newValue) - { - for (int i = 0; i < storeSize; i++) - { - store[i] = newValue; - } - } - - public static implicit operator double(MuMech_MovingAverage v) - { - return v.value; - } - - public override string ToString() - { - return value.ToString(); - } - - public string ToString(string format) - { - return value.ToString(format); - } - } - - //From http://svn.mumech.com/KSP/trunk/MuMechLib/VOID.vesselState.cs - public static double MuMech_get_heading(Vessel vessel) - { - Vector3d CoM = vessel.findWorldCenterOfMass(); - Vector3d up = (CoM - vessel.mainBody.position).normalized; - Vector3d north = Vector3d.Exclude(up, (vessel.mainBody.position + vessel.mainBody.transform.up * (float)vessel.mainBody.Radius) - CoM).normalized; - - Quaternion rotationSurface = Quaternion.LookRotation(north, up); - Quaternion rotationvesselSurface = Quaternion.Inverse(Quaternion.Euler(90, 0, 0) * Quaternion.Inverse(vessel.transform.rotation) * rotationSurface); - MuMech_MovingAverage vesselHeading = new MuMech_MovingAverage(); - vesselHeading.value = rotationvesselSurface.eulerAngles.y; - return vesselHeading.value * 10; // *10 by me - } - - //From http://svn.mumech.com/KSP/trunk/MuMechLib/MuUtils.cs - public static string MuMech_ToSI(double d) - { - int digits = 2; - double exponent = Math.Log10(Math.Abs(d)); - if (Math.Abs(d) >= 1) - { - switch ((int)Math.Floor(exponent)) - { - case 0: - case 1: - case 2: - return d.ToString("F" + digits); - case 3: - case 4: - case 5: - return (d / 1e3).ToString("F" + digits) + "k"; - case 6: - case 7: - case 8: - return (d / 1e6).ToString("F" + digits) + "M"; - case 9: - case 10: - case 11: - return (d / 1e9).ToString("F" + digits) + "G"; - case 12: - case 13: - case 14: - return (d / 1e12).ToString("F" + digits) + "T"; - case 15: - case 16: - case 17: - return (d / 1e15).ToString("F" + digits) + "P"; - case 18: - case 19: - case 20: - return (d / 1e18).ToString("F" + digits) + "E"; - case 21: - case 22: - case 23: - return (d / 1e21).ToString("F" + digits) + "Z"; - default: - return (d / 1e24).ToString("F" + digits) + "Y"; - } - } - else if (Math.Abs(d) > 0) - { - switch ((int)Math.Floor(exponent)) - { - case -1: - case -2: - case -3: - return (d * 1e3).ToString("F" + digits) + "m"; - case -4: - case -5: - case -6: - return (d * 1e6).ToString("F" + digits) + "μ"; - case -7: - case -8: - case -9: - return (d * 1e9).ToString("F" + digits) + "n"; - case -10: - case -11: - case -12: - return (d * 1e12).ToString("F" + digits) + "p"; - case -13: - case -14: - case -15: - return (d * 1e15).ToString("F" + digits) + "f"; - case -16: - case -17: - case -18: - return (d * 1e18).ToString("F" + digits) + "a"; - case -19: - case -20: - case -21: - return (d * 1e21).ToString("F" + digits) + "z"; - default: - return (d * 1e24).ToString("F" + digits) + "y"; - } - } - else - { - return "0"; - } - } - - public static string ConvertInterval(double seconds) - { - string format_1 = "{0:D1}y {1:D1}d {2:D2}h {3:D2}m {4:D2}.{5:D1}s"; - string format_2 = "{0:D1}d {1:D2}h {2:D2}m {3:D2}.{4:D1}s"; - string format_3 = "{0:D2}h {1:D2}m {2:D2}.{3:D1}s"; + /////////////////////////////////////////////////////////////////////////////// + + //For MuMech_get_heading() + public class MuMech_MovingAverage + { + private double[] store; + private int storeSize; + private int nextIndex = 0; + + public double value + { + get + { + double tmp = 0; + foreach (double i in store) + { + tmp += i; + } + return tmp / storeSize; + } + set + { + store[nextIndex] = value; + nextIndex = (nextIndex + 1) % storeSize; + } + } + + public MuMech_MovingAverage(int size = 10, double startingValue = 0) + { + storeSize = size; + store = new double[size]; + force(startingValue); + } + + public void force(double newValue) + { + for (int i = 0; i < storeSize; i++) + { + store[i] = newValue; + } + } + + public static implicit operator double(MuMech_MovingAverage v) + { + return v.value; + } + + public override string ToString() + { + return value.ToString(); + } + + public string ToString(string format) + { + return value.ToString(format); + } + } + + //From http://svn.mumech.com/KSP/trunk/MuMechLib/VOID.vesselState.cs + public static double MuMech_get_heading(Vessel vessel) + { + Vector3d CoM = vessel.findWorldCenterOfMass(); + Vector3d up = (CoM - vessel.mainBody.position).normalized; + Vector3d north = Vector3d.Exclude( + up, + (vessel.mainBody.position + + vessel.mainBody.transform.up * (float)vessel.mainBody.Radius + ) - CoM).normalized; + + Quaternion rotationSurface = Quaternion.LookRotation(north, up); + Quaternion rotationvesselSurface = Quaternion.Inverse( + Quaternion.Euler(90, 0, 0) * + Quaternion.Inverse(vessel.transform.rotation) * + rotationSurface); + + return rotationvesselSurface.eulerAngles.y; + } + + //From http://svn.mumech.com/KSP/trunk/MuMechLib/MuUtils.cs + public static string MuMech_ToSI( + double d, int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue + ) + { + float exponent = (float)Math.Log10(Math.Abs(d)); + exponent = Mathf.Clamp(exponent, (float)MinMagnitude, (float)MaxMagnitude); + + if (exponent >= 0) + { + switch ((int)Math.Floor(exponent)) + { + case 0: + case 1: + case 2: + return d.ToString("F" + digits); + case 3: + case 4: + case 5: + return (d / 1e3).ToString("F" + digits) + "k"; + case 6: + case 7: + case 8: + return (d / 1e6).ToString("F" + digits) + "M"; + case 9: + case 10: + case 11: + return (d / 1e9).ToString("F" + digits) + "G"; + case 12: + case 13: + case 14: + return (d / 1e12).ToString("F" + digits) + "T"; + case 15: + case 16: + case 17: + return (d / 1e15).ToString("F" + digits) + "P"; + case 18: + case 19: + case 20: + return (d / 1e18).ToString("F" + digits) + "E"; + case 21: + case 22: + case 23: + return (d / 1e21).ToString("F" + digits) + "Z"; + default: + return (d / 1e24).ToString("F" + digits) + "Y"; + } + } + else if (exponent < 0) + { + switch ((int)Math.Floor(exponent)) + { + case -1: + case -2: + case -3: + return (d * 1e3).ToString("F" + digits) + "m"; + case -4: + case -5: + case -6: + return (d * 1e6).ToString("F" + digits) + "μ"; + case -7: + case -8: + case -9: + return (d * 1e9).ToString("F" + digits) + "n"; + case -10: + case -11: + case -12: + return (d * 1e12).ToString("F" + digits) + "p"; + case -13: + case -14: + case -15: + return (d * 1e15).ToString("F" + digits) + "f"; + case -16: + case -17: + case -18: + return (d * 1e18).ToString("F" + digits) + "a"; + case -19: + case -20: + case -21: + return (d * 1e21).ToString("F" + digits) + "z"; + default: + return (d * 1e24).ToString("F" + digits) + "y"; + } + } + else + { + return "0"; + } + } + + public static string ConvertInterval(double seconds) + { + string format_1 = "{0:D1}y {1:D1}d {2:D2}h {3:D2}m {4:D2}.{5:D1}s"; + string format_2 = "{0:D1}d {1:D2}h {2:D2}m {3:D2}.{4:D1}s"; + string format_3 = "{0:D2}h {1:D2}m {2:D2}.{3:D1}s"; TimeSpan interval; try { - interval = TimeSpan.FromSeconds(seconds); + interval = TimeSpan.FromSeconds(seconds); } catch (OverflowException) { return "NaN"; } - int years = interval.Days / 365; - - string output; - if (years > 0) - { - output = string.Format(format_1, - years, - interval.Days - (years * 365), // subtract years * 365 for accurate day count - interval.Hours, - interval.Minutes, - interval.Seconds, - interval.Milliseconds.ToString().Substring(0, 1)); - } - else if (interval.Days > 0) - { - output = string.Format(format_2, - interval.Days, - interval.Hours, - interval.Minutes, - interval.Seconds, - interval.Milliseconds.ToString().Substring(0, 1)); - } - else - { - output = string.Format(format_3, - interval.Hours, - interval.Minutes, - interval.Seconds, - interval.Milliseconds.ToString().Substring(0, 1)); - } - return output; - } - - public static string UppercaseFirst(string s) - { - if (string.IsNullOrEmpty(s)) - { - return string.Empty; - } - char[] a = s.ToCharArray(); - a[0] = char.ToUpper(a[0]); - return new string(a); - } - - //transfer angles - - public static double Nivvy_CalcTransferPhaseAngle(double r_current, double r_target, double grav_param) - { - double T_target = (2 * Math.PI) * Math.Sqrt(Math.Pow((r_target / 1000), 3) / (grav_param / 1000000000)); - double T_transfer = (2 * Math.PI) * Math.Sqrt(Math.Pow((((r_target / 1000) + (r_current / 1000)) / 2), 3) / (grav_param / 1000000000)); - return 360 * (0.5 - (T_transfer / (2 * T_target))); - } - - public static double Younata_DeltaVToGetToOtherBody(double mu, double r1, double r2) - { - /* + int years = interval.Days / 365; + + string output; + if (years > 0) + { + output = string.Format(format_1, + years, + interval.Days - (years * 365), // subtract years * 365 for accurate day count + interval.Hours, + interval.Minutes, + interval.Seconds, + interval.Milliseconds.ToString().Substring(0, 1)); + } + else if (interval.Days > 0) + { + output = string.Format(format_2, + interval.Days, + interval.Hours, + interval.Minutes, + interval.Seconds, + interval.Milliseconds.ToString().Substring(0, 1)); + } + else + { + output = string.Format(format_3, + interval.Hours, + interval.Minutes, + interval.Seconds, + interval.Milliseconds.ToString().Substring(0, 1)); + } + return output; + } + + public static string UppercaseFirst(string s) + { + if (string.IsNullOrEmpty(s)) + { + return string.Empty; + } + char[] a = s.ToCharArray(); + a[0] = char.ToUpper(a[0]); + return new string(a); + } + + //transfer angles + + public static double Nivvy_CalcTransferPhaseAngle(double r_current, double r_target, double grav_param) + { + double T_target = (2 * Math.PI) * Math.Sqrt(Math.Pow((r_target / 1000), 3) / (grav_param / 1000000000)); + double T_transfer = (2 * Math.PI) * Math.Sqrt(Math.Pow((((r_target / 1000) + (r_current / 1000)) / 2), 3) / (grav_param / 1000000000)); + return 360 * (0.5 - (T_transfer / (2 * T_target))); + } + + public static double Younata_DeltaVToGetToOtherBody(double mu, double r1, double r2) + { + /* def deltaVToGetToOtherBody(mu, r1, r2): # mu = gravity param of common orbiting body of r1 and r2 # (e.g. for mun to minmus, mu is kerbin's gravity param @@ -387,16 +396,16 @@ mult = sr1r2 - 1 return sur1 * mult */ - double sur1, sr1r2, mult; - sur1 = Math.Sqrt(mu / r1); - sr1r2 = Math.Sqrt((2 * r2) / (r1 + r2)); - mult = sr1r2 - 1; - return sur1 * mult; - } - - public static double Younata_DeltaVToExitSOI(double mu, double r1, double r2, double v) - { - /* + double sur1, sr1r2, mult; + sur1 = Math.Sqrt(mu / r1); + sr1r2 = Math.Sqrt((2 * r2) / (r1 + r2)); + mult = sr1r2 - 1; + return sur1 * mult; + } + + public static double Younata_DeltaVToExitSOI(double mu, double r1, double r2, double v) + { + /* def deltaVToExitSOI(mu, r1, r2, v): # mu = gravity param of current body # r1 = current orbit radius @@ -407,15 +416,15 @@ r = r1*r2 return math.sqrt(bar / r) */ - double foo = r2 * Math.Pow(v, 2) - 2 * mu; - double bar = r1 * foo + (2 * r2 * mu); - double r = r1 * r2; - return Math.Sqrt(bar / r); - } - - public static double Younata_TransferBurnPoint(double r, double v, double angle, double mu) - { - /* + double foo = r2 * Math.Pow(v, 2) - 2 * mu; + double bar = r1 * foo + (2 * r2 * mu); + double r = r1 * r2; + return Math.Sqrt(bar / r); + } + + public static double Younata_TransferBurnPoint(double r, double v, double angle, double mu) + { + /* def transferBurnPoint(r, v, angle, mu): # r = parking orbit radius # v = ejection velocity @@ -428,65 +437,65 @@ degrees = theta * (180.0 / math.pi) return 180 - degrees */ - double epsilon, h, ee, theta, degrees; - epsilon = (Math.Pow(v, 2) / 2) - (mu / r); - h = r * v * Math.Sin(angle); - ee = Math.Sqrt(1 + ((2 * epsilon * Math.Pow(h, 2)) / Math.Pow(mu, 2))); - theta = Math.Acos(1.0 / ee); - degrees = theta * (180.0 / Math.PI); - return 180 - degrees; - // returns the ejection angle - } - - public static double Adammada_CurrrentPhaseAngle(double body_LAN, double body_orbitPct, double origin_LAN, double origin_orbitPct) - { - double angle = (body_LAN / 360 + body_orbitPct) - (origin_LAN / 360 + origin_orbitPct); - if (angle > 1) angle = angle - 1; - if (angle < 0) angle = angle + 1; - if (angle > 0.5) angle = angle - 1; - angle = angle * 360; - return angle; - } - - public static double Adammada_CurrentEjectionAngle(double vessel_long, double origin_rotAngle, double origin_LAN, double origin_orbitPct) - { - //double eangle = ((FlightGlobals.ActiveVOID.vessel.longitude + orbiting.rotationAngle) - (orbiting.orbit.LAN / 360 + orbiting.orbit.orbitPercent) * 360); - double eangle = ((vessel_long + origin_rotAngle) - (origin_LAN / 360 + origin_orbitPct) * 360); - - while (eangle < 0) eangle = eangle + 360; - while (eangle > 360) eangle = eangle - 360; - if (eangle < 270) eangle = 90 - eangle; - else eangle = 450 - eangle; - return eangle; - } - - public static double mrenigma03_calcphase(Vessel vessel, CelestialBody target) //calculates phase angle between the current body and target body - { - Vector3d vecthis = new Vector3d(); - Vector3d vectarget = new Vector3d(); - vectarget = target.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); - - if ((vessel.mainBody.name == "Sun") || (vessel.mainBody.referenceBody.referenceBody.name == "Sun")) - { - vecthis = vessel.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); - } - else - { - vecthis = vessel.mainBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); - } - - vecthis = Vector3d.Project(new Vector3d(vecthis.x, 0, vecthis.z), vecthis); - vectarget = Vector3d.Project(new Vector3d(vectarget.x, 0, vectarget.z), vectarget); - - Vector3d prograde = new Vector3d(); - prograde = Quaternion.AngleAxis(90, Vector3d.forward) * vecthis; - - double phase = Vector3d.Angle(vecthis, vectarget); - - if (Vector3d.Angle(prograde, vectarget) > 90) phase = 360 - phase; - - return (phase + 360) % 360; - } + double epsilon, h, ee, theta, degrees; + epsilon = (Math.Pow(v, 2) / 2) - (mu / r); + h = r * v * Math.Sin(angle); + ee = Math.Sqrt(1 + ((2 * epsilon * Math.Pow(h, 2)) / Math.Pow(mu, 2))); + theta = Math.Acos(1.0 / ee); + degrees = theta * (180.0 / Math.PI); + return 180 - degrees; + // returns the ejection angle + } + + public static double Adammada_CurrrentPhaseAngle(double body_LAN, double body_orbitPct, double origin_LAN, double origin_orbitPct) + { + double angle = (body_LAN / 360 + body_orbitPct) - (origin_LAN / 360 + origin_orbitPct); + if (angle > 1) angle = angle - 1; + if (angle < 0) angle = angle + 1; + if (angle > 0.5) angle = angle - 1; + angle = angle * 360; + return angle; + } + + public static double Adammada_CurrentEjectionAngle(double vessel_long, double origin_rotAngle, double origin_LAN, double origin_orbitPct) + { + //double eangle = ((FlightGlobals.ActiveVOID.vessel.longitude + orbiting.rotationAngle) - (orbiting.orbit.LAN / 360 + orbiting.orbit.orbitPercent) * 360); + double eangle = ((vessel_long + origin_rotAngle) - (origin_LAN / 360 + origin_orbitPct) * 360); + + while (eangle < 0) eangle = eangle + 360; + while (eangle > 360) eangle = eangle - 360; + if (eangle < 270) eangle = 90 - eangle; + else eangle = 450 - eangle; + return eangle; + } + + public static double mrenigma03_calcphase(Vessel vessel, CelestialBody target) //calculates phase angle between the current body and target body + { + Vector3d vecthis = new Vector3d(); + Vector3d vectarget = new Vector3d(); + vectarget = target.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); + + if ((vessel.mainBody.name == "Sun") || (vessel.mainBody.referenceBody.referenceBody.name == "Sun")) + { + vecthis = vessel.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); + } + else + { + vecthis = vessel.mainBody.orbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()); + } + + vecthis = Vector3d.Project(new Vector3d(vecthis.x, 0, vecthis.z), vecthis); + vectarget = Vector3d.Project(new Vector3d(vectarget.x, 0, vectarget.z), vectarget); + + Vector3d prograde = new Vector3d(); + prograde = Quaternion.AngleAxis(90, Vector3d.forward) * vecthis; + + double phase = Vector3d.Angle(vecthis, vectarget); + + if (Vector3d.Angle(prograde, vectarget) > 90) phase = 360 - phase; + + return (phase + 360) % 360; + } public static double FixAngleDomain(double Angle, bool Degrees = false) { @@ -509,55 +518,56 @@ return FixAngleDomain (Angle, true); } - public static double adjustCurrPhaseAngle(double transfer_angle, double curr_phase) - { - if (transfer_angle < 0) - { - if (curr_phase > 0) return (-1 * (360 - curr_phase)); - else if (curr_phase < 0) return curr_phase; - } - else if (transfer_angle > 0) - { - if (curr_phase > 0) return curr_phase; - else if (curr_phase < 0) return (360 + curr_phase); - } - return curr_phase; - } - - public static double adjust_current_ejection_angle(double curr_ejection) - { - //curr_ejection WILL need to be adjusted once for all transfers as it returns values ranging -180 to 180 - // need 0-360 instead - // - // ie i have -17 in the screenshot - // need it to show 343 - // - // do this - // - // if < 0, add curr to 360 // 360 + (-17) = 343 - // else its good as it is - - if (curr_ejection < 0) return 360 + curr_ejection; - else return curr_ejection; - - } - - public static double adjust_transfer_ejection_angle(double trans_ejection, double trans_phase) - { - // if transfer_phase_angle < 0 its a lower transfer - //180 + curr_ejection - // else if transfer_phase_angle > 0 its good as it is - - if (trans_phase < 0) return 180 + trans_ejection; - else return trans_ejection; - - } - - public static double TrueAltitude(Vessel vessel) + public static double adjustCurrPhaseAngle(double transfer_angle, double curr_phase) + { + if (transfer_angle < 0) + { + if (curr_phase > 0) return (-1 * (360 - curr_phase)); + else if (curr_phase < 0) return curr_phase; + } + else if (transfer_angle > 0) + { + if (curr_phase > 0) return curr_phase; + else if (curr_phase < 0) return (360 + curr_phase); + } + return curr_phase; + } + + public static double adjust_current_ejection_angle(double curr_ejection) + { + //curr_ejection WILL need to be adjusted once for all transfers as it returns values ranging -180 to 180 + // need 0-360 instead + // + // ie i have -17 in the screenshot + // need it to show 343 + // + // do this + // + // if < 0, add curr to 360 // 360 + (-17) = 343 + // else its good as it is + + if (curr_ejection < 0) return 360 + curr_ejection; + else return curr_ejection; + + } + + public static double adjust_transfer_ejection_angle(double trans_ejection, double trans_phase) + { + // if transfer_phase_angle < 0 its a lower transfer + //180 + curr_ejection + // else if transfer_phase_angle > 0 its good as it is + + if (trans_phase < 0) return 180 + trans_ejection; + else return trans_ejection; + + } + + public static double TrueAltitude(Vessel vessel) { double trueAltitude = vessel.orbit.altitude - vessel.terrainAltitude; - // HACK: This assumes that on worlds with oceans, all water is fixed at 0 m, and water covers the whole surface at 0 m. + // HACK: This assumes that on worlds with oceans, all water is fixed at 0 m, + // and water covers the whole surface at 0 m. if (vessel.terrainAltitude < 0 && vessel.mainBody.ocean ) { trueAltitude = vessel.orbit.altitude; @@ -587,7 +597,7 @@ else return ""; } - + public static void display_transfer_angles_SUN2PLANET(CelestialBody body, Vessel vessel) { @@ -686,7 +696,137 @@ GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } - + + // This implementation is adapted from FARGUIUtils.ClampToScreen + public static Rect ClampRectToScreen(Rect window, int xMargin, int yMargin) + { + window.x = Mathf.Clamp (window.x, xMargin - window.width, Screen.width - xMargin); + window.y = Mathf.Clamp (window.y, yMargin - window.height, Screen.height - yMargin); + + return window; + } + + public static Rect ClampRectToScreen(Rect window, int Margin) + { + return ClampRectToScreen(window, Margin, Margin); + } + + public static Rect ClampRectToScreen(Rect window) + { + return ClampRectToScreen (window, 30); + } + + public static Vector2 ClampV2ToScreen(Vector2 vec, uint xMargin, uint yMargin) + { + vec.x = Mathf.Clamp (vec.x, xMargin, Screen.width - xMargin); + vec.y = Mathf.Clamp (vec.y, yMargin, Screen.height - yMargin); + + return vec; + } + + public static Vector2 ClampV2ToScreen(Vector2 vec, uint Margin) + { + return ClampV2ToScreen(vec, Margin, Margin); + } + + public static Vector2 ClampV2ToScreen(Vector2 vec) + { + return ClampV2ToScreen (vec, 15); + } + + // UNDONE: This seems messy. Can we clean it up? + public static Rect DockToWindow(Rect icon, Rect window) + { + // We can't set the x and y of the center point directly, so build a new vector. + Vector2 center = new Vector2 (); + + // If we are near the top or bottom of the screen... + if (window.yMax > Screen.height - icon.height || + window.yMin < icon.height + ) + { + // If we are in a corner... + if (window.xMax > Screen.width - icon.width || + window.xMin < icon.width + ) + { + // If it is a top corner, put the icon below the window. + if (window.yMax < Screen.height / 2) + { + center.y = window.yMax + icon.height / 2; + } + // If it is a bottom corner, put the icon above the window. + else + { + center.y = window.yMin - icon.height / 2; + } + } + // If we are not in a corner... + else + { + // If we are along the top edge, align the icon's top edge with the top edge of the window + if (window.yMax > Screen.height / 2) + { + center.y = window.yMax - icon.height / 2; + } + // If we are along the bottom edge, align the icon's bottom edge with the bottom edge of the window + else + { + center.y = window.yMin + icon.height / 2; + } + } + + // At the top or bottom, if we are towards the right, put the icon to the right of the window + if (window.center.x < Screen.width / 2) + { + center.x = window.xMin - icon.width / 2; + } + // At the top or bottom, if we are towards the left, put the icon to the left of the window + else + { + center.x = window.xMax + icon.width / 2; + } + + } + // If we are not along the top or bottom of the screen... + else + { + // By default, center the icon above the window + center.y = window.yMin - icon.height / 2; + center.x = window.center.x; + + // If we are along a side... + if (window.xMax > Screen.width - icon.width || + window.xMin < icon.width + ) + { + // UNDONE: I'm not sure I like the feel of this part. + // If we are along a side towards the bottom, put the icon below the window + if (window.center.y > Screen.height / 2) + { + center.y = window.yMax + icon.height / 2; + } + + // Along the left side, align the left edge of the icon with the left edge of the window. + if (window.xMax > Screen.width - icon.width) + { + center.x = window.xMax - icon.width / 2; + } + // Along the right side, align the right edge of the icon with the right edge of the window. + else if (window.xMin < icon.width) + { + center.x = window.xMin + icon.width / 2; + } + } + } + + // Assign the vector to the center of the rect. + icon.center = center; + + // Return the icon's position. + return icon; + } + private static ScreenMessage debugmsg = new ScreenMessage("", 2f, ScreenMessageStyle.UPPER_RIGHT); [System.Diagnostics.Conditional("DEBUG")] --- a/VOID.csproj +++ /dev/null @@ -1,92 +1,1 @@ - - - - Debug - x86 - 10.0.0 - 2.0 - {45ACC1CC-942C-4A66-BFC7-8BE375938B18} - Library - VOID - VOID - v3.5 - - - true - full - false - bin\Debug - DEBUG; TRACE - prompt - 4 - false - - - - - - - - true - bin\Release - prompt - 4 - false - TRACE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\..\Games\KSP_win\KSP_Data\Managed\Assembly-CSharp.dll - - - ..\..\..\Games\KSP_win\KSP_Data\Managed\UnityEngine.dll - - - ..\..\..\Games\KSP_win\KSP_Data\Managed\System.dll - - - - - {2FCF882B-0771-4649-8D04-81D7AA76A486} - Engineer.Extensions - - - {30FD6C0B-D36E-462F-B0FF-F0FAC9C666CF} - VesselSimulator - - - - - - - - - - - - + --- a/VOIDFlightMaster.cs +++ b/VOIDFlightMaster.cs @@ -46,16 +46,17 @@ public void Awake() { - Tools.PostDebugMessage ("VOIDLightMaster: Waking up."); + Tools.PostDebugMessage ("VOIDFlightMaster: Waking up."); this.Core = (VOID_Core)VOID_Core.Instance; - this.Core.StartGUI (); + this.Core.ResetGUI (); Tools.PostDebugMessage ("VOIDFlightMaster: Awake."); } public void Update() { - if (!HighLogic.LoadedSceneIsEditor) + if (!HighLogic.LoadedSceneIsFlight && this.Core != null) { + this.Core.SaveConfig (); this.Core = null; VOID_Core.Reset(); return; @@ -70,7 +71,8 @@ if (this.Core.vessel != null) { - SimManager.Instance.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2); + SimManager.Instance.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / + Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2); SimManager.Instance.TryStartSimulation(); } @@ -112,14 +114,15 @@ { Tools.PostDebugMessage ("VOIDEditorMaster: Waking up."); this.Core = VOID_EditorCore.Instance; - this.Core.StartGUI (); + this.Core.ResetGUI (); Tools.PostDebugMessage ("VOIDEditorMaster: Awake."); } public void Update() { - if (!HighLogic.LoadedSceneIsEditor) + if (!HighLogic.LoadedSceneIsEditor && this.Core != null) { + this.Core.SaveConfig (); this.Core = null; VOID_EditorCore.Reset(); return; --- a/VOID_CBInfoBrowser.cs +++ b/VOID_CBInfoBrowser.cs @@ -207,89 +207,89 @@ private void body_OP_show_orbital_info(CelestialBody body) { //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.ApA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(Tools.ConvertInterval(body.orbit.timeToAp), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.PeA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(Tools.ConvertInterval(body.orbit.timeToPe), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.semiMajorAxis / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(body.orbit.eccentricity.ToString("F4") + "", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(Tools.ConvertInterval(body.orbit.period), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(Tools.ConvertInterval(body.rotationPeriod), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.orbitalSpeed / 1000).ToString("F2") + "km/s", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.ApA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(Tools.ConvertInterval(body.orbit.timeToAp), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.PeA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(Tools.ConvertInterval(body.orbit.timeToPe), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.semiMajorAxis / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(body.orbit.eccentricity.ToString("F4") + "", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(Tools.ConvertInterval(body.orbit.period), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(Tools.ConvertInterval(body.rotationPeriod), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.orbitalSpeed / 1000).ToString("F2") + "km/s", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); // Toadicus edit: convert mean anomaly into degrees. - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.meanAnomaly * 180d / Math.PI).ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(body.orbit.trueAnomaly.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.meanAnomaly * 180d / Math.PI).ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(body.orbit.trueAnomaly.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); // Toadicus edit: convert eccentric anomaly into degrees. - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label((body.orbit.eccentricAnomaly * 180d / Math.PI).ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(body.orbit.inclination.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(body.orbit.LAN.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(body.orbit.argumentOfPeriapsis.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label((body.orbit.eccentricAnomaly * 180d / Math.PI).ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(body.orbit.inclination.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(body.orbit.LAN.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(body.orbit.argumentOfPeriapsis.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); else { string body_tidally_locked = "No"; if (body.tidallyLocked) body_tidally_locked = "Yes"; - GUILayout.Label(body_tidally_locked, VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(body_tidally_locked, VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); } //GUILayout.EndHorizontal(); } @@ -297,35 +297,35 @@ private void body_OP_show_physical_info(CelestialBody body) { //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label((body.Radius / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(((Math.Pow((body.Radius), 2) * 4 * Math.PI) / 1000).ToString("0.00e+00") + "km²", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label((body.Radius / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label(((Math.Pow((body.Radius), 2) * 4 * Math.PI) / 1000).ToString("0.00e+00") + "km²", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); // divide by 1000 to convert m to km - GUILayout.Label((((4d / 3) * Math.PI * Math.Pow(body.Radius, 3)) / 1000).ToString("0.00e+00") + "km³", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.Label(((4 / 3) * Math.PI * Math.Pow((vessel.mainBody.Radius / 1000), 3)).ToString(), txt_right, GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(body.Mass.ToString("0.00e+00") + "kg", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label((((4d / 3) * Math.PI * Math.Pow(body.Radius, 3)) / 1000).ToString("0.00e+00") + "km³", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.Label(((4 / 3) * Math.PI * Math.Pow((vessel.mainBody.Radius / 1000), 3)).ToString(), right, GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label(body.Mass.ToString("0.00e+00") + "kg", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); double p = body.Mass / (Math.Pow(body.Radius, 3) * (4d / 3) * Math.PI); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(p.ToString("##,#") + "kg/m³", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - if (body.bodyName == "Sun") GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - else GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(body.orbitingBodies.Count.ToString(), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(p.ToString("##,#") + "kg/m³", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + if (body.bodyName == "Sun") GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(Tools.MuMech_ToSI(body.sphereOfInfluence), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label(body.orbitingBodies.Count.ToString(), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //show # artificial satellites @@ -336,28 +336,28 @@ } //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(num_art_sats.ToString(), VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(num_art_sats.ToString(), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); double g_ASL = (VOID_Core.Constant_G * body.Mass) / Math.Pow(body.Radius, 2); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(Tools.MuMech_ToSI(g_ASL) + "m/s²", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); - //GUILayout.EndHorizontal(); - - //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("≈ " + Tools.MuMech_ToSI(body.maxAtmosphereAltitude) + "m", VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(Tools.MuMech_ToSI(g_ASL) + "m/s²", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + //GUILayout.EndHorizontal(); + + //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("≈ " + Tools.MuMech_ToSI(body.maxAtmosphereAltitude) + "m", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); string O2 = "No"; if (body.atmosphereContainsOxygen == true) O2 = "Yes"; - GUILayout.Label(O2, VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(O2, VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); //GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); string ocean = "No"; if (body.ocean == true) ocean = "Yes"; - GUILayout.Label(ocean, VOID_Core.Instance.LabelStyles["txt_right"], GUILayout.ExpandWidth(true)); + GUILayout.Label(ocean, VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); //GUILayout.EndHorizontal(); } } --- a/VOID_Core.cs +++ b/VOID_Core.cs @@ -68,7 +68,7 @@ * Fields * */ protected string VoidName = "VOID"; - protected string VoidVersion = "0.9.9"; + protected string VoidVersion = "0.9.13"; protected bool _factoryReset = false; @@ -120,6 +120,11 @@ [AVOID_SaveValue("resourceRate")] protected VOID_SaveValue resourceRate = 0.2f; + [AVOID_SaveValue("updatePeriod")] + protected VOID_SaveValue _updatePeriod = 1001f/15000f; + protected float _updateTimer = 0f; + protected string stringFrequency; + // Celestial Body Housekeeping protected List _allBodies = new List(); protected bool bodiesLoaded = false; @@ -130,8 +135,9 @@ public float saveTimer = 0; - protected string defaultSkin = "KSP window 2"; - protected VOID_SaveValue _skinIdx = int.MinValue; + [AVOID_SaveValue("defaultSkin")] + protected VOID_SaveValue defaultSkin = "KSP window 2"; + protected int _skinIdx = int.MinValue; protected List skin_list; protected string[] forbiddenSkins = { @@ -214,6 +220,22 @@ } } + public float updateTimer + { + get + { + return this._updateTimer; + } + } + + public double updatePeriod + { + get + { + return this._updatePeriod; + } + } + /* * Methods * */ @@ -246,6 +268,13 @@ )); foreach (var voidType in types) { + if (!HighLogic.LoadedSceneIsEditor && + typeof(IVOID_EditorModule).IsAssignableFrom(voidType) + ) + { + continue; + } + Tools.PostDebugMessage (string.Format ( "{0}: found Type {1}", this.GetType ().Name, @@ -287,19 +316,22 @@ )); } + protected void Preload_BeforeUpdate() + { + if (!this.bodiesLoaded) + { + this.LoadAllBodies(); + } + + if (!this.vesselTypesLoaded) + { + this.LoadVesselTypes(); + } + } + public void Update() { - this.saveTimer += Time.deltaTime; - - if (!this.bodiesLoaded) - { - this.LoadAllBodies(); - } - - if (!this.vesselTypesLoaded) - { - this.LoadVesselTypes(); - } + this.Preload_BeforeUpdate (); if (!this.guiRunning) { @@ -319,8 +351,8 @@ } if (module.guiRunning && !module.toggleActive || !this.togglePower || - !HighLogic.LoadedSceneIsFlight - || this.factoryReset + !HighLogic.LoadedSceneIsFlight || + this.factoryReset ) { module.StopGUI(); @@ -332,11 +364,8 @@ } } - if (this.saveTimer > 2f) - { - this.SaveConfig (); - this.saveTimer = 0; - } + this.CheckAndSave (); + this._updateTimer += Time.deltaTime; } public void FixedUpdate() @@ -407,9 +436,9 @@ this.LabelStyles["center_bold"].alignment = TextAnchor.UpperCenter; this.LabelStyles["center_bold"].fontStyle = FontStyle.Bold; - this.LabelStyles["txt_right"] = new GUIStyle(GUI.skin.label); - this.LabelStyles["txt_right"].normal.textColor = Color.white; - this.LabelStyles["txt_right"].alignment = TextAnchor.UpperRight; + this.LabelStyles["right"] = new GUIStyle(GUI.skin.label); + this.LabelStyles["right"].normal.textColor = Color.white; + this.LabelStyles["right"].alignment = TextAnchor.UpperRight; this.GUIStylesLoaded = true; } @@ -425,6 +454,28 @@ { this._allVesselTypes = Enum.GetValues(typeof(VesselType)).OfType().ToList(); this.vesselTypesLoaded = true; + } + + protected void CheckAndSave() + { + this.saveTimer += Time.deltaTime; + + if (this.saveTimer > 2f) + { + Tools.PostDebugMessage (string.Format ( + "{0}: Time to save, checking if configDirty: {1}", + this.GetType ().Name, + this.configDirty + )); + + if (!this.configDirty) + { + return; + } + + this.SaveConfig (); + this.saveTimer = 0; + } } public void VOIDMainWindow(int _) @@ -493,7 +544,12 @@ { this._skinIdx--; if (this._skinIdx < 0) this._skinIdx = skin_list.Count - 1; - Tools.PostDebugMessage("[VOID] new this._skin = " + this._skinIdx + " :: skin_list.Count = " + skin_list.Count); + Tools.PostDebugMessage (string.Format ( + "{0}: new this._skinIdx = {1} :: skin_list.Count = {2}", + this.GetType().Name, + this._skinIdx, + this.skin_list.Count + )); } string skin_name = skin_list[this._skinIdx].name; @@ -507,11 +563,37 @@ { this._skinIdx++; if (this._skinIdx >= skin_list.Count) this._skinIdx = 0; - Tools.PostDebugMessage("[VOID] new this._skin = " + this._skinIdx + " :: skin_list.Count = " + skin_list.Count); + Tools.PostDebugMessage (string.Format ( + "{0}: new this._skinIdx = {1} :: skin_list.Count = {2}", + this.GetType().Name, + this._skinIdx, + this.skin_list.Count + )); + } + + if (this.Skin.name != this.defaultSkin) + { + this.defaultSkin = this.Skin.name; } GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label("Update Rate (Hz):"); + if (this.stringFrequency == null) + { + this.stringFrequency = (1f / this.updatePeriod).ToString(); + } + this.stringFrequency = GUILayout.TextField(this.stringFrequency.ToString(), 5, GUILayout.ExpandWidth(true)); + // GUILayout.FlexibleSpace(); + if (GUILayout.Button("Apply")) + { + double updateFreq = 1f / this.updatePeriod; + double.TryParse(stringFrequency, out updateFreq); + this._updatePeriod = 1 / updateFreq; + } + GUILayout.EndHorizontal(); + foreach (IVOID_Module mod in this.Modules) { mod.DrawConfigurables (); @@ -527,6 +609,7 @@ return; } + /* Tools.PostDebugMessage(string.Format( "Event.current.type: {0}" + "\nthis.VOIDIconLocked: {1}" + @@ -540,6 +623,7 @@ this.VOIDIconPos.value.xMax, this.VOIDIconPos.value.yMax )); + */ if (!this.VOIDIconLocked && VOIDIconPos.value.Contains(Event.current.mousePosition) @@ -614,13 +698,15 @@ GUILayout.Height (50) ); + _mainWindowPos = Tools.ClampRectToScreen (_mainWindowPos); + if (_mainWindowPos != this.mainWindowPos) { this.mainWindowPos = _mainWindowPos; } } - if (!this.configWindowMinimized) + if (!this.configWindowMinimized && !this.mainGuiMinimized) { Rect _configWindowPos = this.configWindowPos; @@ -633,6 +719,8 @@ GUILayout.Height (50) ); + _configWindowPos = Tools.ClampRectToScreen (_configWindowPos); + if (_configWindowPos != this.configWindowPos) { this.configWindowPos = _configWindowPos; @@ -640,6 +728,19 @@ } } + public void ResetGUI() + { + this.StopGUI (); + + foreach (IVOID_Module module in this.Modules) + { + module.StopGUI (); + module.StartGUI (); + } + + this.StartGUI (); + } + public override void LoadConfig() { base.LoadConfig (); @@ -652,11 +753,6 @@ public void SaveConfig() { - if (!this.configDirty) - { - return; - } - var config = KSP.IO.PluginConfiguration.CreateForType (); config.load (); --- /dev/null +++ b/VOID_DataValue.cs @@ -1,1 +1,254 @@ - +// +// VOID_DataValue.cs +// +// Author: +// toadicus <> +// +// Copyright (c) 2013 toadicus +// +// 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 . +using System; +using UnityEngine; + +namespace VOID +{ + public interface IVOID_DataValue + { + void Refresh(); + string ValueUnitString(); + void DoGUIHorizontal(); + } + + public class VOID_DataValue : IVOID_DataValue + { + /* + * Static Members + * */ + public static implicit operator T(VOID_DataValue v) + { + return (T)v.Value; + } + + /* + * Instance Members + * */ + /* + * Fields + * */ + protected T cache; + protected Func ValueFunc; + + /* + * Properties + * */ + public string Label { get; protected set; } + public string Units { get; protected set; } + + public T Value { + get { + return (T)this.cache; + } + } + + /* + * Methods + * */ + public VOID_DataValue(string Label, Func ValueFunc, string Units = "") + { + this.Label = Label; + this.Units = Units; + this.ValueFunc = ValueFunc; + } + + public void Refresh() + { + this.cache = this.ValueFunc.Invoke (); + } + + public T GetFreshValue() + { + this.Refresh (); + return (T)this.cache; + } + + public string ValueUnitString() { + return this.Value.ToString() + this.Units; + } + + public virtual void DoGUIHorizontal() + { + GUILayout.BeginHorizontal (GUILayout.ExpandWidth (true)); + GUILayout.Label (this.Label + ":"); + GUILayout.FlexibleSpace (); + GUILayout.Label (this.ValueUnitString(), GUILayout.ExpandWidth (false)); + GUILayout.EndHorizontal (); + } + + public override string ToString() + { + return string.Format ( + "{0}: {1}{2}", + this.Label, + this.Value.ToString (), + this.Units + ); + } + } + + internal interface IVOID_NumericValue + { + string ToString(string format); + string ToSIString(int digits, int MinMagnitude, int MaxMagnitude); + } + + public abstract class VOID_NumValue : VOID_DataValue, IVOID_NumericValue + { + public VOID_NumValue(string Label, Func ValueFunc, string Units = "") : base(Label, ValueFunc, Units) {} + + public abstract string ToString(string Format); + public abstract string ToSIString(int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue); + + public abstract string ValueUnitString(string format); + public abstract string ValueUnitString(ushort digits); + + public virtual void DoGUIHorizontal(string format) + { + GUILayout.BeginHorizontal (GUILayout.ExpandWidth (true)); + GUILayout.Label (this.Label + ":"); + GUILayout.FlexibleSpace (); + GUILayout.Label (this.ValueUnitString(format), GUILayout.ExpandWidth (false)); + GUILayout.EndHorizontal (); + } + + public virtual ushort DoGUIHorizontal(ushort digits, bool precisionButton = true) + { + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label(this.Label + ":", GUILayout.ExpandWidth(true)); + GUILayout.FlexibleSpace(); + GUILayout.Label(this.ValueUnitString(digits), GUILayout.ExpandWidth(false)); + if (precisionButton) + { + if (GUILayout.Button ("P")) + { + digits = (ushort)((digits + 3) % 15); + } + } + GUILayout.EndHorizontal(); + + return digits; + } + } + + public class VOID_DoubleValue : VOID_NumValue, IVOID_NumericValue + { + public VOID_DoubleValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {} + + public override string ToString(string format) + { + return string.Format ( + "{0}: {1}{2}", + this.Label, + this.Value.ToString (format), + this.Units + ); + } + + public override string ValueUnitString(string format) { + return this.Value.ToString(format) + this.Units; + } + + public override string ValueUnitString(ushort digits) { + return Tools.MuMech_ToSI(this.Value, digits) + this.Units; + } + + public override string ToSIString(int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue) + { + return string.Format ( + "{0}{1}", + Tools.MuMech_ToSI (this.Value, digits, MinMagnitude, MaxMagnitude), + this.Units + ); + } + } + public class VOID_FloatValue : VOID_NumValue, IVOID_NumericValue + { + public VOID_FloatValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {} + + public override string ValueUnitString(string format) { + return this.Value.ToString(format) + this.Units; + } + + public override string ValueUnitString(ushort digits) { + return Tools.MuMech_ToSI((double)this.Value, digits) + this.Units; + } + + public override string ToString(string format) + { + return string.Format ( + "{0}: {1}{2}", + this.Label, + this.Value.ToString (format), + this.Units + ); + } + + public override string ToSIString(int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue) + { + return string.Format ( + "{0}{1}", + Tools.MuMech_ToSI ((double)this.Value, digits, MinMagnitude, MaxMagnitude), + this.Units + ); + } + } + public class VOID_IntValue : VOID_NumValue, IVOID_NumericValue + { + public VOID_IntValue(string Label, Func ValueFunc, string Units) : base(Label, ValueFunc, Units) {} + + public override string ValueUnitString(string format) { + return this.Value.ToString(format) + this.Units; + } + + public override string ValueUnitString(ushort digits) { + return Tools.MuMech_ToSI((double)this.Value, digits) + this.Units; + } + + public override string ToString(string format) + { + return string.Format ( + "{0}: {1}{2}", + this.Label, + this.Value.ToString (format), + this.Units + ); + } + + public override string ToSIString(int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue) + { + return string.Format ( + "{0}{1}", + Tools.MuMech_ToSI ((double)this.Value, digits, MinMagnitude, MaxMagnitude), + this.Units + ); + } + } + + + public class VOID_StrValue : VOID_DataValue + { + public VOID_StrValue(string Label, Func ValueFunc) : base(Label, ValueFunc, "") {} + } +} + + --- a/VOID_EditorCore.cs +++ b/VOID_EditorCore.cs @@ -79,22 +79,11 @@ this.LoadModulesOfType(); } - Rect _iconPos = new Rect(this.VOIDIconPos); - Vector2 _iconCtr = new Vector2 (); - _iconCtr.x = ((Rect)this.mainWindowPos).center.x; + Rect _iconPos = Tools.DockToWindow (this.VOIDIconPos, this.mainWindowPos); - if (this.mainWindowPos.value.center.y < Screen.height / 2) - { - _iconCtr.y = ((Rect)this.mainWindowPos).yMin - 15; - } - else - { - _iconCtr.y = ((Rect)this.mainWindowPos).yMax + 15; - } + _iconPos = Tools.ClampRectToScreen (_iconPos, (int)_iconPos.width, (int)_iconPos.height); - _iconPos.center = _iconCtr; - - if (this.VOIDIconPos != _iconPos) + if (_iconPos != this.VOIDIconPos) { this.VOIDIconPos = _iconPos; } @@ -121,12 +110,12 @@ } } - if (EditorLogic.startPod == null) + if (EditorLogic.startPod == null || !HighLogic.LoadedSceneIsEditor) { this.StopGUI(); return; } - else if (!this.guiRunning) + else if (!this.guiRunning && HighLogic.LoadedSceneIsEditor) { this.StartGUI(); } @@ -136,6 +125,8 @@ SimManager.Instance.Gravity = 9.08665; SimManager.Instance.TryStartSimulation(); } + + this.CheckAndSave (); } public new void FixedUpdate() {} --- a/VOID_EditorHUD.cs +++ b/VOID_EditorHUD.cs @@ -81,7 +81,7 @@ this.textColors.Add(Color.magenta); this.labelStyle = new GUIStyle (); - this.labelStyle.alignment = TextAnchor.UpperRight; + // this.labelStyle.alignment = TextAnchor.UpperRight; this.labelStyle.normal.textColor = this.textColors [this.ColorIndex]; Tools.PostDebugMessage (this.GetType().Name + ": Constructed."); @@ -96,12 +96,29 @@ return; } + float hudLeft; + + if (EditorLogic.fetch.editorScreen == EditorLogic.EditorScreen.Parts) + { + hudLeft = EditorPanels.Instance.partsPanelWidth + 10; + } + else if (EditorLogic.fetch.editorScreen == EditorLogic.EditorScreen.Actions) + { + hudLeft = EditorPanels.Instance.actionsPanelWidth + 10; + } + else + { + return; + } + + Rect hudPos = new Rect (hudLeft, 48, 300, 32); + // GUI.skin = AssetBase.GetGUISkin("KSP window 2"); labelStyle.normal.textColor = textColors [ColorIndex]; GUI.Label ( - new Rect (Screen.width - 310, 80, 300f, 32f), + hudPos, "Total Mass: " + SimManager.Instance.LastStage.totalMass.ToString("F3") + "t" + " Part Count: " + EditorLogic.SortedShipList.Count + "\nTotal Delta-V: " + Tools.MuMech_ToSI(SimManager.Instance.LastStage.totalDeltaV) + "m/s" + --- a/VOID_HUD.cs +++ b/VOID_HUD.cs @@ -101,7 +101,8 @@ " ETA " + Tools.ConvertInterval (vessel.orbit.timeToAp) + "\nPe: " + Tools.MuMech_ToSI (vessel.orbit.PeA) + "m" + " ETA " + Tools.ConvertInterval (vessel.orbit.timeToPe) + - "\nInc: " + vessel.orbit.inclination.ToString ("F3") + "°", + "\nInc: " + vessel.orbit.inclination.ToString ("F3") + "°" + + "\nPrimary: " + vessel.mainBody.bodyName, labelStyle); // Toadicus edit: Added "Biome: " line to surf/atmo HUD GUI.Label ( --- a/VOID_Module.cs +++ b/VOID_Module.cs @@ -37,6 +37,8 @@ protected string _Name; + protected float lastUpdate = 0; + /* * Properties * */ @@ -193,7 +195,64 @@ protected float defWidth = 250f; protected float defHeight = 50f; - public abstract void ModuleWindow(int _); + public virtual void ModuleWindow(int _) + { + if (VOID_Core.Instance.updateTimer - this.lastUpdate > VOID_Core.Instance.updatePeriod) { + Tools.PostDebugMessage(string.Format( + "{0}: refreshing VOID_DataValues.", + this.GetType().Name + )); + + foreach (var fieldinfo in this.GetType().GetFields( + BindingFlags.Instance | + BindingFlags.NonPublic | + BindingFlags.Public | + BindingFlags.FlattenHierarchy + )) { + Tools.PostDebugMessage(string.Format( + "{0}: checking field {1}.", + this.GetType().Name, + fieldinfo.Name + )); + + object field = null; + + try + { + field = fieldinfo.GetValue (this); + } + catch (NullReferenceException) { + Tools.PostDebugMessage(string.Format( + "{0}: caught NullReferenceException, could not get value for field {1}.", + this.GetType().Name, + fieldinfo.Name + )); + } + + if (field == null) { + continue; + } + + if (typeof(IVOID_DataValue).IsAssignableFrom (field.GetType ())) { + Tools.PostDebugMessage(string.Format( + "{0}: found field {1}.", + this.GetType().Name, + fieldinfo.Name + )); + + (field as IVOID_DataValue).Refresh (); + + Tools.PostDebugMessage(string.Format( + "{0}: refreshed field {1}.", + this.GetType().Name, + fieldinfo.Name + )); + } + } + + this.lastUpdate = VOID_Core.Instance.updateTimer; + } + } public override void DrawGUI() { @@ -208,6 +267,8 @@ GUILayout.Height(this.defHeight) ); + _Pos = Tools.ClampRectToScreen (_Pos); + if (_Pos != this.WindowPos) { this.WindowPos = _Pos; --- a/VOID_Orbital.cs +++ b/VOID_Orbital.cs @@ -29,6 +29,121 @@ [AVOID_SaveValue("toggleExtended")] protected VOID_SaveValue toggleExtended = false; + [AVOID_SaveValue("precisionValues")] + protected long _precisionValues = 230584300921369395; + protected IntCollection precisionValues; + + protected VOID_StrValue primaryName = new VOID_StrValue ( + VOIDLabels.void_primary, + new Func (() => VOID_Core.Instance.vessel.mainBody.name) + ); + + protected VOID_DoubleValue orbitAltitude = new VOID_DoubleValue ( + "Altitude (ASL)", + new Func (() => VOID_Core.Instance.vessel.orbit.altitude), + "m" + ); + + protected VOID_DoubleValue orbitVelocity = new VOID_DoubleValue ( + VOIDLabels.void_velocity, + new Func (() => VOID_Core.Instance.vessel.orbit.vel.magnitude), + "m/s" + ); + + protected VOID_DoubleValue orbitApoAlt = new VOID_DoubleValue( + VOIDLabels.void_apoapsis, + new Func(() => VOID_Core.Instance.vessel.orbit.ApA), + "m" + ); + + protected VOID_DoubleValue oribtPeriAlt = new VOID_DoubleValue( + VOIDLabels.void_periapsis, + new Func(() => VOID_Core.Instance.vessel.orbit.PeA), + "m" + ); + + protected VOID_StrValue timeToApo = new VOID_StrValue( + "Time to Apoapsis", + new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToAp)) + ); + + protected VOID_StrValue timeToPeri = new VOID_StrValue( + "Time to Apoapsis", + new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToPe)) + ); + + protected VOID_DoubleValue orbitInclination = new VOID_DoubleValue( + "Inclination", + new Func(() => VOID_Core.Instance.vessel.orbit.inclination), + "°" + ); + + protected VOID_DoubleValue gravityAccel = new VOID_DoubleValue( + "Gravity", + delegate() + { + double orbitRadius = VOID_Core.Instance.vessel.mainBody.Radius + + VOID_Core.Instance.vessel.mainBody.GetAltitude(VOID_Core.Instance.vessel.findWorldCenterOfMass()); + return (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) / + Math.Pow(orbitRadius, 2); + }, + "m/s²" + ); + + protected VOID_StrValue orbitPeriod = new VOID_StrValue( + "Period", + new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.period)) + ); + + protected VOID_DoubleValue semiMajorAxis = new VOID_DoubleValue( + "Semi-Major Axis", + new Func(() => VOID_Core.Instance.vessel.orbit.semiMajorAxis), + "m" + ); + + protected VOID_DoubleValue eccentricity = new VOID_DoubleValue( + "Eccentricity", + new Func(() => VOID_Core.Instance.vessel.orbit.eccentricity), + "" + ); + + protected VOID_DoubleValue meanAnomaly = new VOID_DoubleValue( + "Mean Anomaly", + new Func(() => VOID_Core.Instance.vessel.orbit.meanAnomaly * 180d / Math.PI), + "°" + ); + + protected VOID_DoubleValue trueAnomaly = new VOID_DoubleValue( + "True Anomaly", + new Func(() => VOID_Core.Instance.vessel.orbit.trueAnomaly), + "°" + ); + + protected VOID_DoubleValue eccAnomaly = new VOID_DoubleValue( + "Eccentric Anomaly", + new Func(() => VOID_Core.Instance.vessel.orbit.eccentricAnomaly * 180d / Math.PI), + "°" + ); + + protected VOID_DoubleValue longitudeAscNode = new VOID_DoubleValue( + "Long. Ascending Node", + new Func(() => VOID_Core.Instance.vessel.orbit.LAN), + "°" + ); + + protected VOID_DoubleValue argumentPeriapsis = new VOID_DoubleValue( + "Argument of Periapsis", + new Func(() => VOID_Core.Instance.vessel.orbit.argumentOfPeriapsis), + "°" + ); + + protected VOID_DoubleValue localSiderealLongitude = new VOID_DoubleValue( + "Local Sidereal Longitude", + new Func(() => Tools.FixDegreeDomain( + VOID_Core.Instance.vessel.longitude + VOID_Core.Instance.vessel.orbit.referenceBody.rotationAngle)), + "°" + ); + public VOID_Orbital() { this._Name = "Orbital Information"; @@ -39,115 +154,76 @@ public override void ModuleWindow(int _) { - // Toadicus edit: added local sidereal longitude. - double LSL = vessel.longitude + vessel.orbit.referenceBody.rotationAngle; - LSL = Tools.FixDegreeDomain (LSL); + base.ModuleWindow (_); + + int idx = 0; GUILayout.BeginVertical(); - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(VOIDLabels.void_primary + ":"); - GUILayout.Label(vessel.mainBody.bodyName, GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(VOIDLabels.void_altitude_asl + ":"); - GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.altitude) + "m", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(VOIDLabels.void_velocity + ":"); - GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.vel.magnitude) + "m/s", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(VOIDLabels.void_apoapsis + ":"); - GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.ApA) + "m", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Time to Ap:"); - GUILayout.Label(Tools.ConvertInterval(vessel.orbit.timeToAp), GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label(VOIDLabels.void_periapsis + ":"); - GUILayout.Label(Tools.MuMech_ToSI(vessel.orbit.PeA) + "m", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Time to Pe:"); - GUILayout.Label(Tools.ConvertInterval(vessel.orbit.timeToPe), GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Inclination:"); - GUILayout.Label(vessel.orbit.inclination.ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - double r_vessel = vessel.mainBody.Radius + vessel.mainBody.GetAltitude(vessel.findWorldCenterOfMass()); - double g_vessel = (VOID_Core.Constant_G * vessel.mainBody.Mass) / Math.Pow(r_vessel, 2); - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Gravity:"); - GUILayout.Label(Tools.MuMech_ToSI(g_vessel) + "m/s²", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); + this.primaryName.DoGUIHorizontal (); + + this.precisionValues [idx] = this.orbitAltitude.DoGUIHorizontal (this.precisionValues [idx]); + idx++; + + this.precisionValues [idx] = this.orbitVelocity.DoGUIHorizontal (this.precisionValues [idx]); + idx++; + + this.precisionValues [idx] = this.orbitApoAlt.DoGUIHorizontal (this.precisionValues [idx]); + idx++; + + this.timeToApo.DoGUIHorizontal(); + + this.precisionValues [idx] = this.oribtPeriAlt.DoGUIHorizontal (this.precisionValues [idx]); + idx++; + + this.timeToPeri.DoGUIHorizontal(); + + this.orbitInclination.DoGUIHorizontal("F3"); + + this.precisionValues [idx] = this.gravityAccel.DoGUIHorizontal (this.precisionValues [idx]); + idx++; this.toggleExtended = GUILayout.Toggle(this.toggleExtended, "Extended info"); if (this.toggleExtended) { - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Period:"); - GUILayout.Label(Tools.ConvertInterval(vessel.orbit.period), GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Semi-major axis:"); - GUILayout.Label((vessel.orbit.semiMajorAxis / 1000).ToString("##,#") + "km", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Eccentricity:"); - GUILayout.Label(vessel.orbit.eccentricity.ToString("F4"), GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - // Toadicus edit: convert mean anomaly into degrees. - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Mean anomaly:"); - GUILayout.Label((vessel.orbit.meanAnomaly * 180d / Math.PI).ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("True anomaly:"); - GUILayout.Label(vessel.orbit.trueAnomaly.ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - // Toadicus edit: convert eccentric anomaly into degrees. - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Eccentric anomaly:"); - GUILayout.Label((vessel.orbit.eccentricAnomaly * 180d / Math.PI).ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Long. ascending node:"); - GUILayout.Label(vessel.orbit.LAN.ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Arg. of periapsis:"); - GUILayout.Label(vessel.orbit.argumentOfPeriapsis.ToString("F3") + "°", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - - // Toadicus edit: added local sidereal longitude. - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Local Sidereal Longitude:"); - GUILayout.Label(LSL.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"]); - GUILayout.EndHorizontal(); + this.orbitPeriod.DoGUIHorizontal(); + + this.precisionValues [idx] = this.semiMajorAxis.DoGUIHorizontal (this.precisionValues [idx]); + idx++; + + this.eccentricity.DoGUIHorizontal("F4"); + + this.meanAnomaly.DoGUIHorizontal("F3"); + + this.trueAnomaly.DoGUIHorizontal("F3"); + + this.eccAnomaly.DoGUIHorizontal("F3"); + + this.longitudeAscNode.DoGUIHorizontal("F3"); + + this.argumentPeriapsis.DoGUIHorizontal("F3"); + + this.localSiderealLongitude.DoGUIHorizontal("F3"); } GUILayout.EndVertical(); GUI.DragWindow(); } + + public override void LoadConfig () + { + base.LoadConfig (); + + this.precisionValues = new IntCollection (4, this._precisionValues); + } + + public override void _SaveToConfig (KSP.IO.PluginConfiguration config) + { + this._precisionValues = this.precisionValues.collection; + + base._SaveToConfig (config); + } } } --- a/VOID_Rendezvous.cs +++ b/VOID_Rendezvous.cs @@ -230,7 +230,7 @@ // Toadicus edit: added local sidereal longitude. GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Local Sidereal Longitude:"); - GUILayout.Label(LSL.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["txt_right"]); + GUILayout.Label(LSL.ToString("F3") + "°", VOID_Core.Instance.LabelStyles["right"]); GUILayout.EndHorizontal(); } } --- a/VOID_SaveValue.cs +++ b/VOID_SaveValue.cs @@ -69,7 +69,7 @@ public static implicit operator T(VOID_SaveValue v) { - return v.value; + return (T)v.value; } public static implicit operator VOID_SaveValue(T v) @@ -77,14 +77,21 @@ VOID_SaveValue r = new VOID_SaveValue(); r.value = v; r.type = v.GetType(); + if (VOID_Core.Initialized) { VOID_Core.Instance.configDirty = true; } + + if (VOID_EditorCore.Initialized) + { + VOID_EditorCore.Instance.configDirty = true; + } + return r; } - public new string ToString() + public override string ToString() { return this.value.ToString(); } --- a/VOID_SurfAtmo.cs +++ b/VOID_SurfAtmo.cs @@ -104,7 +104,7 @@ // Toadicus edit: added Biome GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Biome:"); - GUILayout.Label(Tools.Toadicus_GetAtt(vessel).name, VOID_Core.Instance.LabelStyles["txt_right"]); + GUILayout.Label(Tools.Toadicus_GetAtt(vessel).name, VOID_Core.Instance.LabelStyles["right"]); GUILayout.EndHorizontal(); GUILayout.EndVertical(); --- a/VOID_VesselInfo.cs +++ b/VOID_VesselInfo.cs @@ -48,7 +48,10 @@ GUILayout.BeginVertical(); - GUILayout.Label(vessel.vesselName, VOID_Core.Instance.LabelStyles["center_bold"], GUILayout.ExpandWidth(true)); + GUILayout.Label( + vessel.vesselName, + VOID_Core.Instance.LabelStyles["center_bold"], + GUILayout.ExpandWidth(true)); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("G-force:"); @@ -68,7 +71,10 @@ foreach (PartModule pm in p.Modules) { - if ((pm.moduleName == "ModuleEngines") && ((p.State == PartStates.ACTIVE) || ((Staging.CurrentStage > Staging.lastStage) && (p.inverseStage == Staging.lastStage)))) + if ((pm.moduleName == "ModuleEngines") && + ((p.State == PartStates.ACTIVE) || + ((Staging.CurrentStage > Staging.lastStage) && (p.inverseStage == Staging.lastStage))) + ) { max_thrust += ((ModuleEngines)pm).maxThrust; final_thrust += ((ModuleEngines)pm).finalThrust; @@ -95,7 +101,9 @@ { GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("DeltaV (Current Stage):"); - GUILayout.Label(Tools.MuMech_ToSI(stages[Staging.lastStage].deltaV).ToString() + "m/s", GUILayout.ExpandWidth(false)); + GUILayout.Label( + Tools.MuMech_ToSI(stages[Staging.lastStage].deltaV).ToString() + "m/s", + GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); } @@ -121,13 +129,19 @@ GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Thrust (curr/max):"); - GUILayout.Label(final_thrust.ToString("F1") + " / " + max_thrust.ToString("F1") + " kN", GUILayout.ExpandWidth(false)); + GUILayout.Label( + final_thrust.ToString("F1") + + " / " + max_thrust.ToString("F1") + " kN", + GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); double gravity = vessel.mainBody.gravParameter / Math.Pow(vessel.mainBody.Radius + vessel.altitude, 2); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("T:W (curr/max):"); - GUILayout.Label((final_thrust / (total_mass * gravity)).ToString("F2") + " / " + (max_thrust / (total_mass * gravity)).ToString("F2"), GUILayout.ExpandWidth(false)); + GUILayout.Label( + (final_thrust / (total_mass * gravity)).ToString("F2") + + " / " + (max_thrust / (total_mass * gravity)).ToString("F2"), + GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); double g_ASL = (VOID_Core.Constant_G * vessel.mainBody.Mass) / Math.Pow(vessel.mainBody.Radius, 2);