mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
62 lines
2.8 KiB
C#
62 lines
2.8 KiB
C#
using OWML.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using NewHorizons.Utility;
|
|
using Logger = NewHorizons.Utility.Logger;
|
|
|
|
namespace NewHorizons.OrbitalPhysics
|
|
{
|
|
public class ParameterizedOrbitLine : EllipticOrbitLine
|
|
{
|
|
public ParameterizedAstroObject astroObject;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
|
|
astroObject = _astroObject as ParameterizedAstroObject;
|
|
|
|
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);
|
|
|
|
_semiMajorAxis = periapsis.normalized * a;
|
|
_semiMinorAxis = semiMinorDecending.normalized * b;
|
|
_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 primaryAO = _astroObject?.GetPrimaryBody();
|
|
if (primaryAO == null)
|
|
{
|
|
base.enabled = false;
|
|
return;
|
|
}
|
|
Vector3 vector = primaryAO.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);
|
|
}
|
|
}
|
|
}
|