diff --git a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs index 4cd2b3bf..e6ad0a53 100644 --- a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs +++ b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs @@ -45,15 +45,7 @@ namespace NewHorizons.Builder.Orbital { orbitLine = orbitGO.AddComponent(); - var a = astroObject.semiMajorAxis; - var e = astroObject.eccentricity; - var b = a * Mathf.Sqrt(1f - (e * e)); - var l = astroObject.longitudeOfAscendingNode; - var p = astroObject.argumentOfPeriapsis; - var i = astroObject.inclination; - - (orbitLine as NHOrbitLine).SemiMajorAxis = a * OrbitalParameters.Rotate(Vector3.left, l, i, p); - (orbitLine as NHOrbitLine).SemiMinorAxis = b * OrbitalParameters.Rotate(Vector3.forward, l, i, p); + (orbitLine as NHOrbitLine).SetFromParameters(astroObject); } var color = Color.white; diff --git a/NewHorizons/Components/Orbital/NHOrbitLine.cs b/NewHorizons/Components/Orbital/NHOrbitLine.cs index bf894e77..f58d5e92 100644 --- a/NewHorizons/Components/Orbital/NHOrbitLine.cs +++ b/NewHorizons/Components/Orbital/NHOrbitLine.cs @@ -1,20 +1,17 @@ -using System; +using System; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Components.Orbital { public class NHOrbitLine : OrbitLine { - public Vector3 SemiMajorAxis { get; set; } - public Vector3 SemiMinorAxis { get; set; } + private Vector3 _semiMajorAxis; + private Vector3 _semiMinorAxis; private Vector3 _upAxis; private float _fociDistance; private Vector3[] _verts; - private float semiMajorAxis; - private float semiMinorAxis; - public override void InitializeLineRenderer() { base.GetComponent().positionCount = this._numVerts; @@ -36,10 +33,10 @@ namespace NewHorizons.Components.Orbital { base.Start(); - var a = SemiMajorAxis.magnitude; - var b = SemiMinorAxis.magnitude; + var a = _semiMajorAxis.magnitude; + var b = _semiMinorAxis.magnitude; - _upAxis = Vector3.Cross(SemiMajorAxis.normalized, SemiMinorAxis.normalized); + _upAxis = Vector3.Cross(_semiMajorAxis.normalized, _semiMinorAxis.normalized); _fociDistance = Mathf.Sqrt(a * a - b * b); if (float.IsNaN(_fociDistance)) _fociDistance = 0f; @@ -48,9 +45,6 @@ namespace NewHorizons.Components.Orbital transform.localRotation = Quaternion.Euler(270, 90, 0); - semiMajorAxis = SemiMajorAxis.magnitude; - semiMinorAxis = SemiMinorAxis.magnitude; - base.enabled = false; } @@ -67,22 +61,22 @@ namespace NewHorizons.Components.Orbital return; } - Vector3 origin = primary.transform.position + SemiMajorAxis.normalized * _fociDistance; + Vector3 origin = primary.transform.position + _semiMajorAxis.normalized * _fociDistance; - float num = CalcProjectedAngleToCenter(origin, SemiMajorAxis, SemiMinorAxis, _astroObject.transform.position); + float num = CalcProjectedAngleToCenter(origin, _semiMajorAxis, _semiMinorAxis, _astroObject.transform.position); for (int i = 0; i < _numVerts; i++) { var stepSize = 2f * Mathf.PI / (float)(_numVerts - 1); float f = num + stepSize * i; - _verts[i] = SemiMajorAxis * Mathf.Cos(f) + SemiMinorAxis * Mathf.Sin(f); + _verts[i] = _semiMajorAxis * Mathf.Cos(f) + _semiMinorAxis * Mathf.Sin(f); } _lineRenderer.SetPositions(_verts); transform.position = origin; transform.rotation = Quaternion.Euler(0, 0, 0); //Quaternion.LookRotation(-SemiMajorAxis, _upAxis); - float num2 = DistanceToEllipticalOrbitLine(origin, SemiMajorAxis, SemiMinorAxis, _upAxis, Locator.GetActiveCamera().transform.position); + float num2 = DistanceToEllipticalOrbitLine(origin, _semiMajorAxis, _semiMinorAxis, _upAxis, Locator.GetActiveCamera().transform.position); float widthMultiplier = Mathf.Min(num2 * (_lineWidth / 1000f), _maxLineWidth); float num3 = _fade ? (1f - Mathf.Clamp01((num2 - _fadeStartDist) / (_fadeEndDist - _fadeStartDist))) : 1f; @@ -96,6 +90,19 @@ namespace NewHorizons.Components.Orbital } } + public void SetFromParameters(IOrbitalParameters parameters) + { + var a = parameters.semiMajorAxis; + var e = parameters.eccentricity; + var b = a * Mathf.Sqrt(1f - (e * e)); + var l = parameters.longitudeOfAscendingNode; + var p = parameters.argumentOfPeriapsis; + var i = parameters.inclination; + + _semiMajorAxis = a * OrbitalParameters.Rotate(Vector3.left, l, i, p); + _semiMinorAxis = b * OrbitalParameters.Rotate(Vector3.forward, l, i, p); + } + private float CalcProjectedAngleToCenter(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 point) { Vector3 lhs = point - foci; @@ -107,7 +114,7 @@ namespace NewHorizons.Components.Orbital private float DistanceToEllipticalOrbitLine(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 upAxis, Vector3 point) { float f = CalcProjectedAngleToCenter(foci, semiMajorAxis, semiMinorAxis, point); - Vector3 b = foci + SemiMajorAxis * Mathf.Cos(f) + SemiMinorAxis * Mathf.Sin(f); + Vector3 b = foci + _semiMajorAxis * Mathf.Cos(f) + _semiMinorAxis * Mathf.Sin(f); return Vector3.Distance(point, b); } } diff --git a/NewHorizons/Components/QuantumPlanet.cs b/NewHorizons/Components/QuantumPlanet.cs index d6b4222e..58c7d716 100644 --- a/NewHorizons/Components/QuantumPlanet.cs +++ b/NewHorizons/Components/QuantumPlanet.cs @@ -20,6 +20,7 @@ namespace NewHorizons.Components private ConstantForceDetector _detector; private AlignWithTargetBody _alignment; private OWRigidbody _rb; + private OrbitLine _orbitLine; public int CurrentIndex { get { return _currentIndex; } } @@ -31,6 +32,7 @@ namespace NewHorizons.Components _detector = GetComponentInChildren(); _alignment = GetComponent(); _rb = GetComponent(); + _orbitLine = GetComponent(); GlobalMessenger.AddListener("PlayerBlink", new Callback(OnPlayerBlink)); @@ -143,6 +145,16 @@ namespace NewHorizons.Components } _rb.SetVelocity(orbitalParameters.InitialVelocity + primaryBody.GetAttachedOWRigidbody().GetVelocity()); + + if (_orbitLine is NHOrbitLine nhOrbitLine) + { + nhOrbitLine.SetFromParameters(orbitalParameters); + } + + if (_orbitLine is TrackingOrbitLine trackingOrbitLine) + { + trackingOrbitLine.Reset(); + } } private void OnPlayerBlink()