Fixed comet tail, gravity radius, axial tilt, linear gravity eccentric orbit lines, detail rotation, changed menu screen planets, map satellite orbit,
This commit is contained in:
Nick J. Connors 2022-01-04 15:29:10 -05:00
parent e5ced93768
commit a158f05a9d
11 changed files with 174 additions and 65 deletions

View File

@ -17,7 +17,7 @@ namespace NewHorizons.Builder.Body
cometTail.transform.localPosition = Vector3.zero;
cometTail.name = "CometTail";
cometTail.transform.localScale = Vector3.one * module.SurfaceSize / 110;
cometTail.transform.localRotation = Quaternion.Euler(0, 180, 90);
cometTail.transform.localRotation = Quaternion.Euler(0, 90, 90);
/*
var alignment = cometTail.AddComponent<AlignWithTargetBody>();
alignment.SetTargetBody(primary.GetAttachedOWRigidbody());

View File

@ -19,6 +19,11 @@ namespace NewHorizons.Builder.General
var gravityRadius = GM / 0.1f;
if (exponent == 2f) gravityRadius = Mathf.Sqrt(gravityRadius);
// To let you actually orbit things the way you would expect we cap this at 4x the diameter if its not a star or black hole (this is what giants deep has)
if (config.Star != null || config.Singularity != null) gravityRadius = Mathf.Min(gravityRadius, 4 * config.Base.SurfaceSize);
else gravityRadius = Mathf.Min(gravityRadius, 15 * config.Base.SurfaceSize);
if (config.Base.SphereOfInfluence != 0f) gravityRadius = config.Base.SphereOfInfluence;
GameObject gravityGO = new GameObject("GravityWell");
gravityGO.transform.parent = body.transform;
gravityGO.transform.localPosition = Vector3.zero;

View File

@ -26,7 +26,7 @@ namespace NewHorizons.Builder.Orbital
// Rotation
initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 1.0f / orbit.SiderealPeriod);
var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination, Vector3.right) * Vector3.up;
var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination + 90f, Vector3.right) * Vector3.up;
body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis);
initialMotion._orbitImpulseScalar = 0f;

View File

@ -23,10 +23,16 @@ namespace NewHorizons.Builder.Orbital
var ecc = config.Orbit.Eccentricity;
var parentGravity = astroobject.GetPrimaryBody()?.GetGravityVolume();
OrbitLine orbitLine;
if (ecc == 0) orbitLine = orbitGO.AddComponent<OrbitLine>();
else if (ecc > 0 && ecc < 1) orbitLine = orbitGO.AddComponent<EllipticOrbitLine>();
else orbitLine = orbitGO.AddComponent<TrackingOrbitLine>();
if (ecc == 0)
orbitLine = orbitGO.AddComponent<OrbitLine>();
// Doesn't work for linear eccentric falloff
else if (ecc > 0 && ecc < 1 && (parentGravity != null && parentGravity._falloffType == GravityVolume.FalloffType.inverseSquared))
orbitLine = orbitGO.AddComponent<EllipticOrbitLine>();
else
orbitLine = orbitGO.AddComponent<TrackingOrbitLine>();
var color = Color.white;
if (config.Orbit.Tint != null) color = config.Orbit.Tint.ToColor32();

View File

@ -94,8 +94,8 @@ namespace NewHorizons.Builder.Props
prop.transform.parent = go.transform;
prop.transform.localPosition = position == null ? Vector3.zero : (Vector3)position;
Quaternion rot = rotation == null ? prefab.transform.rotation : Quaternion.Euler((Vector3)rotation);
prop.transform.rotation = rot;
Quaternion rot = rotation == null ? Quaternion.identity : Quaternion.Euler((Vector3)rotation);
prop.transform.localRotation = rot;
if (alignWithNormal)
{
var up = prop.transform.localPosition.normalized;
@ -116,7 +116,7 @@ namespace NewHorizons.Builder.Props
private static void MakeScatter(GameObject go, PropModule.ScatterInfo[] scatterInfo, float radius, Sector sector, IModAssets assets, string uniqueModName)
{
var area = 4f * Mathf.PI * radius * radius;
var points = FibonacciSphere((int)area);
var points = RandomUtility.FibonacciSphere((int)area);
foreach (var propInfo in scatterInfo)
{
@ -136,27 +136,6 @@ namespace NewHorizons.Builder.Props
}
}
private static List<Vector3> FibonacciSphere(int samples)
{
List<Vector3> points = new List<Vector3>();
var phi = Mathf.PI * (3f - Mathf.Sqrt(5f));
for(int i = 0; i < samples; i++)
{
var y = 1 - (i / (float)(samples - 1)) * 2f;
var radius = Mathf.Sqrt(1 - y * y);
var theta = phi * i;
var x = Mathf.Cos(theta) * radius;
var z = Mathf.Sin(theta) * radius;
points.Add(new Vector3(x, y, z));
}
return points;
}
private static GameObject LoadPrefab(string assetBundle, string path, string uniqueModName, IModAssets assets)
{
string key = uniqueModName + "." + assetBundle;

View File

@ -0,0 +1,22 @@
using NewHorizons.Builder.General;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Components
{
public class MapSatelliteOrbitFix : MonoBehaviour
{
public void Awake()
{
var detector = base.transform.GetComponentInChildren<DynamicForceDetector>();
var ao = base.GetComponent<AstroObject>();
var newDetector = DetectorBuilder.Make(base.gameObject, ao.GetAttachedOWRigidbody(), ao.GetPrimaryBody(), ao);
newDetector.transform.parent = detector.transform.parent;
GameObject.Destroy(detector);
}
}
}

View File

@ -14,6 +14,7 @@ namespace NewHorizons.External
public float SurfaceGravity { get; set; }
public string GravityFallOff { get; set; } = "linear";
public float SurfaceSize { get; set; }
public float SphereOfInfluence { get; set; }
public float WaterSize { get; set; }
public float GroundSize { get; set; }
public float LavaSize { get; set; }

View File

@ -4,6 +4,7 @@ using NewHorizons.Builder.Body;
using NewHorizons.Builder.General;
using NewHorizons.Builder.Orbital;
using NewHorizons.Builder.Props;
using NewHorizons.Components;
using NewHorizons.External;
using NewHorizons.OrbitalPhysics;
using NewHorizons.Utility;
@ -24,7 +25,6 @@ namespace NewHorizons
{
public class Main : ModBehaviour
{
public static AssetBundle ShaderBundle;
public static Main Instance { get; private set; }
@ -34,7 +34,8 @@ namespace NewHorizons
public static float FurthestOrbit { get; set; } = 50000f;
public StarLightController StarLightController { get; private set; }
private static string _currentStarSystem = "SolarSystem";
private string _currentStarSystem = "SolarSystem";
private bool _isChangingStarSystem = false;
public override object GetApi()
{
@ -45,6 +46,7 @@ namespace NewHorizons
{
SceneManager.sceneLoaded += OnSceneLoaded;
Instance = this;
GlobalMessenger<DeathType>.AddListener("PlayerDeath", OnDeath);
ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader");
Utility.Patches.Apply();
@ -60,7 +62,7 @@ namespace NewHorizons
Logger.LogWarning("Couldn't find planets folder");
}
//UnityEngine.Random.InitState();
UnityEngine.Random.InitState((int)DateTime.Now.Ticks);
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single));
}
@ -68,21 +70,36 @@ namespace NewHorizons
{
Logger.Log($"Destroying NewHorizons");
SceneManager.sceneLoaded -= OnSceneLoaded;
GlobalMessenger<DeathType>.RemoveListener("PlayerDeath", OnDeath);
}
void OnDeath(DeathType _)
{
// We reset the solar system on death (unless we just killed the player)
if (!_isChangingStarSystem) _currentStarSystem = "SolarSystem";
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Logger.Log($"Scene Loaded: {scene.name} {mode}");
_isChangingStarSystem = false;
HeavenlyBodyBuilder.Reset();
if (scene.name.Equals("TitleScreen")) DisplayBodyOnTitleScreen();
if (scene.name != "SolarSystem") return;
if (scene.name != "SolarSystem")
{
// Reset back to original solar system after going to main menu.
_currentStarSystem = "SolarSystem";
return;
}
NewHorizonsData.Load();
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => ShipLogBuilder.Init());
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => AstroObjectLocator.GetAstroObject("MapSatellite").gameObject.AddComponent<MapSatelliteOrbitFix>());
// Need to manage this when there are multiple stars
var sun = GameObject.Find("Sun_Body");
@ -188,13 +205,51 @@ namespace NewHorizons
public void DisplayBodyOnTitleScreen()
{
//Try loading one planet why not
GameObject titleScreenGO = new GameObject("TitleScreenPlanet");
var eligible = BodyList.Where(b => b.Config.Ring != null && (b.Config.HeightMap != null || (b.Config.Atmosphere?.Cloud != null))).ToArray();
var body = eligible[UnityEngine.Random.Range(0, eligible.Count())];
var eligible = BodyList.Where(b => b.Config.HeightMap != null || b.Config.Atmosphere?.Cloud != null).ToArray();
var eligibleCount = eligible.Count();
if (eligibleCount == 0) return;
var selectionCount = Mathf.Max(eligibleCount, UnityEngine.Random.Range(1, 3));
var indices = RandomUtility.GetUniqueRandomArray(0, eligible.Count(), selectionCount);
var body = eligible[UnityEngine.Random.Range(0, eligibleCount)];
Logger.Log($"Displaying {body.Config.Name} on the title screen");
var flag = false;
GameObject body1, body2, body3;
body1 = LoadTitleScreenBody(eligible[indices[0]]);
if (selectionCount > 2)
{
body1.transform.localScale = Vector3.one * (body1.transform.localScale.x) * 0.3f;
body1.transform.localPosition = new Vector3(0, -10, 0);
body2 = LoadTitleScreenBody(eligible[indices[1]]);
body2.transform.localScale = Vector3.one * (body2.transform.localScale.x) * 0.3f;
body2.transform.localPosition = new Vector3(7, 40, 0);
}
if (selectionCount > 3)
{
body3 = LoadTitleScreenBody(eligible[indices[2]]);
body3.transform.localScale = Vector3.one * (body3.transform.localScale.x) * 0.3f;
body3.transform.localPosition = new Vector3(-5, 15, 0);
}
GameObject.Find("Scene/Background/PlanetPivot/Prefab_HEA_Campfire").SetActive(false);
GameObject.Find("Scene/Background/PlanetPivot/PlanetRoot").SetActive(false);
var lightGO = new GameObject("Light");
lightGO.transform.parent = GameObject.Find("Scene/Background").transform;
lightGO.transform.localPosition = new Vector3(-47.9203f, 145.7596f, 43.1802f);
var light = lightGO.AddComponent<Light>();
light.color = new Color(1f, 1f, 1f, 1f);
light.range = 100;
light.intensity = 0.8f;
}
private GameObject LoadTitleScreenBody(NewHorizonsBody body)
{
Logger.Log($"Displaying {body.Config.Name} on the title screen");
GameObject titleScreenGO = new GameObject(body.Config.Name + "_TitleScreen");
HeightMapModule heightMap = new HeightMapModule();
var minSize = 20;
var maxSize = 35;
@ -206,19 +261,15 @@ namespace NewHorizons
heightMap.HeightMap = body.Config.HeightMap.HeightMap;
heightMap.MaxHeight = size;
heightMap.MinHeight = body.Config.HeightMap.MinHeight * size / body.Config.HeightMap.MaxHeight;
flag = true;
}
if (body.Config.Atmosphere != null && body.Config.Atmosphere.Cloud != null)
{
// Hacky but whatever I just want a sphere
size = Mathf.Clamp(body.Config.Atmosphere.Size / 10, minSize, maxSize);
heightMap.MaxHeight = heightMap.MinHeight = size+1;
heightMap.MaxHeight = heightMap.MinHeight = size + 1;
heightMap.TextureMap = body.Config.Atmosphere.Cloud;
flag = true;
}
if (flag)
{
HeightMapBuilder.Make(titleScreenGO, heightMap, body.Assets);
if (body.Config.Ring != null)
{
@ -229,19 +280,10 @@ namespace NewHorizons
RingBuilder.Make(titleScreenGO, newRing, body.Assets);
titleScreenGO.transform.localScale = Vector3.one * 0.8f;
}
GameObject.Find("Scene/Background/PlanetPivot/Prefab_HEA_Campfire").SetActive(false);
GameObject.Find("Scene/Background/PlanetPivot/PlanetRoot").SetActive(false);
titleScreenGO.transform.parent = GameObject.Find("Scene/Background/PlanetPivot/").transform;
titleScreenGO.transform.localPosition = Vector3.zero;
var lightGO = new GameObject("Light");
lightGO.transform.parent = titleScreenGO.transform.parent.parent;
lightGO.transform.localPosition = new Vector3(-47.9203f, 145.7596f, 43.1802f);
var light = lightGO.AddComponent<Light>();
light.color = new Color(1f, 1f, 1f, 1f);
light.range = 100;
light.intensity = 0.8f;
}
return titleScreenGO;
}
private bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = false)
@ -480,6 +522,8 @@ namespace NewHorizons
public void ChangeCurrentStarSystem(string newStarSystem)
{
_currentStarSystem = newStarSystem;
_isChangingStarSystem = true;
Locator.GetDeathManager().KillPlayer(DeathType.Meditation);
LoadManager.LoadSceneAsync(OWScene.SolarSystem, true, LoadManager.FadeType.ToBlack, 0.1f, true);
}
}

View File

@ -33,6 +33,7 @@
<ItemGroup>
<Reference Include="PacificEngine.OW_CommonResources">
<HintPath>$(OuterWildsModsDirectory)\PacificEngine.OW_CommonResources\PacificEngine.OW_CommonResources.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>

View File

@ -19,7 +19,7 @@ namespace NewHorizons.Utility
public static AstroObject GetAstroObject(string name)
{
if (name.Equals("MAP_SATELLITE"))
if (name.ToUpper().Replace("_", "").Equals("MAPSATELLITE"))
return GetAstroObject(AstroObject.Name.MapSatellite);
var aoName = AstroObject.StringIDToAstroObjectName(name);
if(aoName == AstroObject.Name.None) aoName = AstroObject.StringIDToAstroObjectName(name.ToUpper().Replace(" ", "_"));

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Utility
{
public static class RandomUtility
{
public static int[] GetUniqueRandomArray(int min, int max, int count)
{
int[] result = new int[count];
List<int> numbersInOrder = new List<int>();
for (var x = min; x < max; x++)
{
numbersInOrder.Add(x);
}
for (var x = 0; x < count; x++)
{
var randomIndex = UnityEngine.Random.Range(0, numbersInOrder.Count);
result[x] = numbersInOrder[randomIndex];
numbersInOrder.RemoveAt(randomIndex);
}
return result;
}
public static List<Vector3> FibonacciSphere(int samples)
{
List<Vector3> points = new List<Vector3>();
var phi = Mathf.PI * (3f - Mathf.Sqrt(5f));
for (int i = 0; i < samples; i++)
{
var y = 1 - (i / (float)(samples - 1)) * 2f;
var radius = Mathf.Sqrt(1 - y * y);
var theta = phi * i;
var x = Mathf.Cos(theta) * radius;
var z = Mathf.Sin(theta) * radius;
points.Add(new Vector3(x, y, z));
}
return points;
}
}
}