using System.Collections.Generic; using AcDream.Core.Terrain; using AcDream.Core.World; namespace AcDream.App.Streaming; /// /// A job posted to 's inbox. Either a load /// (fetch this landblock from the dats and build its CPU-side mesh data) /// or an unload (release any state tied to this landblock on the render /// thread's next Tick drain). /// public abstract record LandblockStreamJob(uint LandblockId) { public sealed record Load(uint LandblockId, LandblockStreamJobKind Kind) : LandblockStreamJob(LandblockId); public sealed record Unload(uint LandblockId) : LandblockStreamJob(LandblockId); } /// /// Outbox record the render thread drains. Either a successful load, a /// failed load (logged and ignored until region recenters off/back), or /// an unload notification (tells the render thread to release GPU state /// for this landblock id). /// public abstract record LandblockStreamResult(uint LandblockId) { /// /// A landblock load completed. distinguishes Far /// (terrain only) from Near (terrain + entities). /// is built off the render thread on the streaming worker. /// public sealed record Loaded( uint LandblockId, LandblockStreamTier Tier, LoadedLandblock Landblock, LandblockMeshData MeshData ) : LandblockStreamResult(LandblockId); /// /// A previously-Far-resident landblock was promoted to Near. Terrain /// mesh is already on the GPU; the result carries the entity layer /// (stabs, buildings, scenery) to merge into the existing GpuWorldState /// entry. /// public sealed record Promoted( uint LandblockId, IReadOnlyList Entities ) : LandblockStreamResult(LandblockId); public sealed record Failed(uint LandblockId, string Error) : LandblockStreamResult(LandblockId); public sealed record Unloaded(uint LandblockId) : LandblockStreamResult(LandblockId); /// /// The worker loop itself crashed with an unhandled exception. Not tied /// to a specific landblock — distinguished from /// because consumers typically route this to a fatal-log path rather /// than retrying a single landblock later. LandblockId is 0 by /// convention; readers should pattern-match on the type, not the id. /// public sealed record WorkerCrashed(string Error) : LandblockStreamResult(0); }