using System.Collections.Generic; using JetBrains.Annotations; using Robust.Shared.GameObjects; namespace Content.Client.Window { [UsedImplicitly] public sealed class WindowSystem : EntitySystem { private readonly Queue _dirtyEntities = new(); public override void Initialize() { base.Initialize(); SubscribeLocalEvent(HandleDirtyEvent); SubscribeLocalEvent(HandleSnapGridMove); } public override void Shutdown() { base.Shutdown(); UnsubscribeLocalEvent(); UnsubscribeLocalEvent(HandleSnapGridMove); } private void HandleDirtyEvent(WindowSmoothDirtyEvent ev) { if (ev.Sender.HasComponent()) { _dirtyEntities.Enqueue(ev.Sender); } } private static void HandleSnapGridMove(EntityUid uid, WindowComponent component, SnapGridPositionChangedEvent args) { component.SnapGridOnPositionChanged(); } public override void FrameUpdate(float frameTime) { base.FrameUpdate(frameTime); // Performance: This could be spread over multiple updates, or made parallel. while (_dirtyEntities.Count > 0) { var entity = _dirtyEntities.Dequeue(); if (entity.Deleted) { continue; } entity.GetComponent().UpdateSprite(); } } } /// /// Event raised by a when it needs to be recalculated. /// public sealed class WindowSmoothDirtyEvent : EntityEventArgs { public IEntity Sender { get; } public WindowSmoothDirtyEvent(IEntity sender) { Sender = sender; } } }