Files
tbd-station-14/Content.Client/Radar/RadarConsoleWindow.xaml.cs
2022-03-07 18:04:26 +11:00

117 lines
3.7 KiB
C#

using System;
using Content.Client.Computer;
using Content.Shared.Radar;
using JetBrains.Annotations;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Maths;
namespace Content.Client.Radar;
[GenerateTypedNameReferences]
public sealed partial class RadarConsoleWindow : DefaultWindow, IComputerWindow<RadarConsoleBoundInterfaceState>
{
public RadarConsoleWindow()
{
RobustXamlLoader.Load(this);
}
public void SetupComputerWindow(ComputerBoundUserInterfaceBase cb)
{
}
public void UpdateState(RadarConsoleBoundInterfaceState scc)
{
Radar.UpdateState(scc);
}
}
public sealed class RadarControl : Control
{
private const int MinimapRadius = 256;
private const int MinimapMargin = 4;
private const float GridLinesDistance = 32f;
private float _radarRange = 256f;
private RadarConsoleBoundInterfaceState _lastState = new(256f, Array.Empty<RadarObjectData>());
private int SizeFull => (int) ((MinimapRadius + MinimapMargin) * 2 * UIScale);
private int ScaledMinimapRadius => (int) (MinimapRadius * UIScale);
private float MinimapScale => _radarRange != 0 ? ScaledMinimapRadius / _radarRange : 0f;
public RadarControl()
{
MinSize = (SizeFull, SizeFull);
}
public void UpdateState(RadarConsoleBoundInterfaceState ls)
{
if (!_radarRange.Equals(ls.Range))
{
_radarRange = ls.Range;
}
_lastState = ls;
}
protected override void Draw(DrawingHandleScreen handle)
{
var point = SizeFull / 2;
var fakeAA = new Color(0.08f, 0.08f, 0.08f);
var gridLines = new Color(0.08f, 0.08f, 0.08f);
var gridLinesRadial = 8;
var gridLinesEquatorial = (int) Math.Floor(_radarRange / GridLinesDistance);
handle.DrawCircle((point, point), ScaledMinimapRadius + 1, fakeAA);
handle.DrawCircle((point, point), ScaledMinimapRadius, Color.Black);
for (var i = 1; i < gridLinesEquatorial + 1; i++)
{
handle.DrawCircle((point, point), GridLinesDistance * MinimapScale * i, gridLines, false);
}
for (var i = 0; i < gridLinesRadial; i++)
{
Angle angle = (Math.PI / gridLinesRadial) * i;
var aExtent = angle.ToVec() * ScaledMinimapRadius;
handle.DrawLine((point, point) - aExtent, (point, point) + aExtent, gridLines);
}
handle.DrawLine((point, point) + new Vector2(8, 8), (point, point) - new Vector2(0, 8), Color.Yellow);
handle.DrawLine((point, point) + new Vector2(-8, 8), (point, point) - new Vector2(0, 8), Color.Yellow);
foreach (var obj in _lastState.Objects)
{
var minimapPos = obj.Position * MinimapScale;
var radius = obj.Radius * MinimapScale;
if (minimapPos.Length + radius > ScaledMinimapRadius)
continue;
switch (obj.Shape)
{
case RadarObjectShape.CircleFilled:
case RadarObjectShape.Circle:
{
handle.DrawCircle(minimapPos + point, radius, obj.Color, obj.Shape == RadarObjectShape.CircleFilled);
break;
}
default:
throw new NotImplementedException();
}
}
}
}
[UsedImplicitly]
public sealed class RadarConsoleBoundUserInterface : ComputerBoundUserInterface<RadarConsoleWindow, RadarConsoleBoundInterfaceState>
{
public RadarConsoleBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {}
}