feat(render): Phase 3 (Step A) — outdoor-root seeds full-screen OutsideView
Render unification cutover, Step A (additive, behavior-neutral until Step B). When PortalVisibilityBuilder.Build roots at the synthetic outdoor node, seed OutsideView with the full-screen NDC quad so ClipFrameAssembler yields a full-screen OutsideView slice and DrawInside's DrawLandscapeThroughOutsideView draws terrain/sky/scenery/weather as the node's shell — the same callback that already draws the doorway slice for an interior root looking out. Keyed on a new explicit LoadedCell.IsOutdoorNode flag (set by OutdoorCellNode.Build), NOT a cell-id heuristic: production EnvCell ids are >= 0x100 but test fixtures use low interior ids, so an id test misfired on 4 existing PortalVisibilityBuilderTests. Nothing roots at the node until Step B, so this is behavior-neutral. Tests: App 216/0 (2 new UnifiedFloodTests incl. the spec section 10 pure-outdoor regression guard + 2 OutdoorCellNode flag assertions). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9bc0db9351
commit
5379f6ecd3
5 changed files with 71 additions and 0 deletions
|
|
@ -76,6 +76,18 @@ public static class PortalVisibilityBuilder
|
|||
|
||||
frame.CellViews[cameraCell.CellId] = CellView.FullScreen();
|
||||
|
||||
// Render unification (outdoor-as-cell, 2026-06-07): when the root IS the synthetic outdoor
|
||||
// node, the landscape is visible FULL-SCREEN, so seed OutsideView with the full-screen NDC
|
||||
// quad. ClipFrameAssembler turns that into a full-screen OutsideView slice, so DrawInside's
|
||||
// DrawLandscapeThroughOutsideView draws terrain/sky/scenery/weather as the node's "shell" —
|
||||
// the very same callback that already draws the doorway slice when an INTERIOR root reaches
|
||||
// outdoors. Keyed on the explicit IsOutdoorNode flag (set by OutdoorCellNode.Build), NOT a
|
||||
// cell-id heuristic: production EnvCell ids are >= 0x100 but test fixtures use low interior
|
||||
// ids, so an id test would misfire. An interior root never sets this flag, so the indoor
|
||||
// exit-portal path (OtherCellId==0xFFFF below) still owns the doorway OutsideView region.
|
||||
if (cameraCell.IsOutdoorNode)
|
||||
frame.OutsideView.Add(new ViewPolygon((Vector2[])FullScreenQuad.Clone()));
|
||||
|
||||
// Distance-priority work list (retail PView::cell_todo_list). Cells pop closest-first;
|
||||
// each cell carries the camera→nearest-portal-vertex distance that put it on the list
|
||||
// (retail keys on InitCell's per-portal min-vertex distance, decomp 432988-433004). The
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue