PuddleOverlay.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System.Numerics;
  2. using Content.Shared.FixedPoint;
  3. using Robust.Client.Graphics;
  4. using Robust.Client.ResourceManagement;
  5. using Robust.Shared.Enums;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. namespace Content.Client.Fluids;
  9. public sealed class PuddleOverlay : Overlay
  10. {
  11. [Dependency] private readonly IEyeManager _eyeManager = default!;
  12. [Dependency] private readonly IEntityManager _entityManager = default!;
  13. [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
  14. private readonly PuddleDebugOverlaySystem _debugOverlaySystem;
  15. private readonly SharedTransformSystem _transformSystem;
  16. private readonly Color _heavyPuddle = new(0, 255, 255, 50);
  17. private readonly Color _mediumPuddle = new(0, 150, 255, 50);
  18. private readonly Color _lightPuddle = new(0, 50, 255, 50);
  19. private readonly Font _font;
  20. public override OverlaySpace Space => OverlaySpace.ScreenSpace | OverlaySpace.WorldSpace;
  21. public PuddleOverlay()
  22. {
  23. IoCManager.InjectDependencies(this);
  24. _debugOverlaySystem = _entitySystemManager.GetEntitySystem<PuddleDebugOverlaySystem>();
  25. var cache = IoCManager.Resolve<IResourceCache>();
  26. _font = new VectorFont(cache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 8);
  27. _transformSystem = _entityManager.System<SharedTransformSystem>();
  28. }
  29. protected override void Draw(in OverlayDrawArgs args)
  30. {
  31. switch (args.Space)
  32. {
  33. case OverlaySpace.ScreenSpace:
  34. DrawScreen(args);
  35. break;
  36. case OverlaySpace.WorldSpace:
  37. DrawWorld(args);
  38. break;
  39. }
  40. }
  41. private void DrawWorld(in OverlayDrawArgs args)
  42. {
  43. var drawHandle = args.WorldHandle;
  44. Box2 gridBounds;
  45. var xformQuery = _entityManager.GetEntityQuery<TransformComponent>();
  46. foreach (var gridId in _debugOverlaySystem.TileData.Keys)
  47. {
  48. if (!_entityManager.TryGetComponent(gridId, out MapGridComponent? mapGrid))
  49. continue;
  50. var gridXform = xformQuery.GetComponent(gridId);
  51. var (_, _, worldMatrix, invWorldMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform, xformQuery);
  52. gridBounds = invWorldMatrix.TransformBox(args.WorldBounds).Enlarged(mapGrid.TileSize * 2);
  53. drawHandle.SetTransform(worldMatrix);
  54. foreach (var debugOverlayData in _debugOverlaySystem.GetData(gridId))
  55. {
  56. var centre = (debugOverlayData.Pos + Vector2Helpers.Half) * mapGrid.TileSize;
  57. // is the center of this tile visible
  58. if (!gridBounds.Contains(centre))
  59. continue;
  60. var box = Box2.UnitCentered.Translated(centre);
  61. drawHandle.DrawRect(box, Color.Blue, false);
  62. drawHandle.DrawRect(box, ColorMap(debugOverlayData.CurrentVolume));
  63. }
  64. }
  65. drawHandle.SetTransform(Matrix3x2.Identity);
  66. }
  67. private void DrawScreen(in OverlayDrawArgs args)
  68. {
  69. var drawHandle = args.ScreenHandle;
  70. var xformQuery = _entityManager.GetEntityQuery<TransformComponent>();
  71. foreach (var gridId in _debugOverlaySystem.TileData.Keys)
  72. {
  73. if (!_entityManager.TryGetComponent(gridId, out MapGridComponent? mapGrid))
  74. continue;
  75. var gridXform = xformQuery.GetComponent(gridId);
  76. var (_, _, matrix, invMatrix) = _transformSystem.GetWorldPositionRotationMatrixWithInv(gridXform, xformQuery);
  77. var gridBounds = invMatrix.TransformBox(args.WorldBounds).Enlarged(mapGrid.TileSize * 2);
  78. foreach (var debugOverlayData in _debugOverlaySystem.GetData(gridId))
  79. {
  80. var centre = (debugOverlayData.Pos + Vector2Helpers.Half) * mapGrid.TileSize;
  81. // // is the center of this tile visible
  82. if (!gridBounds.Contains(centre))
  83. continue;
  84. var screenCenter = _eyeManager.WorldToScreen(Vector2.Transform(centre, matrix));
  85. drawHandle.DrawString(_font, screenCenter, debugOverlayData.CurrentVolume.ToString(), Color.White);
  86. }
  87. }
  88. }
  89. private Color ColorMap(FixedPoint2 intensity)
  90. {
  91. var fraction = 1 - intensity / FixedPoint2.New(20f);
  92. var result = fraction < 0.5f
  93. ? Color.InterpolateBetween(_mediumPuddle, _heavyPuddle, fraction.Float() * 2)
  94. : Color.InterpolateBetween(_lightPuddle, _mediumPuddle, (fraction.Float() - 0.5f) * 2);
  95. return result;
  96. }
  97. }