AfterLightTargetOverlay.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Numerics;
  2. using Robust.Client.Graphics;
  3. using Robust.Shared.Enums;
  4. namespace Content.Client.Light;
  5. /// <summary>
  6. /// This exists just to copy <see cref="BeforeLightTargetOverlay"/> to the light render target
  7. /// </summary>
  8. public sealed class AfterLightTargetOverlay : Overlay
  9. {
  10. public override OverlaySpace Space => OverlaySpace.BeforeLighting;
  11. [Dependency] private readonly IOverlayManager _overlay = default!;
  12. public const int ContentZIndex = LightBlurOverlay.ContentZIndex + 1;
  13. public AfterLightTargetOverlay()
  14. {
  15. IoCManager.InjectDependencies(this);
  16. ZIndex = ContentZIndex;
  17. }
  18. protected override void Draw(in OverlayDrawArgs args)
  19. {
  20. var viewport = args.Viewport;
  21. var worldHandle = args.WorldHandle;
  22. if (viewport.Eye == null)
  23. return;
  24. var lightOverlay = _overlay.GetOverlay<BeforeLightTargetOverlay>();
  25. var bounds = args.WorldBounds;
  26. // at 1-1 render scale it's mostly fine but at 4x4 it's way too fkn big
  27. var lightScale = viewport.LightRenderTarget.Size / (Vector2) viewport.Size;
  28. var newScale = viewport.RenderScale / (Vector2.One / lightScale);
  29. var localMatrix =
  30. viewport.LightRenderTarget.GetWorldToLocalMatrix(viewport.Eye, newScale);
  31. var diff = (lightOverlay.EnlargedLightTarget.Size - viewport.LightRenderTarget.Size);
  32. var halfDiff = diff / 2;
  33. // Pixels -> Metres -> Half distance.
  34. // If we're zoomed in need to enlarge the bounds further.
  35. args.WorldHandle.RenderInRenderTarget(viewport.LightRenderTarget,
  36. () =>
  37. {
  38. // We essentially need to draw the cropped version onto the lightrendertarget.
  39. var subRegion = new UIBox2i(halfDiff.X,
  40. halfDiff.Y,
  41. viewport.LightRenderTarget.Size.X + halfDiff.X,
  42. viewport.LightRenderTarget.Size.Y + halfDiff.Y);
  43. worldHandle.SetTransform(localMatrix);
  44. worldHandle.DrawTextureRectRegion(lightOverlay.EnlargedLightTarget.Texture, bounds, subRegion: subRegion);
  45. }, Color.Transparent);
  46. }
  47. }