Skip to content

Commit

Permalink
Add relay placeholder rendering to know its current state
Browse files Browse the repository at this point in the history
  • Loading branch information
rockfactory committed Feb 10, 2024
1 parent fe92472 commit ceda92e
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 42 deletions.
68 changes: 68 additions & 0 deletions src/CommNext/Rendering/Behaviors/MapRulerComponent.cs
Original file line number Diff line number Diff line change
@@ -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<MapSphereRulerComponent>();
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<MapSphereRulerComponent>();
_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);
}
}
49 changes: 20 additions & 29 deletions src/CommNext/Rendering/Behaviors/MapSphereRulerComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<MeshRenderer>();
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);
}
}
27 changes: 14 additions & 13 deletions src/CommNext/Rendering/ConnectionsRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class ConnectionsRenderer : MonoBehaviour
public static ConnectionsRenderer Instance { get; private set; } = null!;

private readonly Dictionary<string, MapConnectionComponent> _connections = new();
private readonly Dictionary<string, MapSphereRulerComponent> _rulers = new();
private readonly Dictionary<string, MapRulerComponent> _rulers = new();

private static Dictionary<IGGuid, Map3DFocusItem>? AllMapItems => _mapCore.map3D.AllMapSelectableItems;
private static MapCore _mapCore = null!;
Expand Down Expand Up @@ -190,9 +190,9 @@ private void UpdateRulers(List<ConnectionGraphNode> 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;

Expand All @@ -206,13 +206,14 @@ private void UpdateRulers(List<ConnectionGraphNode> nodes, int[] prevIndexes)
}
else
{
var rulerObject = Instantiate(RulerSpherePrefab, _mapCore.map3D.transform);
rulerObject.name = $"Ruler_{item.AssociatedMapItem.ItemName}_{item.AssociatedMapItem.SimGUID}";
ruler = rulerObject.AddComponent<MapSphereRulerComponent>();
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<MapRulerComponent>();
ruler.Track(item, networkNode, node);
_rulers.Add(ruler.Id, ruler);

keepIds.Add(ruler.Id);
}
}

Expand All @@ -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);
}

Expand Down

0 comments on commit ceda92e

Please sign in to comment.