diff --git a/Content.Client/Decals/Overlays/DecalOverlay.cs b/Content.Client/Decals/Overlays/DecalOverlay.cs index 6fcd48264b..60b24c154b 100644 --- a/Content.Client/Decals/Overlays/DecalOverlay.cs +++ b/Content.Client/Decals/Overlays/DecalOverlay.cs @@ -2,18 +2,17 @@ using Content.Shared.Decals; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.Enums; +using Robust.Shared.Map; using Robust.Shared.Prototypes; namespace Content.Client.Decals.Overlays { - public sealed class DecalOverlay : Overlay + public sealed class DecalOverlay : GridOverlay { private readonly SpriteSystem _sprites; private readonly IEntityManager _entManager; private readonly IPrototypeManager _prototypeManager; - public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowEntities; - private readonly Dictionary _cachedTextures = new(64); public DecalOverlay( @@ -28,52 +27,58 @@ namespace Content.Client.Decals.Overlays protected override void Draw(in OverlayDrawArgs args) { + if (args.MapId == MapId.Nullspace) + return; + + var grid = Grid; + + if (!_entManager.TryGetComponent(grid, out DecalGridComponent? decalGrid) || + !_entManager.TryGetComponent(grid, out TransformComponent? xform)) + { + return; + } + + if (xform.MapID != args.MapId) + return; + // Shouldn't need to clear cached textures unless the prototypes get reloaded. var handle = args.WorldHandle; var xformSystem = _entManager.System(); var eyeAngle = args.Viewport.Eye?.Rotation ?? Angle.Zero; - var gridQuery = _entManager.AllEntityQueryEnumerator(); + var zIndexDictionary = decalGrid.DecalRenderIndex; - while (gridQuery.MoveNext(out var decalGrid, out var xform)) + if (zIndexDictionary.Count == 0) + return; + + var (_, worldRot, worldMatrix) = xformSystem.GetWorldPositionRotationMatrix(xform); + + handle.SetTransform(worldMatrix); + + foreach (var decals in zIndexDictionary.Values) { - if (xform.MapID != args.MapId) - continue; - - var zIndexDictionary = decalGrid.DecalRenderIndex; - - if (zIndexDictionary.Count == 0) - continue; - - var (_, worldRot, worldMatrix) = xformSystem.GetWorldPositionRotationMatrix(xform); - - handle.SetTransform(worldMatrix); - - foreach (var decals in zIndexDictionary.Values) + foreach (var decal in decals.Values) { - foreach (var decal in decals.Values) + if (!_cachedTextures.TryGetValue(decal.Id, out var cache) && _prototypeManager.TryIndex(decal.Id, out var decalProto)) { - if (!_cachedTextures.TryGetValue(decal.Id, out var cache) && _prototypeManager.TryIndex(decal.Id, out var decalProto)) - { - cache = (_sprites.Frame0(decalProto.Sprite), decalProto.SnapCardinals); - _cachedTextures[decal.Id] = cache; - } - - var cardinal = Angle.Zero; - - if (cache.SnapCardinals) - { - var worldAngle = eyeAngle + worldRot; - cardinal = worldAngle.GetCardinalDir().ToAngle(); - } - - var angle = decal.Angle - cardinal; - - if (angle.Equals(Angle.Zero)) - handle.DrawTexture(cache.Texture, decal.Coordinates, decal.Color); - else - handle.DrawTexture(cache.Texture, decal.Coordinates, angle, decal.Color); + cache = (_sprites.Frame0(decalProto.Sprite), decalProto.SnapCardinals); + _cachedTextures[decal.Id] = cache; } + + var cardinal = Angle.Zero; + + if (cache.SnapCardinals) + { + var worldAngle = eyeAngle + worldRot; + cardinal = worldAngle.GetCardinalDir().ToAngle(); + } + + var angle = decal.Angle - cardinal; + + if (angle.Equals(Angle.Zero)) + handle.DrawTexture(cache.Texture, decal.Coordinates, decal.Color); + else + handle.DrawTexture(cache.Texture, decal.Coordinates, angle, decal.Color); } }