research(render): Phase U.4c — refute eye-crosses-plane; correct stale H2 note

A8CellAudit portals now dumps each cell's local AABB. Real flap cells: 0171 local
y in [-7.65, 1.15], 0170 in [-8.61, -7.65]; the 0171->0170 portal plane is at
y=-7.65 (0171's MIN boundary), no overlap. So an eye genuinely inside 0171 always
has side-test D<=0 -> always traverses 0171->0170; the side test cannot cull 0170
while the eye is in 0171. The flap therefore requires the eye OUTSIDE 0171 while
root is still 0171 (cache/grace/3rd-person camera) -> a camera-cell-resolution
issue, not the side test (H2, disproven) and not the per-frame PVS set (H1, in
doubt). Mechanism still unconfirmed -> needs a live eye-pos capture. Stale H2
conclusion in the characterization note corrected with a banner.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-05-31 10:36:30 +02:00
parent b5f2bf2b8f
commit 8941d1e6e5
2 changed files with 31 additions and 0 deletions

View file

@ -261,6 +261,19 @@ static void DumpCellPortals(DatCollection dats, uint envCellId)
Console.WriteLine($" SIDES: {sideText}");
}
// U.4c H3 check: local AABB over all cellStruct verts. If the cell's AABB extends
// PAST one of its own portal planes, a camera eye in that region is in this cell's
// AABB (so an AABB-based FindCameraCell keeps rooting here) yet geometrically on the
// neighbour's side of the portal (so the per-frame side test culls that portal) →
// the flap's stale-root region.
if (cellStruct is not null && cellStruct.VertexArray.Vertices.Count > 0)
{
var mn = new Vector3(float.MaxValue); var mx = new Vector3(float.MinValue);
foreach (var v in cellStruct.VertexArray.Vertices.Values)
{ mn = Vector3.Min(mn, v.Origin); mx = Vector3.Max(mx, v.Origin); }
Console.WriteLine($" localAABB: min=({mn.X:F2},{mn.Y:F2},{mn.Z:F2}) max=({mx.X:F2},{mx.Y:F2},{mx.Z:F2})");
}
Console.WriteLine(
$"summary: cell=0x{envCellId:X8} portals={envCell.CellPortals.Count} " +
$"exits(0xFFFF)={exitCount} interior={interiorCount} " +