mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Added manifest dependency
This commit is contained in:
parent
74230cba86
commit
f045294177
@ -1,255 +1,251 @@
|
|||||||
using NewHorizons.External;
|
using NewHorizons.External;
|
||||||
using NewHorizons.OrbitalPhysics;
|
using NewHorizons.OrbitalPhysics;
|
||||||
using NewHorizons.Utility;
|
using NewHorizons.Utility;
|
||||||
using OWML.Common;
|
using OWML.Common;
|
||||||
using OWML.Utils;
|
using OWML.Utils;
|
||||||
using PacificEngine.OW_CommonResources.Game;
|
using PacificEngine.OW_CommonResources.Game;
|
||||||
using PacificEngine.OW_CommonResources.Game.Resource;
|
using PacificEngine.OW_CommonResources.Game.Resource;
|
||||||
using PacificEngine.OW_CommonResources.Game.State;
|
using PacificEngine.OW_CommonResources.Game.State;
|
||||||
using PacificEngine.OW_CommonResources.Geometry.Orbits;
|
using PacificEngine.OW_CommonResources.Geometry.Orbits;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Logger = NewHorizons.Utility.Logger;
|
using Logger = NewHorizons.Utility.Logger;
|
||||||
|
|
||||||
namespace NewHorizons.Builder.General
|
namespace NewHorizons.Builder.General
|
||||||
{
|
{
|
||||||
public static class HeavenlyBodyBuilder
|
public static class HeavenlyBodyBuilder
|
||||||
{
|
{
|
||||||
private static readonly Dictionary<string, HeavenlyBody> _bodyMap = new Dictionary<string, HeavenlyBody>();
|
private static readonly Dictionary<string, HeavenlyBody> _bodyMap = new Dictionary<string, HeavenlyBody>();
|
||||||
|
|
||||||
public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion)
|
public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion)
|
||||||
{
|
{
|
||||||
var size = new Position.Size(config.Base.SurfaceSize, SOI);
|
var size = new Position.Size(config.Base.SurfaceSize, SOI);
|
||||||
var gravity = GetGravity(bodyGravity);
|
var gravity = GetGravity(bodyGravity);
|
||||||
var parent = config.Orbit.PrimaryBody != null ? GetBody(config.Orbit.PrimaryBody) : HeavenlyBody.None;
|
var parent = config.Orbit.PrimaryBody != null ? GetBody(config.Orbit.PrimaryBody) : HeavenlyBody.None;
|
||||||
|
|
||||||
if (config.Orbit.PrimaryBody != null && parent == HeavenlyBody.None)
|
if (config.Orbit.PrimaryBody != null && parent == HeavenlyBody.None)
|
||||||
Logger.LogWarning($"Could not find [{config.Orbit.PrimaryBody}] parent of [{config.Name}]");
|
Logger.LogWarning($"Could not find [{config.Orbit.PrimaryBody}] parent of [{config.Name}]");
|
||||||
|
|
||||||
var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit);
|
var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit);
|
||||||
|
|
||||||
var hb = GetBody(config.Name);
|
var hb = GetBody(config.Name);
|
||||||
if (hb == null) hb = AddHeavenlyBody(config.Name, config.FocalPoint != null);
|
if (hb == null) hb = AddHeavenlyBody(config.Name, config.FocalPoint != null);
|
||||||
|
|
||||||
Planet.Plantoid planetoid;
|
Planet.Plantoid planetoid;
|
||||||
|
|
||||||
if (!config.Orbit.IsStatic) planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit);
|
if (!config.Orbit.IsStatic) planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit);
|
||||||
else planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, 0f, HeavenlyBody.None, body.transform.position, Vector3.zero);
|
else planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, 0f, HeavenlyBody.None, body.transform.position, Vector3.zero);
|
||||||
|
|
||||||
var mapping = Planet.defaultMapping;
|
var mapping = Planet.defaultMapping;
|
||||||
mapping[hb] = planetoid;
|
mapping[hb] = planetoid;
|
||||||
|
|
||||||
// Fix for binary focal points
|
// Fix for binary focal points
|
||||||
if(parent != HeavenlyBody.None)
|
if(parent != HeavenlyBody.None)
|
||||||
{
|
{
|
||||||
var focalPoint = Position.AstroLookup[parent].Invoke()?.gameObject.GetComponent<BinaryFocalPoint>();
|
var focalPoint = Position.AstroLookup[parent].Invoke()?.gameObject.GetComponent<BinaryFocalPoint>();
|
||||||
if (focalPoint != null && mapping.ContainsKey(parent))
|
if (focalPoint != null && mapping.ContainsKey(parent))
|
||||||
{
|
{
|
||||||
GameObject primary = null;
|
GameObject primary = null;
|
||||||
GameObject secondary = null;
|
GameObject secondary = null;
|
||||||
|
|
||||||
Gravity primaryGravity = null;
|
Gravity primaryGravity = null;
|
||||||
Gravity secondaryGravity = null;
|
Gravity secondaryGravity = null;
|
||||||
|
|
||||||
// One of them is null if it's the one being loaded
|
// One of them is null if it's the one being loaded
|
||||||
if(config.Name.Equals(focalPoint.PrimaryName))
|
if(config.Name.Equals(focalPoint.PrimaryName))
|
||||||
{
|
{
|
||||||
primary = body;
|
primary = body;
|
||||||
primaryGravity = GetGravity(bodyGravity);
|
primaryGravity = GetGravity(bodyGravity);
|
||||||
secondary = Position.getBody(GetBody(focalPoint.SecondaryName))?.gameObject;
|
secondary = Position.getBody(GetBody(focalPoint.SecondaryName))?.gameObject;
|
||||||
var secondaryGV = Position.getBody(GetBody(focalPoint.SecondaryName))?.GetAttachedGravityVolume();
|
var secondaryGV = Position.getBody(GetBody(focalPoint.SecondaryName))?.GetAttachedGravityVolume();
|
||||||
if (secondaryGV != null) secondaryGravity = GetGravity(secondaryGV);
|
if (secondaryGV != null) secondaryGravity = GetGravity(secondaryGV);
|
||||||
}
|
}
|
||||||
else if (config.Name.Equals(focalPoint.SecondaryName))
|
else if (config.Name.Equals(focalPoint.SecondaryName))
|
||||||
{
|
{
|
||||||
secondary = body;
|
secondary = body;
|
||||||
secondaryGravity = GetGravity(bodyGravity);
|
secondaryGravity = GetGravity(bodyGravity);
|
||||||
primary = Position.getBody(GetBody(focalPoint.PrimaryName))?.gameObject;
|
primary = Position.getBody(GetBody(focalPoint.PrimaryName))?.gameObject;
|
||||||
var primaryGV = Position.getBody(GetBody(focalPoint.PrimaryName))?.GetAttachedGravityVolume();
|
var primaryGV = Position.getBody(GetBody(focalPoint.PrimaryName))?.GetAttachedGravityVolume();
|
||||||
if (primaryGV != null) primaryGravity = GetGravity(primaryGV);
|
if (primaryGV != null) primaryGravity = GetGravity(primaryGV);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (primaryGravity != null && secondaryGravity != null)
|
if (primaryGravity != null && secondaryGravity != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Also have to fix the children
|
// Also have to fix the children
|
||||||
var primaryHB = GetBody(focalPoint.PrimaryName);
|
var primaryHB = GetBody(focalPoint.PrimaryName);
|
||||||
var secondaryHB = GetBody(focalPoint.SecondaryName);
|
var secondaryHB = GetBody(focalPoint.SecondaryName);
|
||||||
|
|
||||||
var r = primary.transform.position - secondary.transform.position;
|
var r = primary.transform.position - secondary.transform.position;
|
||||||
|
|
||||||
var m1 = primaryGravity.mass;
|
var m1 = primaryGravity.mass;
|
||||||
var m2 = secondaryGravity.mass;
|
var m2 = secondaryGravity.mass;
|
||||||
|
|
||||||
float r1 = r.magnitude * m2 / (m1 + m2);
|
float r1 = r.magnitude * m2 / (m1 + m2);
|
||||||
float r2 = r.magnitude * m1 / (m1 + m2);
|
float r2 = r.magnitude * m1 / (m1 + m2);
|
||||||
|
|
||||||
ParameterizedAstroObject primaryAO = Position.AstroLookup[primaryHB].Invoke() as ParameterizedAstroObject;
|
ParameterizedAstroObject primaryAO = Position.AstroLookup[primaryHB].Invoke() as ParameterizedAstroObject;
|
||||||
ParameterizedAstroObject secondaryAO = Position.AstroLookup[secondaryHB].Invoke() as ParameterizedAstroObject;
|
ParameterizedAstroObject secondaryAO = Position.AstroLookup[secondaryHB].Invoke() as ParameterizedAstroObject;
|
||||||
|
|
||||||
float ecc = primaryAO.Eccentricity;
|
float ecc = primaryAO.Eccentricity;
|
||||||
float i = primaryAO.Inclination;
|
float i = primaryAO.Inclination;
|
||||||
float l = primaryAO.LongitudeOfAscendingNode;
|
float l = primaryAO.LongitudeOfAscendingNode;
|
||||||
float p = primaryAO.ArgumentOfPeriapsis;
|
float p = primaryAO.ArgumentOfPeriapsis;
|
||||||
|
|
||||||
var primaryKeplerCoordinates = KeplerCoordinates.fromEccentricAnomaly(ecc, r1 / (1 - ecc), i, p, l, 0);
|
var primaryKeplerCoordinates = KeplerCoordinates.fromEccentricAnomaly(ecc, r1 / (1 - ecc), i, p, l, 0);
|
||||||
var secondaryKeplerCoordinates = KeplerCoordinates.fromEccentricAnomaly(ecc, r2 / (1 - ecc), i, p, l, 180);
|
var secondaryKeplerCoordinates = KeplerCoordinates.fromEccentricAnomaly(ecc, r2 / (1 - ecc), i, p, l, 180);
|
||||||
|
|
||||||
var totalMass = m1 + m2;
|
var totalMass = m1 + m2;
|
||||||
|
|
||||||
var exponent = (primaryGravity.exponent + secondaryGravity.exponent) / 2f;
|
var exponent = (primaryGravity.exponent + secondaryGravity.exponent) / 2f;
|
||||||
var primaryCartesianState = OrbitHelper.toCartesian(Gravity.of(exponent, totalMass), 0, primaryKeplerCoordinates);
|
var primaryCartesianState = OrbitHelper.toCartesian(Gravity.of(exponent, totalMass), 0, primaryKeplerCoordinates);
|
||||||
var secondaryCartesianState = OrbitHelper.toCartesian(Gravity.of(exponent, totalMass), 0, secondaryKeplerCoordinates);
|
var secondaryCartesianState = OrbitHelper.toCartesian(Gravity.of(exponent, totalMass), 0, secondaryKeplerCoordinates);
|
||||||
|
|
||||||
var point = Position.AstroLookup[parent].Invoke();
|
var point = Position.AstroLookup[parent].Invoke();
|
||||||
|
|
||||||
primary.transform.position = point.transform.position + primaryCartesianState.Item1;
|
primary.transform.position = point.transform.position + primaryCartesianState.Item1;
|
||||||
secondary.transform.position = point.transform.position + secondaryCartesianState.Item1;
|
secondary.transform.position = point.transform.position + secondaryCartesianState.Item1;
|
||||||
|
|
||||||
Logger.Log($"Positions: {primary.transform.position}, {secondary.transform.position}");
|
Logger.Log($"Positions: {primary.transform.position}, {secondary.transform.position}");
|
||||||
|
|
||||||
var primaryOriginal = mapping[primaryHB];
|
var primaryOriginal = mapping[primaryHB];
|
||||||
var secondaryOriginal = mapping[secondaryHB];
|
var secondaryOriginal = mapping[secondaryHB];
|
||||||
|
|
||||||
// TODO: Idk if this works at all... probably not
|
// TODO: Idk if this works at all... probably not
|
||||||
var primaryRotation = 0f;
|
var primaryRotation = 0f;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
primaryRotation = primaryOriginal.state.relative.angularVelocity.magnitude;
|
primaryRotation = primaryOriginal.state.relative.angularVelocity.magnitude;
|
||||||
}
|
}
|
||||||
catch (Exception) { };
|
catch (Exception) { };
|
||||||
|
|
||||||
var secondaryRotation = 0f;
|
var secondaryRotation = 0f;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
secondaryRotation = secondaryOriginal.state.relative.angularVelocity.magnitude;
|
secondaryRotation = secondaryOriginal.state.relative.angularVelocity.magnitude;
|
||||||
}
|
}
|
||||||
catch (Exception) { };
|
catch (Exception) { };
|
||||||
|
|
||||||
mapping[primaryHB] = new Planet.Plantoid(
|
mapping[primaryHB] = new Planet.Plantoid(
|
||||||
primaryOriginal.size,
|
primaryOriginal.size,
|
||||||
primaryOriginal.gravity,
|
primaryOriginal.gravity,
|
||||||
primary.transform.rotation,
|
primary.transform.rotation,
|
||||||
primaryRotation,
|
primaryRotation,
|
||||||
parent,
|
parent,
|
||||||
primaryKeplerCoordinates);
|
primaryKeplerCoordinates);
|
||||||
|
|
||||||
mapping[secondaryHB] = new Planet.Plantoid(
|
mapping[secondaryHB] = new Planet.Plantoid(
|
||||||
secondaryOriginal.size,
|
secondaryOriginal.size,
|
||||||
secondaryOriginal.gravity,
|
secondaryOriginal.gravity,
|
||||||
secondary.transform.rotation,
|
secondary.transform.rotation,
|
||||||
secondaryRotation,
|
secondaryRotation,
|
||||||
parent,
|
parent,
|
||||||
secondaryKeplerCoordinates);
|
secondaryKeplerCoordinates);
|
||||||
|
|
||||||
var period = 2 * Mathf.PI * Mathf.Sqrt(Mathf.Pow(r.magnitude, exponent + 1) / (GravityVolume.GRAVITATIONAL_CONSTANT * totalMass));
|
var period = 2 * Mathf.PI * Mathf.Sqrt(Mathf.Pow(r.magnitude, exponent + 1) / (GravityVolume.GRAVITATIONAL_CONSTANT * totalMass));
|
||||||
|
|
||||||
var trackingOrbitPrimary = primary.GetComponentInChildren<TrackingOrbitLine>();
|
var trackingOrbitPrimary = primary.GetComponentInChildren<TrackingOrbitLine>();
|
||||||
if (trackingOrbitPrimary != null)
|
if (trackingOrbitPrimary != null)
|
||||||
{
|
{
|
||||||
trackingOrbitPrimary.TrailTime = period;
|
trackingOrbitPrimary.TrailTime = period;
|
||||||
}
|
}
|
||||||
|
|
||||||
var trackingOrbitSecondary = secondary.GetComponentInChildren<TrackingOrbitLine>();
|
var trackingOrbitSecondary = secondary.GetComponentInChildren<TrackingOrbitLine>();
|
||||||
if (trackingOrbitSecondary != null)
|
if (trackingOrbitSecondary != null)
|
||||||
{
|
{
|
||||||
trackingOrbitSecondary.TrailTime = period;
|
trackingOrbitSecondary.TrailTime = period;
|
||||||
}
|
}
|
||||||
|
|
||||||
Helper.helper.Console.WriteLine($"{parent}: {mapping[parent]}");
|
Logger.Log($"{parent}: {mapping[parent]}");
|
||||||
Helper.helper.Console.WriteLine($"{primaryHB}: {mapping[primaryHB]}");
|
Logger.Log($"{primaryHB}: {mapping[primaryHB]}");
|
||||||
Helper.helper.Console.WriteLine($"{secondaryHB}: {mapping[secondaryHB]}");
|
Logger.Log($"{secondaryHB}: {mapping[secondaryHB]}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Planet.defaultMapping = mapping;
|
Planet.defaultMapping = mapping;
|
||||||
Planet.mapping = mapping;
|
Planet.mapping = mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Remove(AstroObject obj)
|
|
||||||
{
|
|
||||||
var astro = Position.find(obj);
|
|
||||||
|
|
||||||
var mapping = Planet.defaultMapping;
|
|
||||||
mapping.Remove(astro);
|
|
||||||
Planet.defaultMapping = mapping;
|
|
||||||
|
|
||||||
mapping = Planet.mapping;
|
public static void Remove(AstroObject obj)
|
||||||
mapping.Remove(astro);
|
{
|
||||||
Planet.mapping = mapping;
|
var astro = Position.find(obj);
|
||||||
}
|
var mapping = Planet.defaultMapping;
|
||||||
|
mapping.Remove(astro);
|
||||||
private static Gravity GetGravity(GravityVolume volume)
|
Planet.defaultMapping = mapping;
|
||||||
{
|
Planet.mapping = mapping;
|
||||||
if (volume == null)
|
}
|
||||||
{
|
|
||||||
return Gravity.of(2, 0);
|
private static Gravity GetGravity(GravityVolume volume)
|
||||||
}
|
{
|
||||||
|
if (volume == null)
|
||||||
var exponent = volume._falloffType != GravityVolume.FalloffType.linear ? 2f : 1f;
|
{
|
||||||
var mass = (volume._surfaceAcceleration * Mathf.Pow(volume._upperSurfaceRadius, exponent)) / GravityVolume.GRAVITATIONAL_CONSTANT;
|
return Gravity.of(2, 0);
|
||||||
|
}
|
||||||
return Gravity.of(exponent, mass);
|
|
||||||
}
|
var exponent = volume._falloffType != GravityVolume.FalloffType.linear ? 2f : 1f;
|
||||||
|
var mass = (volume._surfaceAcceleration * Mathf.Pow(volume._upperSurfaceRadius, exponent)) / GravityVolume.GRAVITATIONAL_CONSTANT;
|
||||||
private static HeavenlyBody AddHeavenlyBody(string name, bool isFocalPoint)
|
|
||||||
{
|
return Gravity.of(exponent, mass);
|
||||||
var hb = new HeavenlyBody(name, isFocalPoint);
|
}
|
||||||
_bodyMap.Add(name, hb);
|
|
||||||
|
private static HeavenlyBody AddHeavenlyBody(string name, bool isFocalPoint)
|
||||||
var astroLookup = Position.AstroLookup;
|
{
|
||||||
var bodyLookup = Position.BodyLookup;
|
var hb = new HeavenlyBody(name, isFocalPoint);
|
||||||
|
_bodyMap.Add(name, hb);
|
||||||
astroLookup.Add(hb, () => GetAstroObject(name));
|
|
||||||
bodyLookup.Add(hb, () => GetOWRigidbody(name));
|
var astroLookup = Position.AstroLookup;
|
||||||
|
var bodyLookup = Position.BodyLookup;
|
||||||
Position.AstroLookup = astroLookup;
|
|
||||||
Position.BodyLookup = bodyLookup;
|
astroLookup.Add(hb, () => GetAstroObject(name));
|
||||||
|
bodyLookup.Add(hb, () => GetOWRigidbody(name));
|
||||||
return hb;
|
|
||||||
}
|
Position.AstroLookup = astroLookup;
|
||||||
|
Position.BodyLookup = bodyLookup;
|
||||||
private static HeavenlyBody GetBody(string name)
|
|
||||||
{
|
return hb;
|
||||||
if (_bodyMap.ContainsKey(name))
|
}
|
||||||
{
|
|
||||||
return _bodyMap[name];
|
private static HeavenlyBody GetBody(string name)
|
||||||
}
|
{
|
||||||
|
if (_bodyMap.ContainsKey(name))
|
||||||
var hb = Position.find(AstroObjectLocator.GetAstroObject(name));
|
{
|
||||||
if (hb != null)
|
return _bodyMap[name];
|
||||||
{
|
}
|
||||||
_bodyMap.Add(name, hb);
|
|
||||||
}
|
var hb = Position.find(AstroObjectLocator.GetAstroObject(name));
|
||||||
return hb;
|
if (hb != null)
|
||||||
}
|
{
|
||||||
|
_bodyMap.Add(name, hb);
|
||||||
public static void Reset()
|
}
|
||||||
{
|
return hb;
|
||||||
Planet.defaultMapping = Planet.standardMapping;
|
}
|
||||||
}
|
|
||||||
|
public static void Reset()
|
||||||
private static AstroObject GetAstroObject(string name)
|
{
|
||||||
{
|
Planet.defaultMapping = Planet.standardMapping;
|
||||||
var astroBody = AstroObjectLocator.GetAstroObject(name);
|
}
|
||||||
if (astroBody == null
|
|
||||||
|| astroBody.gameObject == null)
|
private static AstroObject GetAstroObject(string name)
|
||||||
{
|
{
|
||||||
return null;
|
var astroBody = AstroObjectLocator.GetAstroObject(name);
|
||||||
}
|
if (astroBody == null
|
||||||
|
|| astroBody.gameObject == null)
|
||||||
return astroBody;
|
{
|
||||||
}
|
return null;
|
||||||
|
}
|
||||||
private static OWRigidbody GetOWRigidbody(string name)
|
|
||||||
{
|
return astroBody;
|
||||||
var astroBody = GetAstroObject(name);
|
}
|
||||||
return astroBody?.GetOWRigidbody();
|
|
||||||
}
|
private static OWRigidbody GetOWRigidbody(string name)
|
||||||
}
|
{
|
||||||
}
|
var astroBody = GetAstroObject(name);
|
||||||
|
return astroBody?.GetOWRigidbody();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -189,7 +189,7 @@ namespace NewHorizons
|
|||||||
existingPlanet = AstroObjectLocator.GetAstroObject(stringID).gameObject;
|
existingPlanet = AstroObjectLocator.GetAstroObject(stringID).gameObject;
|
||||||
if (existingPlanet == null) existingPlanet = AstroObjectLocator.GetAstroObject(body.Config.Name.Replace(" ", "")).gameObject;
|
if (existingPlanet == null) existingPlanet = AstroObjectLocator.GetAstroObject(body.Config.Name.Replace(" ", "")).gameObject;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
existingPlanet = GameObject.Find(body.Config.Name.Replace(" ", "") + "_Body");
|
existingPlanet = GameObject.Find(body.Config.Name.Replace(" ", "") + "_Body");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,5 +4,6 @@
|
|||||||
"name": "New Horizons",
|
"name": "New Horizons",
|
||||||
"uniqueName": "xen.NewHorizons",
|
"uniqueName": "xen.NewHorizons",
|
||||||
"version": "0.3.1",
|
"version": "0.3.1",
|
||||||
"owmlVersion": "2.1.0"
|
"owmlVersion": "2.1.0",
|
||||||
|
"dependencies": [ "PacificEngine.OW_CommonResources" ]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user