fix(streaming): commit EnvCell landblocks atomically (#214)

Carry one complete cell payload with each streaming completion and publish visibility, physics, and render state on the render thread. Remove the obsolete post-readiness login reload that triggered a duplicate dungeon build.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-13 18:45:24 +02:00
parent 85980fe13f
commit b0c175afc0
26 changed files with 973 additions and 617 deletions

View file

@ -1,5 +1,6 @@
using System.Threading.Tasks;
using AcDream.App.Streaming;
using AcDream.App.Rendering.Wb;
using AcDream.Core.World;
using DatReaderWriter.DBObjs;
using Xunit;
@ -109,6 +110,35 @@ public class LandblockStreamerTests
Assert.Equal(1, meshBuildCalls);
}
[Fact]
public async Task Load_CarriesTheExactCompletedCellTransactionToTheConsumer()
{
var landblock = new LoadedLandblock(
0x8C04FFFFu,
new LandBlock(),
System.Array.Empty<WorldEntity>());
var cellBuild = new EnvCellLandblockBuild(
landblock.LandblockId,
System.Array.Empty<AcDream.App.Rendering.LoadedCell>(),
System.Array.Empty<EnvCellShellPlacement>());
var build = new LandblockBuild(landblock, cellBuild);
var mesh = new AcDream.Core.Terrain.LandblockMeshData(
System.Array.Empty<AcDream.Core.Terrain.TerrainVertex>(),
System.Array.Empty<uint>());
using var streamer = new LandblockStreamer(
loadLandblock: (_, _) => build,
buildMeshOrNull: (_, _) => mesh);
streamer.Start();
streamer.EnqueueLoad(landblock.LandblockId, LandblockStreamJobKind.LoadNear);
var loaded = Assert.IsType<LandblockStreamResult.Loaded>(
await DrainFirstAsync(streamer));
Assert.Same(build, loaded.Build);
Assert.Same(cellBuild, loaded.Build.EnvCells);
}
[Fact]
public async Task PromoteToNear_OvertakesAndSupersedesQueuedFarLoadForSameLandblock()
{