Added manifest dependency

This commit is contained in:
Nick J. Connors 2022-01-02 13:08:35 -05:00
parent 74230cba86
commit f045294177
3 changed files with 248 additions and 251 deletions

View File

@ -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();
}
}
}

View File

@ -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");
} }

View File

@ -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" ]
} }