feat: ChunkStreamer unload path and SpawnReady property
This commit is contained in:
@@ -170,4 +170,74 @@ public class ChunkStreamerTests
|
||||
|
||||
Assert.Equal(registry.Stone.Id, world.GetBlock(5, 6, 7).Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tick_PlayerMovesAway_UnloadsOldChunksAndDisposesRenderer()
|
||||
{
|
||||
var cfg = new Configuration
|
||||
{
|
||||
RenderDistanceHorizontal = 0,
|
||||
RenderDistanceVertical = 0,
|
||||
MaxGenerateJobsInFlight = 100,
|
||||
MaxMeshUploadsPerFrame = 100,
|
||||
};
|
||||
var (streamer, world, created) = CreateStreamer(cfg);
|
||||
|
||||
streamer.Tick(new Vector3i(0, 0, 0)); // loads (0,0,0)
|
||||
Assert.Single(created);
|
||||
Assert.NotNull(world.GetChunk(new Vector3i(0, 0, 0)));
|
||||
|
||||
streamer.Tick(new Vector3i(5, 0, 0)); // (0,0,0) now out of range; (5,0,0) loaded
|
||||
|
||||
Assert.True(created[0].Disposed);
|
||||
Assert.Null(world.GetChunk(new Vector3i(0, 0, 0)));
|
||||
Assert.False(streamer.IsReady(new Vector3i(0, 0, 0)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tick_UnloadKeepsModificationStoreDiff()
|
||||
{
|
||||
var cfg = new Configuration
|
||||
{
|
||||
RenderDistanceHorizontal = 0,
|
||||
RenderDistanceVertical = 0,
|
||||
MaxGenerateJobsInFlight = 100,
|
||||
MaxMeshUploadsPerFrame = 100,
|
||||
};
|
||||
var registry = new BlockRegistry();
|
||||
var store = new InMemoryChunkModificationStore();
|
||||
var world = new World.World(registry, store);
|
||||
var mesher = new FakeMesher();
|
||||
var executor = new SynchronousJobExecutor();
|
||||
Func<float[], IChunkRenderer> factory = m => new FakeRenderer(m);
|
||||
Func<Vector3i, VoxelChunk> generate = _ => new VoxelChunk();
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
|
||||
|
||||
var pos = new Vector3i(0, 0, 0);
|
||||
streamer.Tick(pos);
|
||||
store.RecordEdit(pos, 0, registry.Stone.Id);
|
||||
|
||||
streamer.Tick(new Vector3i(99, 0, 0)); // unloads (0,0,0)
|
||||
Assert.True(store.HasDiff(pos)); // diff survives unload
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SpawnReady_FlipsTrueOnceSpawnAreaLoaded()
|
||||
{
|
||||
var cfg = new Configuration
|
||||
{
|
||||
RenderDistanceHorizontal = 1,
|
||||
RenderDistanceVertical = 0,
|
||||
SpawnReadyRadiusHorizontal = 1,
|
||||
MaxGenerateJobsInFlight = 100,
|
||||
MaxMeshUploadsPerFrame = 1, // throttle to expose progression
|
||||
};
|
||||
var (streamer, _, _) = CreateStreamer(cfg);
|
||||
|
||||
Assert.False(streamer.SpawnReady);
|
||||
// Tick once per chunk needed (3×3×1 = 9 chunks at this Y). Spawn area
|
||||
// restricted by Y bounds (only Y=0 valid here) → 9 ticks.
|
||||
for (int i = 0; i < 9; i++) streamer.Tick(new Vector3i(0, 0, 0));
|
||||
Assert.True(streamer.SpawnReady);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user