using System.Numerics; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Direction = Robust.Shared.Maths.Direction; namespace Content.Client.UserInterface.Controls; /// /// Simple control that shows an arrow pointing in some direction. /// /// /// The actual arrow and other icons are defined in the style sheet. /// public sealed class DirectionIcon : TextureRect { public static string StyleClassDirectionIconArrow = "direction-icon-arrow"; // south pointing arrow public static string StyleClassDirectionIconHere = "direction-icon-here"; // "you have reached your destination" public static string StyleClassDirectionIconUnknown = "direction-icon-unknown"; // unknown direction / error private Angle? _rotation; private bool _snap; float _minDistance; public Angle? Rotation { get => _rotation; set { _rotation = value; SetOnlyStyleClass(value == null ? StyleClassDirectionIconUnknown : StyleClassDirectionIconArrow); } } public DirectionIcon() { Stretch = StretchMode.KeepAspectCentered; SetOnlyStyleClass(StyleClassDirectionIconUnknown); } public DirectionIcon(bool snap = true, float minDistance = 0.1f) : this() { _snap = snap; _minDistance = minDistance; } public void UpdateDirection(Direction direction) { Rotation = direction.ToAngle(); } public void UpdateDirection(Vector2 direction, Angle relativeAngle) { if (direction.EqualsApprox(Vector2.Zero, _minDistance)) { SetOnlyStyleClass(StyleClassDirectionIconHere); return; } var rotation = direction.ToWorldAngle() - relativeAngle; Rotation = _snap ? rotation.GetDir().ToAngle() : rotation; } protected override void Draw(DrawingHandleScreen handle) { if (_rotation != null) { var offset = (-_rotation.Value).RotateVec(Size * UIScale / 2) - Size * UIScale / 2; handle.SetTransform(Matrix3Helpers.CreateTransform(GlobalPixelPosition - offset, -_rotation.Value)); } base.Draw(handle); } }