diff --git a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs index 7850f570..b3a15493 100644 --- a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs +++ b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs @@ -1,5 +1,6 @@ using HarmonyLib; using NewHorizons.Builder.Props; +using NewHorizons.Components; using NewHorizons.Components.Orbital; using NewHorizons.Handlers; using NewHorizons.Utility; @@ -177,6 +178,10 @@ namespace NewHorizons.Builder.Body cloak._sectors = new Sector[] { sector }; cloak.GetComponent().enabled = true; + // Cull stuff + var cullController = go.AddComponent(); + cullController.SetSector(sector); + // finalize atmo.SetActive(true); volumes.SetActive(true); diff --git a/NewHorizons/Components/BrambleSectorController.cs b/NewHorizons/Components/BrambleSectorController.cs new file mode 100644 index 00000000..08f6babf --- /dev/null +++ b/NewHorizons/Components/BrambleSectorController.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace NewHorizons.Components +{ + public class BrambleSectorController : MonoBehaviour, ISectorGroup + { + private Sector _sector; + + private List _renderers = null; + private List _tessellatedRenderers = null; + private List _colliders = null; + private List _lights = null; + + public static bool isPlayerInside = false; + public static bool isProbeInside = false; + public static bool isShipInside = false; + + private bool _renderersShown = false; + + public Sector GetSector() => _sector; + + public void SetSector(Sector sector) + { + if (_sector != null) _sector.OnSectorOccupantsUpdated -= OnSectorOccupantsUpdated; + + _sector = sector; + _sector.OnSectorOccupantsUpdated += OnSectorOccupantsUpdated; + } + + private void OnDestroy() + { + if (_sector != null) _sector.OnSectorOccupantsUpdated -= OnSectorOccupantsUpdated; + } + + private void Start() + { + _renderers = gameObject.GetComponentsInChildren().ToList(); + _tessellatedRenderers = gameObject.GetComponentsInChildren().ToList(); + _colliders = gameObject.GetComponentsInChildren().ToList(); + _lights = gameObject.GetComponentsInChildren().ToList(); + + DisableRenderers(); + } + + private void OnSectorOccupantsUpdated() + { + if (_sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe)) + { + if (!_renderersShown) EnableRenderers(); + } + else + { + if (_renderersShown) DisableRenderers(); + } + } + + private void EnableRenderers() + { + foreach (var renderer in _renderers) + { + renderer.forceRenderingOff = false; + } + + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = true; + } + + foreach (var collider in _colliders) + { + collider.enabled = true; + } + + foreach (var light in _lights) + { + light.enabled = true; + } + } + + private void DisableRenderers() + { + foreach (var renderer in _renderers) + { + renderer.forceRenderingOff = true; + } + + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = false; + } + + foreach (var collider in _colliders) + { + collider.enabled = false; + } + + foreach (var light in _lights) + { + light.enabled = false; + } + } + } +}