From d81dde6ea068cd92c5f44167cf8c48691f3058f3 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 26 Mar 2023 00:19:36 -0400 Subject: [PATCH] Try and fail to make the tails move right --- NewHorizons/Builder/Body/CometTailBuilder.cs | 64 ++++++++++++++++--- .../SizeControllers/CometTailController.cs | 33 +++++++++- .../SizeControllers/SizeController.cs | 2 + NewHorizons/Utility/NewHorizonExtensions.cs | 10 +++ NewHorizons/Utility/OWML/NHLogger.cs | 10 +-- 5 files changed, 104 insertions(+), 15 deletions(-) diff --git a/NewHorizons/Builder/Body/CometTailBuilder.cs b/NewHorizons/Builder/Body/CometTailBuilder.cs index b3d25e7b..4d8e719f 100644 --- a/NewHorizons/Builder/Body/CometTailBuilder.cs +++ b/NewHorizons/Builder/Body/CometTailBuilder.cs @@ -10,14 +10,53 @@ namespace NewHorizons.Builder.Body { public static class CometTailBuilder { - private static GameObject _tailPrefab; + private static GameObject _dustPrefab; + private static GameObject _gasPrefab; internal static void InitPrefab() { - if (_tailPrefab == null) + if (_dustPrefab == null) { - _tailPrefab = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes").InstantiateInactive().Rename("Prefab_CO_Tail").DontDestroyOnLoad(); - } + _dustPrefab = new GameObject("Prefab_CO_Dust").DontDestroyOnLoad(); + + var dust1 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_DustTail").Instantiate(); + dust1.transform.parent = _dustPrefab.transform; + dust1.transform.localPosition = Vector3.zero; + dust1.transform.localRotation = Quaternion.Euler(0, 270, 0); + + var dust2 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_DustTail (1)").Instantiate(); + dust2.transform.parent = _dustPrefab.transform; + dust2.transform.localPosition = Vector3.zero; + dust2.transform.localRotation = Quaternion.Euler(0, 270, 0); + + var dust3 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_DustTail (2)").Instantiate(); + dust3.transform.parent = _dustPrefab.transform; + dust3.transform.localPosition = Vector3.zero; + dust3.transform.localRotation = Quaternion.Euler(0, 270, 0); + + _dustPrefab.SetActive(false); + } + if (_gasPrefab == null) + { + _gasPrefab = new GameObject("Prefab_CO_Gas").DontDestroyOnLoad(); + + var gas1 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_GasTail").Instantiate(); + gas1.transform.parent = _gasPrefab.transform; + gas1.transform.localPosition = Vector3.zero; + gas1.transform.localRotation = Quaternion.Euler(0, 270, 0); + + var gas2 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_GasTail (1)").Instantiate(); + gas2.transform.parent = _gasPrefab.transform; + gas2.transform.localPosition = Vector3.zero; + gas2.transform.localRotation = Quaternion.Euler(0, 270, 0); + + var gas3 = SearchUtilities.Find("Comet_Body/Sector_CO/Effects_CO/Effects_CO_TailMeshes/Effects_CO_GasTail (2)").Instantiate(); + gas3.transform.parent = _gasPrefab.transform; + gas3.transform.localPosition = Vector3.zero; + gas3.transform.localRotation = Quaternion.Euler(0, 270, 0); + + _gasPrefab.SetActive(false); + } } public static void Make(GameObject planetGO, Sector sector, CometTailModule cometTailModule, PlanetConfig config) @@ -27,11 +66,6 @@ namespace NewHorizons.Builder.Body rootObj.transform.parent = sector?.transform ?? planetGO.transform; rootObj.transform.localPosition = Vector3.zero; - var cometTail = GameObject.Instantiate(_tailPrefab, rootObj.transform).Rename("CometTail"); - cometTail.transform.localPosition = Vector3.zero; - cometTail.transform.localRotation = Quaternion.Euler(90, 90, 0); - cometTail.SetActive(true); - var controller = rootObj.AddComponent(); controller.size = (cometTailModule.innerRadius ?? config.Base.surfaceSize) / 110; @@ -47,6 +81,18 @@ namespace NewHorizons.Builder.Body controller.SetScaleCurve(cometTailModule.curve); + var dustTail = GameObject.Instantiate(_dustPrefab, rootObj.transform).Rename("DustTail"); + dustTail.transform.localPosition = Vector3.zero; + dustTail.transform.localRotation = Quaternion.Euler(90, 90, 0); + dustTail.SetActive(true); + controller.dustTail = dustTail; + + var gasTail = GameObject.Instantiate(_gasPrefab, rootObj.transform).Rename("GasTail"); + gasTail.transform.localPosition = Vector3.zero; + gasTail.transform.localRotation = Quaternion.Euler(90, 90, 0); + gasTail.SetActive(true); + controller.gasTail = gasTail; + rootObj.SetActive(true); } } diff --git a/NewHorizons/Components/SizeControllers/CometTailController.cs b/NewHorizons/Components/SizeControllers/CometTailController.cs index 6532cec1..b3bef490 100644 --- a/NewHorizons/Components/SizeControllers/CometTailController.cs +++ b/NewHorizons/Components/SizeControllers/CometTailController.cs @@ -1,3 +1,5 @@ +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; using UnityEngine; namespace NewHorizons.Components.SizeControllers @@ -10,9 +12,24 @@ namespace NewHorizons.Components.SizeControllers private bool _hasRotationOverride; private bool _hasPrimaryBody; + public GameObject gasTail; + public GameObject dustTail; + + private Vector3 _gasTarget; + private Vector3 _dustTarget; + + private float _angularVelocity = 1f; + public void Start() { _body = transform.GetAttachedOWRigidbody(); + + if (!_hasRotationOverride && _hasPrimaryBody) + { + UpdateTargetPositions(); + dustTail?.transform?.LookAt(_dustTarget); + gasTail?.transform?.LookAt(_gasTarget); + } } public override void FixedUpdate() @@ -21,10 +38,24 @@ namespace NewHorizons.Components.SizeControllers if (!_hasRotationOverride && _hasPrimaryBody) { - transform.LookAt(_primaryBody, _body.GetVelocity().normalized); + UpdateTargetPositions(); + + dustTail?.SmoothLookAt(_dustTarget, Time.deltaTime, _angularVelocity); + gasTail?.SmoothLookAt(_gasTarget, Time.deltaTime, _angularVelocity); } } + private void UpdateTargetPositions() + { + var toPrimary = (_body.transform.position - _primaryBody.transform.position).normalized; + var velocityDirection = -_body.GetVelocity(); // Accept that this is flipped ok + + var tangentVel = Vector3.ProjectOnPlane(velocityDirection, toPrimary) / velocityDirection.magnitude; + + _gasTarget = toPrimary; + _dustTarget = (toPrimary + tangentVel).normalized; + } + public void SetRotationOverride(Vector3 eulerAngles) { _hasRotationOverride = true; diff --git a/NewHorizons/Components/SizeControllers/SizeController.cs b/NewHorizons/Components/SizeControllers/SizeController.cs index 4e645f56..a0c15f01 100644 --- a/NewHorizons/Components/SizeControllers/SizeController.cs +++ b/NewHorizons/Components/SizeControllers/SizeController.cs @@ -71,6 +71,8 @@ namespace NewHorizons.Components.SizeControllers public void SetScaleCurve(TimeValuePair[] curve) { + if (curve == null) return; + scaleCurve = new AnimationCurve(); foreach (var pair in curve) { diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 9321e804..d20be830 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -255,5 +255,15 @@ namespace NewHorizons.Utility } public static FluidVolume.Type ConvertToOW(this NHFluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE) => EnumUtils.Parse(fluidType.ToString().ToUpper(), @default); + + public static void SmoothLookAt(this GameObject go, Vector3 direction, float dt, float angularVelocity) + { + var start = go.transform.rotation; + var end = Quaternion.FromToRotation(Vector3.forward, direction); + + var angle = Quaternion.Angle(start, end); + + go.transform.rotation = Quaternion.Slerp(start, end, angularVelocity / angle * dt * dt); + } } } diff --git a/NewHorizons/Utility/OWML/NHLogger.cs b/NewHorizons/Utility/OWML/NHLogger.cs index ea53aec6..080cdcad 100644 --- a/NewHorizons/Utility/OWML/NHLogger.cs +++ b/NewHorizons/Utility/OWML/NHLogger.cs @@ -13,16 +13,16 @@ namespace NewHorizons.Utility.OWML _logLevel = newLevel; } - private static void Log(string text, LogType type) + private static void Log(object text, LogType type) { if (type < _logLevel) return; Main.Instance.ModHelper.Console.WriteLine($"{Enum.GetName(typeof(LogType), type)} : {text}", LogTypeToMessageType(type)); } - public static void LogVerbose(string text) => Log(text, LogType.Verbose); - public static void Log(string text) => Log(text, LogType.Log); - public static void LogWarning(string text) => Log(text, LogType.Warning); - public static void LogError(string text) => Log(text, LogType.Error); + public static void LogVerbose(object text) => Log(text, LogType.Verbose); + public static void Log(object text) => Log(text, LogType.Log); + public static void LogWarning(object text) => Log(text, LogType.Warning); + public static void LogError(object text) => Log(text, LogType.Error); public enum LogType {