MapTextOverlay.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Numerics;
  2. using Content.Shared.MapText;
  3. using Robust.Client.Graphics;
  4. using Robust.Client.ResourceManagement;
  5. using Robust.Client.UserInterface;
  6. using Robust.Client.UserInterface.RichText;
  7. using Robust.Shared;
  8. using Robust.Shared.Configuration;
  9. using Robust.Shared.Enums;
  10. using Robust.Shared.Prototypes;
  11. namespace Content.Client.MapText;
  12. /// <summary>
  13. /// Draws map text as an overlay
  14. /// </summary>
  15. public sealed class MapTextOverlay : Overlay
  16. {
  17. private readonly IConfigurationManager _configManager;
  18. private readonly IEntityManager _entManager;
  19. private readonly IUserInterfaceManager _uiManager;
  20. private readonly SharedTransformSystem _transform;
  21. public override OverlaySpace Space => OverlaySpace.ScreenSpace;
  22. public MapTextOverlay(
  23. IConfigurationManager configManager,
  24. IEntityManager entManager,
  25. IUserInterfaceManager uiManager,
  26. SharedTransformSystem transform,
  27. IResourceCache resourceCache,
  28. IPrototypeManager prototypeManager)
  29. {
  30. _configManager = configManager;
  31. _entManager = entManager;
  32. _uiManager = uiManager;
  33. _transform = transform;
  34. }
  35. protected override void Draw(in OverlayDrawArgs args)
  36. {
  37. if (args.ViewportControl == null)
  38. return;
  39. args.DrawingHandle.SetTransform(Matrix3x2.Identity);
  40. var scale = _configManager.GetCVar(CVars.DisplayUIScale);
  41. if (scale == 0f)
  42. scale = _uiManager.DefaultUIScale;
  43. DrawWorld(args.ScreenHandle, args, scale);
  44. args.DrawingHandle.UseShader(null);
  45. }
  46. private void DrawWorld(DrawingHandleScreen handle, OverlayDrawArgs args, float scale)
  47. {
  48. if ( args.ViewportControl == null)
  49. return;
  50. var matrix = args.ViewportControl.GetWorldToScreenMatrix();
  51. var query = _entManager.AllEntityQueryEnumerator<MapTextComponent>();
  52. // Enlarge bounds to try prevent pop-in due to large text.
  53. var bounds = args.WorldBounds.Enlarged(2);
  54. while(query.MoveNext(out var uid, out var mapText))
  55. {
  56. var mapPos = _transform.GetMapCoordinates(uid);
  57. if (mapPos.MapId != args.MapId)
  58. continue;
  59. if (!bounds.Contains(mapPos.Position))
  60. continue;
  61. if (mapText.CachedFont == null)
  62. continue;
  63. var pos = Vector2.Transform(mapPos.Position, matrix) + mapText.Offset;
  64. var dimensions = handle.GetDimensions(mapText.CachedFont, mapText.CachedText, scale);
  65. handle.DrawString(mapText.CachedFont, pos - dimensions / 2f, mapText.CachedText, scale, mapText.Color);
  66. }
  67. }
  68. }