diff --git a/NewHorizons/Builder/General/BaseBuilder.cs b/NewHorizons/Builder/General/BaseBuilder.cs index 7669f48f..d0eb5514 100644 --- a/NewHorizons/Builder/General/BaseBuilder.cs +++ b/NewHorizons/Builder/General/BaseBuilder.cs @@ -1,11 +1,11 @@ using NewHorizons.External; -using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; using OWML.Utils; using System; using UnityEngine; using NewHorizons.External.Configs; using Logger = NewHorizons.Utility.Logger; +using NewHorizons.Components.Orbital; namespace NewHorizons.Builder.General { diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index ad2f7941..ff4f876d 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -1,6 +1,6 @@ using NewHorizons.Builder.Orbital; using NewHorizons.External; -using NewHorizons.OrbitalPhysics; +using NewHorizons.Components.Orbital; using OWML.Utils; using System; using System.Collections.Generic; @@ -83,9 +83,9 @@ namespace NewHorizons.Builder.General var primaryGV = primary.GetGravityVolume(); var secondaryGV = secondary.GetGravityVolume(); - if (primaryGV.GetFalloffType() != secondaryGV.GetFalloffType()) + if (primaryGV._falloffType != secondaryGV._falloffType) { - Logger.LogError($"Binaries must have the same gravity falloff! {primaryGV.GetFalloffType()} != {secondaryGV.GetFalloffType()}"); + Logger.LogError($"Binaries must have the same gravity falloff! {primaryGV._falloffType} != {secondaryGV._falloffType}"); return; } diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs index fa56756a..3053b31d 100644 --- a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -1,5 +1,4 @@ using NewHorizons.External; -using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; using OWML.Common; using OWML.Utils; @@ -15,6 +14,7 @@ using System.Threading.Tasks; using UnityEngine; using NewHorizons.External.Configs; using Logger = NewHorizons.Utility.Logger; +using NewHorizons.Components.Orbital; namespace NewHorizons.Builder.General { @@ -31,7 +31,7 @@ namespace NewHorizons.Builder.General if (config.Orbit.PrimaryBody != null && parent == HeavenlyBody.None) Logger.LogWarning($"Could not find [{config.Orbit.PrimaryBody}] parent of [{config.Name}]"); - var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit); + var orbit = config.Orbit.GetKeplerCoords(); var hb = GetBody(config.Name); if (hb == null) hb = AddHeavenlyBody(config.Name, config.FocalPoint != null); diff --git a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs index a9914828..bf617581 100644 --- a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs +++ b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs @@ -1,5 +1,5 @@ -using NewHorizons.External; -using NewHorizons.OrbitalPhysics; +using NewHorizons.Components.Orbital; +using NewHorizons.External; using System; using System.Collections.Generic; using System.Linq; diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index 1f84fcee..75bde8ab 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -6,10 +6,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; -using NewHorizons.OrbitalPhysics; using Logger = NewHorizons.Utility.Logger; using System.Reflection; using NewHorizons.Utility; +using PacificEngine.OW_CommonResources.Geometry.Orbits; +using NewHorizons.Utility.CommonResources; namespace NewHorizons.Builder.Orbital { @@ -43,7 +44,7 @@ namespace NewHorizons.Builder.Orbital var gv = primaryBody.GetGravityVolume(); if(gv != null) { - var velocity = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(primaryBody.GetGravityVolume()), orbit).Item2; + var velocity = CommonResourcesUtilities.GetCartesian(gv, orbit).Item2; // For some stupid reason the InitialMotion awake method transforms the perfectly fine direction vector you give it so we preemptively do the inverse so it all cancels out initialMotion._initLinearDirection = body.transform.InverseTransformDirection(velocity.normalized); diff --git a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs index 43035390..7b6aa295 100644 --- a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs +++ b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs @@ -1,10 +1,10 @@ using NewHorizons.External; -using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; using OWML.Utils; using UnityEngine; using NewHorizons.External.Configs; using Logger = NewHorizons.Utility.Logger; +using NewHorizons.Components.Orbital; namespace NewHorizons.Builder.Orbital { diff --git a/NewHorizons/Builder/Updater/OrbitUpdater.cs b/NewHorizons/Builder/Updater/OrbitUpdater.cs index 695d9c87..a188126c 100644 --- a/NewHorizons/Builder/Updater/OrbitUpdater.cs +++ b/NewHorizons/Builder/Updater/OrbitUpdater.cs @@ -1,6 +1,6 @@ using NewHorizons.Builder.Orbital; -using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; +using NewHorizons.Utility.CommonResources; using PacificEngine.OW_CommonResources.Game.Resource; using PacificEngine.OW_CommonResources.Game.State; using System; @@ -26,7 +26,7 @@ namespace NewHorizons.Builder.Updater { var original = mapping[heavenlyBody]; - var coords = OrbitalHelper.KeplerCoordinatesFromOrbitModule(body.Config.Orbit); + var coords = body.Config.Orbit.GetKeplerCoords(); var parent = original.state.parent; if (body.Config.Orbit.PrimaryBody != null) diff --git a/NewHorizons/OrbitalPhysics/BinaryFocalPoint.cs b/NewHorizons/Components/Orbital/BinaryFocalPoint.cs similarity index 92% rename from NewHorizons/OrbitalPhysics/BinaryFocalPoint.cs rename to NewHorizons/Components/Orbital/BinaryFocalPoint.cs index c8e6a716..447ef9d6 100644 --- a/NewHorizons/OrbitalPhysics/BinaryFocalPoint.cs +++ b/NewHorizons/Components/Orbital/BinaryFocalPoint.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using UnityEngine; -namespace NewHorizons.OrbitalPhysics +namespace NewHorizons.Components.Orbital { public class BinaryFocalPoint : MonoBehaviour { diff --git a/NewHorizons/Components/Orbital/ParameterizedAstroObject.cs b/NewHorizons/Components/Orbital/ParameterizedAstroObject.cs new file mode 100644 index 00000000..aff7f1cb --- /dev/null +++ b/NewHorizons/Components/Orbital/ParameterizedAstroObject.cs @@ -0,0 +1,53 @@ +using NewHorizons.External; +using NewHorizons.Utility.CommonResources; +using PacificEngine.OW_CommonResources.Geometry.Orbits; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.Components.Orbital +{ + public class ParameterizedAstroObject : AstroObject, IKeplerCoordinates + { + public float Inclination { get; set; } + public int SemiMajorAxis { get; set; } + public float LongitudeOfAscendingNode { get; set; } + public float Eccentricity { get; set; } + public float ArgumentOfPeriapsis { get; set; } + public float TrueAnomaly { get; set; } + + public void SetKeplerCoordinatesFromOrbitModule(OrbitModule orbit) + { + var keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); + Inclination = keplerCoordinates.inclinationAngle; + SemiMajorAxis = (int)keplerCoordinates.semiMajorRadius; + LongitudeOfAscendingNode = keplerCoordinates.ascendingAngle; + Eccentricity = keplerCoordinates.eccentricity; + ArgumentOfPeriapsis = keplerCoordinates.periapseAngle; + TrueAnomaly = keplerCoordinates.trueAnomaly; + } + + public void SetKeplerCoordinatesFromTrueAnomaly(float ecc, float a, float i, float p, float l, float trueAnomaly) + { + var keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(ecc, a, i, p, l, trueAnomaly); + Inclination = keplerCoordinates.inclinationAngle; + SemiMajorAxis = (int)keplerCoordinates.semiMajorRadius; + LongitudeOfAscendingNode = keplerCoordinates.ascendingAngle; + Eccentricity = keplerCoordinates.eccentricity; + ArgumentOfPeriapsis = keplerCoordinates.periapseAngle; + TrueAnomaly = keplerCoordinates.trueAnomaly; + } + + public override string ToString() + { + return $"ParameterizedAstroObject: Eccentricity {Eccentricity}, SemiMajorAxis {SemiMajorAxis}, Inclination {Inclination}, ArgumentOfPeriapsis {ArgumentOfPeriapsis}, LongitudeOfAscendingNode {LongitudeOfAscendingNode}, TrueAnomaly {TrueAnomaly}"; + } + + public KeplerCoordinates GetKeplerCoords() + { + return KeplerCoordinates.fromTrueAnomaly(Eccentricity, SemiMajorAxis, Inclination, ArgumentOfPeriapsis, LongitudeOfAscendingNode, TrueAnomaly); + } + } +} diff --git a/NewHorizons/OrbitalPhysics/TrackingOrbitLine.cs b/NewHorizons/Components/Orbital/TrackingOrbitLine.cs similarity index 98% rename from NewHorizons/OrbitalPhysics/TrackingOrbitLine.cs rename to NewHorizons/Components/Orbital/TrackingOrbitLine.cs index 84656b0c..1499547a 100644 --- a/NewHorizons/OrbitalPhysics/TrackingOrbitLine.cs +++ b/NewHorizons/Components/Orbital/TrackingOrbitLine.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using UnityEngine; -namespace NewHorizons.OrbitalPhysics +namespace NewHorizons.Components.Orbital { public class TrackingOrbitLine : OrbitLine { diff --git a/NewHorizons/External/OrbitModule.cs b/NewHorizons/External/OrbitModule.cs index 9a06c273..240f8427 100644 --- a/NewHorizons/External/OrbitModule.cs +++ b/NewHorizons/External/OrbitModule.cs @@ -1,4 +1,6 @@ using NewHorizons.Utility; +using NewHorizons.Utility.CommonResources; +using PacificEngine.OW_CommonResources.Geometry.Orbits; using System; using System.Collections.Generic; using System.Linq; @@ -7,7 +9,7 @@ using System.Threading.Tasks; namespace NewHorizons.External { - public class OrbitModule : Module + public class OrbitModule : Module, IKeplerCoordinates { public int SemiMajorAxis { get; set; } public float Inclination { get; set; } @@ -24,5 +26,10 @@ namespace NewHorizons.External public bool IsStatic { get; set; } public MColor Tint { get; set; } public bool TrackingOrbitLine { get; set; } = false; + + public KeplerCoordinates GetKeplerCoords() + { + return KeplerCoordinates.fromTrueAnomaly(Eccentricity, SemiMajorAxis, Inclination, ArgumentOfPeriapsis, LongitudeOfAscendingNode, TrueAnomaly); + } } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index d417ab04..643e7317 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -9,7 +9,6 @@ using NewHorizons.External; using NewHorizons.External.Configs; using NewHorizons.External.VariableSize; using NewHorizons.Handlers; -using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; using Newtonsoft.Json.Linq; using OWML.Common; @@ -26,6 +25,8 @@ using UnityEngine; using UnityEngine.SceneManagement; using Logger = NewHorizons.Utility.Logger; using NewHorizons.Builder.Atmosphere; +using PacificEngine.OW_CommonResources.Geometry.Orbits; +using NewHorizons.Utility.CommonResources; namespace NewHorizons { @@ -770,7 +771,7 @@ namespace NewHorizons private void UpdatePosition(GameObject go, NewHorizonsBody body, AstroObject primaryBody) { go.transform.parent = Locator.GetRootTransform(); - go.transform.position = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(1, 100), body.Config.Orbit).Item1 + (primaryBody == null ? Vector3.zero : primaryBody.transform.position); + go.transform.position = CommonResourcesUtilities.GetPosition(body.Config.Orbit) + (primaryBody == null ? Vector3.zero : primaryBody.transform.position); if (go.transform.position.magnitude > FurthestOrbit) { diff --git a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs deleted file mode 100644 index 6492174b..00000000 --- a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using NewHorizons.Utility; -using Logger = NewHorizons.Utility.Logger; -using NewHorizons.External; -using CRGravity = PacificEngine.OW_CommonResources.Geometry.Orbits.Gravity; -using KeplerCoordinates = PacificEngine.OW_CommonResources.Geometry.Orbits.KeplerCoordinates; - -/* - * Wrapper class for OW_CommonResources.Geometry.Orbits functions - */ -namespace NewHorizons.OrbitalPhysics -{ - public static class OrbitalHelper - { - public enum FalloffType - { - inverseSquared, - linear, - none - } - - public static Tuple GetCartesian(Gravity gravity, OrbitModule orbit) - { - if (orbit.SemiMajorAxis == 0) - { - return Tuple.Create(Vector3.zero, Vector3.zero); - } - - var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); - var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - var cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); - - if (cartesian == null) - { - cartesian = Tuple.Create(Vector3.zero, Vector3.zero); - } - - return cartesian; - } - - public static Tuple GetCartesian(Gravity gravity, ParameterizedAstroObject ao) - { - if (ao.SemiMajorAxis == 0) - { - return Tuple.Create(Vector3.zero, Vector3.zero); - } - - var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); - var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); - var cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); - - if (cartesian == null) - { - cartesian = Tuple.Create(Vector3.zero, Vector3.zero); - } - - return cartesian; - } - - public static KeplerCoordinates KeplerCoordinatesFromOrbitModule(OrbitModule orbit) - { - return KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - } - - public class Gravity - { - public float Exponent { get; } - public float Mass { get; } - - public Gravity(float exponent, float mass) - { - Exponent = exponent; - Mass = mass; - } - - public Gravity(GravityVolume gv) - { - Exponent = gv.GetFalloffExponent(); - Mass = gv.GetStandardGravitationalParameter() / GravityVolume.GRAVITATIONAL_CONSTANT; - } - } - } -} diff --git a/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs b/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs deleted file mode 100644 index 30b47f4a..00000000 --- a/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs +++ /dev/null @@ -1,60 +0,0 @@ -using NewHorizons.External; -using PacificEngine.OW_CommonResources.Geometry.Orbits; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NewHorizons.OrbitalPhysics -{ - public class ParameterizedAstroObject : AstroObject - { - private KeplerCoordinates _keplerCoordinates; - - public float Eccentricity - { - get { return _keplerCoordinates.eccentricity; } - } - - public float SemiMajorAxis - { - get { return _keplerCoordinates.semiMajorRadius; } - } - - public float Inclination - { - get { return _keplerCoordinates.inclinationAngle; } - } - - public float ArgumentOfPeriapsis - { - get { return _keplerCoordinates.periapseAngle; } - } - - public float LongitudeOfAscendingNode - { - get { return _keplerCoordinates.ascendingAngle; } - } - - public float TrueAnomaly - { - get { return _keplerCoordinates.trueAnomaly; } - } - - public void SetKeplerCoordinatesFromOrbitModule(OrbitModule orbit) - { - _keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - } - - public void SetKeplerCoordinatesFromTrueAnomaly(float ecc, float a, float i, float p, float l, float trueAnomaly) - { - _keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(ecc, a, i, p, l, trueAnomaly); - } - - public override string ToString() - { - return $"ParameterizedAstroObject: Eccentricity {Eccentricity}, SemiMajorAxis {SemiMajorAxis}, Inclination {Inclination}, ArgumentOfPeriapsis {ArgumentOfPeriapsis}, LongitudeOfAscendingNode {LongitudeOfAscendingNode}, TrueAnomaly {TrueAnomaly}"; - } - } -} diff --git a/NewHorizons/Utility/CommonResourcesUtilities.cs b/NewHorizons/Utility/CommonResources/CommonResourcesUtilities.cs similarity index 65% rename from NewHorizons/Utility/CommonResourcesUtilities.cs rename to NewHorizons/Utility/CommonResources/CommonResourcesUtilities.cs index b2da17f3..1622e0bc 100644 --- a/NewHorizons/Utility/CommonResourcesUtilities.cs +++ b/NewHorizons/Utility/CommonResources/CommonResourcesUtilities.cs @@ -1,11 +1,13 @@ using PacificEngine.OW_CommonResources.Game.Resource; +using PacificEngine.OW_CommonResources.Geometry.Orbits; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEngine; -namespace NewHorizons.Utility +namespace NewHorizons.Utility.CommonResources { public static class CommonResourcesUtilities { @@ -57,5 +59,39 @@ namespace NewHorizons.Utility return HeavenlyBodies.None; } } + + public static Gravity GravityFromVolume(GravityVolume gv) + { + if (gv == null) return null; + + var constant = GravityVolume.GRAVITATIONAL_CONSTANT; + var falloff = gv._falloffExponent; + var mass = gv._gravitationalMass / constant; + return new Gravity(constant, falloff, mass); + } + + public static Tuple GetCartesian(Gravity gravity, IKeplerCoordinates keplerCoords) + { + var cartesian = OrbitHelper.toCartesian(gravity, 0f, keplerCoords.GetKeplerCoords()); + + // CR breaks when a = 0 + if(keplerCoords.SemiMajorAxis == 0) + { + cartesian = Tuple.Create(Vector3.zero, cartesian.Item2); + } + + return cartesian; + } + + public static Tuple GetCartesian(GravityVolume gv, IKeplerCoordinates keplerCoords) + { + return GetCartesian(GravityFromVolume(gv), keplerCoords); + } + + public static Vector3 GetPosition(IKeplerCoordinates keplerCoords) + { + if (keplerCoords.SemiMajorAxis == 0) return Vector3.zero; + return OrbitHelper.toCartesian(new Gravity(1, 1, 1), 0f, keplerCoords.GetKeplerCoords()).Item1; + } } } diff --git a/NewHorizons/Utility/CommonResources/IKeplerCoordinates.cs b/NewHorizons/Utility/CommonResources/IKeplerCoordinates.cs new file mode 100644 index 00000000..c1f32af3 --- /dev/null +++ b/NewHorizons/Utility/CommonResources/IKeplerCoordinates.cs @@ -0,0 +1,21 @@ +using PacificEngine.OW_CommonResources.Geometry.Orbits; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.Utility.CommonResources +{ + public interface IKeplerCoordinates + { + float Inclination { get; set; } + int SemiMajorAxis { get; set; } + float LongitudeOfAscendingNode { get; set; } + float Eccentricity { get; set; } + float ArgumentOfPeriapsis { get; set; } + float TrueAnomaly { get; set; } + + KeplerCoordinates GetKeplerCoords(); + } +} diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 3c935dff..b466206c 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -1,5 +1,4 @@ -using NewHorizons.OrbitalPhysics; -using System; +using System; using System.Collections.Generic; using System.Reflection; using System.Text; @@ -20,14 +19,6 @@ namespace NewHorizons.Utility return (T)dict[settingName]; } - public static OrbitalHelper.FalloffType GetFalloffType(this GravityVolume gv) - { - if (gv == null) return OrbitalHelper.FalloffType.none; - var falloffTypeString = typeof(GravityVolume).GetField("_falloffType", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(gv).ToString(); - var falloffType = falloffTypeString.Equals("linear") ? OrbitalHelper.FalloffType.linear : OrbitalHelper.FalloffType.inverseSquared; - return falloffType; - } - public static float GetFalloffExponent(this GravityVolume gv) { if (gv == null) return 0;