1
0

PopupOverlay.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Numerics;
  2. using Content.Shared.Examine;
  3. using Robust.Client.Graphics;
  4. using Robust.Client.Player;
  5. using Robust.Client.UserInterface;
  6. using Robust.Shared;
  7. using Robust.Shared.Configuration;
  8. using Robust.Shared.Enums;
  9. using Robust.Shared.Map;
  10. using Robust.Shared.Prototypes;
  11. namespace Content.Client.Popups;
  12. /// <summary>
  13. /// Draws popup text, either in world or on screen.
  14. /// </summary>
  15. public sealed class PopupOverlay : Overlay
  16. {
  17. private readonly IConfigurationManager _configManager;
  18. private readonly IEntityManager _entManager;
  19. private readonly IPlayerManager _playerMgr;
  20. private readonly IUserInterfaceManager _uiManager;
  21. private readonly PopupSystem _popup;
  22. private readonly PopupUIController _controller;
  23. private readonly ExamineSystemShared _examine;
  24. private readonly SharedTransformSystem _transform;
  25. private readonly ShaderInstance _shader;
  26. public override OverlaySpace Space => OverlaySpace.ScreenSpace;
  27. public PopupOverlay(
  28. IConfigurationManager configManager,
  29. IEntityManager entManager,
  30. IPlayerManager playerMgr,
  31. IPrototypeManager protoManager,
  32. IUserInterfaceManager uiManager,
  33. PopupUIController controller,
  34. ExamineSystemShared examine,
  35. SharedTransformSystem transform,
  36. PopupSystem popup)
  37. {
  38. _configManager = configManager;
  39. _entManager = entManager;
  40. _playerMgr = playerMgr;
  41. _uiManager = uiManager;
  42. _examine = examine;
  43. _transform = transform;
  44. _popup = popup;
  45. _controller = controller;
  46. _shader = protoManager.Index<ShaderPrototype>("unshaded").Instance();
  47. }
  48. protected override void Draw(in OverlayDrawArgs args)
  49. {
  50. if (args.ViewportControl == null)
  51. return;
  52. args.DrawingHandle.SetTransform(Matrix3x2.Identity);
  53. args.DrawingHandle.UseShader(_shader);
  54. var scale = _configManager.GetCVar(CVars.DisplayUIScale);
  55. if (scale == 0f)
  56. scale = _uiManager.DefaultUIScale;
  57. DrawWorld(args.ScreenHandle, args, scale);
  58. args.DrawingHandle.UseShader(null);
  59. }
  60. private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, float scale)
  61. {
  62. if (_popup.WorldLabels.Count == 0 || args.ViewportControl == null)
  63. return;
  64. var matrix = args.ViewportControl.GetWorldToScreenMatrix();
  65. var ourEntity = _playerMgr.LocalEntity;
  66. var viewPos = new MapCoordinates(args.WorldAABB.Center, args.MapId);
  67. var ourPos = args.WorldBounds.Center;
  68. if (ourEntity != null)
  69. {
  70. viewPos = _transform.GetMapCoordinates(ourEntity.Value);
  71. ourPos = viewPos.Position;
  72. }
  73. foreach (var popup in _popup.WorldLabels)
  74. {
  75. var mapPos = popup.InitialPos.ToMap(_entManager, _transform);
  76. if (mapPos.MapId != args.MapId)
  77. continue;
  78. var distance = (mapPos.Position - ourPos).Length();
  79. // Should handle fade here too wyci.
  80. if (!args.WorldBounds.Contains(mapPos.Position) || !_examine.InRangeUnOccluded(viewPos, mapPos, distance,
  81. e => e == popup.InitialPos.EntityId || e == ourEntity, entMan: _entManager))
  82. continue;
  83. var pos = Vector2.Transform(mapPos.Position, matrix);
  84. _controller.DrawPopup(popup, worldHandle, pos, scale);
  85. }
  86. }
  87. }