using Content.Client.Graphics; using Robust.Client.Graphics; using Robust.Shared.Enums; namespace Content.Client.Light; /// /// Essentially handles blurring for content-side light overlays. /// public sealed class LightBlurOverlay : Overlay { public override OverlaySpace Space => OverlaySpace.BeforeLighting; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IOverlayManager _overlay = default!; public const int ContentZIndex = TileEmissionOverlay.ContentZIndex + 1; private readonly OverlayResourceCache _resources = new(); public LightBlurOverlay() { IoCManager.InjectDependencies(this); ZIndex = ContentZIndex; } protected override void Draw(in OverlayDrawArgs args) { if (args.Viewport.Eye == null) return; var beforeOverlay = _overlay.GetOverlay(); var beforeLightRes = beforeOverlay.GetCachedForViewport(args.Viewport); var res = _resources.GetForViewport(args.Viewport, static _ => new CachedResources()); var size = beforeLightRes.EnlargedLightTarget.Size; if (res.BlurTarget?.Size != size) { res.BlurTarget = _clyde .CreateRenderTarget(size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "enlarged-light-blur"); } var target = beforeLightRes.EnlargedLightTarget; // Yeah that's all this does keep walkin. _clyde.BlurRenderTarget(args.Viewport, target, res.BlurTarget, args.Viewport.Eye, 14f * 5f); } protected override void DisposeBehavior() { _resources.Dispose(); base.DisposeBehavior(); } private sealed class CachedResources : IDisposable { public IRenderTarget? BlurTarget; public void Dispose() { BlurTarget?.Dispose(); } } }