diff --git a/NewHorizons/Assets/xen.newhorizons b/NewHorizons/Assets/xen.newhorizons index ec531739..84e681f3 100644 Binary files a/NewHorizons/Assets/xen.newhorizons and b/NewHorizons/Assets/xen.newhorizons differ diff --git a/NewHorizons/Builder/Body/ProxyBuilder.cs b/NewHorizons/Builder/Body/ProxyBuilder.cs index 87888e45..077a4f8f 100644 --- a/NewHorizons/Builder/Body/ProxyBuilder.cs +++ b/NewHorizons/Builder/Body/ProxyBuilder.cs @@ -188,7 +188,7 @@ namespace NewHorizons.Builder.Body newProxy.SetActive(true); } - private static GameObject AddColouredSphere(GameObject rootObj, float size, VariableSizeModule.TimeValuePair[] curve, Color color) + private static GameObject AddColouredSphere(GameObject rootObj, float size, TimeValuePair[] curve, Color color) { GameObject sphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphereGO.transform.name = "ProxySphere"; @@ -206,7 +206,7 @@ namespace NewHorizons.Builder.Body return sphereGO; } - private static void AddSizeController(GameObject go, VariableSizeModule.TimeValuePair[] curve, float size) + private static void AddSizeController(GameObject go, TimeValuePair[] curve, float size) { var sizeController = go.AddComponent(); sizeController.SetScaleCurve(curve); diff --git a/NewHorizons/Builder/Body/RingBuilder.cs b/NewHorizons/Builder/Body/RingBuilder.cs index c89318f0..9d2e6b05 100644 --- a/NewHorizons/Builder/Body/RingBuilder.cs +++ b/NewHorizons/Builder/Body/RingBuilder.cs @@ -7,7 +7,6 @@ using System.Collections.Generic; using NewHorizons.External.Modules; using UnityEngine; using Logger = NewHorizons.Utility.Logger; -using NewHorizons.External.Modules.VariableSize; namespace NewHorizons.Builder.Body { @@ -49,6 +48,8 @@ namespace NewHorizons.Builder.Body sfv._fluidType = ring.fluidType.ConvertToOW(); sfv._density = 5f; + if (ringGO.TryGetComponent(out var ringOC)) ringOC.SetRingFluidVolume(sfv); + ringVolume.SetActive(true); @@ -116,10 +117,17 @@ namespace NewHorizons.Builder.Body rot._localAxis = Vector3.down; } - if (ring.curve != null) + if (ring.scaleCurve != null) { var levelController = ringGO.AddComponent(); - levelController.SetScaleCurve(ring.curve); + levelController.SetScaleCurve(ring.scaleCurve); + } + + if (ring.opacityCurve != null) + { + var ringOC = ringGO.AddComponent(); + ringOC.SetOpacityCurve(ring.opacityCurve); + ringOC.SetMeshRenderer(ringMR); } return ringGO; diff --git a/NewHorizons/Builder/Body/SingularityBuilder.cs b/NewHorizons/Builder/Body/SingularityBuilder.cs index 1676879a..bbd3c761 100644 --- a/NewHorizons/Builder/Body/SingularityBuilder.cs +++ b/NewHorizons/Builder/Body/SingularityBuilder.cs @@ -95,7 +95,7 @@ namespace NewHorizons.Builder.Body } public static GameObject MakeBlackHole(GameObject planetGO, Sector sector, Vector3 localPosition, float size, - bool hasDestructionVolume, string targetSolarSystem, VariableSizeModule.TimeValuePair[] curve, bool makeAudio = true) + bool hasDestructionVolume, string targetSolarSystem, TimeValuePair[] curve, bool makeAudio = true) { var blackHole = new GameObject("BlackHole"); blackHole.SetActive(false); @@ -181,7 +181,7 @@ namespace NewHorizons.Builder.Body } public static GameObject MakeWhiteHole(GameObject planetGO, Sector sector, OWRigidbody OWRB, Vector3 localPosition, float size, - VariableSizeModule.TimeValuePair[] curve, bool makeZeroGVolume = true) + TimeValuePair[] curve, bool makeZeroGVolume = true) { var whiteHole = new GameObject("WhiteHole"); whiteHole.SetActive(false); diff --git a/NewHorizons/Components/RingFluidVolume.cs b/NewHorizons/Components/RingFluidVolume.cs index 76619ef7..83b377a7 100644 --- a/NewHorizons/Components/RingFluidVolume.cs +++ b/NewHorizons/Components/RingFluidVolume.cs @@ -17,5 +17,7 @@ namespace NewHorizons.Components fluidDetector.AddVolume(this); } + + public override bool IsSpherical() => false; } } diff --git a/NewHorizons/Components/RingOpacityController.cs b/NewHorizons/Components/RingOpacityController.cs new file mode 100644 index 00000000..fde75452 --- /dev/null +++ b/NewHorizons/Components/RingOpacityController.cs @@ -0,0 +1,51 @@ +using NewHorizons.External.Modules.VariableSize; +using NewHorizons.Utility; +using UnityEngine; + +namespace NewHorizons.Components +{ + public class RingOpacityController : MonoBehaviour + { + private static readonly int Alpha = Shader.PropertyToID("_Alpha"); + + public AnimationCurve opacityCurve { get; protected set; } + public float CurrentOpacity { get; protected set; } + + private MeshRenderer _meshRenderer; + private RingFluidVolume _ringFluidVolume; + + protected void FixedUpdate() + { + if (opacityCurve != null) + { + CurrentOpacity = opacityCurve.Evaluate(TimeLoop.GetMinutesElapsed()); + } + else + { + CurrentOpacity = 1; + } + + if (_ringFluidVolume != null) + { + if (Mathf.Approximately(CurrentOpacity, 0) && _ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(false); + else if (!_ringFluidVolume.IsVolumeActive()) _ringFluidVolume.SetVolumeActivation(true); + } + + if (_meshRenderer == null) return; + + _meshRenderer.material.SetFloat(Alpha, CurrentOpacity); + } + + public void SetOpacityCurve(TimeValuePair[] curve) + { + opacityCurve = new AnimationCurve(); + foreach (var pair in curve) + { + opacityCurve.AddKey(new Keyframe(pair.time, pair.value)); + } + } + + public void SetMeshRenderer(MeshRenderer meshRenderer) => _meshRenderer = meshRenderer; + public void SetRingFluidVolume(RingFluidVolume ringFluidVolume) => _ringFluidVolume = ringFluidVolume; + } +} diff --git a/NewHorizons/Components/SizeControllers/SizeController.cs b/NewHorizons/Components/SizeControllers/SizeController.cs index 83702bec..9839b2a7 100644 --- a/NewHorizons/Components/SizeControllers/SizeController.cs +++ b/NewHorizons/Components/SizeControllers/SizeController.cs @@ -1,4 +1,5 @@ using NewHorizons.External.Modules.VariableSize; +using NewHorizons.Utility; using UnityEngine; namespace NewHorizons.Components.SizeControllers { @@ -22,7 +23,7 @@ namespace NewHorizons.Components.SizeControllers base.transform.localScale = Vector3.one * CurrentScale; } - public void SetScaleCurve(VariableSizeModule.TimeValuePair[] curve) + public void SetScaleCurve(TimeValuePair[] curve) { scaleCurve = new AnimationCurve(); foreach (var pair in curve) diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index 057aba8f..80d065a6 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -362,6 +362,12 @@ namespace NewHorizons.External.Configs if (!string.IsNullOrEmpty(Cloak.audioClip)) Cloak.audio = Cloak.audioClip; if (!string.IsNullOrEmpty(Cloak.audioFilePath)) Cloak.audio = Cloak.audioFilePath; } + + // Rings are no longer variable size module + if (Ring != null) + { + if (Ring.curve != null) Ring.scaleCurve = Ring.curve; + } } } } \ No newline at end of file diff --git a/NewHorizons/External/Modules/VariableSize/RingModule.cs b/NewHorizons/External/Modules/RingModule.cs similarity index 65% rename from NewHorizons/External/Modules/VariableSize/RingModule.cs rename to NewHorizons/External/Modules/RingModule.cs index 2a4157d1..5f21a8a6 100644 --- a/NewHorizons/External/Modules/VariableSize/RingModule.cs +++ b/NewHorizons/External/Modules/RingModule.cs @@ -1,10 +1,12 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; +using NewHorizons.Utility; using Newtonsoft.Json; -namespace NewHorizons.External.Modules.VariableSize +namespace NewHorizons.External.Modules { [JsonObject] - public class RingModule : VariableSizeModule + public class RingModule { /// /// Fluid type for sounds/effects when colliding with this ring. @@ -45,5 +47,20 @@ namespace NewHorizons.External.Modules.VariableSize /// Should this ring be unlit? /// public bool unlit; + + #region Obsolete + [Obsolete("curve is deprecated, please use scaleCurve instead")] + public TimeValuePair[] curve; + #endregion + + /// + /// Scale rings over time. Optional. Value between 0-1, time is in minutes. + /// + public TimeValuePair[] scaleCurve; + + /// + /// Fade rings in/out over time. Optional. Value between 0-1, time is in minutes. + /// + public TimeValuePair[] opacityCurve; } } \ No newline at end of file diff --git a/NewHorizons/External/Modules/VariableSize/VariableSizeModule.cs b/NewHorizons/External/Modules/VariableSize/VariableSizeModule.cs index d220a15d..92ba2dd1 100644 --- a/NewHorizons/External/Modules/VariableSize/VariableSizeModule.cs +++ b/NewHorizons/External/Modules/VariableSize/VariableSizeModule.cs @@ -1,3 +1,4 @@ +using NewHorizons.Utility; using Newtonsoft.Json; using UnityEngine; @@ -7,22 +8,8 @@ namespace NewHorizons.External.Modules.VariableSize public class VariableSizeModule { /// - /// Scale this module over time + /// Scale this object over time /// public TimeValuePair[] curve; - - [JsonObject] - public class TimeValuePair - { - /// - /// A specific point in time - /// - public float time; - - /// - /// The value for this point in time - /// - public float value; - } } } \ No newline at end of file diff --git a/NewHorizons/Handlers/TitleSceneHandler.cs b/NewHorizons/Handlers/TitleSceneHandler.cs index 42b6e6a4..b4fb22dc 100644 --- a/NewHorizons/Handlers/TitleSceneHandler.cs +++ b/NewHorizons/Handlers/TitleSceneHandler.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Linq; using UnityEngine; using Logger = NewHorizons.Utility.Logger; -using NewHorizons.External.Modules.VariableSize; namespace NewHorizons.Handlers { diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index ae405fb2..9094de92 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -662,7 +662,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } @@ -766,7 +766,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } @@ -1750,7 +1750,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } @@ -2120,13 +2120,6 @@ "type": "object", "additionalProperties": false, "properties": { - "curve": { - "type": "array", - "description": "Scale this module over time", - "items": { - "$ref": "#/definitions/TimeValuePair" - } - }, "fluidType": { "description": "Fluid type for sounds/effects when colliding with this ring.", "$ref": "#/definitions/FluidType" @@ -2165,6 +2158,20 @@ "unlit": { "type": "boolean", "description": "Should this ring be unlit?" + }, + "scaleCurve": { + "type": "array", + "description": "Scale rings over time. Optional. Value between 0-1, time is in minutes.", + "items": { + "$ref": "#/definitions/TimeValuePair" + } + }, + "opacityCurve": { + "type": "array", + "description": "Fade rings in/out over time. Optional. Value between 0-1, time is in minutes.", + "items": { + "$ref": "#/definitions/TimeValuePair" + } } } }, @@ -2174,7 +2181,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } @@ -2319,7 +2326,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } @@ -2405,7 +2412,7 @@ "properties": { "curve": { "type": "array", - "description": "Scale this module over time", + "description": "Scale this object over time", "items": { "$ref": "#/definitions/TimeValuePair" } diff --git a/NewHorizons/Utility/TimeValuePair.cs b/NewHorizons/Utility/TimeValuePair.cs new file mode 100644 index 00000000..acacda16 --- /dev/null +++ b/NewHorizons/Utility/TimeValuePair.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; + +namespace NewHorizons.Utility +{ + [JsonObject] + public class TimeValuePair + { + /// + /// A specific point in time + /// + public float time; + + /// + /// The value for this point in time + /// + public float value; + } +}