From ceda92ec72c1bda78b43a30f2904179e731efacf Mon Sep 17 00:00:00 2001 From: Leonardo Ascione <112330494+rockfactory@users.noreply.github.com> Date: Sat, 10 Feb 2024 20:41:25 +0100 Subject: [PATCH] Add relay placeholder rendering to know its current state --- .../Rendering/Behaviors/MapRulerComponent.cs | 68 +++++++++++++++++++ .../Behaviors/MapSphereRulerComponent.cs | 49 ++++++------- src/CommNext/Rendering/ConnectionsRenderer.cs | 27 ++++---- 3 files changed, 102 insertions(+), 42 deletions(-) create mode 100644 src/CommNext/Rendering/Behaviors/MapRulerComponent.cs diff --git a/src/CommNext/Rendering/Behaviors/MapRulerComponent.cs b/src/CommNext/Rendering/Behaviors/MapRulerComponent.cs new file mode 100644 index 0000000..21a38ce --- /dev/null +++ b/src/CommNext/Rendering/Behaviors/MapRulerComponent.cs @@ -0,0 +1,68 @@ +using CommNext.Network; +using KSP.Map; +using KSP.Sim; +using UnityEngine; + +namespace CommNext.Rendering.Behaviors; + +public class MapRulerComponent : MonoBehaviour, IMapComponent +{ + public string Id { get; set; } = null!; + + private bool _isTracking; + private Map3DFocusItem? _target; + + private NetworkNode? _networkNode; + private MapSphereRulerComponent? _placeholder; + + public void Start() + { + gameObject.layer = LayerMask.NameToLayer("Map"); + } + + public void Track(Map3DFocusItem target, NetworkNode networkNode, ConnectionGraphNode connectionNode) + { + Id = target.AssociatedMapItem.SimGUID.ToString(); + _networkNode = networkNode; + _target = target; + + // Relay sphere + var sphereObject = Instantiate(ConnectionsRenderer.RulerSpherePrefab, gameObject.transform); + sphereObject.name = "RulerSphere"; + sphereObject.transform.localPosition = Vector3.zero; + var sphereComponent = sphereObject.AddComponent(); + sphereComponent.Configure(connectionNode.MaxRange, null); + + // Simple relay placeholder + var placeholderObject = Instantiate(ConnectionsRenderer.RulerSpherePrefab, gameObject.transform); + placeholderObject.name = "RulerPlaceholder"; + placeholderObject.transform.localPosition = Vector3.zero; + _placeholder = placeholderObject.AddComponent(); + _placeholder.Configure(50_000, Color.gray); + + _isTracking = true; + } + + private void Update() + { + if (!_isTracking) return; + if (_target == null) + { + ConnectionsRenderer.Instance.OnMapRulerDestroyed(this); + return; + } + + if (_networkNode?.HasEnoughResources != true) + _placeholder!.SetColor(Color.red); + else + _placeholder!.SetColor(Color.green); + + transform.position = _target.transform.position; + } + + public void OnDestroy() + { + if (!_isTracking) return; + ConnectionsRenderer.Instance.OnMapRulerDestroyed(this, false); + } +} \ No newline at end of file diff --git a/src/CommNext/Rendering/Behaviors/MapSphereRulerComponent.cs b/src/CommNext/Rendering/Behaviors/MapSphereRulerComponent.cs index 858d8ce..9e3060e 100644 --- a/src/CommNext/Rendering/Behaviors/MapSphereRulerComponent.cs +++ b/src/CommNext/Rendering/Behaviors/MapSphereRulerComponent.cs @@ -4,54 +4,45 @@ namespace CommNext.Rendering.Behaviors; -public class MapSphereRulerComponent : MonoBehaviour, IMapComponent +public class MapSphereRulerComponent : MonoBehaviour { - public string Id { get; set; } = null!; - private double _range; - private bool _isTracking; - private MeshRenderer _meshRenderer = null!; - private static readonly int ColorID = Shader.PropertyToID("_Color"); + private Color? _lastColor; + private MaterialPropertyBlock _propertyBlock = null!; - private Map3DFocusItem? _target; + private static readonly int ColorID = Shader.PropertyToID("_Color"); public void Start() { gameObject.layer = LayerMask.NameToLayer("Map"); } - public void Track(Map3DFocusItem target, double range, Color? color) + public void Configure(double range, Color? color) { - Id = target.AssociatedMapItem.SimGUID.ToString(); - _meshRenderer = gameObject.GetComponent(); - if (color.HasValue) _meshRenderer.material.SetColor(ColorID, color.Value); + _propertyBlock = new MaterialPropertyBlock(); + _meshRenderer.SetPropertyBlock(_propertyBlock); + if (color.HasValue) + { + _lastColor = color; + _propertyBlock.SetColor(ColorID, color.Value); + } _range = range; - _target = target; - _isTracking = true; } - // Update is called once per frame - private void Update() + public void SetColor(Color color) { - if (!_isTracking) return; - if (_target == null) - { - ConnectionsRenderer.Instance.OnMapSphereRulerDestroyed(this); - return; - } - - var radius = (float)(_range / ConnectionsRenderer.Instance.GetMap3dScaleInv()); - var currentTransform = transform; - currentTransform.localScale = new Vector3(radius, radius, radius); - currentTransform.position = _target.transform.position; + if (_lastColor == color) return; + _lastColor = color; + _propertyBlock.SetColor(ColorID, color); + _meshRenderer.SetPropertyBlock(_propertyBlock); // TODO Needed? } - public void OnDestroy() + private void Update() { - if (!_isTracking) return; - ConnectionsRenderer.Instance.OnMapSphereRulerDestroyed(this, false); + var radius = (float)(_range / ConnectionsRenderer.Instance.GetMap3dScaleInv()); + transform.localScale = new Vector3(radius, radius, radius); } } \ No newline at end of file diff --git a/src/CommNext/Rendering/ConnectionsRenderer.cs b/src/CommNext/Rendering/ConnectionsRenderer.cs index fc8b4f4..f606e2e 100644 --- a/src/CommNext/Rendering/ConnectionsRenderer.cs +++ b/src/CommNext/Rendering/ConnectionsRenderer.cs @@ -24,7 +24,7 @@ public class ConnectionsRenderer : MonoBehaviour public static ConnectionsRenderer Instance { get; private set; } = null!; private readonly Dictionary _connections = new(); - private readonly Dictionary _rulers = new(); + private readonly Dictionary _rulers = new(); private static Dictionary? AllMapItems => _mapCore.map3D.AllMapSelectableItems; private static MapCore _mapCore = null!; @@ -190,9 +190,9 @@ private void UpdateRulers(List nodes, int[] prevIndexes) for (var i = 0; i < nodes.Count; i++) { var node = nodes[i]; - if (prevIndexes[i] < 0 || prevIndexes[i] >= nodes.Count) continue; if (node == null) continue; - if (node.MaxRange <= 0) continue; + // if (prevIndexes[i] < 0 || prevIndexes[i] >= nodes.Count) continue; + // if (node.MaxRange <= 0) continue; var item = GetMapItem(node); if (item == null) continue; @@ -206,13 +206,14 @@ private void UpdateRulers(List nodes, int[] prevIndexes) } else { - var rulerObject = Instantiate(RulerSpherePrefab, _mapCore.map3D.transform); - rulerObject.name = $"Ruler_{item.AssociatedMapItem.ItemName}_{item.AssociatedMapItem.SimGUID}"; - ruler = rulerObject.AddComponent(); - ruler.Track(item, node.MaxRange, null); - _rulers.Add(item.AssociatedMapItem.SimGUID.ToString(), ruler); - - keepIds.Add(item.AssociatedMapItem.SimGUID.ToString()); + var rulerObject = + new GameObject($"Ruler_{item.AssociatedMapItem.ItemName}_{item.AssociatedMapItem.SimGUID}"); + rulerObject.transform.SetParent(_mapCore.map3D.transform); + ruler = rulerObject.AddComponent(); + ruler.Track(item, networkNode, node); + _rulers.Add(ruler.Id, ruler); + + keepIds.Add(ruler.Id); } } @@ -237,14 +238,14 @@ public double GetMap3dScaleInv() public void OnMapConnectionDestroyed(MapConnectionComponent connection, bool destroyGameObject = true) { if (!_connections.ContainsKey(connection.Id)) return; - Destroy(connection.gameObject); + if (destroyGameObject) Destroy(connection.gameObject); _connections.Remove(connection.Id); } - public void OnMapSphereRulerDestroyed(MapSphereRulerComponent ruler, bool destroyGameObject = true) + public void OnMapRulerDestroyed(MapRulerComponent ruler, bool destroyGameObject = true) { if (!_rulers.ContainsKey(ruler.Id)) return; - Destroy(ruler.gameObject); + if (destroyGameObject) Destroy(ruler.gameObject); _rulers.Remove(ruler.Id); }