using System.Numerics; using Content.Shared.MapText; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Client.UserInterface.RichText; using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Prototypes; namespace Content.Client.MapText; /// /// Draws map text as an overlay /// public sealed class MapTextOverlay : Overlay { private readonly IConfigurationManager _configManager; private readonly IEntityManager _entManager; private readonly IUserInterfaceManager _uiManager; private readonly TransformSystem _transform; public override OverlaySpace Space => OverlaySpace.ScreenSpace; public MapTextOverlay(IConfigurationManager configManager, IEntityManager entManager, IUserInterfaceManager uiManager, TransformSystem transform, IResourceCache resourceCache, IPrototypeManager prototypeManager) { _configManager = configManager; _entManager = entManager; _uiManager = uiManager; _transform = transform; } protected override void Draw(in OverlayDrawArgs args) { if (args.ViewportControl == null) return; var scale = _configManager.GetCVar(CVars.DisplayUIScale); if (scale == 0f) scale = _uiManager.DefaultUIScale; DrawWorld(args.ScreenHandle, args, scale); } private void DrawWorld(DrawingHandleScreen handle, OverlayDrawArgs args, float scale) { if ( args.ViewportControl == null) return; var matrix = args.ViewportControl.GetWorldToScreenMatrix(); var query = _entManager.AllEntityQueryEnumerator(); // Enlarge bounds to try prevent pop-in due to large text. var bounds = args.WorldBounds.Enlarged(2); while(query.MoveNext(out var uid, out var mapText)) { var mapPos = _transform.GetRenderMapCoordinates(uid); if (mapPos.MapId != args.MapId) continue; if (!bounds.Contains(mapPos.Position)) continue; if (mapText.CachedFont == null) continue; var pos = Vector2.Transform(mapPos.Position, matrix) + mapText.Offset; var dimensions = handle.GetDimensions(mapText.CachedFont, mapText.CachedText, scale); var drawPosition = (pos - dimensions / 2f).Rounded(); handle.DrawString(mapText.CachedFont, drawPosition, mapText.CachedText, scale, mapText.Color, TextOutline.Default); } } }