From 2af194672e2fb19fa511cc8cb582443f45d004b6 Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Tue, 28 Dec 2021 17:29:51 -0500 Subject: [PATCH] Still broken --- .../Builder/General/DetectorBuilder.cs | 7 ++-- NewHorizons/Builder/General/GravityBuilder.cs | 4 ++- .../Builder/General/HeavenlyBodyBuilder.cs | 32 +++++++++++++++++ .../Builder/Orbital/InitialMotionBuilder.cs | 36 ++++++------------- .../Builder/Orbital/OrbitlineBuilder.cs | 13 +++---- NewHorizons/Main.cs | 13 ++++--- NewHorizons/OrbitalPhysics/OrbitalHelper.cs | 17 +++++---- .../ParameterizedAstroObject.cs | 6 ++-- .../OrbitalPhysics/ParameterizedOrbitLine.cs | 32 +++++++++++++++-- 9 files changed, 105 insertions(+), 55 deletions(-) create mode 100644 NewHorizons/Builder/General/HeavenlyBodyBuilder.cs diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index d561fe98..55ff1eea 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -159,11 +159,11 @@ namespace NewHorizons.Builder.General var focalPointVelocity = focalPointMotion == null ? Vector3.zero : focalPointMotion.GetInitVelocity(); var primaryInitialMotion = primary.gameObject.GetComponent(); - primaryInitialMotion.SetValue("_initLinearDirection", v1.normalized); + primaryInitialMotion.SetValue("_initLinearDirection", primary.gameObject.transform.InverseTransformDirection(v1.normalized)); primaryInitialMotion.SetValue("_initLinearSpeed", v1.magnitude); var secondaryInitialMotion = secondary.gameObject.GetComponent(); - secondaryInitialMotion.SetValue("_initLinearDirection", v2.normalized); + secondaryInitialMotion.SetValue("_initLinearDirection", secondary.gameObject.transform.InverseTransformDirection(v2.normalized)); secondaryInitialMotion.SetValue("_initLinearSpeed", v2.magnitude); // InitialMotion already set its speed so we overwrite that @@ -178,10 +178,7 @@ namespace NewHorizons.Builder.General // If they have tracking orbits set the period var period = 2 * Mathf.PI * Mathf.Sqrt(Mathf.Pow(r, exponent + 1) / (GravityVolume.GRAVITATIONAL_CONSTANT * totalMass)); - - if (exponent == 1) period /= 3f; - // Only one of these won't be null, the other one gets done next tick var trackingOrbitPrimary = primary.GetComponentInChildren(); if (trackingOrbitPrimary != null) { diff --git a/NewHorizons/Builder/General/GravityBuilder.cs b/NewHorizons/Builder/General/GravityBuilder.cs index d7b20f71..97eb0aff 100644 --- a/NewHorizons/Builder/General/GravityBuilder.cs +++ b/NewHorizons/Builder/General/GravityBuilder.cs @@ -8,7 +8,7 @@ namespace NewHorizons.Builder.General { static class GravityBuilder { - public static void Make(GameObject body, AstroObject ao, float surfaceAccel, float sphereOfInfluence, float surface, string falloffType) + public static GravityVolume Make(GameObject body, AstroObject ao, float surfaceAccel, float sphereOfInfluence, float surface, string falloffType) { GameObject gravityGO = new GameObject("GravityWell"); gravityGO.transform.parent = body.transform; @@ -42,6 +42,8 @@ namespace NewHorizons.Builder.General gravityGO.SetActive(true); ao.SetValue("_gravityVolume", GV); + + return GV; } } } diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs new file mode 100644 index 00000000..22da7018 --- /dev/null +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -0,0 +1,32 @@ +using NewHorizons.External; +using NewHorizons.OrbitalPhysics; +using NewHorizons.Utility; +using PacificEngine.OW_CommonResources.Game.Resource; +using PacificEngine.OW_CommonResources.Game.State; +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.Builder.General +{ + public static class HeavenlyBodyBuilder + { + public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion) + { + var size = new Position.Size(config.Base.SurfaceSize, SOI); + var G = GravityVolume.GRAVITATIONAL_CONSTANT; + var gravity = new Gravity(G, bodyGravity == null ? 0 : bodyGravity.GetFalloffExponent(), bodyGravity == null ? 0 : bodyGravity.GetStandardGravitationalParameter() / G); + var parent = HeavenlyBody.FromString(config.Orbit.PrimaryBody); + var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit); + + var hb = new HeavenlyBody(config.Name); + var planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit); + + Planet.mapping.Add(hb, planetoid); + } + } +} diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index ad53c343..ffb51a83 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -17,31 +17,21 @@ namespace NewHorizons.Builder.Orbital { public static InitialMotion Make(GameObject body, AstroObject primaryBody, OWRigidbody OWRB, OrbitModule orbit) { - - - /* - ParameterizedInitialMotion initialMotion = body.AddComponent(); - initialMotion.SetPrimary(primaryBody); - initialMotion.SetOrbitalParameters( - orbit.Eccentricity, - orbit.SemiMajorAxis, - orbit.Inclination, - orbit.LongitudeOfAscendingNode, - orbit.ArgumentOfPeriapsis, - orbit.TrueAnomaly); - initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0.02f : 1.0f / orbit.SiderealPeriod); - */ - InitialMotion initialMotion = body.AddComponent(); return Update(initialMotion, body, primaryBody, OWRB, orbit); } public static InitialMotion Update(InitialMotion initialMotion, GameObject body, AstroObject primaryBody, OWRigidbody OWRB, OrbitModule orbit) { + // Rotation + initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 1.0f / orbit.SiderealPeriod); + + var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination, Vector3.right) * Vector3.up; + body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis); + + initialMotion._orbitImpulseScalar = 0f; if (!orbit.IsStatic) - { - initialMotion._orbitImpulseScalar = 0f; - + { if(primaryBody != null) { initialMotion.SetPrimaryBody(primaryBody.GetAttachedOWRigidbody()); @@ -49,18 +39,14 @@ namespace NewHorizons.Builder.Orbital if(gv != null) { var velocity = OrbitalHelper.GetVelocity(new OrbitalHelper.Gravity(primaryBody.GetGravityVolume()), orbit); - initialMotion._initLinearDirection = velocity.normalized; + + // 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); initialMotion._initLinearSpeed = velocity.magnitude; } } } - // Rotation - //initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 1.0f / orbit.SiderealPeriod); - initialMotion.SetValue("_initAngularSpeed", 0); - var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination, Vector3.right) * Vector3.up; - body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis); - return initialMotion; } } diff --git a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs index b54a5c4e..13304cf7 100644 --- a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs +++ b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs @@ -21,15 +21,12 @@ namespace NewHorizons.Builder.Orbital lineRenderer.useWorldSpace = false; lineRenderer.loop = false; + var ecc = config.Orbit.Eccentricity; + OrbitLine orbitLine; - if (config.Orbit.Eccentricity == 0) - { - orbitLine = orbitGO.AddComponent(); - } - else - { - orbitLine = orbitGO.AddComponent(); - } + if (ecc == 0) orbitLine = orbitGO.AddComponent(); + else if (ecc > 0 && ecc < 1) orbitLine = orbitGO.AddComponent(); + else orbitLine = orbitGO.AddComponent(); var color = Color.white; if (config.Orbit.Tint != null) color = config.Orbit.Tint.ToColor32(); diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 6e9a1895..2421cf8a 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -10,6 +10,9 @@ using NewHorizons.Utility; using OWML.Common; using OWML.ModHelper; using OWML.Utils; +using PacificEngine.OW_CommonResources.Game.Resource; +using PacificEngine.OW_CommonResources.Game.State; +using PacificEngine.OW_CommonResources.Geometry.Orbits; using System; using System.Collections.Generic; using System.IO; @@ -17,6 +20,7 @@ using System.Linq; using System.Reflection; using UnityEngine; using UnityEngine.SceneManagement; +using static PacificEngine.OW_CommonResources.Game.State.Planet; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons @@ -219,8 +223,6 @@ namespace NewHorizons Logger.Log($"Begin generation sequence of [{body.Config.Name}]"); - body.Config.Orbit.AxialTilt = 0; - var go = new GameObject(body.Config.Name.Replace(" ", "").Replace("'", "") + "_Body"); go.SetActive(false); @@ -233,8 +235,9 @@ namespace NewHorizons var ao = (AstroObject)outputTuple.Item1; var owRigidBody = (OWRigidbody)outputTuple.Item2; + GravityVolume gv = null; if (body.Config.Base.SurfaceGravity != 0) - GravityBuilder.Make(go, ao, body.Config.Base.SurfaceGravity, sphereOfInfluence * (body.Config.Star != null ? 10f : 1f), body.Config.Base.SurfaceSize, body.Config.Base.GravityFallOff); + gv = GravityBuilder.Make(go, ao, body.Config.Base.SurfaceGravity, sphereOfInfluence * (body.Config.Star != null ? 10f : 1f), body.Config.Base.SurfaceSize, body.Config.Base.GravityFallOff); if(body.Config.Base.HasReferenceFrame) RFVolumeBuilder.Make(go, owRigidBody, sphereOfInfluence); @@ -280,7 +283,7 @@ namespace NewHorizons } // Have to do this after setting position - InitialMotionBuilder.Make(go, primaryBody, owRigidBody, body.Config.Orbit); + var initialMotion = InitialMotionBuilder.Make(go, primaryBody, owRigidBody, body.Config.Orbit); // Spawning on other planets is a bit hacky so we do it last if (body.Config.Spawn != null) @@ -294,6 +297,8 @@ namespace NewHorizons if (ao.GetAstroObjectName() == AstroObject.Name.CustomString) AstroObjectLocator.RegisterCustomAstroObject(ao); + HeavenlyBodyBuilder.Make(go, body.Config, sphereOfInfluence, gv, initialMotion); + return go; } diff --git a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs index de0c059b..a70bd305 100644 --- a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs +++ b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs @@ -31,7 +31,7 @@ namespace NewHorizons.OrbitalPhysics { // The gravity doesnt have an affect on position so we put whatever var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); + var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } @@ -45,7 +45,7 @@ namespace NewHorizons.OrbitalPhysics if(ao.SemiMajorAxis != 0) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination + 90, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); + var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } @@ -59,7 +59,7 @@ namespace NewHorizons.OrbitalPhysics if (semiMajorAxis != 0) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromTrueAnomaly(eccentricity, semiMajorAxis, inclination + 90, argumentOfPeriapsis, longitudeOfAscendingNode, trueAnomaly); + var kepler = KeplerCoordinates.fromTrueAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, trueAnomaly); pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } @@ -73,7 +73,7 @@ namespace NewHorizons.OrbitalPhysics if (semiMajorAxis != 0) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromEccentricAnomaly(eccentricity, semiMajorAxis, inclination + 90, argumentOfPeriapsis, longitudeOfAscendingNode, eccentricAnomaly); + var kepler = KeplerCoordinates.fromEccentricAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, eccentricAnomaly); pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } @@ -84,7 +84,7 @@ namespace NewHorizons.OrbitalPhysics public static Vector3 GetVelocity(Gravity gravity, OrbitModule orbit) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); - var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); + var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; Logger.Log($"Velocity : {vel}"); return vel; @@ -93,12 +93,17 @@ namespace NewHorizons.OrbitalPhysics public static Vector3 GetVelocity(Gravity gravity, ParameterizedAstroObject ao) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); - var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination + 90, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); + var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; Logger.Log($"Velocity : {vel}"); return vel; } + 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; } diff --git a/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs b/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs index 7668667d..30b47f4a 100644 --- a/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs +++ b/NewHorizons/OrbitalPhysics/ParameterizedAstroObject.cs @@ -24,7 +24,7 @@ namespace NewHorizons.OrbitalPhysics public float Inclination { - get { return _keplerCoordinates.inclinationAngle - 90; } + get { return _keplerCoordinates.inclinationAngle; } } public float ArgumentOfPeriapsis @@ -44,12 +44,12 @@ namespace NewHorizons.OrbitalPhysics public void SetKeplerCoordinatesFromOrbitModule(OrbitModule orbit) { - _keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); + _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 + 90, p, l, trueAnomaly); + _keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(ecc, a, i, p, l, trueAnomaly); } public override string ToString() diff --git a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs b/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs index f63827db..f37bfc68 100644 --- a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs +++ b/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs @@ -21,8 +21,8 @@ namespace NewHorizons.OrbitalPhysics astroObject = _astroObject as ParameterizedAstroObject; - var periapsis = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination + 90, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 0f); - var semiMinorDecending = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination + 90, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 90f); + var periapsis = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 0f); + var semiMinorDecending = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 90f); var a = astroObject.SemiMajorAxis; var b = a * Mathf.Sqrt(1 - astroObject.Eccentricity * astroObject.Eccentricity); @@ -31,5 +31,31 @@ namespace NewHorizons.OrbitalPhysics _upAxisDir = Vector3.Cross(_semiMajorAxis, _semiMinorAxis).normalized; _fociDistance = Mathf.Sqrt(a * a - b * b); } - } + + // Literally the stock EllipticOrbitLine but for now I don't want to use the patches from CommonResources + public override void Update() + { + AstroObject astroObject = (this._astroObject != null) ? this._astroObject.GetPrimaryBody() : null; + if (astroObject == null) + { + base.enabled = false; + return; + } + Vector3 vector = astroObject.transform.position + this._semiMajorAxis.normalized * this._fociDistance; + float num = this.CalcProjectedAngleToCenter(vector, this._semiMajorAxis, this._semiMinorAxis, this._astroObject.transform.position); + for (int i = 0; i < this._numVerts; i++) + { + float f = (float)i / (float)(this._numVerts - 1) * 3.1415927f * 2f - (num + 3.1415927f); + this._verts[i] = this._semiMajorAxis * Mathf.Cos(f) + this._semiMinorAxis * Mathf.Sin(f); + } + this._lineRenderer.SetPositions(this._verts); + base.transform.position = vector; + base.transform.rotation = Quaternion.LookRotation(this._semiMinorAxis, this._upAxisDir); + float num2 = this.DistanceToEllipticalOrbitLine(vector, this._semiMajorAxis, this._semiMinorAxis, this._upAxisDir, Locator.GetActiveCamera().transform.position); + float widthMultiplier = Mathf.Min(num2 * (this._lineWidth / 1000f), this._maxLineWidth); + float num3 = this._fade ? (1f - Mathf.Clamp01((num2 - this._fadeStartDist) / (this._fadeEndDist - this._fadeStartDist))) : 1f; + this._lineRenderer.widthMultiplier = widthMultiplier; + this._lineRenderer.startColor = new Color(this._color.r, this._color.g, this._color.b, num3 * num3); + } + } }