acdream/tests/AcDream.App.Tests/Rendering/CellVisibilityPortalPolygonsTests.cs
Erik b0c175afc0 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>
2026-07-13 18:45:24 +02:00

55 lines
1.8 KiB
C#

// CellVisibilityPortalPolygonsTests.cs — verifies the cell-build transaction preserves
// portal polygon vertices in LoadedCell.PortalPolygons.
//
// Phase A8 — Indoor-cell visibility culling. Issue #78.
using System.Numerics;
using AcDream.App.Rendering;
using Xunit;
namespace AcDream.App.Tests.Rendering;
public class CellVisibilityPortalPolygonsTests
{
[Fact]
public void LoadedCell_DefaultPortalPolygons_IsEmpty()
{
var cell = new LoadedCell();
Assert.NotNull(cell.PortalPolygons);
Assert.Empty(cell.PortalPolygons);
}
[Fact]
public void LoadedCell_PortalPolygons_ParallelIndexedToPortals()
{
// Hand-construct: two portals, one with a 4-vertex polygon, one with
// an empty polygon (resolution failure simulated by an empty array).
// The data-class semantics: PortalPolygons[i] corresponds to
// Portals[i] and ClipPlanes[i].
var cell = new LoadedCell
{
Portals = new()
{
new CellPortalInfo(0xFFFF, 100, 0, 0), // exit portal, has geometry
new CellPortalInfo(0x0102, 101, 0, 0), // inner portal, no geometry resolved
},
ClipPlanes = new() { default, default },
PortalPolygons = new()
{
new[]
{
new Vector3(0, 0, 0),
new Vector3(1, 0, 0),
new Vector3(1, 1, 0),
new Vector3(0, 1, 0),
},
System.Array.Empty<Vector3>(),
},
};
Assert.Equal(2, cell.Portals.Count);
Assert.Equal(2, cell.PortalPolygons.Count);
Assert.Equal(4, cell.PortalPolygons[0].Length);
Assert.Empty(cell.PortalPolygons[1]);
}
}