From: Andy Date: Wed, 21 May 2014 20:16:08 +0000 Subject: VOID_HUDAdvanced: Finished vesselThrustOffset, reformatted burnTime lines, new default positions. X-Git-Tag: 0.12.0 X-Git-Url: http://git.toad.homelinux.net/projects/VOID.git/commitdiff/f491abc --- VOID_HUDAdvanced: Finished vesselThrustOffset, reformatted burnTime lines, new default positions. --- --- a/IVOID_Module.cs +++ b/IVOID_Module.cs @@ -1,23 +1,31 @@ +// VOID // -// IVOID_Module.cs +// IVOID_Module.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using System; namespace VOID --- a/IntCollection.cs +++ /dev/null @@ -1,81 +1,1 @@ -// -// 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 { - if (idx < 0) { - idx += this.maxCount; - } - - if (idx >= maxCount || idx < 0) { - throw new IndexOutOfRangeException (); - } - - idx *= wordLength; - - long packvalue = value & this.mask; - - this.collection &= ~(this.mask << idx); - this.collection |= packvalue << idx; - } - } - } -} - - --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -1,1 +1,48 @@ +// VOID +// +// AssemblyInfo.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +using System.Reflection; +using System.Runtime.CompilerServices; +[assembly: KSPAssemblyDependency("ToadicusTools", 0, 0)] +[assembly: KSPAssemblyDependency("VesselSimulator", 0, 0)] + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. +[assembly: AssemblyTitle("VOID")] +[assembly: AssemblyDescription("A KSP mod that provides at-a-glance information about Vessels, Orbits, and their states.")] +[assembly: AssemblyCopyright("toadicus")] +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. +[assembly: AssemblyVersion("0.11.0.*")] +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + + --- a/Tools.cs +++ /dev/null @@ -1,1034 +1,1 @@ -// -// Tools.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 . -// -// This software uses VesselSimulator and Engineer.Extensions from Engineer Redux. -// Engineer Redux (c) 2013 cybutek -// Used by permission. -// -/////////////////////////////////////////////////////////////////////////////// -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace VOID -{ - public static class VOIDLabels - { - public static string void_primary = "Primary"; - public static string void_altitude_asl = "Altitude (ASL)"; - public static string void_velocity = "Velocity"; - public static string void_apoapsis = "Apoapsis"; - public static string void_periapsis = "Periapsis"; - } - - public static class Tools - { - // Toadicus edit: Added re-implementation of the CBAttributeMap.GetAtt function that does not fire a debug message to the game screen. - public static CBAttributeMap.MapAttribute Toadicus_GetAtt(Vessel vessel) - { - CBAttributeMap.MapAttribute mapAttribute; - - try - { - CBAttributeMap BiomeMap = vessel.mainBody.BiomeMap; - - double lat = vessel.latitude * Math.PI / 180d; - double lon = vessel.longitude * Math.PI / 180d; - - mapAttribute = BiomeMap.GetAtt(lat, lon); - - /* - lon -= Math.PI / 2d; - - if (lon < 0d) - { - lon += 2d * Math.PI; - } - - float v = (float)(lat / Math.PI) + 0.5f; - float u = (float)(lon / (2d * Math.PI)); - - Color pixelBilinear = BiomeMap.Map.GetPixelBilinear(u, v); - mapAttribute = BiomeMap.defaultAttribute; - - if (BiomeMap.Map != null) - { - if (BiomeMap.exactSearch) - { - for (int i = 0; i < BiomeMap.Attributes.Length; ++i) - { - if (pixelBilinear == BiomeMap.Attributes[i].mapColor) - { - mapAttribute = BiomeMap.Attributes[i]; - } - } - } - else - { - float zero = 0; - float num = 1 / zero; - for (int j = 0; j < BiomeMap.Attributes.Length; ++j) - { - Color mapColor = BiomeMap.Attributes[j].mapColor; - float sqrMagnitude = ((Vector4)(mapColor - pixelBilinear)).sqrMagnitude; - if (sqrMagnitude < num) - { - bool testCase = true; - if (BiomeMap.nonExactThreshold != -1) - { - testCase = (sqrMagnitude < BiomeMap.nonExactThreshold); - } - if (testCase) - { - mapAttribute = BiomeMap.Attributes[j]; - num = sqrMagnitude; - } - } - } - } - } - */ - } - catch (NullReferenceException) - { - mapAttribute = new CBAttributeMap.MapAttribute(); - mapAttribute.name = "N/A"; - } - - return mapAttribute; - } - - public static string GetLongitudeString(Vessel vessel, string format = "F4") - { - string dir_long = "W"; - double v_long = vessel.longitude; - - v_long = FixDegreeDomain(v_long); - - if (v_long < -180d) - { - v_long += 360d; - } - if (v_long >= 180) - { - v_long -= 360d; - } - - if (v_long > 0) - dir_long = "E"; - - return string.Format("{0}° {1}", Math.Abs(v_long).ToString(format), dir_long); - } - - public static string GetLatitudeString(Vessel vessel, string format = "F4") - { - string dir_lat = "S"; - double v_lat = vessel.latitude; - if (v_lat > 0) - dir_lat = "N"; - - return string.Format("{0}° {1}", Math.Abs(v_lat).ToString(format), dir_lat); - } - - /* - * MuMechLib Methods - * The methods below are adapted from MuMechLib, © 2013-2014 r4m0n - * The following methods are a derivative work of the code from MuMechLib in the MechJeb project. - * Used under license. - * */ - - // Derived from MechJeb2/VesselState.cs - public static Quaternion getSurfaceRotation(this Vessel vessel) - { - Vector3 CoM; - - try - { - CoM = vessel.findWorldCenterOfMass(); - } - catch - { - return new Quaternion(); - } - - Vector3 bodyPosition = vessel.mainBody.position; - Vector3 bodyUp = vessel.mainBody.transform.up; - - Vector3 surfaceUp = (CoM - vessel.mainBody.position).normalized; - Vector3 surfaceNorth = Vector3.Exclude( - surfaceUp, - (bodyPosition + bodyUp * (float)vessel.mainBody.Radius) - CoM - ).normalized; - - Quaternion surfaceRotation = Quaternion.LookRotation(surfaceNorth, surfaceUp); - - return Quaternion.Inverse( - Quaternion.Euler(90, 0, 0) * Quaternion.Inverse(vessel.GetTransform().rotation) * surfaceRotation - ); - } - - // Derived from MechJeb2/VesselState.cs - public static double getSurfaceHeading(this Vessel vessel) - { - return vessel.getSurfaceRotation().eulerAngles.y; - } - - // Derived from MechJeb2/VesselState.cs - public static double getSurfacePitch(this Vessel vessel) - { - Quaternion vesselSurfaceRotation = vessel.getSurfaceRotation(); - - return (vesselSurfaceRotation.eulerAngles.x > 180f) ? - (360f - vesselSurfaceRotation.eulerAngles.x) : - -vesselSurfaceRotation.eulerAngles.x; - } - - // Derived from MechJeb2/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"; - } - } - - /* - * END MuMecLib METHODS - * */ - - 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); - } - 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) - { - /* - 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 - # r1 = initial body's orbit radius - # r2 = target body's orbit radius - - # return value is km/s - sur1 = math.sqrt(mu / r1) - sr1r2 = math.sqrt(float(2*r2)/float(r1+r2)) - 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) - { - /* - def deltaVToExitSOI(mu, r1, r2, v): - # mu = gravity param of current body - # r1 = current orbit radius - # r2 = SOI radius - # v = SOI exit velocity - foo = r2 * (v**2) - 2 * mu - bar = r1 * foo + (2 * r2 * mu) - 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) - { - /* - def transferBurnPoint(r, v, angle, mu): - # r = parking orbit radius - # v = ejection velocity - # angle = phase angle (from function phaseAngle()) - # mu = gravity param of current body. - epsilon = ((v**2)/2) - (mu / r) - h = r * v * math.sin(angle) - e = math.sqrt(1 + ((2 * epsilon * h**2)/(mu**2))) - theta = math.acos(1.0 / e) - 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; - } - - public static double FixAngleDomain(double Angle, bool Degrees = false) - { - double Extent = 2d * Math.PI; - if (Degrees) - { - Extent = 360d; - } - - Angle = Angle % (Extent); - if (Angle < 0d) - { - Angle += Extent; - } - - return Angle; - } - - public static double FixDegreeDomain(double Angle) - { - 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) - { - 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. - if (vessel.terrainAltitude < 0 && vessel.mainBody.ocean) - { - trueAltitude = vessel.orbit.altitude; - } - - return trueAltitude; - } - - public static string get_heading_text(double heading) - { - if (heading > 348.75 || heading <= 11.25) - return "N"; - else if (heading > 11.25 && heading <= 33.75) - return "NNE"; - else if (heading > 33.75 && heading <= 56.25) - return "NE"; - else if (heading > 56.25 && heading <= 78.75) - return "ENE"; - else if (heading > 78.75 && heading <= 101.25) - return "E"; - else if (heading > 101.25 && heading <= 123.75) - return "ESE"; - else if (heading > 123.75 && heading <= 146.25) - return "SE"; - else if (heading > 146.25 && heading <= 168.75) - return "SSE"; - else if (heading > 168.75 && heading <= 191.25) - return "S"; - else if (heading > 191.25 && heading <= 213.75) - return "SSW"; - else if (heading > 213.75 && heading <= 236.25) - return "SW"; - else if (heading > 236.25 && heading <= 258.75) - return "WSW"; - else if (heading > 258.75 && heading <= 281.25) - return "W"; - else if (heading > 281.25 && heading <= 303.75) - return "WNW"; - else if (heading > 303.75 && heading <= 326.25) - return "NW"; - else if (heading > 326.25 && heading <= 348.75) - return "NNW"; - else - return ""; - } - - public static void display_transfer_angles_SUN2PLANET(CelestialBody body, Vessel vessel) - { - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Phase angle (curr/trans):"); - GUILayout.Label( - Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + Tools.Nivvy_CalcTransferPhaseAngle( - vessel.orbit.semiMajorAxis, - body.orbit.semiMajorAxis, - vessel.mainBody.gravParameter - ).ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Transfer velocity:"); - GUILayout.Label( - (Tools.Younata_DeltaVToGetToOtherBody( - (vessel.mainBody.gravParameter / 1000000000), - (vessel.orbit.semiMajorAxis / 1000), - (body.orbit.semiMajorAxis / 1000) - ) * 1000).ToString("F2") + "m/s", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - } - - public static void display_transfer_angles_PLANET2PLANET(CelestialBody body, Vessel vessel) - { - double dv1 = Tools.Younata_DeltaVToGetToOtherBody( - (vessel.mainBody.referenceBody.gravParameter / 1000000000), - (vessel.mainBody.orbit.semiMajorAxis / 1000), - (body.orbit.semiMajorAxis / 1000) - ); - double dv2 = Tools.Younata_DeltaVToExitSOI( - (vessel.mainBody.gravParameter / 1000000000), - (vessel.orbit.semiMajorAxis / 1000), - (vessel.mainBody.sphereOfInfluence / 1000), - Math.Abs(dv1) - ); - - double trans_ejection_angle = Tools.Younata_TransferBurnPoint( - (vessel.orbit.semiMajorAxis / 1000), - dv2, - (Math.PI / 2.0), - (vessel.mainBody.gravParameter / 1000000000) - ); - double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle( - FlightGlobals.ActiveVessel.longitude, - FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent - ); - - double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle( - vessel.mainBody.orbit.semiMajorAxis, - body.orbit.semiMajorAxis, - vessel.mainBody.referenceBody.gravParameter - ) % 360; - double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle( - body.orbit.LAN, - body.orbit.orbitPercent, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent - ); - - double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle); - double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle); - double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Phase angle (curr/trans):"); - GUILayout.Label( - adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Ejection angle (curr/trans):"); - GUILayout.Label( - adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Transfer velocity:"); - GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - } - - public static void display_transfer_angles_PLANET2MOON(CelestialBody body, Vessel vessel) - { - double dv1 = Tools.Younata_DeltaVToGetToOtherBody( - (vessel.mainBody.gravParameter / 1000000000), - (vessel.orbit.semiMajorAxis / 1000), - (body.orbit.semiMajorAxis / 1000) - ); - - double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle( - vessel.orbit.semiMajorAxis, - body.orbit.semiMajorAxis, - vessel.mainBody.gravParameter - ); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Phase angle (curr/trans):"); - GUILayout.Label( - Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Transfer velocity:"); - GUILayout.Label((dv1 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); - GUILayout.EndHorizontal(); - } - - public static void display_transfer_angles_MOON2MOON(CelestialBody body, Vessel vessel) - { - double dv1 = Tools.Younata_DeltaVToGetToOtherBody( - (vessel.mainBody.referenceBody.gravParameter / 1000000000), - (vessel.mainBody.orbit.semiMajorAxis / 1000), - (body.orbit.semiMajorAxis / 1000) - ); - double dv2 = Tools.Younata_DeltaVToExitSOI( - (vessel.mainBody.gravParameter / 1000000000), - (vessel.orbit.semiMajorAxis / 1000), - (vessel.mainBody.sphereOfInfluence / 1000), - Math.Abs(dv1) - ); - double trans_ejection_angle = Tools.Younata_TransferBurnPoint( - (vessel.orbit.semiMajorAxis / 1000), - dv2, - (Math.PI / 2.0), - (vessel.mainBody.gravParameter / 1000000000) - ); - - double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle( - body.orbit.LAN, - body.orbit.orbitPercent, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent - ); - double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle( - FlightGlobals.ActiveVessel.longitude, - FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, - FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent - ); - - double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle( - vessel.mainBody.orbit.semiMajorAxis, - body.orbit.semiMajorAxis, - vessel.mainBody.referenceBody.gravParameter - ) % 360; - - double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle); - //double adj_ejection_angle = adjustCurrEjectionAngle(trans_phase_angle, curr_ejection_angle); - - //new stuff - // - double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle); - double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle); - // - // - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Phase angle (curr/trans):"); - GUILayout.Label( - adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Ejection angle (curr/trans):"); - GUILayout.Label( - adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°", - GUILayout.ExpandWidth(false) - ); - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); - GUILayout.Label("Transfer velocity:"); - 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; - } - - public static ExperimentSituations GetExperimentSituation(this Vessel vessel) - { - Vessel.Situations situation = vessel.situation; - - switch (situation) - { - case Vessel.Situations.PRELAUNCH: - case Vessel.Situations.LANDED: - return ExperimentSituations.SrfLanded; - case Vessel.Situations.SPLASHED: - return ExperimentSituations.SrfSplashed; - case Vessel.Situations.FLYING: - if (vessel.altitude < (double)vessel.mainBody.scienceValues.flyingAltitudeThreshold) - { - return ExperimentSituations.FlyingLow; - } - else - { - return ExperimentSituations.FlyingHigh; - } - } - - if (vessel.altitude < (double)vessel.mainBody.scienceValues.spaceAltitudeThreshold) - { - return ExperimentSituations.InSpaceLow; - } - else - { - return ExperimentSituations.InSpaceHigh; - } - } - - public static double Radius(this Vessel vessel) - { - double radius; - - radius = vessel.altitude; - - if (vessel.mainBody != null) - { - radius += vessel.mainBody.Radius; - } - - return radius; - } - - public static double TryGetLastMass(this Engineer.VesselSimulator.SimManager simManager) - { - if (simManager.Stages == null || simManager.Stages.Length <= Staging.lastStage) - { - return double.NaN; - } - - return simManager.Stages[Staging.lastStage].totalMass; - } - - public static string HumanString(this ExperimentSituations situation) - { - switch (situation) - { - case ExperimentSituations.FlyingHigh: - return "Upper Atmosphere"; - case ExperimentSituations.FlyingLow: - return "Flying"; - case ExperimentSituations.SrfLanded: - return "Surface"; - case ExperimentSituations.InSpaceLow: - return "Near in Space"; - case ExperimentSituations.InSpaceHigh: - return "High in Space"; - case ExperimentSituations.SrfSplashed: - return "Splashed Down"; - default: - return "Unknown"; - } - } - - private static ScreenMessage debugmsg = new ScreenMessage("", 2f, ScreenMessageStyle.UPPER_RIGHT); - - [System.Diagnostics.Conditional("DEBUG")] - public static void PostDebugMessage(string Msg) - { - if (HighLogic.LoadedScene > GameScenes.SPACECENTER) - { - debugmsg.message = Msg; - ScreenMessages.PostScreenMessage(debugmsg, true); - } - - KSPLog.print(Msg); - } - } -} --- /dev/null +++ b/VOID.csproj @@ -1,1 +1,129 @@ + + + + Debug_win + 8.0.30703 + 2.0 + {45ACC1CC-942C-4A66-BFC7-8BE375938B18} + Library + VOID + VOID + 65001 + v3.5 + AnyCPU + 0.11 + false + + + true + full + false + bin\Debug + DEBUG; TRACE + prompt + 4 + false + + + + + + + + false + bin\Release + prompt + 4 + false + TRACE + + + + + + + + true + full + false + bin\Debug + DEBUG; TRACE + prompt + 4 + false + + + + + + + + false + bin\Release + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\_KSPAssemblies\System.dll + + + ..\_KSPAssemblies\Assembly-CSharp.dll + + + ..\_KSPAssemblies\UnityEngine.dll + + + + + {D48A5542-6655-4149-BC27-B27DF0466F1C} + ToadicusTools + + + {30FD6C0B-D36E-462F-B0FF-F0FAC9C666CF} + VesselSimulator + + + --- a/VOIDEditorMaster.cs +++ b/VOIDEditorMaster.cs @@ -1,21 +1,30 @@ -/////////////////////////////////////////////////////////////////////////////// +// VOID // -// VOID - Vessel Orbital Information Display for Kerbal Space Program -// Copyright (C) 2012 Iannic-ann-od -// Copyright (C) 2013 Toadicus +// VOIDEditorMaster.cs // -// 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. +// Copyright © 2014, toadicus +// All rights reserved. // -// 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. +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// // @@ -31,9 +40,11 @@ // /////////////////////////////////////////////////////////////////////////////// +using Engineer.VesselSimulator; +using KSP; using System; +using ToadicusTools; using UnityEngine; -using Engineer.VesselSimulator; namespace VOID { @@ -47,7 +58,6 @@ Tools.PostDebugMessage ("VOIDEditorMaster: Waking up."); this.Core = VOID_EditorCore.Instance; this.Core.ResetGUI (); - SimManager.HardReset(); Tools.PostDebugMessage ("VOIDEditorMaster: Awake."); } --- a/VOIDFlightMaster.cs +++ b/VOIDFlightMaster.cs @@ -1,21 +1,30 @@ -/////////////////////////////////////////////////////////////////////////////// +// VOID // -// VOID - Vessel Orbital Information Display for Kerbal Space Program -// Copyright (C) 2012 Iannic-ann-od -// Copyright (C) 2013 Toadicus +// VOIDFlightMaster.cs // -// 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. +// Copyright © 2014, toadicus +// All rights reserved. // -// 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. +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// // @@ -34,6 +43,7 @@ using System; using UnityEngine; using Engineer.VesselSimulator; +using ToadicusTools; namespace VOID { @@ -47,7 +57,6 @@ Tools.PostDebugMessage ("VOIDFlightMaster: Waking up."); this.Core = (VOID_Core)VOID_Core.Instance; this.Core.ResetGUI (); - SimManager.HardReset(); Tools.PostDebugMessage ("VOIDFlightMaster: Awake."); } --- a/VOID_CBInfoBrowser.cs +++ b/VOID_CBInfoBrowser.cs @@ -1,26 +1,35 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_CBInfoBrowser.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; using System.Collections.Generic; +using ToadicusTools; using UnityEngine; namespace VOID @@ -208,13 +217,13 @@ else GUILayout.Label((body.orbit.ApA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], 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)); + else GUILayout.Label(VOID_Tools.ConvertInterval(body.orbit.timeToAp), VOID_Core.Instance.LabelStyles["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.PeA / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], 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)); + else GUILayout.Label(VOID_Tools.ConvertInterval(body.orbit.timeToPe), VOID_Core.Instance.LabelStyles["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.semiMajorAxis / 1000).ToString("##,#") + "km", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); @@ -223,10 +232,10 @@ else GUILayout.Label(body.orbit.eccentricity.ToString("F4") + "", VOID_Core.Instance.LabelStyles["right"], 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)); - - 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)); + else GUILayout.Label(VOID_Tools.ConvertInterval(body.orbit.period), VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + + if (body.bodyName == "Sun") GUILayout.Label("N/A", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); + else GUILayout.Label(VOID_Tools.ConvertInterval(body.rotationPeriod), VOID_Core.Instance.LabelStyles["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.orbitalSpeed / 1000).ToString("F2") + "km/s", VOID_Core.Instance.LabelStyles["right"], GUILayout.ExpandWidth(true)); --- a/VOID_Core.cs +++ b/VOID_Core.cs @@ -1,34 +1,44 @@ +// VOID // -// VOID_Core.cs +// VOID_Core.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using Engineer.VesselSimulator; +using KSP; using System; using System.Collections.Generic; using System.Linq; -using KSP; +using ToadicusTools; using UnityEngine; -using Engineer.VesselSimulator; namespace VOID { public class VOID_Core : VOID_Module, IVOID_Module { + #region Singleton Members /* * Static Members * */ @@ -63,13 +73,15 @@ _instance = null; _initialized = false; } + #endregion public static double Constant_G = 6.674e-11; + /* * Fields * */ protected string VoidName = "VOID"; - protected string VoidVersion = "0.9.22"; + protected string VoidVersion = "0.11.0"; protected bool _factoryReset = false; @@ -127,6 +139,9 @@ protected VOID_SaveValue _updatePeriod = 1001f / 15000f; protected float _updateTimer = 0f; protected string stringFrequency; + + [AVOID_SaveValue("vesselSimActive")] + protected VOID_SaveValue vesselSimActive; // Vessel Type Housekeeping protected List _allVesselTypes = new List(); @@ -302,7 +317,7 @@ { get { - return _UseToolbarManager; + return _UseToolbarManager & ToolbarManager.ToolbarAvailable; } set { @@ -463,11 +478,15 @@ { this.LoadBeforeUpdate(); - if (this.vessel != null) - { - SimManager.Instance.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / + if (this.vessel != null && this.vesselSimActive) + { + SimManager.Gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / Math.Pow(VOID_Core.Instance.vessel.Radius(), 2); - SimManager.Instance.TryStartSimulation(); + SimManager.TryStartSimulation(); + } + else if (!this.vesselSimActive) + { + SimManager.ClearResults(); } if (!this.guiRunning) @@ -613,6 +632,9 @@ this.UseToolbarManager = GUILayout.Toggle(this.UseToolbarManager, "Use Blizzy's Toolbar If Available"); + this.vesselSimActive.value = GUILayout.Toggle(this.vesselSimActive.value, + "Enable Engineering Calculations"); + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Skin:", GUILayout.ExpandWidth(false)); @@ -858,6 +880,12 @@ protected void InitializeToolbarButton() { + // Do nothing if the Toolbar is not available. + if (!ToolbarManager.ToolbarAvailable) + { + return; + } + this.ToolbarButton = ToolbarManager.Instance.add(this.VoidName, "coreToggle"); this.ToolbarButton.Text = this.VoidName; this.SetIconTexture(this.powerState | this.activeState); @@ -973,6 +1001,8 @@ this.VOIDIconOffInactivePath = "VOID/Textures/void_icon_light"; this.VOIDIconOffActivePath = "VOID/Textures/void_icon_dark"; + this.vesselSimActive = true; + this.UseToolbarManager = false; this.LoadConfig(); @@ -999,19 +1029,11 @@ } } - public static Engineer.VesselSimulator.SimManager simManager - { - get - { - return Engineer.VesselSimulator.SimManager.Instance; - } - } - public static double KerbinGee { get { - return core.Kerbin.gravParameter / Math.Pow(core.Kerbin.Radius, 2); + return core.Kerbin.gravParameter / (core.Kerbin.Radius * core.Kerbin.Radius); } } } --- a/VOID_DataLogger.cs +++ b/VOID_DataLogger.cs @@ -1,26 +1,35 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_DataLogger.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; using System.Collections.Generic; +using ToadicusTools; using UnityEngine; namespace VOID @@ -88,7 +97,7 @@ GUILayout.BeginVertical(); GUILayout.Label("System time: " + DateTime.Now.ToString("HH:mm:ss")); - GUILayout.Label(Tools.ConvertInterval(stopwatch1)); + GUILayout.Label(VOID_Tools.ConvertInterval(stopwatch1)); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); if (GUILayout.Button("Start")) --- a/VOID_DataValue.cs +++ b/VOID_DataValue.cs @@ -1,24 +1,33 @@ -// -// 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 . +// VOID +// +// VOID_DataValue.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using System; +using ToadicusTools; using UnityEngine; namespace VOID @@ -235,19 +244,26 @@ public virtual int DoGUIHorizontalPrec(int digits) { - float magnitude; - float magLimit; - - magnitude = (float)Math.Log10(Math.Abs(this)); - - magLimit = Mathf.Max(magnitude, 6f); - magLimit = Mathf.Round((float)Math.Ceiling(magLimit / 3f) * 3f); + double magnitude; + double magLimit; + + magnitude = Math.Log10(Math.Abs((double)this)); + + magLimit = Math.Max(Math.Abs(magnitude), 3d) + 3d; + magLimit = Math.Round(Math.Ceiling(magLimit / 3f)) * 3d; GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label(this.Label + "ⁱ:", GUILayout.ExpandWidth(true)); GUILayout.FlexibleSpace(); - GUILayout.Label(this.ValueUnitString(3, int.MinValue, (int)magnitude - digits), GUILayout.ExpandWidth(false)); + if (magnitude >= 0) + { + GUILayout.Label(this.ValueUnitString(3, int.MinValue, (int)magnitude - digits), GUILayout.ExpandWidth(false)); + } + else + { + GUILayout.Label(this.ValueUnitString(3, (int)magnitude + digits, int.MaxValue), GUILayout.ExpandWidth(false)); + } GUILayout.EndHorizontal(); if (Event.current.type == EventType.mouseUp) @@ -255,6 +271,11 @@ Rect lastRect = GUILayoutUtility.GetLastRect(); if (lastRect.Contains(Event.current.mousePosition)) { + Tools.PostDebugMessage(string.Format("{0}: Changing digits from {1} within magLimit {2}.", + this.GetType().Name, + digits, + magLimit)); + if (Event.current.button == 0) { digits = (digits + 3) % (int)magLimit; @@ -262,11 +283,22 @@ else if (Event.current.button == 1) { digits = (digits - 3) % (int)magLimit; - if (digits < 0) - { - digits = (int)magLimit - 3; - } } + + if (digits < 0) + { + digits += (int)magLimit; + } + + Tools.PostDebugMessage(string.Format("{0}: Changed digits to {1}." + + "\n\tNew minMagnitude: {2}, maxMagnitude: {3}" + + "\n\tMagnitude: {4}", + this.GetType().Name, + digits, + magnitude >= 0 ? int.MinValue : (int)magnitude - 4 + digits, + magnitude >= 0 ? (int)magnitude - digits : int.MaxValue, + magnitude + )); } } --- a/VOID_EditorCore.cs +++ b/VOID_EditorCore.cs @@ -1,28 +1,37 @@ +// VOID // -// VOID_EditorCore.cs +// VOID_EditorCore.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using Engineer.VesselSimulator; using KSP; using System; using System.Collections.Generic; using System.Linq; +using ToadicusTools; using UnityEngine; namespace VOID @@ -120,10 +129,14 @@ this.StartGUI(); } - if (EditorLogic.SortedShipList.Count > 0) + if (EditorLogic.SortedShipList.Count > 0 && this.vesselSimActive) { - SimManager.Instance.Gravity = VOID_Data.KerbinGee; - SimManager.Instance.TryStartSimulation(); + SimManager.Gravity = VOID_Data.KerbinGee; + SimManager.TryStartSimulation(); + } + else if (!this.vesselSimActive) + { + SimManager.ClearResults(); } this.CheckAndSave (); --- a/VOID_EditorHUD.cs +++ b/VOID_EditorHUD.cs @@ -1,24 +1,30 @@ -// -// VOID_Hud.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 . -// +// VOID +// +// VOID_EditorHUD.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using Engineer.VesselSimulator; using KSP; @@ -26,6 +32,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using ToadicusTools; using UnityEngine; namespace VOID @@ -134,9 +141,9 @@ public override void DrawGUI() { - SimManager.Instance.RequestSimulation(); - - if (SimManager.Instance.LastStage == null) + SimManager.RequestSimulation(); + + if (SimManager.LastStage == null) { return; } @@ -166,7 +173,7 @@ labelStyle.normal.textColor = textColors [ColorIndex]; hudString.Append("Total Mass: "); - hudString.Append(SimManager.Instance.LastStage.totalMass.ToString("F3")); + hudString.Append(SimManager.LastStage.totalMass.ToString("F3")); hudString.Append('t'); hudString.Append(' '); @@ -177,19 +184,19 @@ hudString.Append('\n'); hudString.Append("Total Delta-V: "); - hudString.Append(Tools.MuMech_ToSI(SimManager.Instance.LastStage.totalDeltaV)); + hudString.Append(Tools.MuMech_ToSI(SimManager.LastStage.totalDeltaV)); hudString.Append("m/s"); hudString.Append('\n'); hudString.Append("Bottom Stage Delta-V"); - hudString.Append(Tools.MuMech_ToSI(SimManager.Instance.LastStage.deltaV)); + hudString.Append(Tools.MuMech_ToSI(SimManager.LastStage.deltaV)); hudString.Append("m/s"); hudString.Append('\n'); hudString.Append("Bottom Stage T/W Ratio: "); - hudString.Append(SimManager.Instance.LastStage.thrustToWeight.ToString("F3")); + hudString.Append(SimManager.LastStage.thrustToWeight.ToString("F3")); if (this.CoMmarker.gameObject.activeInHierarchy && this.CoTmarker.gameObject.activeInHierarchy) { --- a/VOID_HUD.cs +++ b/VOID_HUD.cs @@ -1,31 +1,38 @@ -// -// VOID_Hud.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 . -// +// VOID +// +// VOID_HUD.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using Engineer.VesselSimulator; using KSP; -using UnityEngine; using System; using System.Collections.Generic; using System.Text; +using ToadicusTools; +using UnityEngine; namespace VOID { @@ -211,7 +218,7 @@ if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate)) { - SimManager.Instance.RequestSimulation(); + SimManager.RequestSimulation(); } this.leftHUDPos.value = GUI.Window( @@ -262,62 +269,6 @@ () => core.vessel.getSurfacePitch(), "°" ); - - public static readonly VOID_DoubleValue stageMassFlow = new VOID_DoubleValue( - "Stage Mass Flow", - delegate() - { - if (simManager.LastStage == null) - { - return double.NaN; - } - - double stageIsp = simManager.LastStage.isp; - double stageThrust = simManager.LastStage.actualThrust; - - return stageThrust / (stageIsp * KerbinGee); - }, - "Mg/s" - ); - - public static readonly VOID_DoubleValue burnTimeCompleteAtNode = new VOID_DoubleValue( - "Full burn time to complete at node", - delegate() - { - if (simManager.LastStage == null) - { - return double.NaN; - } - - double nextManeuverDV = core.vessel.patchedConicSolver.maneuverNodes[0].DeltaV.magnitude; - double stageThrust = simManager.LastStage.actualThrust; - - return burnTime(nextManeuverDV, totalMass, stageMassFlow, stageThrust); - }, - "s" - ); - - public static readonly VOID_DoubleValue burnTimeHalfDoneAtNode = new VOID_DoubleValue( - "Full burn time to be half done at node", - delegate() - { - if (simManager.LastStage == null) - { - return double.NaN; - } - - double nextManeuverDV = core.vessel.patchedConicSolver.maneuverNodes[0].DeltaV.magnitude / 2d; - double stageThrust = simManager.LastStage.actualThrust; - - return burnTime(nextManeuverDV, totalMass, stageMassFlow, stageThrust); - }, - "s" - ); - - private static double burnTime(double deltaV, double initialMass, double massFlow, double thrust) - { - return initialMass / massFlow * (Math.Exp(deltaV * massFlow / thrust) - 1d); - } } } --- /dev/null +++ b/VOID_HUDAdvanced.cs @@ -1,1 +1,658 @@ - +// VOID +// +// VOID_HUD.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using Engineer.VesselSimulator; +using KSP; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ToadicusTools; +using UnityEngine; + +namespace VOID +{ + public class VOID_HUDAdvanced : VOID_Module, IVOID_Module + { + /* + * Fields + * */ + protected VOID_HUD primaryHUD; + + protected Rect leftHUDdefaultPos; + protected Rect rightHUDdefaultPos; + + [AVOID_SaveValue("leftHUDPos")] + protected VOID_SaveValue leftHUDPos; + [AVOID_SaveValue("rightHUDPos")] + protected VOID_SaveValue rightHUDPos; + + [AVOID_SaveValue("positionsLocked")] + protected VOID_SaveValue positionsLocked; + + /* + * Properties + * */ + public int ColorIndex + { + get + { + if (this.primaryHUD == null) + { + return 0; + } + + return this.primaryHUD.ColorIndex; + } + } + + /* + * Methods + * */ + public VOID_HUDAdvanced() : base() + { + this._Name = "Advanced Heads-Up Display"; + + this._Active.value = true; + + this.leftHUDdefaultPos = new Rect( + Screen.width * .5f - (float)GameSettings.UI_SIZE * .25f - 300f, + Screen.height - 200f, + 300f, 90f + ); + this.leftHUDPos = new Rect(this.leftHUDdefaultPos); + + this.rightHUDdefaultPos = new Rect( + Screen.width * .5f + (float)GameSettings.UI_SIZE * .25f, + Screen.height - 200f, + 300f, 90f + ); + this.rightHUDPos = new Rect(this.rightHUDdefaultPos); + + this.positionsLocked = true; + + Tools.PostDebugMessage (this, "Constructed."); + } + + protected void leftHUDWindow(int id) + { + StringBuilder leftHUD; + + leftHUD = new StringBuilder(); + + VOID_Core.Instance.LabelStyles["hud"].alignment = TextAnchor.UpperRight; + + if (VOID_Core.Instance.powerAvailable) + { + leftHUD.AppendFormat( + string.Intern("Mass: {0}\n"), + VOID_Data.totalMass.ToSIString(2) + ); + + if (VOID_Data.vesselCrewCapacity > 0) + { + leftHUD.AppendFormat( + string.Intern("Crew: {0} / {1}\n"), + VOID_Data.vesselCrewCount.Value, + VOID_Data.vesselCrewCapacity.Value + ); + } + + leftHUD.AppendFormat( + string.Intern("Acc: {0} T:W: {1}\n"), + VOID_Data.vesselAccel.ToSIString(2), + VOID_Data.currThrustWeight.Value.ToString("f2") + ); + + leftHUD.AppendFormat( + string.Intern("Ang Vel: {0}\n"), + VOID_Data.vesselAngularVelocity.ToSIString(2) + ); + + if (VOID_Data.stageNominalThrust != 0) + { + leftHUD.AppendFormat( + string.Intern("Thrust Offset: {0}\n"), + VOID_Data.vesselThrustOffset.Value.ToString("F1") + ); + } + } + else + { + VOID_Core.Instance.LabelStyles["hud"].normal.textColor = Color.red; + leftHUD.Append(string.Intern("-- POWER LOST --")); + } + + GUILayout.Label(leftHUD.ToString(), VOID_Core.Instance.LabelStyles["hud"], GUILayout.ExpandWidth(true)); + + if (!this.positionsLocked) + { + GUI.DragWindow(); + } + + GUI.BringWindowToBack(id); + } + + protected void rightHUDWindow(int id) + { + StringBuilder rightHUD; + + rightHUD = new StringBuilder(); + + VOID_Core.Instance.LabelStyles["hud"].alignment = TextAnchor.UpperLeft; + + if (VOID_Core.Instance.powerAvailable) + { + rightHUD.AppendFormat( + "Burn Δv (Rem/Tot): {0} / {1}\n", + VOID_Data.currManeuverDVRemaining.ValueUnitString("f2"), + VOID_Data.currManeuverDeltaV.ValueUnitString("f2") + ); + + if (VOID_Data.upcomingManeuverNodes > 1) + { + rightHUD.AppendFormat("Next Burn Δv: {0}\n", + VOID_Data.nextManeuverDeltaV.ValueUnitString("f2") + ); + } + + rightHUD.AppendFormat("Burn Time (Rem/Total): {0} / {1}\n", + VOID_Tools.ConvertInterval(VOID_Data.currentNodeBurnRemaining.Value), + VOID_Tools.ConvertInterval(VOID_Data.currentNodeBurnDuration.Value) + ); + + if (VOID_Data.burnTimeDoneAtNode.Value != string.Empty) + { + rightHUD.AppendFormat("{0} (done @ node)\n", + VOID_Data.burnTimeDoneAtNode.Value + ); + + rightHUD.AppendFormat("{0} (½ done @ node)", + VOID_Data.burnTimeHalfDoneAtNode.Value + ); + } + else + { + rightHUD.Append("Node is past"); + } + } + else + { + VOID_Core.Instance.LabelStyles["hud"].normal.textColor = Color.red; + rightHUD.Append(string.Intern("-- POWER LOST --")); + } + + GUILayout.Label(rightHUD.ToString(), VOID_Core.Instance.LabelStyles["hud"], GUILayout.ExpandWidth(true)); + + if (!this.positionsLocked) + { + GUI.DragWindow(); + } + + GUI.BringWindowToBack(id); + } + + public override void DrawGUI() + { + if (this.primaryHUD == null) + { + foreach (IVOID_Module module in VOID_Core.Instance.Modules) + { + if (module is VOID_HUD) + { + this.primaryHUD = module as VOID_HUD; + } + } + } + else + { + if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate)) + { + SimManager.RequestSimulation(); + } + + this.leftHUDPos.value = GUI.Window( + VOID_Core.Instance.windowID, + this.leftHUDPos, + this.leftHUDWindow, + GUIContent.none, + GUIStyle.none + ); + + if (VOID_Data.upcomingManeuverNodes > 0) + { + this.rightHUDPos.value = GUI.Window( + VOID_Core.Instance.windowID, + this.rightHUDPos, + this.rightHUDWindow, + GUIContent.none, + GUIStyle.none + ); + } + } + } + + public override void DrawConfigurables() + { + this.positionsLocked = GUILayout.Toggle(this.positionsLocked, + string.Intern("Lock Advanced HUD Positions"), + GUILayout.ExpandWidth(false)); + } + } + + public static partial class VOID_Data + { + public static int upcomingManeuverNodes + { + get + { + if (core.vessel == null || + core.vessel.patchedConicSolver == null || + core.vessel.patchedConicSolver.maneuverNodes == null + ) + { + return 0; + } + + return core.vessel.patchedConicSolver.maneuverNodes.Count; + } + } + + public static readonly VOID_Vector3dValue vesselThrustOffset = new VOID_Vector3dValue( + "Thrust Offset", + delegate() + { + if (core.vessel == null) + { + return Vector3d.zero; + } + + List engineModules = core.vessel.getModulesOfType(); + + Vector3d thrustPos = Vector3d.zero; + Vector3d thrustDir = Vector3d.zero; + float thrust = 0; + + foreach (PartModule engine in engineModules) + { + float moduleThrust = 0; + + switch (engine.moduleName) + { + case "ModuleEngines": + case "ModuleEnginesFX": + break; + default: + continue; + } + + if (!engine.isEnabled) + { + continue; + } + + CenterOfThrustQuery cotQuery = new CenterOfThrustQuery(); + + if (engine is ModuleEngines) + { + ModuleEngines engineModule = engine as ModuleEngines; + + moduleThrust = engineModule.finalThrust; + + engineModule.OnCenterOfThrustQuery(cotQuery); + } + else // engine is ModuleEnginesFX + { + ModuleEnginesFX engineFXModule = engine as ModuleEnginesFX; + + moduleThrust = engineFXModule.finalThrust; + + engineFXModule.OnCenterOfThrustQuery(cotQuery); + } + + if (moduleThrust != 0d) + { + cotQuery.thrust = moduleThrust; + } + + thrustPos += cotQuery.pos * cotQuery.thrust; + thrustDir += cotQuery.dir * cotQuery.thrust; + thrust += cotQuery.thrust; + } + + if (thrust != 0) + { + thrustPos /= thrust; + thrustDir /= thrust; + } + + Vector3d thrustOffset = VectorTools.PointDistanceToLine( + thrustPos, thrustDir.normalized, core.vessel.findWorldCenterOfMass()); + + Tools.PostDebugMessage(typeof(VOID_Data), "vesselThrustOffset:\n" + + "\tthrustPos: {0}\n" + + "\tthrustDir: {1}\n" + + "\tthrustOffset: {2}\n" + + "\tvessel.CoM: {3}", + thrustPos, + thrustDir.normalized, + thrustOffset, + core.vessel.findWorldCenterOfMass() + ); + + return thrustOffset; + }, + "m" + ); + + public static readonly VOID_DoubleValue vesselAccel = new VOID_DoubleValue( + "Acceleration", + () => geeForce * KerbinGee, + "m/s" + ); + + public static readonly VOID_IntValue vesselCrewCount = new VOID_IntValue( + "Crew Onboard", + delegate() + { + if (core.vessel != null) + { + return core.vessel.GetCrewCount(); + } + else + { + return 0; + } + }, + "" + ); + + public static readonly VOID_IntValue vesselCrewCapacity = new VOID_IntValue( + "Crew Capacity", + delegate() + { + if (core.vessel != null) + { + return core.vessel.GetCrewCapacity(); + } + else + { + return 0; + } + }, + "" + ); + + public static readonly VOID_DoubleValue vesselAngularVelocity = new VOID_DoubleValue( + "Angular Velocity", + delegate() + { + if (core.vessel != null) + { + return core.vessel.angularVelocity.magnitude; + } + else + { + return double.NaN; + } + }, + "rad/s" + ); + + public static readonly VOID_DoubleValue stageNominalThrust = new VOID_DoubleValue( + "Nominal Stage Thrust", + delegate() + { + if (SimManager.LastStage == null) + { + return double.NaN; + } + + if (SimManager.LastStage.actualThrust == 0d) + { + return SimManager.LastStage.thrust; + } + else + { + return SimManager.LastStage.actualThrust; + } + }, + "kN" + ); + + public static readonly VOID_DoubleValue stageMassFlow = new VOID_DoubleValue( + "Stage Mass Flow", + delegate() + { + if (SimManager.LastStage == null) + { + return double.NaN; + } + + double stageIsp = SimManager.LastStage.isp; + double stageThrust = stageNominalThrust; + + Tools.PostDebugMessage(typeof(VOID_Data), "calculating stageMassFlow from:\n" + + "\tstageIsp: {0}\n" + + "\tstageThrust: {1}\n" + + "\tKerbinGee: {2}\n", + stageIsp, + stageThrust, + KerbinGee + ); + + return stageThrust / (stageIsp * KerbinGee); + }, + "Mg/s" + ); + + public static readonly VOID_DoubleValue currManeuverDeltaV = new VOID_DoubleValue( + "Current Maneuver Delta-V", + delegate() + { + if (upcomingManeuverNodes > 0) + { + return core.vessel.patchedConicSolver.maneuverNodes[0].DeltaV.magnitude; + } + else + { + return double.NaN; + } + }, + "m/s" + ); + + public static readonly VOID_DoubleValue currManeuverDVRemaining = new VOID_DoubleValue( + "Remaining Maneuver Delta-V", + delegate() + { + if (upcomingManeuverNodes > 0) + { + return core.vessel.patchedConicSolver.maneuverNodes[0].GetBurnVector(core.vessel.orbit).magnitude; + } + else + { + return double.NaN; + } + }, + "m/s" + ); + + public static readonly VOID_DoubleValue nextManeuverDeltaV = new VOID_DoubleValue( + "Current Maneuver Delta-V", + delegate() + { + if (upcomingManeuverNodes > 1) + { + return core.vessel.patchedConicSolver.maneuverNodes[1].DeltaV.magnitude; + } + else + { + return double.NaN; + } + }, + "m/s" + ); + + public static readonly VOID_DoubleValue currentNodeBurnDuration = new VOID_DoubleValue( + "Total Burn Time", + delegate() + { + if (SimManager.LastStage == null || currManeuverDeltaV.Value == double.NaN) + { + return double.NaN; + } + + double stageThrust = stageNominalThrust; + + return burnTime(currManeuverDeltaV.Value, totalMass, stageMassFlow, stageThrust); + }, + "s" + ); + + public static readonly VOID_DoubleValue currentNodeBurnRemaining = new VOID_DoubleValue( + "Burn Time Remaining", + delegate() + { + if (SimManager.LastStage == null || currManeuverDVRemaining == double.NaN) + { + return double.NaN; + } + + double stageThrust = stageNominalThrust; + + return burnTime(currManeuverDVRemaining, totalMass, stageMassFlow, stageThrust); + }, + "s" + ); + + public static readonly VOID_DoubleValue currentNodeHalfBurnDuration = new VOID_DoubleValue( + "Half Burn Time", + delegate() + { + if (SimManager.LastStage == null || currManeuverDeltaV.Value == double.NaN) + { + return double.NaN; + } + + double stageThrust = stageNominalThrust; + + return burnTime(currManeuverDeltaV.Value / 2d, totalMass, stageMassFlow, stageThrust); + }, + "s" + ); + + public static readonly VOID_StrValue burnTimeDoneAtNode = new VOID_StrValue( + "Full burn time to be half done at node", + delegate() + { + if (SimManager.LastStage == null && upcomingManeuverNodes < 1) + { + return "N/A"; + } + + ManeuverNode node = core.vessel.patchedConicSolver.maneuverNodes[0]; + + if ((node.UT - Planetarium.GetUniversalTime()) < 0) + { + return string.Empty; + } + + double interval = (node.UT - currentNodeBurnDuration) - Planetarium.GetUniversalTime(); + + int sign = Math.Sign(interval); + interval = Math.Abs(interval); + + string format; + + if (sign >= 0) + { + format = string.Intern("T - {0}"); + } + else + { + format = string.Intern("T + {0}"); + } + + return string.Format(format, VOID_Tools.ConvertInterval(interval)); + } + ); + + public static readonly VOID_StrValue burnTimeHalfDoneAtNode = new VOID_StrValue( + "Full burn time to be half done at node", + delegate() + { + if (SimManager.LastStage == null && upcomingManeuverNodes < 1) + { + return "N/A"; + } + + ManeuverNode node = core.vessel.patchedConicSolver.maneuverNodes[0]; + + if ((node.UT - Planetarium.GetUniversalTime()) < 0) + { + return string.Empty; + } + + double interval = (node.UT - currentNodeHalfBurnDuration) - Planetarium.GetUniversalTime(); + + int sign = Math.Sign(interval); + interval = Math.Abs(interval); + + string format; + + if (sign >= 0) + { + format = string.Intern("T - {0}"); + } + else + { + format = string.Intern("T + {0}"); + } + + return string.Format(format, VOID_Tools.ConvertInterval(interval)); + } + ); + + private static double burnTime(double deltaV, double initialMass, double massFlow, double thrust) + { + Tools.PostDebugMessage(typeof(VOID_Data), "calculating burnTime from:\n" + + "\tdeltaV: {0}\n" + + "\tinitialMass: {1}\n" + + "\tmassFlow: {2}\n" + + "\tthrust: {3}\n", + deltaV, + initialMass, + massFlow, + thrust + ); + return initialMass / massFlow * (Math.Exp(deltaV * massFlow / thrust) - 1d); + } + } +} + --- /dev/null +++ b/VOID_Localization.cs @@ -1,1 +1,36 @@ +// VOID +// +// VOID_Localization.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +public static class VOID_Localization +{ + public static string void_primary = "Primary"; + public static string void_altitude_asl = "Altitude (ASL)"; + public static string void_velocity = "Velocity"; + public static string void_apoapsis = "Apoapsis"; + public static string void_periapsis = "Periapsis"; +} --- a/VOID_Module.cs +++ b/VOID_Module.cs @@ -1,27 +1,36 @@ -// -// VOID_Module.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 . +// VOID +// +// VOID_Module.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using ToadicusTools; using UnityEngine; namespace VOID @@ -42,6 +51,14 @@ /* * Properties * */ + protected virtual VOID_Core core + { + get + { + return VOID_Core.Instance; + } + } + public virtual bool toggleActive { get --- a/VOID_Orbital.cs +++ b/VOID_Orbital.cs @@ -1,25 +1,34 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_Orbital.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; +using ToadicusTools; using UnityEngine; namespace VOID @@ -119,8 +128,15 @@ public static partial class VOID_Data { public static readonly VOID_StrValue primaryName = new VOID_StrValue ( - VOIDLabels.void_primary, - new Func (() => VOID_Core.Instance.vessel.mainBody.name) + VOID_Localization.void_primary, + delegate() + { + if (VOID_Core.Instance.vessel == null) + { + return string.Empty; + } + return VOID_Core.Instance.vessel.mainBody.name; + } ); public static readonly VOID_DoubleValue orbitAltitude = new VOID_DoubleValue ( @@ -130,31 +146,31 @@ ); public static readonly VOID_DoubleValue orbitVelocity = new VOID_DoubleValue ( - VOIDLabels.void_velocity, + VOID_Localization.void_velocity, new Func (() => VOID_Core.Instance.vessel.orbit.vel.magnitude), "m/s" ); public static readonly VOID_DoubleValue orbitApoAlt = new VOID_DoubleValue( - VOIDLabels.void_apoapsis, + VOID_Localization.void_apoapsis, new Func(() => VOID_Core.Instance.vessel.orbit.ApA), "m" ); public static readonly VOID_DoubleValue oribtPeriAlt = new VOID_DoubleValue( - VOIDLabels.void_periapsis, + VOID_Localization.void_periapsis, new Func(() => VOID_Core.Instance.vessel.orbit.PeA), "m" ); public static readonly VOID_StrValue timeToApo = new VOID_StrValue( "Time to Apoapsis", - new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToAp)) + new Func(() => VOID_Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToAp)) ); public static readonly VOID_StrValue timeToPeri = new VOID_StrValue( "Time to Periapsis", - new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToPe)) + new Func(() => VOID_Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.timeToPe)) ); public static readonly VOID_DoubleValue orbitInclination = new VOID_DoubleValue( @@ -177,7 +193,7 @@ public static readonly VOID_StrValue orbitPeriod = new VOID_StrValue( "Period", - new Func(() => Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.period)) + new Func(() => VOID_Tools.ConvertInterval(VOID_Core.Instance.vessel.orbit.period)) ); public static readonly VOID_DoubleValue semiMajorAxis = new VOID_DoubleValue( @@ -224,7 +240,7 @@ public static readonly VOID_DoubleValue localSiderealLongitude = new VOID_DoubleValue( "Local Sidereal Longitude", - new Func(() => Tools.FixDegreeDomain( + new Func(() => VOID_Tools.FixDegreeDomain( VOID_Core.Instance.vessel.longitude + VOID_Core.Instance.vessel.orbit.referenceBody.rotationAngle)), "°" ); --- a/VOID_Rendezvous.cs +++ b/VOID_Rendezvous.cs @@ -1,27 +1,36 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_Rendezvous.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; using System.Collections.Generic; using System.Linq; +using ToadicusTools; using UnityEngine; namespace VOID @@ -49,7 +58,10 @@ Vessel rendezvessel = new Vessel(); CelestialBody rendezbody = new CelestialBody(); - this.RegisterModule = VOID_Core.Instance.Modules.Where(m => typeof(VOID_VesselRegister).IsAssignableFrom(m.GetType())).FirstOrDefault() as VOID_VesselRegister; + if (this.RegisterModule == null) + { + this.RegisterModule = VOID_Core.Instance.Modules.Where(m => typeof(VOID_VesselRegister).IsAssignableFrom(m.GetType())).FirstOrDefault() as VOID_VesselRegister; + } GUILayout.BeginVertical(); @@ -59,13 +71,13 @@ if (FlightGlobals.fetch.VesselTarget != null) { //a KSP Target (body or vessel) is selected - if (FlightGlobals.fetch.vesselTargetMode == FlightGlobals.VesselTargetModes.Direction) + if (FlightGlobals.fetch.vesselTargetMode == VesselTargetModes.Direction) { //a Body is selected rendezbody = vessel.patchedConicSolver.targetBody; display_rendezvous_info(null, rendezbody); } - else if (FlightGlobals.fetch.vesselTargetMode == FlightGlobals.VesselTargetModes.DirectionAndVelocity) + else if (FlightGlobals.fetch.vesselTargetMode == VesselTargetModes.DirectionAndVelocity) { //a Vessel is selected rendezvessel = FlightGlobals.fetch.VesselTarget.GetVessel(); @@ -139,7 +151,7 @@ // Toadicus edit: added local sidereal longitude. // Toadicus edit: added local sidereal longitude. double LSL = v.longitude + v.orbit.referenceBody.rotationAngle; - LSL = Tools.FixDegreeDomain (LSL); + LSL = VOID_Tools.FixDegreeDomain (LSL); //display orbital info for orbiting/flying/suborbital/escaping vessels only GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); @@ -187,7 +199,7 @@ { GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Period:"); - GUILayout.Label(Tools.ConvertInterval(v.orbit.period), GUILayout.ExpandWidth(false)); + GUILayout.Label(VOID_Tools.ConvertInterval(v.orbit.period), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); @@ -238,12 +250,12 @@ { GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Latitude:"); - GUILayout.Label(Tools.GetLatitudeString(vessel), GUILayout.ExpandWidth(false)); + GUILayout.Label(VOID_Tools.GetLatitudeString(vessel), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label("Longitude:"); - GUILayout.Label(Tools.GetLongitudeString(vessel), GUILayout.ExpandWidth(false)); + GUILayout.Label(VOID_Tools.GetLongitudeString(vessel), GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); @@ -288,28 +300,28 @@ //SUN2PLANET: if (vessel.mainBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody) { - Tools.display_transfer_angles_SUN2PLANET(cb, vessel); + VOID_Tools.display_transfer_angles_SUN2PLANET(cb, vessel); //if (debugging) Debug.Log("[VOID] SUN2PLANET OK"); } //PLANET2PLANET else if (vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody.referenceBody) { - Tools.display_transfer_angles_PLANET2PLANET(cb, vessel); + VOID_Tools.display_transfer_angles_PLANET2PLANET(cb, vessel); //if (debugging) Debug.Log("[VOID] PLANET2PLANET OK"); } //PLANET2MOON else if (vessel.mainBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody) { - Tools.display_transfer_angles_PLANET2MOON(cb, vessel); + VOID_Tools.display_transfer_angles_PLANET2MOON(cb, vessel); //if (debugging) Debug.Log("[VOID] PLANET2MOON OK"); } //MOON2MOON else if (vessel.mainBody.referenceBody.referenceBody.bodyName == "Sun" && cb.referenceBody == vessel.mainBody.referenceBody) { - Tools.display_transfer_angles_MOON2MOON(cb, vessel); + VOID_Tools.display_transfer_angles_MOON2MOON(cb, vessel); //if (debugging) Debug.Log("[VOID] MOON2MOON OK"); } --- a/VOID_SaveValue.cs +++ b/VOID_SaveValue.cs @@ -1,26 +1,35 @@ +// VOID // -// VOID_Config.cs +// VOID_SaveValue.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using KSP; using System; using System.Collections.Generic; -using KSP; +using ToadicusTools; using UnityEngine; namespace VOID --- a/VOID_SurfAtmo.cs +++ b/VOID_SurfAtmo.cs @@ -1,25 +1,34 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_SurfAtmo.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; +using ToadicusTools; using UnityEngine; namespace VOID @@ -116,12 +125,12 @@ public static readonly VOID_StrValue surfLatitude = new VOID_StrValue( "Latitude", - new Func (() => Tools.GetLatitudeString(VOID_Core.Instance.vessel)) + new Func (() => VOID_Tools.GetLatitudeString(VOID_Core.Instance.vessel)) ); public static readonly VOID_StrValue surfLongitude = new VOID_StrValue( "Longitude", - new Func (() => Tools.GetLongitudeString(VOID_Core.Instance.vessel)) + new Func (() => VOID_Tools.GetLongitudeString(VOID_Core.Instance.vessel)) ); public static readonly VOID_StrValue vesselHeading = new VOID_StrValue( @@ -129,7 +138,7 @@ delegate() { double heading = core.vessel.getSurfaceHeading(); - string cardinal = Tools.get_heading_text(heading); + string cardinal = VOID_Tools.get_heading_text(heading); return string.Format( "{0}° {1}", @@ -189,7 +198,7 @@ public static readonly VOID_StrValue currBiome = new VOID_StrValue( "Biome", - new Func (() => Tools.Toadicus_GetAtt(VOID_Core.Instance.vessel).name) + new Func (() => VOID_Tools.GetBiome(VOID_Core.Instance.vessel).name) ); } --- /dev/null +++ b/VOID_Tools.cs @@ -1,1 +1,770 @@ - +// VOID +// +// VOID_Tools.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using KSP; +using System; +using UnityEngine; + +namespace VOID +{ + public static partial class VOID_Tools + { + #region VESSEL_EXTENSIONS_SCIENCE + public static CBAttributeMap.MapAttribute GetBiome(this Vessel vessel) + { + CBAttributeMap.MapAttribute mapAttribute; + + try + { + CBAttributeMap BiomeMap = vessel.mainBody.BiomeMap; + + double lat = vessel.latitude * Math.PI / 180d; + double lon = vessel.longitude * Math.PI / 180d; + + mapAttribute = BiomeMap.GetAtt(lat, lon); + + /* + lon -= Math.PI / 2d; + + if (lon < 0d) + { + lon += 2d * Math.PI; + } + + float v = (float)(lat / Math.PI) + 0.5f; + float u = (float)(lon / (2d * Math.PI)); + + Color pixelBilinear = BiomeMap.Map.GetPixelBilinear(u, v); + mapAttribute = BiomeMap.defaultAttribute; + + if (BiomeMap.Map != null) + { + if (BiomeMap.exactSearch) + { + for (int i = 0; i < BiomeMap.Attributes.Length; ++i) + { + if (pixelBilinear == BiomeMap.Attributes[i].mapColor) + { + mapAttribute = BiomeMap.Attributes[i]; + } + } + } + else + { + float zero = 0; + float num = 1 / zero; + for (int j = 0; j < BiomeMap.Attributes.Length; ++j) + { + Color mapColor = BiomeMap.Attributes[j].mapColor; + float sqrMagnitude = ((Vector4)(mapColor - pixelBilinear)).sqrMagnitude; + if (sqrMagnitude < num) + { + bool testCase = true; + if (BiomeMap.nonExactThreshold != -1) + { + testCase = (sqrMagnitude < BiomeMap.nonExactThreshold); + } + if (testCase) + { + mapAttribute = BiomeMap.Attributes[j]; + num = sqrMagnitude; + } + } + } + } + } + */ + } + catch (NullReferenceException) + { + mapAttribute = new CBAttributeMap.MapAttribute(); + mapAttribute.name = "N/A"; + } + + return mapAttribute; + } + + public static ExperimentSituations GetExperimentSituation(this Vessel vessel) + { + if (vessel == null) + { + return ExperimentSituations.SrfSplashed; + } + + Vessel.Situations situation = vessel.situation; + + switch (situation) + { + case Vessel.Situations.PRELAUNCH: + case Vessel.Situations.LANDED: + return ExperimentSituations.SrfLanded; + case Vessel.Situations.SPLASHED: + return ExperimentSituations.SrfSplashed; + case Vessel.Situations.FLYING: + if (vessel.altitude < (double)vessel.mainBody.scienceValues.flyingAltitudeThreshold) + { + return ExperimentSituations.FlyingLow; + } + else + { + return ExperimentSituations.FlyingHigh; + } + } + + if (vessel.altitude < (double)vessel.mainBody.scienceValues.spaceAltitudeThreshold) + { + return ExperimentSituations.InSpaceLow; + } + else + { + return ExperimentSituations.InSpaceHigh; + } + } + + public static string HumanString(this ExperimentSituations situation) + { + switch (situation) + { + case ExperimentSituations.FlyingHigh: + return "Upper Atmosphere"; + case ExperimentSituations.FlyingLow: + return "Flying"; + case ExperimentSituations.SrfLanded: + return "Surface"; + case ExperimentSituations.InSpaceLow: + return "Near in Space"; + case ExperimentSituations.InSpaceHigh: + return "High in Space"; + case ExperimentSituations.SrfSplashed: + return "Splashed Down"; + default: + return "Unknown"; + } + } + #endregion + + #region VESSEL_EXTENSIONS_LAT_LONG + public static string GetLongitudeString(this Vessel vessel, string format = "F4") + { + string dir_long = "W"; + double v_long = vessel.longitude; + + v_long = FixDegreeDomain(v_long); + + if (v_long < -180d) + { + v_long += 360d; + } + if (v_long >= 180) + { + v_long -= 360d; + } + + if (v_long > 0) + dir_long = "E"; + + return string.Format("{0}° {1}", Math.Abs(v_long).ToString(format), dir_long); + } + + public static string GetLatitudeString(this Vessel vessel, string format = "F4") + { + string dir_lat = "S"; + double v_lat = vessel.latitude; + if (v_lat > 0) + dir_lat = "N"; + + return string.Format("{0}° {1}", Math.Abs(v_lat).ToString(format), dir_lat); + } + #endregion + + #region VESSEL_EXTENSIONS_GENERAL + 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. + if (vessel.terrainAltitude < 0 && vessel.mainBody.ocean) + { + trueAltitude = vessel.orbit.altitude; + } + + return trueAltitude; + } + + public static double Radius(this Vessel vessel) + { + double radius; + + radius = vessel.altitude; + + if (vessel.mainBody != null) + { + radius += vessel.mainBody.Radius; + } + + return radius; + } + #endregion + + #region GEOMETRY_UTILS + public static double FixAngleDomain(double Angle, bool Degrees = false) + { + double Extent = 2d * Math.PI; + if (Degrees) + { + Extent = 360d; + } + + Angle = Angle % (Extent); + if (Angle < 0d) + { + Angle += Extent; + } + + return Angle; + } + + public static double FixDegreeDomain(double Angle) + { + return FixAngleDomain(Angle, true); + } + #endregion + + /// + /// Converts the interval given in seconds to a human-friendly + /// time period in [years], [days], hours, minutes, and seconds. + /// + /// Uses sidereal days, since "6 hours per day" is the Kerbal standard. + /// + /// Human readable interval + /// + public static string ConvertInterval(double seconds) + { + double SecondsPerMinute = 60d; + double SecondsPerHour = 3600d; + double SecondsPerDay; + double SecondsPerYear; + + if (GameSettings.KERBIN_TIME) + { + SecondsPerDay = 21600d; + SecondsPerYear = 9203545d; + } + else + { + SecondsPerDay = 86164.1d; + SecondsPerYear = 31558149d; + } + + int years; + int days; + int hours; + int minutes; + + years = (int)(seconds / SecondsPerYear); + + seconds %= SecondsPerYear; + + days = (int)(seconds / SecondsPerDay); + + seconds %= SecondsPerDay; + + hours = (int)(seconds / SecondsPerHour); + + seconds %= SecondsPerHour; + + minutes = (int)(seconds / SecondsPerMinute); + + seconds %= SecondsPerMinute; + + string format_1 = string.Intern("{0:D1}y {1:D1}d {2:D2}h {3:D2}m {4:00.0}s"); + string format_2 = string.Intern("{0:D1}d {1:D2}h {2:D2}m {3:00.0}s"); + string format_3 = string.Intern("{0:D2}h {1:D2}m {2:00.0}s"); + string format_4 = string.Intern("{0:D2}m {1:00.0}s"); + string format_5 = string.Intern("{0:00.0}s"); + + if (years > 0) + { + return string.Format(format_1, years, days, hours, minutes, seconds); + } + else if (days > 0) + { + return string.Format(format_2, days, hours, minutes, seconds); + } + else if (hours > 0) + { + return string.Format(format_3, hours, minutes, seconds); + } + else if (minutes > 0) + { + return string.Format(format_4, minutes, seconds); + } + else + { + return string.Format(format_5, seconds); + } + } + + 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 + # r1 = initial body's orbit radius + # r2 = target body's orbit radius + + # return value is km/s + sur1 = math.sqrt(mu / r1) + sr1r2 = math.sqrt(float(2*r2)/float(r1+r2)) + 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) + { + /* + def deltaVToExitSOI(mu, r1, r2, v): + # mu = gravity param of current body + # r1 = current orbit radius + # r2 = SOI radius + # v = SOI exit velocity + foo = r2 * (v**2) - 2 * mu + bar = r1 * foo + (2 * r2 * mu) + 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) + { + /* + def transferBurnPoint(r, v, angle, mu): + # r = parking orbit radius + # v = ejection velocity + # angle = phase angle (from function phaseAngle()) + # mu = gravity param of current body. + epsilon = ((v**2)/2) - (mu / r) + h = r * v * math.sin(angle) + e = math.sqrt(1 + ((2 * epsilon * h**2)/(mu**2))) + theta = math.acos(1.0 / e) + 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; + } + + 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 void display_transfer_angles_SUN2PLANET(CelestialBody body, Vessel vessel) + { + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Phase angle (curr/trans):"); + GUILayout.Label( + VOID_Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + VOID_Tools.Nivvy_CalcTransferPhaseAngle( + vessel.orbit.semiMajorAxis, + body.orbit.semiMajorAxis, + vessel.mainBody.gravParameter + ).ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Transfer velocity:"); + GUILayout.Label( + (VOID_Tools.Younata_DeltaVToGetToOtherBody( + (vessel.mainBody.gravParameter / 1000000000), + (vessel.orbit.semiMajorAxis / 1000), + (body.orbit.semiMajorAxis / 1000) + ) * 1000).ToString("F2") + "m/s", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + } + + public static void display_transfer_angles_PLANET2PLANET(CelestialBody body, Vessel vessel) + { + double dv1 = VOID_Tools.Younata_DeltaVToGetToOtherBody( + (vessel.mainBody.referenceBody.gravParameter / 1000000000), + (vessel.mainBody.orbit.semiMajorAxis / 1000), + (body.orbit.semiMajorAxis / 1000) + ); + double dv2 = VOID_Tools.Younata_DeltaVToExitSOI( + (vessel.mainBody.gravParameter / 1000000000), + (vessel.orbit.semiMajorAxis / 1000), + (vessel.mainBody.sphereOfInfluence / 1000), + Math.Abs(dv1) + ); + + double trans_ejection_angle = VOID_Tools.Younata_TransferBurnPoint( + (vessel.orbit.semiMajorAxis / 1000), + dv2, + (Math.PI / 2.0), + (vessel.mainBody.gravParameter / 1000000000) + ); + double curr_ejection_angle = VOID_Tools.Adammada_CurrentEjectionAngle( + FlightGlobals.ActiveVessel.longitude, + FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent + ); + + double trans_phase_angle = VOID_Tools.Nivvy_CalcTransferPhaseAngle( + vessel.mainBody.orbit.semiMajorAxis, + body.orbit.semiMajorAxis, + vessel.mainBody.referenceBody.gravParameter + ) % 360; + double curr_phase_angle = VOID_Tools.Adammada_CurrrentPhaseAngle( + body.orbit.LAN, + body.orbit.orbitPercent, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent + ); + + double adj_phase_angle = VOID_Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle); + double adj_trans_ejection_angle = VOID_Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle); + double adj_curr_ejection_angle = VOID_Tools.adjust_current_ejection_angle(curr_ejection_angle); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Phase angle (curr/trans):"); + GUILayout.Label( + adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Ejection angle (curr/trans):"); + GUILayout.Label( + adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Transfer velocity:"); + GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); + GUILayout.EndHorizontal(); + } + + public static void display_transfer_angles_PLANET2MOON(CelestialBody body, Vessel vessel) + { + double dv1 = VOID_Tools.Younata_DeltaVToGetToOtherBody( + (vessel.mainBody.gravParameter / 1000000000), + (vessel.orbit.semiMajorAxis / 1000), + (body.orbit.semiMajorAxis / 1000) + ); + + double trans_phase_angle = VOID_Tools.Nivvy_CalcTransferPhaseAngle( + vessel.orbit.semiMajorAxis, + body.orbit.semiMajorAxis, + vessel.mainBody.gravParameter + ); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Phase angle (curr/trans):"); + GUILayout.Label( + VOID_Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Transfer velocity:"); + GUILayout.Label((dv1 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); + GUILayout.EndHorizontal(); + } + + public static void display_transfer_angles_MOON2MOON(CelestialBody body, Vessel vessel) + { + double dv1 = VOID_Tools.Younata_DeltaVToGetToOtherBody( + (vessel.mainBody.referenceBody.gravParameter / 1000000000), + (vessel.mainBody.orbit.semiMajorAxis / 1000), + (body.orbit.semiMajorAxis / 1000) + ); + double dv2 = VOID_Tools.Younata_DeltaVToExitSOI( + (vessel.mainBody.gravParameter / 1000000000), + (vessel.orbit.semiMajorAxis / 1000), + (vessel.mainBody.sphereOfInfluence / 1000), + Math.Abs(dv1) + ); + double trans_ejection_angle = VOID_Tools.Younata_TransferBurnPoint( + (vessel.orbit.semiMajorAxis / 1000), + dv2, + (Math.PI / 2.0), + (vessel.mainBody.gravParameter / 1000000000) + ); + + double curr_phase_angle = VOID_Tools.Adammada_CurrrentPhaseAngle( + body.orbit.LAN, + body.orbit.orbitPercent, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent + ); + double curr_ejection_angle = VOID_Tools.Adammada_CurrentEjectionAngle( + FlightGlobals.ActiveVessel.longitude, + FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN, + FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent + ); + + double trans_phase_angle = VOID_Tools.Nivvy_CalcTransferPhaseAngle( + vessel.mainBody.orbit.semiMajorAxis, + body.orbit.semiMajorAxis, + vessel.mainBody.referenceBody.gravParameter + ) % 360; + + double adj_phase_angle = VOID_Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle); + //double adj_ejection_angle = adjustCurrEjectionAngle(trans_phase_angle, curr_ejection_angle); + + //new stuff + // + double adj_trans_ejection_angle = VOID_Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle); + double adj_curr_ejection_angle = VOID_Tools.adjust_current_ejection_angle(curr_ejection_angle); + // + // + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Phase angle (curr/trans):"); + GUILayout.Label( + adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Ejection angle (curr/trans):"); + GUILayout.Label( + adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°", + GUILayout.ExpandWidth(false) + ); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + GUILayout.Label("Transfer velocity:"); + GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false)); + GUILayout.EndHorizontal(); + } + + public static string get_heading_text(double heading) + { + if (heading > 348.75 || heading <= 11.25) + return "N"; + else if (heading > 11.25 && heading <= 33.75) + return "NNE"; + else if (heading > 33.75 && heading <= 56.25) + return "NE"; + else if (heading > 56.25 && heading <= 78.75) + return "ENE"; + else if (heading > 78.75 && heading <= 101.25) + return "E"; + else if (heading > 101.25 && heading <= 123.75) + return "ESE"; + else if (heading > 123.75 && heading <= 146.25) + return "SE"; + else if (heading > 146.25 && heading <= 168.75) + return "SSE"; + else if (heading > 168.75 && heading <= 191.25) + return "S"; + else if (heading > 191.25 && heading <= 213.75) + return "SSW"; + else if (heading > 213.75 && heading <= 236.25) + return "SW"; + else if (heading > 236.25 && heading <= 258.75) + return "WSW"; + else if (heading > 258.75 && heading <= 281.25) + return "W"; + else if (heading > 281.25 && heading <= 303.75) + return "WNW"; + else if (heading > 303.75 && heading <= 326.25) + return "NW"; + else if (heading > 326.25 && heading <= 348.75) + return "NNW"; + else + return ""; + } + } +} + + --- a/VOID_Transfer.cs +++ b/VOID_Transfer.cs @@ -1,27 +1,36 @@ +// VOID // -// VOID_Orbital.cs +// VOID_Transfer.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; using System.Collections.Generic; using System.Linq; +using ToadicusTools; using UnityEngine; namespace VOID @@ -59,7 +68,7 @@ if (selectedBodies.Contains(body)) { - Tools.display_transfer_angles_SUN2PLANET(body, vessel); //show phase angles for each selected body + VOID_Tools.display_transfer_angles_SUN2PLANET(body, vessel); //show phase angles for each selected body tad_targeting(body); //display Set/Unset Target button for each selected body } } @@ -82,7 +91,7 @@ if (selectedBodies.Contains(body)) { - Tools.display_transfer_angles_PLANET2PLANET(body, vessel); + VOID_Tools.display_transfer_angles_PLANET2PLANET(body, vessel); tad_targeting(body); //display Set/Unset Target button } } @@ -101,7 +110,7 @@ if (selectedBodies.Contains(body)) { - Tools.display_transfer_angles_PLANET2MOON(body, vessel); + VOID_Tools.display_transfer_angles_PLANET2MOON(body, vessel); tad_targeting(body); //display Set/Unset Target button } } @@ -124,7 +133,7 @@ if (selectedBodies.Contains(body)) { - Tools.display_transfer_angles_MOON2MOON(body, vessel); + VOID_Tools.display_transfer_angles_MOON2MOON(body, vessel); tad_targeting(body); //display Set/Unset Target button } } --- a/VOID_VesselInfo.cs +++ b/VOID_VesselInfo.cs @@ -1,29 +1,38 @@ -// -// VOID_Orbital.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 . +// VOID +// +// VOID_VesselInfo.cs +// +// Copyright © 2014, toadicus +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using Engineer.VesselSimulator; +using Engineer.Extensions; using KSP; using System; using System.Collections.Generic; +using ToadicusTools; using UnityEngine; -using Engineer.VesselSimulator; -using Engineer.Extensions; namespace VOID { @@ -43,7 +52,7 @@ if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate)) { - SimManager.Instance.RequestSimulation(); + SimManager.RequestSimulation(); } GUILayout.BeginVertical(); @@ -53,55 +62,29 @@ VOID_Core.Instance.LabelStyles["center_bold"], GUILayout.ExpandWidth(true)); - Tools.PostDebugMessage("Starting VesselInfo window."); - VOID_Data.geeForce.DoGUIHorizontal ("F2"); - Tools.PostDebugMessage("GeeForce done."); - VOID_Data.partCount.DoGUIHorizontal (); - Tools.PostDebugMessage("PartCount done."); - - VOID_Data.totalMass.DoGUIHorizontal ("F1"); - - Tools.PostDebugMessage("TotalMass done."); - - VOID_Data.resourceMass.DoGUIHorizontal ("F1"); - - Tools.PostDebugMessage("ResourceMass done."); + VOID_Data.totalMass.DoGUIHorizontal ("F3"); + + VOID_Data.resourceMass.DoGUIHorizontal ("F3"); VOID_Data.stageDeltaV.DoGUIHorizontal (3, false); - Tools.PostDebugMessage("Stage deltaV done."); - VOID_Data.totalDeltaV.DoGUIHorizontal (3, false); - Tools.PostDebugMessage("Total deltaV done."); - VOID_Data.mainThrottle.DoGUIHorizontal ("F0"); - Tools.PostDebugMessage("MainThrottle done."); - VOID_Data.currmaxThrust.DoGUIHorizontal (); - Tools.PostDebugMessage("CurrMaxThrust done."); - VOID_Data.currmaxThrustWeight.DoGUIHorizontal (); - Tools.PostDebugMessage("CurrMaxTWR done."); - VOID_Data.surfaceThrustWeight.DoGUIHorizontal ("F2"); - Tools.PostDebugMessage("surfaceTWR done."); - VOID_Data.intakeAirStatus.DoGUIHorizontal(); - Tools.PostDebugMessage("intakeAirStatus done."); - GUILayout.EndVertical(); - - Tools.PostDebugMessage("VesselInfo window done."); GUI.DragWindow(); } @@ -123,7 +106,15 @@ public static readonly VOID_DoubleValue totalMass = new VOID_DoubleValue( "Total Mass", - new Func (() => SimManager.Instance.TryGetLastMass()), + delegate() + { + if (SimManager.Stages == null || SimManager.LastStage == null) + { + return double.NaN; + } + + return SimManager.LastStage.totalMass; + }, "tons" ); @@ -131,12 +122,12 @@ "Resource Mass", delegate() { - double rscMass = 0; - foreach (Part part in VOID_Core.Instance.vessel.Parts) + if (SimManager.Stages == null || SimManager.LastStage == null) { - rscMass += part.GetResourceMass(); + return double.NaN; } - return rscMass; + + return SimManager.LastStage.totalBaseMass; }, "tons" ); @@ -145,11 +136,9 @@ "DeltaV (Current Stage)", delegate() { - if (SimManager.Instance.Stages == null || - SimManager.Instance.Stages.Length <= Staging.lastStage - ) + if (SimManager.Stages == null || SimManager.LastStage == null) return double.NaN; - return SimManager.Instance.Stages[Staging.lastStage].deltaV; + return SimManager.LastStage.deltaV; }, "m/s" ); @@ -158,9 +147,9 @@ "DeltaV (Total)", delegate() { - if (SimManager.Instance.Stages == null) + if (SimManager.Stages == null || SimManager.LastStage == null) return double.NaN; - return SimManager.Instance.LastStage.totalDeltaV; + return SimManager.LastStage.totalDeltaV; }, "m/s" ); @@ -175,11 +164,11 @@ "Thrust (curr/max)", delegate() { - if (SimManager.Instance.Stages == null) + if (SimManager.Stages == null || SimManager.LastStage == null) return "N/A"; - double currThrust = SimManager.Instance.LastStage.actualThrust; - double maxThrust = SimManager.Instance.LastStage.thrust; + double currThrust = SimManager.LastStage.actualThrust; + double maxThrust = SimManager.LastStage.thrust; return string.Format( "{0} / {1}", @@ -189,27 +178,45 @@ } ); + public static readonly VOID_DoubleValue currThrustWeight = new VOID_DoubleValue( + "T:W Ratio", + delegate() + { + if (SimManager.LastStage == null) + { + return double.NaN; + } + + return SimManager.LastStage.actualThrustToWeight; + }, + "" + ); + + public static readonly VOID_DoubleValue maxThrustWeight = new VOID_DoubleValue( + "T:W Ratio", + delegate() + { + if (SimManager.LastStage == null) + { + return double.NaN; + } + + return SimManager.LastStage.maxThrustToWeight; + }, + "" + ); + public static readonly VOID_StrValue currmaxThrustWeight = new VOID_StrValue( "T:W (curr/max)", delegate() { - if (SimManager.Instance.Stages == null) + if (SimManager.Stages == null || SimManager.LastStage == null) return "N/A"; - - double currThrust = SimManager.Instance.LastStage.actualThrust; - double maxThrust = SimManager.Instance.LastStage.thrust; - double mass = SimManager.Instance.TryGetLastMass(); - double gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / - Math.Pow( - VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude, - 2 - ); - double weight = mass * gravity; return string.Format( "{0} / {1}", - (currThrust / weight).ToString("F2"), - (maxThrust / weight).ToString("F2") + (VOID_Data.currThrustWeight.Value).ToString("F2"), + (VOID_Data.maxThrustWeight.Value).ToString("F2") ); } ); @@ -218,11 +225,11 @@ "Max T:W @ surface", delegate() { - if (SimManager.Instance.Stages == null) + if (SimManager.Stages == null || SimManager.LastStage == null) return double.NaN; - double maxThrust = SimManager.Instance.LastStage.thrust; - double mass = SimManager.Instance.TryGetLastMass(); + double maxThrust = SimManager.LastStage.thrust; + double mass = SimManager.LastStage.totalMass; double gravity = (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) / Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2); double weight = mass * gravity; @@ -244,23 +251,38 @@ foreach (Part part in VOID_Core.Instance.vessel.Parts) { - if (part.HasModule() && part.enabled) + if (part.enabled) { - foreach (Propellant propellant in part.GetModule().propellants) + ModuleEngines engineModule; + ModuleEnginesFX enginesFXModule; + List propellantList = null; + + if (part.tryGetFirstModuleOfType(out engineModule)) { - if (propellant.name == "IntakeAir") + propellantList = engineModule.propellants; + } + else if (part.tryGetFirstModuleOfType(out enginesFXModule)) + { + propellantList = enginesFXModule.propellants; + } + + if (propellantList != null) + { + foreach (Propellant propellant in propellantList) { - // currentAmount += propellant.currentAmount; - currentRequirement += propellant.currentRequirement / TimeWarp.fixedDeltaTime; - break; + if (propellant.name == "IntakeAir") + { + currentRequirement += propellant.currentRequirement / TimeWarp.fixedDeltaTime; + break; + } } } } - if (part.HasModule() && part.enabled) + ModuleResourceIntake intakeModule; + + if (part.enabled && part.tryGetFirstModuleOfType(out intakeModule)) { - ModuleResourceIntake intakeModule = part.GetModule(); - if (intakeModule.resourceName == "IntakeAir") { currentAmount += intakeModule.airFlow; --- a/VOID_VesselRegister.cs +++ b/VOID_VesselRegister.cs @@ -1,26 +1,35 @@ +// VOID // -// VOID_Orbital.cs +// VOID_VesselRegister.cs // -// Author: -// toadicus <> +// Copyright © 2014, toadicus +// All rights reserved. // -// Copyright (c) 2013 toadicus +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: // -// 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. +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// 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. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. // -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// 3. Neither the name of the copyright holder nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + using KSP; using System; using System.Linq; +using ToadicusTools; using UnityEngine; namespace VOID @@ -106,7 +115,7 @@ GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); GUILayout.Label( - Tools.UppercaseFirst(vesselSituation) + " " + selectedVesselType.ToString() + "s @ " + seletedBody.bodyName, + VOID_Tools.UppercaseFirst(vesselSituation) + " " + selectedVesselType.ToString() + "s @ " + seletedBody.bodyName, VOID_Core.Instance.LabelStyles["center"], GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); --- a/Wrapper/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +1,1 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("Toolbar Wrapper for Kerbal Space Program")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ToolbarWrapper")] -[assembly: AssemblyCopyright("Copyright © 2013-2014 Maik Schreiber")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("bfd95a60-6335-4a59-a29e-438d806d8f2d")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - --- a/Wrapper/ToolbarWrapper.cs +++ /dev/null @@ -1,793 +1,1 @@ -/* -Copyright (c) 2013-2014, Maik Schreiber -All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using UnityEngine; - - -namespace VOID { - - - - /**********************************************************\ - * --- DO NOT EDIT BELOW THIS COMMENT --- * - * * - * This file contains classes and interfaces to use the * - * Toolbar Plugin without creating a hard dependency on it. * - * * - * There is nothing in this file that needs to be edited * - * by hand. * - * * - * --- DO NOT EDIT BELOW THIS COMMENT --- * - \**********************************************************/ - - - - /// - /// The global tool bar manager. - /// - public partial class ToolbarManager : IToolbarManager { - /// - /// Whether the Toolbar Plugin is available. - /// - public static bool ToolbarAvailable { - get { - if (toolbarAvailable == null) { - toolbarAvailable = Instance != null; - } - return (bool) toolbarAvailable; - } - } - - /// - /// The global tool bar manager instance. - /// - public static IToolbarManager Instance { - get { - if ((toolbarAvailable != false) && (instance_ == null)) { - Type type = ToolbarTypes.getType("Toolbar.ToolbarManager"); - if (type != null) { - object realToolbarManager = ToolbarTypes.getStaticProperty(type, "Instance").GetValue(null, null); - instance_ = new ToolbarManager(realToolbarManager); - } - } - return instance_; - } - } - } - - #region interfaces - - /// - /// A toolbar manager. - /// - public interface IToolbarManager { - /// - /// Adds a new button. - /// - /// - /// To replace an existing button, just add a new button using the old button's namespace and ID. - /// Note that the new button will inherit the screen position of the old button. - /// - /// The new button's namespace. This is usually the plugin's name. Must not include special characters like '.' - /// The new button's ID. This ID must be unique across all buttons in the namespace. Must not include special characters like '.' - /// The button created. - IButton add(string ns, string id); - } - - /// - /// Represents a clickable button. - /// - public interface IButton { - /// - /// The text displayed on the button. Set to null to hide text. - /// - /// - /// The text can be changed at any time to modify the button's appearance. Note that since this will also - /// modify the button's size, this feature should be used sparingly, if at all. - /// - /// - string Text { - set; - get; - } - - /// - /// The color the button text is displayed with. Defaults to Color.white. - /// - /// - /// The text color can be changed at any time to modify the button's appearance. - /// - Color TextColor { - set; - get; - } - - /// - /// The path of a texture file to display an icon on the button. Set to null to hide icon. - /// - /// - /// - /// A texture path on a button will have precedence over text. That is, if both text and texture path - /// have been set on a button, the button will show the texture, not the text. - /// - /// - /// The texture size must not exceed 24x24 pixels. - /// - /// - /// The texture path must be relative to the "GameData" directory, and must not specify a file name suffix. - /// Valid example: MyAddon/Textures/icon_mybutton - /// - /// - /// The texture path can be changed at any time to modify the button's appearance. - /// - /// - /// - string TexturePath { - set; - get; - } - - /// - /// The button's tool tip text. Set to null if no tool tip is desired. - /// - /// - /// Tool Tip Text Should Always Use Headline Style Like This. - /// - string ToolTip { - set; - get; - } - - /// - /// Whether this button is currently visible or not. Can be used in addition to or as a replacement for . - /// - /// - /// Setting this property to true does not affect the player's ability to hide the button using the configuration. - /// Conversely, setting this property to false does not enable the player to show the button using the configuration. - /// - bool Visible { - set; - get; - } - - /// - /// Determines this button's visibility. Can be used in addition to or as a replacement for . - /// - /// - /// The return value from IVisibility.Visible is subject to the same rules as outlined for - /// . - /// - IVisibility Visibility { - set; - get; - } - - /// - /// Whether this button is currently effectively visible or not. This is a combination of - /// and . - /// - /// - /// Note that the toolbar is not visible in certain game scenes, for example the loading screens. This property - /// does not reflect button invisibility in those scenes. In addition, this property does not reflect the - /// player's configuration of the button's visibility. - /// - bool EffectivelyVisible { - get; - } - - /// - /// Whether this button is currently enabled (clickable) or not. This does not affect the player's ability to - /// position the button on their toolbar. - /// - bool Enabled { - set; - get; - } - - /// - /// Whether this button is currently "important." Set to false to return to normal button behaviour. - /// - /// - /// - /// This can be used to temporarily force the button to be shown on screen regardless of the toolbar being - /// currently in auto-hidden mode. For example, a button that signals the arrival of a private message in - /// a chat room could mark itself as "important" as long as the message has not been read. - /// - /// - /// Setting this property does not change the appearance of the button. Use to - /// change the button's icon. - /// - /// - /// Setting this property to true does not affect the player's ability to hide the button using the - /// configuration. - /// - /// - /// This feature should be used only sparingly, if at all, since it forces the button to be displayed on - /// screen even when it normally wouldn't. - /// - /// - bool Important { - set; - get; - } - - /// - /// A drawable that is tied to the current button. This can be anything from a popup menu to - /// an informational window. Set to null to hide the drawable. - /// - IDrawable Drawable { - set; - get; - } - - /// - /// Event handler that can be registered with to receive "on click" events. - /// - /// - /// - /// IButton button = ... - /// button.OnClick += (e) => { - /// Debug.Log("button clicked, mouseButton: " + e.MouseButton); - /// }; - /// - /// - event ClickHandler OnClick; - - /// - /// Event handler that can be registered with to receive "on mouse enter" events. - /// - /// - /// - /// IButton button = ... - /// button.OnMouseEnter += (e) => { - /// Debug.Log("mouse entered button"); - /// }; - /// - /// - event MouseEnterHandler OnMouseEnter; - - /// - /// Event handler that can be registered with to receive "on mouse leave" events. - /// - /// - /// - /// IButton button = ... - /// button.OnMouseLeave += (e) => { - /// Debug.Log("mouse left button"); - /// }; - /// - /// - event MouseLeaveHandler OnMouseLeave; - - /// - /// Permanently destroys this button so that it is no longer displayed. - /// Should be used when a plugin is stopped to remove leftover buttons. - /// - void Destroy(); - } - - /// - /// A drawable that is tied to a particular button. This can be anything from a popup menu - /// to an informational window. - /// - public interface IDrawable { - /// - /// Update any information. This is called once per frame. - /// - void Update(); - - /// - /// Draws GUI widgets for this drawable. This is the equivalent to the OnGUI() message in - /// . - /// - /// - /// The drawable will be positioned near its parent toolbar according to the drawable's current - /// width/height. - /// - /// The left/top position of where to draw this drawable. - /// The current width/height of this drawable. - Vector2 Draw(Vector2 position); - } - - #endregion - - #region events - - /// - /// Event describing a click on a button. - /// - public partial class ClickEvent : EventArgs { - /// - /// The button that has been clicked. - /// - public readonly IButton Button; - - /// - /// The mouse button which the button was clicked with. - /// - /// - /// Is 0 for left mouse button, 1 for right mouse button, and 2 for middle mouse button. - /// - public readonly int MouseButton; - } - - /// - /// An event handler that is invoked whenever a button has been clicked. - /// - /// An event describing the button click. - public delegate void ClickHandler(ClickEvent e); - - /// - /// Event describing the mouse pointer moving about a button. - /// - public abstract partial class MouseMoveEvent { - /// - /// The button in question. - /// - public readonly IButton button; - } - - /// - /// Event describing the mouse pointer entering a button's area. - /// - public partial class MouseEnterEvent : MouseMoveEvent { - } - - /// - /// Event describing the mouse pointer leaving a button's area. - /// - public partial class MouseLeaveEvent : MouseMoveEvent { - } - - /// - /// An event handler that is invoked whenever the mouse pointer enters a button's area. - /// - /// An event describing the mouse pointer entering. - public delegate void MouseEnterHandler(MouseEnterEvent e); - - /// - /// An event handler that is invoked whenever the mouse pointer leaves a button's area. - /// - /// An event describing the mouse pointer leaving. - public delegate void MouseLeaveHandler(MouseLeaveEvent e); - - #endregion - - #region visibility - - /// - /// Determines visibility of a button. - /// - /// - public interface IVisibility { - /// - /// Whether a button is currently visible or not. - /// - /// - bool Visible { - get; - } - } - - /// - /// Determines visibility of a button in relation to the currently running game scene. - /// - /// - /// - /// IButton button = ... - /// button.Visibility = new GameScenesVisibility(GameScenes.EDITOR, GameScenes.SPH); - /// - /// - /// - public class GameScenesVisibility : IVisibility { - private GameScenes[] gameScenes; - - public bool Visible { - get { - return (bool) visibleProperty.GetValue(realGameScenesVisibility, null); - } - } - - private object realGameScenesVisibility; - private PropertyInfo visibleProperty; - - public GameScenesVisibility(params GameScenes[] gameScenes) { - Type gameScenesVisibilityType = ToolbarTypes.getType("Toolbar.GameScenesVisibility"); - realGameScenesVisibility = Activator.CreateInstance(gameScenesVisibilityType, new object[] { gameScenes }); - visibleProperty = ToolbarTypes.getProperty(gameScenesVisibilityType, "Visible"); - this.gameScenes = gameScenes; - } - } - - #endregion - - #region drawable - - /// - /// A drawable that draws a popup menu. - /// - public partial class PopupMenuDrawable : IDrawable { - /// - /// Event handler that can be registered with to receive "any menu option clicked" events. - /// - public event Action OnAnyOptionClicked { - add { - onAnyOptionClickedEvent.AddEventHandler(realPopupMenuDrawable, value); - } - remove { - onAnyOptionClickedEvent.RemoveEventHandler(realPopupMenuDrawable, value); - } - } - - private object realPopupMenuDrawable; - private MethodInfo updateMethod; - private MethodInfo drawMethod; - private MethodInfo addOptionMethod; - private MethodInfo addSeparatorMethod; - private MethodInfo destroyMethod; - private EventInfo onAnyOptionClickedEvent; - - public PopupMenuDrawable() { - Type popupMenuDrawableType = ToolbarTypes.getType("Toolbar.PopupMenuDrawable"); - realPopupMenuDrawable = Activator.CreateInstance(popupMenuDrawableType, null); - updateMethod = ToolbarTypes.getMethod(popupMenuDrawableType, "Update"); - drawMethod = ToolbarTypes.getMethod(popupMenuDrawableType, "Draw"); - addOptionMethod = ToolbarTypes.getMethod(popupMenuDrawableType, "AddOption"); - addSeparatorMethod = ToolbarTypes.getMethod(popupMenuDrawableType, "AddSeparator"); - destroyMethod = ToolbarTypes.getMethod(popupMenuDrawableType, "Destroy"); - onAnyOptionClickedEvent = ToolbarTypes.getEvent(popupMenuDrawableType, "OnAnyOptionClicked"); - } - - public void Update() { - updateMethod.Invoke(realPopupMenuDrawable, null); - } - - public Vector2 Draw(Vector2 position) { - return (Vector2) drawMethod.Invoke(realPopupMenuDrawable, new object[] { position }); - } - - /// - /// Adds a new option to the popup menu. - /// - /// The text of the option. - /// A button that can be used to register clicks on the menu option. - public IButton AddOption(string text) { - object realButton = addOptionMethod.Invoke(realPopupMenuDrawable, new object[] { text }); - return new Button(realButton, new ToolbarTypes()); - } - - /// - /// Adds a separator to the popup menu. - /// - public void AddSeparator() { - addSeparatorMethod.Invoke(realPopupMenuDrawable, null); - } - - /// - /// Destroys this drawable. This must always be called before disposing of this drawable. - /// - public void Destroy() { - destroyMethod.Invoke(realPopupMenuDrawable, null); - } - } - - #endregion - - #region private implementations - - public partial class ToolbarManager : IToolbarManager { - private static bool? toolbarAvailable = null; - private static IToolbarManager instance_; - - private object realToolbarManager; - private MethodInfo addMethod; - private Dictionary buttons = new Dictionary(); - private ToolbarTypes types = new ToolbarTypes(); - - private ToolbarManager(object realToolbarManager) { - this.realToolbarManager = realToolbarManager; - - addMethod = ToolbarTypes.getMethod(types.iToolbarManagerType, "add"); - } - - public IButton add(string ns, string id) { - object realButton = addMethod.Invoke(realToolbarManager, new object[] { ns, id }); - IButton button = new Button(realButton, types); - buttons.Add(realButton, button); - return button; - } - } - - internal class Button : IButton { - private object realButton; - private ToolbarTypes types; - private Delegate realClickHandler; - private Delegate realMouseEnterHandler; - private Delegate realMouseLeaveHandler; - - internal Button(object realButton, ToolbarTypes types) { - this.realButton = realButton; - this.types = types; - - realClickHandler = attachEventHandler(types.button.onClickEvent, "clicked", realButton); - realMouseEnterHandler = attachEventHandler(types.button.onMouseEnterEvent, "mouseEntered", realButton); - realMouseLeaveHandler = attachEventHandler(types.button.onMouseLeaveEvent, "mouseLeft", realButton); - } - - private Delegate attachEventHandler(EventInfo @event, string methodName, object realButton) { - MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance); - Delegate d = Delegate.CreateDelegate(@event.EventHandlerType, this, method); - @event.AddEventHandler(realButton, d); - return d; - } - - public string Text { - set { - types.button.textProperty.SetValue(realButton, value, null); - } - get { - return (string) types.button.textProperty.GetValue(realButton, null); - } - } - - public Color TextColor { - set { - types.button.textColorProperty.SetValue(realButton, value, null); - } - get { - return (Color) types.button.textColorProperty.GetValue(realButton, null); - } - } - - public string TexturePath { - set { - types.button.texturePathProperty.SetValue(realButton, value, null); - } - get { - return (string) types.button.texturePathProperty.GetValue(realButton, null); - } - } - - public string ToolTip { - set { - types.button.toolTipProperty.SetValue(realButton, value, null); - } - get { - return (string) types.button.toolTipProperty.GetValue(realButton, null); - } - } - - public bool Visible { - set { - types.button.visibleProperty.SetValue(realButton, value, null); - } - get { - return (bool) types.button.visibleProperty.GetValue(realButton, null); - } - } - - public IVisibility Visibility { - set { - object functionVisibility = null; - if (value != null) { - functionVisibility = Activator.CreateInstance(types.functionVisibilityType, new object[] { new Func(() => value.Visible) }); - } - types.button.visibilityProperty.SetValue(realButton, functionVisibility, null); - visibility_ = value; - } - get { - return visibility_; - } - } - private IVisibility visibility_; - - public bool EffectivelyVisible { - get { - return (bool) types.button.effectivelyVisibleProperty.GetValue(realButton, null); - } - } - - public bool Enabled { - set { - types.button.enabledProperty.SetValue(realButton, value, null); - } - get { - return (bool) types.button.enabledProperty.GetValue(realButton, null); - } - } - - public bool Important { - set { - types.button.importantProperty.SetValue(realButton, value, null); - } - get { - return (bool) types.button.importantProperty.GetValue(realButton, null); - } - } - - public IDrawable Drawable { - set { - object functionDrawable = null; - if (value != null) { - functionDrawable = Activator.CreateInstance(types.functionDrawableType, new object[] { - new Action(() => value.Update()), - new Func((pos) => value.Draw(pos)) - }); - } - types.button.drawableProperty.SetValue(realButton, functionDrawable, null); - drawable_ = value; - } - get { - return drawable_; - } - } - private IDrawable drawable_; - - public event ClickHandler OnClick; - - private void clicked(object realEvent) { - if (OnClick != null) { - OnClick(new ClickEvent(realEvent, this)); - } - } - - public event MouseEnterHandler OnMouseEnter; - - private void mouseEntered(object realEvent) { - if (OnMouseEnter != null) { - OnMouseEnter(new MouseEnterEvent(this)); - } - } - - public event MouseLeaveHandler OnMouseLeave; - - private void mouseLeft(object realEvent) { - if (OnMouseLeave != null) { - OnMouseLeave(new MouseLeaveEvent(this)); - } - } - - public void Destroy() { - detachEventHandler(types.button.onClickEvent, realClickHandler, realButton); - detachEventHandler(types.button.onMouseEnterEvent, realMouseEnterHandler, realButton); - detachEventHandler(types.button.onMouseLeaveEvent, realMouseLeaveHandler, realButton); - - types.button.destroyMethod.Invoke(realButton, null); - } - - private void detachEventHandler(EventInfo @event, Delegate d, object realButton) { - @event.RemoveEventHandler(realButton, d); - } - } - - public partial class ClickEvent : EventArgs { - internal ClickEvent(object realEvent, IButton button) { - Type type = realEvent.GetType(); - Button = button; - MouseButton = (int) type.GetField("MouseButton", BindingFlags.Public | BindingFlags.Instance).GetValue(realEvent); - } - } - - public abstract partial class MouseMoveEvent : EventArgs { - internal MouseMoveEvent(IButton button) { - this.button = button; - } - } - - public partial class MouseEnterEvent : MouseMoveEvent { - internal MouseEnterEvent(IButton button) - : base(button) { - } - } - - public partial class MouseLeaveEvent : MouseMoveEvent { - internal MouseLeaveEvent(IButton button) - : base(button) { - } - } - - internal class ToolbarTypes { - internal readonly Type iToolbarManagerType; - internal readonly Type functionVisibilityType; - internal readonly Type functionDrawableType; - internal readonly ButtonTypes button; - - internal ToolbarTypes() { - iToolbarManagerType = getType("Toolbar.IToolbarManager"); - functionVisibilityType = getType("Toolbar.FunctionVisibility"); - functionDrawableType = getType("Toolbar.FunctionDrawable"); - - Type iButtonType = getType("Toolbar.IButton"); - button = new ButtonTypes(iButtonType); - } - - internal static Type getType(string name) { - return AssemblyLoader.loadedAssemblies - .SelectMany(a => a.assembly.GetExportedTypes()) - .SingleOrDefault(t => t.FullName == name); - } - - internal static PropertyInfo getProperty(Type type, string name) { - return type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); - } - - internal static PropertyInfo getStaticProperty(Type type, string name) { - return type.GetProperty(name, BindingFlags.Public | BindingFlags.Static); - } - - internal static EventInfo getEvent(Type type, string name) { - return type.GetEvent(name, BindingFlags.Public | BindingFlags.Instance); - } - - internal static MethodInfo getMethod(Type type, string name) { - return type.GetMethod(name, BindingFlags.Public | BindingFlags.Instance); - } - } - - internal class ButtonTypes { - internal readonly Type iButtonType; - internal readonly PropertyInfo textProperty; - internal readonly PropertyInfo textColorProperty; - internal readonly PropertyInfo texturePathProperty; - internal readonly PropertyInfo toolTipProperty; - internal readonly PropertyInfo visibleProperty; - internal readonly PropertyInfo visibilityProperty; - internal readonly PropertyInfo effectivelyVisibleProperty; - internal readonly PropertyInfo enabledProperty; - internal readonly PropertyInfo importantProperty; - internal readonly PropertyInfo drawableProperty; - internal readonly EventInfo onClickEvent; - internal readonly EventInfo onMouseEnterEvent; - internal readonly EventInfo onMouseLeaveEvent; - internal readonly MethodInfo destroyMethod; - - internal ButtonTypes(Type iButtonType) { - this.iButtonType = iButtonType; - - textProperty = ToolbarTypes.getProperty(iButtonType, "Text"); - textColorProperty = ToolbarTypes.getProperty(iButtonType, "TextColor"); - texturePathProperty = ToolbarTypes.getProperty(iButtonType, "TexturePath"); - toolTipProperty = ToolbarTypes.getProperty(iButtonType, "ToolTip"); - visibleProperty = ToolbarTypes.getProperty(iButtonType, "Visible"); - visibilityProperty = ToolbarTypes.getProperty(iButtonType, "Visibility"); - effectivelyVisibleProperty = ToolbarTypes.getProperty(iButtonType, "EffectivelyVisible"); - enabledProperty = ToolbarTypes.getProperty(iButtonType, "Enabled"); - importantProperty = ToolbarTypes.getProperty(iButtonType, "Important"); - drawableProperty = ToolbarTypes.getProperty(iButtonType, "Drawable"); - onClickEvent = ToolbarTypes.getEvent(iButtonType, "OnClick"); - onMouseEnterEvent = ToolbarTypes.getEvent(iButtonType, "OnMouseEnter"); - onMouseLeaveEvent = ToolbarTypes.getEvent(iButtonType, "OnMouseLeave"); - destroyMethod = ToolbarTypes.getMethod(iButtonType, "Destroy"); - } - } - - #endregion -} - --- a/Wrapper/Wrapper.csproj +++ /dev/null @@ -1,59 +1,1 @@ - - - - - Debug - AnyCPU - {E258AB2C-E2BB-4ACA-B902-C98582041F69} - Library - Properties - ToolbarWrapper - ToolbarWrapper - v3.5 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\..\..\Programme\KSP_23_dev\KSP_Data\Managed\Assembly-CSharp.dll - - - - - - - - - ..\..\..\..\Programme\KSP_23_dev\KSP_Data\Managed\UnityEngine.dll - - - - - - - - - +