diff --git a/NewHorizons/Assets/textures/Effects_CO_GasTail_d.png b/NewHorizons/Assets/textures/Effects_CO_GasTail_d.png new file mode 100644 index 00000000..00859b6c Binary files /dev/null and b/NewHorizons/Assets/textures/Effects_CO_GasTail_d.png differ diff --git a/NewHorizons/Builder/Body/CometTailBuilder.cs b/NewHorizons/Builder/Body/CometTailBuilder.cs index 4d8e719f..cdc691f5 100644 --- a/NewHorizons/Builder/Body/CometTailBuilder.cs +++ b/NewHorizons/Builder/Body/CometTailBuilder.cs @@ -2,6 +2,7 @@ using NewHorizons.Components.SizeControllers; using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Utility; +using NewHorizons.Utility.Files; using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OWML; using UnityEngine; @@ -93,6 +94,25 @@ namespace NewHorizons.Builder.Body gasTail.SetActive(true); controller.gasTail = gasTail; + if (cometTailModule.dustTint != null) + { + foreach (var dust in dustTail.GetComponentsInChildren()) + { + var untintedDust = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Effects_CO_DustTail_d.png"); + dust.material.mainTexture = ImageUtilities.TintImage(untintedDust, cometTailModule.dustTint.ToColor()); + } + } + + if (cometTailModule.gasTint != null) + { + foreach (var gas in gasTail.GetComponentsInChildren()) + { + var untintedGas = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Effects_CO_GasTail_d.png"); + gas.material.mainTexture = untintedGas; + gas.material.color = cometTailModule.gasTint.ToColor(); + } + } + rootObj.SetActive(true); } } diff --git a/NewHorizons/Components/SizeControllers/CometTailController.cs b/NewHorizons/Components/SizeControllers/CometTailController.cs index b3bef490..b108d76e 100644 --- a/NewHorizons/Components/SizeControllers/CometTailController.cs +++ b/NewHorizons/Components/SizeControllers/CometTailController.cs @@ -18,18 +18,9 @@ namespace NewHorizons.Components.SizeControllers 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() @@ -40,8 +31,8 @@ namespace NewHorizons.Components.SizeControllers { UpdateTargetPositions(); - dustTail?.SmoothLookAt(_dustTarget, Time.deltaTime, _angularVelocity); - gasTail?.SmoothLookAt(_gasTarget, Time.deltaTime, _angularVelocity); + dustTail?.LookDir(_dustTarget); + gasTail?.LookDir(_gasTarget); } } diff --git a/NewHorizons/External/Modules/CometTailModule.cs b/NewHorizons/External/Modules/CometTailModule.cs index b74c88f3..2750ba36 100644 --- a/NewHorizons/External/Modules/CometTailModule.cs +++ b/NewHorizons/External/Modules/CometTailModule.cs @@ -21,5 +21,15 @@ namespace NewHorizons.External.Modules /// The body that the comet tail should always point away from /// public string primaryBody; + + /// + /// Colour of the dust tail (the shorter part) + /// + public MColor dustTint; + + /// + /// Colour of the gas tail (the longer part) + /// + public MColor gasTint; } } diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index d20be830..275e6f52 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -256,14 +256,19 @@ 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) + public static void SmoothLookDir(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); + go.transform.rotation = Quaternion.Slerp(start, end, (angularVelocity / angle) * dt); + } + + public static void LookDir(this GameObject go, Vector3 direction) + { + go.transform.rotation = Quaternion.FromToRotation(Vector3.forward, direction); } } }