feat(streaming): load surface shell + player slab instead of vertical box
This commit is contained in:
@@ -44,7 +44,8 @@ internal sealed class EmptyMesher : IChunkMesher
|
||||
|
||||
public class ChunkStreamerTests
|
||||
{
|
||||
private static (ChunkStreamer streamer, World.World world, List<FakeRenderer> created) CreateStreamer(Configuration cfg)
|
||||
private static (ChunkStreamer streamer, World.World world, List<FakeRenderer> created) CreateStreamer(
|
||||
Configuration cfg, Func<int, int, int>? surfaceHeightAt = null)
|
||||
{
|
||||
var registry = new BlockRegistry();
|
||||
var store = new InMemoryChunkModificationStore();
|
||||
@@ -59,7 +60,8 @@ public class ChunkStreamerTests
|
||||
return r;
|
||||
};
|
||||
Func<Vector3i, VoxelChunk> generate = _ => new VoxelChunk();
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
|
||||
Func<int, int, int> height = surfaceHeightAt ?? ((_, _) => 8);
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, height, mesher, registry, executor, factory);
|
||||
return (streamer, world, created);
|
||||
}
|
||||
|
||||
@@ -186,7 +188,7 @@ public class ChunkStreamerTests
|
||||
int localIndex = (5 * VoxelChunk.Size + 6) * VoxelChunk.Size + 7;
|
||||
store.RecordEdit(pos, localIndex, registry.Stone.Id);
|
||||
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, (_, _) => 8, mesher, registry, executor, factory);
|
||||
streamer.Tick(pos);
|
||||
|
||||
Assert.Equal(registry.Stone.Id, world.GetBlock(5, 6, 7).Id);
|
||||
@@ -232,7 +234,7 @@ public class ChunkStreamerTests
|
||||
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 streamer = new ChunkStreamer(cfg, world, generate, (_, _) => 8, mesher, registry, executor, factory);
|
||||
|
||||
var pos = new Vector3i(0, 0, 0);
|
||||
streamer.Tick(pos);
|
||||
@@ -348,7 +350,7 @@ public class ChunkStreamerTests
|
||||
};
|
||||
Func<float[], IChunkRenderer> factory = m => new FakeRenderer(m);
|
||||
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, (_, _) => 8, mesher, registry, executor, factory);
|
||||
|
||||
streamer.Tick(new Vector3i(0, 0, 0));
|
||||
Assert.Equal(1, generateCalls);
|
||||
@@ -382,7 +384,7 @@ public class ChunkStreamerTests
|
||||
};
|
||||
Func<Vector3i, VoxelChunk> generate = _ => new VoxelChunk();
|
||||
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
|
||||
var streamer = new ChunkStreamer(cfg, world, generate, (_, _) => 8, mesher, registry, executor, factory);
|
||||
var pos = new Vector3i(0, 0, 0);
|
||||
streamer.Tick(pos);
|
||||
|
||||
@@ -419,4 +421,28 @@ public class ChunkStreamerTests
|
||||
Assert.Null(world.GetChunk(new Vector3i(0, 3, 0)));
|
||||
Assert.Null(world.GetChunk(new Vector3i(0, 1, 0)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tick_LoadsSurfaceShell_AndExcludesAirAboveSurface()
|
||||
{
|
||||
var cfg = new Configuration
|
||||
{
|
||||
RenderDistanceHorizontal = 0, // single column at the player
|
||||
RenderDistanceVertical = 0, // slab is just the player's chunk
|
||||
SurfaceShellSkirtBelow = 1,
|
||||
MaxGenerateJobsInFlight = 100,
|
||||
MaxMeshUploadsPerFrame = 100,
|
||||
};
|
||||
// Surface at worldY 40 → chunk Y 2. Shell = [2-1, 2] = {1, 2}. Slab at
|
||||
// player Y=0 = {0}. Union = {0, 1, 2}. Chunk Y 3+ is air above surface.
|
||||
var (streamer, world, _) = CreateStreamer(cfg, surfaceHeightAt: (_, _) => 40);
|
||||
|
||||
streamer.Tick(new Vector3i(0, 0, 0));
|
||||
|
||||
Assert.NotNull(world.GetChunk(new Vector3i(0, 0, 0))); // slab
|
||||
Assert.NotNull(world.GetChunk(new Vector3i(0, 1, 0))); // shell skirt
|
||||
Assert.NotNull(world.GetChunk(new Vector3i(0, 2, 0))); // shell surface
|
||||
Assert.Null(world.GetChunk(new Vector3i(0, 3, 0))); // air above surface — not loaded
|
||||
Assert.Null(world.GetChunk(new Vector3i(0, 5, 0))); // air above surface — not loaded
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user