From 4862947b06767b662d22a82b44a0a6a609e07134 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Tue, 5 Jul 2022 08:01:15 -0400 Subject: [PATCH] Make cloaks also turn off tessellated renderers. Stops water, sand, inner clouds, and any other tessellated renderer from showing even when player is not inside cloak. --- .../Builder/Atmosphere/CloudsBuilder.cs | 9 ++- .../Components/CloakSectorController.cs | 24 ++++++ .../CloakedTessSphereSectorToggle.cs | 74 +++++++++++++++++++ NewHorizons/Handlers/PlanetCreationHandler.cs | 6 +- 4 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 NewHorizons/Components/CloakedTessSphereSectorToggle.cs diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index fce3ada5..da11d9a0 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -1,4 +1,5 @@ using NewHorizons.External.Modules; +using NewHorizons.Components; using NewHorizons.Utility; using OWML.Common; using System; @@ -20,7 +21,7 @@ namespace NewHorizons.Builder.Atmosphere private static readonly int CapTex = Shader.PropertyToID("_CapTex"); private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp"); - public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod) + public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, bool cloaked, IModBehaviour mod) { if (_lightningPrefab == null) _lightningPrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Clouds_GD/LightningGenerator_GD"); if (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Clouds_Bottom_ramp.png"); @@ -65,8 +66,10 @@ namespace NewHorizons.Builder.Atmosphere bottomTSR.LODBias = 0; bottomTSR.LODRadius = 1f; - TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent(); - bottomTSST._sector = sector; + if (cloaked) + cloudsBottomGO.AddComponent()._sector = sector; + else + cloudsBottomGO.AddComponent()._sector = sector; GameObject cloudsFluidGO = new GameObject("CloudsFluid"); cloudsFluidGO.SetActive(false); diff --git a/NewHorizons/Components/CloakSectorController.cs b/NewHorizons/Components/CloakSectorController.cs index 09f50776..7d0bbf7b 100644 --- a/NewHorizons/Components/CloakSectorController.cs +++ b/NewHorizons/Components/CloakSectorController.cs @@ -11,6 +11,8 @@ namespace NewHorizons.Components private bool _isInitialized; private List _renderers = null; + private List _tessellatedRenderers = null; + private List _tessSphereToggles = null; public static bool isPlayerInside = false; public static bool isProbeInside = false; @@ -51,6 +53,8 @@ namespace NewHorizons.Components private void SetUpList() { _renderers = _root.GetComponentsInChildren().ToList(); + _tessellatedRenderers = _root.GetComponentsInChildren().ToList(); + _tessSphereToggles = _root.GetComponentsInChildren().ToList(); } public void OnPlayerEnter() @@ -62,6 +66,16 @@ namespace NewHorizons.Components renderer.forceRenderingOff = false; } + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = true; + } + + foreach (var tessSphereSectorToggle in _tessSphereToggles) + { + tessSphereSectorToggle.OnEnterCloakField(); + } + isPlayerInside = true; GlobalMessenger.FireEvent("PlayerEnterCloakField"); } @@ -75,6 +89,16 @@ namespace NewHorizons.Components renderer.forceRenderingOff = true; } + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = false; + } + + foreach (var tessSphereSectorToggle in _tessSphereToggles) + { + tessSphereSectorToggle.OnExitCloakField(); + } + isPlayerInside = false; GlobalMessenger.FireEvent("PlayerExitCloakField"); } diff --git a/NewHorizons/Components/CloakedTessSphereSectorToggle.cs b/NewHorizons/Components/CloakedTessSphereSectorToggle.cs new file mode 100644 index 00000000..b5232720 --- /dev/null +++ b/NewHorizons/Components/CloakedTessSphereSectorToggle.cs @@ -0,0 +1,74 @@ +using UnityEngine; + +namespace NewHorizons.Components +{ + [RequireComponent(typeof(TessellatedSphereRenderer))] + public class CloakedTessSphereSectorToggle : SectoredMonoBehaviour + { + protected TessellatedSphereRenderer _renderer; + protected bool _inMapView; + protected bool _inCloakField; + + public override void Awake() + { + _renderer = GetComponent(); + GlobalMessenger.AddListener("EnterMapView", OnEnterMapView); + GlobalMessenger.AddListener("ExitMapView", OnExitMapView); + } + + public override void OnDestroy() + { + GlobalMessenger.RemoveListener("EnterMapView", OnEnterMapView); + GlobalMessenger.RemoveListener("ExitMapView", OnExitMapView); + } + + public override void OnChangeSector(Sector oldSector, Sector newSector) => OnSectorOccupantsUpdated(); + + public override void OnSectorOccupantsUpdated() + { + if (_inMapView || !_inCloakField) + return; + if (_sector != null) + { + if (_sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe) && !_renderer.enabled) + { + _renderer.enabled = true; + } + else + { + if (_sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe) || !_renderer.enabled) + return; + _renderer.enabled = false; + } + } + else + _renderer.enabled = true; + } + + public virtual void OnEnterMapView() + { + _inMapView = true; + if (_renderer.enabled) + _renderer.enabled = false; + } + + public virtual void OnExitMapView() + { + _inMapView = false; + OnSectorOccupantsUpdated(); + } + + public virtual void OnEnterCloakField() + { + _inCloakField = true; + OnSectorOccupantsUpdated(); + } + + public virtual void OnExitCloakField() + { + _inCloakField = false; + if (_renderer.enabled) + _renderer.enabled = false; + } + } +} diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 888342e1..4d93a496 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -432,6 +432,8 @@ namespace NewHorizons.Handlers SandBuilder.Make(go, sector, rb, body.Config.Sand); } + var willHaveCloak = body.Config.Cloak != null && body.Config.Cloak.radius != 0f; + if (body.Config.Atmosphere != null) { var airInfo = new AtmosphereModule.AirInfo() @@ -448,7 +450,7 @@ namespace NewHorizons.Handlers if (!string.IsNullOrEmpty(body.Config.Atmosphere?.clouds?.texturePath)) { - CloudsBuilder.Make(go, sector, body.Config.Atmosphere, body.Mod); + CloudsBuilder.Make(go, sector, body.Config.Atmosphere, willHaveCloak, body.Mod); SunOverrideBuilder.Make(go, sector, body.Config.Atmosphere, body.Config.Water, surfaceSize); } @@ -477,7 +479,7 @@ namespace NewHorizons.Handlers } // Has to go last probably - if (body.Config.Cloak != null && body.Config.Cloak.radius != 0f) + if (willHaveCloak) { CloakBuilder.Make(go, sector, rb, body.Config.Cloak, !body.Config.ReferenceFrame.hideInMap, body.Mod); }