41public sealed class DirectDrawingManager : IDisposable
44 private static readonly Lazy<DirectDrawingManager> _instance =
45 new(() =>
new DirectDrawingManager());
51 public static DirectDrawingManager
Instance => _instance.Value;
54 private readonly ConcurrentDictionary<string, IDirectDrawable> _directDrawings =
55 new(StringComparer.Ordinal);
57 private DirectDrawingManager() { }
78 new ReadOnlyCollection<IDirectDrawable>([.. _directDrawings.Values]);
91 public int Count => _directDrawings.Count;
114 return name is
null ? null : _directDrawings.TryGetValue(name, out
IDirectDrawable? d) ? d :
null;
137 var toDispose = _directDrawings.Values.ToArray();
138 foreach (var d
in toDispose)
159 if (
string.IsNullOrEmpty(name))
return;
160 if (_directDrawings.TryGetValue(name, out var d))
182 internal void UpdateAll(
long tick)
185 var snapshot = _directDrawings.Values.ToArray();
187 foreach (var drawing
in snapshot)
188 drawing.Update(tick);
212 internal void AddOrReplace(IDirectDrawable drawing)
215 throw new ArgumentNullException(nameof(drawing));
217 var name = drawing.Nickname!.ToString();
219 _directDrawings.AddOrUpdate(
224 drawing.Disposing += OnDrawingDisposing;
231 existing.Disposing -= OnDrawingDisposing;
237 drawing.Disposing += OnDrawingDisposing;
242 private static readonly IComparer<DirectDrawingBase> _defaultComparer =
243 Comparer<DirectDrawingBase>.Create((Comparison<DirectDrawingBase>)((a, b) =>
245 if (a ==
null && b ==
null)
return 0;
246 if (a ==
null)
return -1;
247 if (b ==
null)
return 1;
250 int z = a.ZOrder.CompareTo(b.ZOrder);
251 if (z != 0)
return z;
254 return string.Compare(a.Nickname, b.Nickname, StringComparison.Ordinal);
257 private void OnDrawingDisposing(
object? sender, IDirectDrawable drawing)
259 _directDrawings.TryRemove(drawing.Nickname!, out _);
260 drawing.Disposing -= OnDrawingDisposing;
263 #region helper methods
265 internal bool HasVisibleDrawingForLayer(
269 foreach (var value
in _directDrawings.Values)
271 if (value is DirectDrawingBase drawing &&
274 ReferenceEquals(drawing.SceneLayer, layer) &&
275 drawing.WorldBounds.IntersectsWith(worldRect))
315 var snapshot = _directDrawings.Values.ToArray();
317 var result = snapshot
321 ReferenceEquals(d.SceneLayer, layer))
324 result.Sort(_defaultComparer);
359 var snapshot = _directDrawings.Values.ToArray();
361 var result = snapshot
365 ReferenceEquals(d.View, view))
368 result.Sort(_defaultComparer);
380 #endregion helper methods