Fix gravity/map scale + some prop stuff

This commit is contained in:
Nick J. Connors 2022-01-01 02:08:10 -05:00
parent ea721d2519
commit 4a912056c5
5 changed files with 50 additions and 30 deletions

View File

@ -11,24 +11,12 @@ namespace NewHorizons.Builder.General
{ {
public static GravityVolume Make(GameObject body, AstroObject ao, IPlanetConfig config) public static GravityVolume Make(GameObject body, AstroObject ao, IPlanetConfig config)
{ {
var parent = AstroObjectLocator.GetAstroObject(config.Orbit.PrimaryBody);
if (parent?.gameObject?.GetComponent<FocalPointModule>() != null)
{
parent = parent.GetPrimaryBody();
}
var a = config.Orbit.SemiMajorAxis;
if (parent == null)
{
parent = GameObject.Find("Sun_Body").GetComponent<AstroObject>();
a = 80000;
}
var exponent = config.Base.GravityFallOff.Equals("linear") ? 1f : 2f; var exponent = config.Base.GravityFallOff.Equals("linear") ? 1f : 2f;
var m = config.Base.SurfaceGravity * Mathf.Pow(config.Base.SurfaceSize, exponent) / 0.001f; var GM = config.Base.SurfaceGravity * Mathf.Pow(config.Base.SurfaceSize, exponent);
var M = parent.GetGravityVolume()._gravitationalMass;
var sphereOfInfluence = a * Mathf.Pow(m / M, 2f / (3f + exponent)); // Gravity limit will be when the acceleration it would cause is less than 0.1 m/s^2
Logger.Log($"{m}, {M}, {sphereOfInfluence}, {config.Name}"); var gravityRadius = GM / 0.1f;
if (exponent == 2f) gravityRadius = Mathf.Sqrt(gravityRadius);
GameObject gravityGO = new GameObject("GravityWell"); GameObject gravityGO = new GameObject("GravityWell");
gravityGO.transform.parent = body.transform; gravityGO.transform.parent = body.transform;
@ -38,7 +26,7 @@ namespace NewHorizons.Builder.General
SphereCollider SC = gravityGO.AddComponent<SphereCollider>(); SphereCollider SC = gravityGO.AddComponent<SphereCollider>();
SC.isTrigger = true; SC.isTrigger = true;
SC.radius = sphereOfInfluence; SC.radius = gravityRadius;
OWCollider OWC = gravityGO.AddComponent<OWCollider>(); OWCollider OWC = gravityGO.AddComponent<OWCollider>();
OWC.SetLODActivationMask(DynamicOccupant.Player); OWC.SetLODActivationMask(DynamicOccupant.Player);
@ -48,7 +36,7 @@ namespace NewHorizons.Builder.General
GravityVolume GV = gravityGO.AddComponent<GravityVolume>(); GravityVolume GV = gravityGO.AddComponent<GravityVolume>();
GV.SetValue("_cutoffAcceleration", 0.1f); GV.SetValue("_cutoffAcceleration", 0.1f);
GV.SetValue("_falloffType", GV.GetType().GetNestedType("FalloffType", BindingFlags.NonPublic).GetField(config.Base.GravityFallOff).GetValue(GV)); GV.SetValue("_falloffType", GV.GetType().GetNestedType("FalloffType", BindingFlags.NonPublic).GetField(config.Base.GravityFallOff).GetValue(GV));
GV.SetValue("_alignmentRadius", 1.5f * config.Base.SurfaceSize); GV.SetValue("_alignmentRadius", config.Base.SurfaceGravity != 0 ? 1.5f * config.Base.SurfaceSize : 0f);
GV.SetValue("_upperSurfaceRadius", config.Base.SurfaceSize); GV.SetValue("_upperSurfaceRadius", config.Base.SurfaceSize);
GV.SetValue("_lowerSurfaceRadius", 0); GV.SetValue("_lowerSurfaceRadius", 0);
GV.SetValue("_layer", 3); GV.SetValue("_layer", 3);

View File

@ -8,24 +8,40 @@ using UnityEngine;
using Random = UnityEngine.Random; using Random = UnityEngine.Random;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
using System.Reflection; using System.Reflection;
using NewHorizons.Utility;
namespace NewHorizons.Builder.Props namespace NewHorizons.Builder.Props
{ {
public static class PropBuilder public static class PropBuilder
{ {
public static GameObject Make(GameObject body, string propToClone, Vector3 position, Sector sector) public static void Make(GameObject go, Sector sector, IPlanetConfig config)
{ {
var prefab = GameObject.Find(propToClone); if (config.Props.Scatter != null) PropBuilder.Scatter(go, config.Props.Scatter, config.Base.SurfaceSize, sector);
return Make(body, prefab, position, sector); if(config.Props.Details != null)
{
foreach(var detail in config.Props.Details)
{
MakeDetail(go, sector, detail.path, detail.position, detail.rotation, detail.scale);
}
}
} }
public static GameObject Make(GameObject body, GameObject prefab, Vector3 position, Sector sector) public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale)
{
var prefab = GameObject.Find(propToClone);
return MakeDetail(go, sector, prefab, position, rotation, scale);
}
public static GameObject MakeDetail(GameObject go, Sector sector, GameObject prefab, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal = false)
{ {
if (prefab == null) return null; if (prefab == null) return null;
GameObject prop = GameObject.Instantiate(prefab, sector.transform); GameObject prop = GameObject.Instantiate(prefab, sector.transform);
prop.transform.localPosition = position; prop.transform.localPosition = position == null ? prefab.transform.localPosition : (Vector3)position;
prop.transform.rotation = Quaternion.FromToRotation(prop.transform.TransformDirection(Vector3.up), position.normalized); Quaternion rot = rotation == null ? prefab.transform.localRotation : Quaternion.Euler((Vector3)rotation);
if (alignWithNormal) rot = Quaternion.FromToRotation(prop.transform.TransformDirection(Vector3.up), ((Vector3)position).normalized);
prop.transform.rotation = rot;
prop.transform.localScale = scale != 0 ? Vector3.one * scale : prefab.transform.localScale;
prop.SetActive(false); prop.SetActive(false);
List<string> assetBundles = new List<string>(); List<string> assetBundles = new List<string>();
@ -69,7 +85,7 @@ namespace NewHorizons.Builder.Props
return prop; return prop;
} }
public static void Scatter(GameObject body, PropModule.ScatterInfo[] scatterInfo, float radius, Sector sector) private static void Scatter(GameObject go, PropModule.ScatterInfo[] scatterInfo, float radius, Sector sector)
{ {
var area = 4f * Mathf.PI * radius * radius; var area = 4f * Mathf.PI * radius * radius;
var points = FibonacciSphere((int)area); var points = FibonacciSphere((int)area);
@ -81,7 +97,7 @@ namespace NewHorizons.Builder.Props
{ {
var randomInd = (int)Random.Range(0, points.Count); var randomInd = (int)Random.Range(0, points.Count);
var point = points[randomInd]; var point = points[randomInd];
var prop = Make(body, prefab, point.normalized * radius, sector); var prop = MakeDetail(go, sector, prefab, (MVector3)(point.normalized * radius), null, 0f);
if(propInfo.offset != null) prop.transform.localPosition += prop.transform.TransformVector(propInfo.offset); if(propInfo.offset != null) prop.transform.localPosition += prop.transform.TransformVector(propInfo.offset);
if(propInfo.rotation != null) prop.transform.rotation *= Quaternion.Euler(propInfo.rotation); if(propInfo.rotation != null) prop.transform.rotation *= Quaternion.Euler(propInfo.rotation);
points.RemoveAt(randomInd); points.RemoveAt(randomInd);

View File

@ -10,6 +10,7 @@ namespace NewHorizons.External
public class PropModule : Module public class PropModule : Module
{ {
public ScatterInfo[] Scatter; public ScatterInfo[] Scatter;
public DetailInfo[] Details;
public MVector3[] Rafts; public MVector3[] Rafts;
public class ScatterInfo public class ScatterInfo
@ -19,5 +20,13 @@ namespace NewHorizons.External
public MVector3 offset; public MVector3 offset;
public MVector3 rotation; public MVector3 rotation;
} }
public class DetailInfo
{
public string path;
public MVector3 position;
public MVector3 rotation;
public float scale;
}
} }
} }

View File

@ -159,6 +159,13 @@ namespace NewHorizons
// I don't know what these do but they look really weird from a distance // I don't know what these do but they look really weird from a distance
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => PlanetDestroyer.RemoveDistantProxyClones()); Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => PlanetDestroyer.RemoveDistantProxyClones());
var map = GameObject.FindObjectOfType<MapController>();
if (map != null) map._maxPanDistance = FurthestOrbit * 1.5f;
foreach(var cam in GameObject.FindObjectsOfType<OWCamera>())
{
cam.farClipPlane = FurthestOrbit * 3f;
}
} }
private bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) private bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = false)
@ -392,7 +399,7 @@ namespace NewHorizons
if (body.Config.Props != null) if (body.Config.Props != null)
{ {
if (body.Config.Props.Scatter != null) PropBuilder.Scatter(go, body.Config.Props.Scatter, body.Config.Base.SurfaceSize, sector); PropBuilder.Make(go, sector, body.Config);
/* /*
if (body.Config.Props.Rafts != null) if (body.Config.Props.Rafts != null)
{ {

View File

@ -58,7 +58,7 @@ namespace NewHorizons.Utility
public static void OnMapControllerAwake(MapController __instance, ref float ____maxPanDistance, ref float ____maxZoomDistance, ref float ____minPitchAngle, ref float ____zoomSpeed) public static void OnMapControllerAwake(MapController __instance, ref float ____maxPanDistance, ref float ____maxZoomDistance, ref float ____minPitchAngle, ref float ____zoomSpeed)
{ {
____maxPanDistance *= 4f; ____maxPanDistance = Main.FurthestOrbit * 1.5f;
____maxZoomDistance *= 6f; ____maxZoomDistance *= 6f;
____minPitchAngle = -90f; ____minPitchAngle = -90f;
____zoomSpeed *= 4f; ____zoomSpeed *= 4f;
@ -66,7 +66,7 @@ namespace NewHorizons.Utility
public static void OnOWCameraAwake(OWCamera __instance) public static void OnOWCameraAwake(OWCamera __instance)
{ {
__instance.farClipPlane *= 4f; __instance.farClipPlane = Main.FurthestOrbit * 3f;
} }
public static bool OnSunLightParamUpdaterLateUpdate(SunLightParamUpdater __instance) public static bool OnSunLightParamUpdaterLateUpdate(SunLightParamUpdater __instance)