8internal sealed class RefreshQueue
10 private readonly Func<bool> _isEnabled;
11 private readonly List<Rectangle> _worldRects;
12 private readonly
object _syncRoot =
new();
14 internal RefreshQueue(Func<bool> isEnabled)
16 _isEnabled = isEnabled ??
throw new ArgumentNullException(nameof(isEnabled));
17 _worldRects =
new List<Rectangle>(64);
25 get { lock (_syncRoot)
return _worldRects.Count > 0; }
39 internal IReadOnlyList<Rectangle> WorldRects => _worldRects;
48 lock (_syncRoot)
return _worldRects.ToArray();
57 internal void AddWorldRect(Rectangle worldPixelRange)
59 if (!_isEnabled() || worldPixelRange.IsEmpty)
63 var engine = Engine.Instance;
64 if (!engine.EngineDispatcher.IsOnEngineThread)
66 engine.EngineDispatcher.Post(() => AddWorldRect(worldPixelRange));
73 for (
int i = 0; i < _worldRects.Count; i++)
75 if (_worldRects[i].Contains(worldPixelRange))
79 _worldRects.Add(worldPixelRange);
83 internal void AddViewScreenRect(View view, SceneLayer sceneLayer, Rectangle screenPixelRange)
85 if (!_isEnabled() || screenPixelRange.IsEmpty)
89 throw new ArgumentNullException(nameof(view));
91 if (sceneLayer is
null)
92 throw new ArgumentNullException(nameof(sceneLayer));
95 var engine = Engine.Instance;
96 if (!engine.EngineDispatcher.IsOnEngineThread)
98 engine.EngineDispatcher.Post(() => AddViewScreenRect(view, sceneLayer, screenPixelRange));
106 worldRect.Inflate(3, 3);
107 AddWorldRect(worldRect.ToPixelAlignedRect());
110 internal void ClearRefreshQueue()
113 var engine = Engine.Instance;
114 if (!engine.EngineDispatcher.IsOnEngineThread)
116 engine.EngineDispatcher.Post(() => ClearRefreshQueue());
RectangleF ScreenRectToWorldRect(SceneLayer layer, RectangleF screenRect)
Converts a screen-space rectangle (on the logical Backbuffer) into a world-space rectangle for the gi...
Viewport Viewport
Gets the viewport that defines the screen-space rectangle, zoom level, and other rendering parameters...
Rectangle TargetRectPx
Screen-space rectangle (in SCREEN / RenderSurface pixels) where this view is drawn....
@ Rectangle
Particles are spawned uniformly within a rectangular area. This is the default distribution.