diff --git a/src/AcDream.App/Streaming/LandblockStreamJob.cs b/src/AcDream.App/Streaming/LandblockStreamJob.cs index aff6500..e5b9602 100644 --- a/src/AcDream.App/Streaming/LandblockStreamJob.cs +++ b/src/AcDream.App/Streaming/LandblockStreamJob.cs @@ -10,7 +10,7 @@ namespace AcDream.App.Streaming; /// public abstract record LandblockStreamJob(uint LandblockId) { - public sealed record Load(uint LandblockId) : LandblockStreamJob(LandblockId); + public sealed record Load(uint LandblockId, LandblockStreamJobKind Kind) : LandblockStreamJob(LandblockId); public sealed record Unload(uint LandblockId) : LandblockStreamJob(LandblockId); } diff --git a/src/AcDream.App/Streaming/LandblockStreamer.cs b/src/AcDream.App/Streaming/LandblockStreamer.cs index fff7fc6..a325fb6 100644 --- a/src/AcDream.App/Streaming/LandblockStreamer.cs +++ b/src/AcDream.App/Streaming/LandblockStreamer.cs @@ -88,7 +88,7 @@ public sealed class LandblockStreamer : IDisposable // Synchronous mode: invoke the load delegate inline. The result lands // in the outbox and DrainCompletions picks it up later in the same // (or next) frame. - HandleJob(new LandblockStreamJob.Load(landblockId)); + HandleJob(new LandblockStreamJob.Load(landblockId, LandblockStreamJobKind.LoadNear)); } public void EnqueueUnload(uint landblockId) diff --git a/src/AcDream.App/Streaming/TwoTierDiff.cs b/src/AcDream.App/Streaming/TwoTierDiff.cs new file mode 100644 index 0000000..2a24dab --- /dev/null +++ b/src/AcDream.App/Streaming/TwoTierDiff.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace AcDream.App.Streaming; + +/// +/// Output of for the two-tier model. +/// Five disjoint lists describe what changed since the previous Tick. Per +/// Phase A.5 spec §4.2. +/// +public readonly record struct TwoTierDiff( + IReadOnlyList ToLoadFar, // entered far window from null (terrain only) + IReadOnlyList ToLoadNear, // entered near window from null (terrain + entities — first-tick or teleport) + IReadOnlyList ToPromote, // entered near window from far-resident (entities only) + IReadOnlyList ToDemote, // exited near window past hysteresis (drop entities) + IReadOnlyList ToUnload); // exited far window past hysteresis (drop terrain)