From 8143b9d87a3db95b6654a2ccbcbc68a70a4c9c8a Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:22:35 +1200 Subject: [PATCH] Slight status icons performance improvement. (#18076) --- Content.Client/StatusIcon/StatusIconOverlay.cs | 10 +++++++--- Content.Client/StatusIcon/StatusIconSystem.cs | 13 +++++++++---- .../StatusIcon/Components/StatusIconComponent.cs | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Content.Client/StatusIcon/StatusIconOverlay.cs b/Content.Client/StatusIcon/StatusIconOverlay.cs index d1b556a5c7..c5add7f9bd 100644 --- a/Content.Client/StatusIcon/StatusIconOverlay.cs +++ b/Content.Client/StatusIcon/StatusIconOverlay.cs @@ -35,19 +35,23 @@ public sealed class StatusIconOverlay : Overlay var scaleMatrix = Matrix3.CreateScale(new Vector2(1, 1)); var rotationMatrix = Matrix3.CreateRotation(-eyeRot); - var query = _entity.AllEntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp, out var sprite, out var xform)) + var query = _entity.AllEntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var sprite, out var xform, out var meta)) { if (xform.MapID != args.MapId) continue; - var icons = _statusIcon.GetStatusIcons(uid); + var icons = _statusIcon.GetStatusIcons(uid, meta); if (icons.Count == 0) continue; var bounds = comp.Bounds ?? sprite.Bounds; var worldPos = _transform.GetWorldPosition(xform, xformQuery); + + if (!bounds.Translated(worldPos).Intersects(args.WorldAABB)) + continue; + var worldMatrix = Matrix3.CreateTranslation(worldPos); Matrix3.Multiply(scaleMatrix, worldMatrix, out var scaledWorld); Matrix3.Multiply(rotationMatrix, scaledWorld, out var matty); diff --git a/Content.Client/StatusIcon/StatusIconSystem.cs b/Content.Client/StatusIcon/StatusIconSystem.cs index c5ca10735a..a6caf4a2db 100644 --- a/Content.Client/StatusIcon/StatusIconSystem.cs +++ b/Content.Client/StatusIcon/StatusIconSystem.cs @@ -53,12 +53,17 @@ public sealed class StatusIconSystem : SharedStatusIconSystem _overlay.AddOverlay(new StatusIconOverlay()); } - public List GetStatusIcons(EntityUid uid) + public List GetStatusIcons(EntityUid uid, MetaDataComponent? meta = null) { - if (!Exists(uid) || Terminating(uid)) - return new(); + var list = new List(); + if (!Resolve(uid, ref meta)) + return list; - var ev = new GetStatusIconsEvent(new()); + if (meta.EntityLifeStage >= EntityLifeStage.Terminating) + return list; + + var inContainer = (meta.Flags & MetaDataFlags.InContainer) != 0; + var ev = new GetStatusIconsEvent(list, inContainer); RaiseLocalEvent(uid, ref ev); return ev.StatusIcons; } diff --git a/Content.Shared/StatusIcon/Components/StatusIconComponent.cs b/Content.Shared/StatusIcon/Components/StatusIconComponent.cs index c18cd7290f..8d3583c39c 100644 --- a/Content.Shared/StatusIcon/Components/StatusIconComponent.cs +++ b/Content.Shared/StatusIcon/Components/StatusIconComponent.cs @@ -24,4 +24,4 @@ public sealed partial class StatusIconComponent : Component /// /// [ByRefEvent] -public record struct GetStatusIconsEvent(List StatusIcons); +public record struct GetStatusIconsEvent(List StatusIcons, bool InContainer);