1
0

StencilOverlay.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Numerics;
  2. using Content.Client.Parallax;
  3. using Content.Client.Weather;
  4. using Content.Shared.Salvage;
  5. using Content.Shared.Weather;
  6. using Robust.Client.GameObjects;
  7. using Robust.Client.Graphics;
  8. using Robust.Shared.Enums;
  9. using Robust.Shared.Map;
  10. using Robust.Shared.Prototypes;
  11. using Robust.Shared.Timing;
  12. namespace Content.Client.Overlays;
  13. /// <summary>
  14. /// Simple re-useable overlay with stencilled texture.
  15. /// </summary>
  16. public sealed partial class StencilOverlay : Overlay
  17. {
  18. [Dependency] private readonly IClyde _clyde = default!;
  19. [Dependency] private readonly IEntityManager _entManager = default!;
  20. [Dependency] private readonly IGameTiming _timing = default!;
  21. [Dependency] private readonly IMapManager _mapManager = default!;
  22. [Dependency] private readonly IPrototypeManager _protoManager = default!;
  23. private readonly ParallaxSystem _parallax;
  24. private readonly SharedTransformSystem _transform;
  25. private readonly SharedMapSystem _map;
  26. private readonly SpriteSystem _sprite;
  27. private readonly WeatherSystem _weather;
  28. public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
  29. private IRenderTexture? _blep;
  30. private readonly ShaderInstance _shader;
  31. public StencilOverlay(ParallaxSystem parallax, SharedTransformSystem transform, SharedMapSystem map, SpriteSystem sprite, WeatherSystem weather)
  32. {
  33. ZIndex = ParallaxSystem.ParallaxZIndex + 1;
  34. _parallax = parallax;
  35. _transform = transform;
  36. _map = map;
  37. _sprite = sprite;
  38. _weather = weather;
  39. IoCManager.InjectDependencies(this);
  40. _shader = _protoManager.Index<ShaderPrototype>("WorldGradientCircle").InstanceUnique();
  41. }
  42. protected override void Draw(in OverlayDrawArgs args)
  43. {
  44. var mapUid = _mapManager.GetMapEntityId(args.MapId);
  45. var invMatrix = args.Viewport.GetWorldToLocalMatrix();
  46. if (_blep?.Texture.Size != args.Viewport.Size)
  47. {
  48. _blep?.Dispose();
  49. _blep = _clyde.CreateRenderTarget(args.Viewport.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "weather-stencil");
  50. }
  51. if (_entManager.TryGetComponent<WeatherComponent>(mapUid, out var comp))
  52. {
  53. foreach (var (proto, weather) in comp.Weather)
  54. {
  55. if (!_protoManager.TryIndex<WeatherPrototype>(proto, out var weatherProto))
  56. continue;
  57. var alpha = _weather.GetPercent(weather, mapUid);
  58. DrawWeather(args, weatherProto, alpha, invMatrix);
  59. }
  60. }
  61. if (_entManager.TryGetComponent<RestrictedRangeComponent>(mapUid, out var restrictedRangeComponent))
  62. {
  63. DrawRestrictedRange(args, restrictedRangeComponent, invMatrix);
  64. }
  65. args.WorldHandle.UseShader(null);
  66. args.WorldHandle.SetTransform(Matrix3x2.Identity);
  67. }
  68. }