fix #451: stabilize portal seam rendering
All checks were successful
CI / linux-portable (push) Successful in 3m32s
CI / windows-gate (push) Successful in 6m55s
CI / release (push) Successful in 2m12s

This commit is contained in:
Erik 2026-08-27 14:30:21 +02:00
parent f6fe0f2a4f
commit 1d2f2f738f
29 changed files with 1650 additions and 239 deletions

View file

@ -24,6 +24,48 @@ What does NOT go here:
- Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending.
- Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed.
## #451 — Sanctuary cathedral portal seam leaks exterior world and particles
**Status:** DONE — OWNER-ACCEPTED 2026-08-27 ("Looks good! Gate pass now!").
**Component:** Vulkan PView / nested building look-ins / landscape alpha ordering.
At the open-air Sanctuary cathedral seam between `0xF4180104` and
`0xF4180106`, small player or chase-camera movements could make cathedral
halves, their shadows, or floor textures flap; expose the world background,
trees, a nearby building, and waterfall/steam particles through opaque
geometry; or clip the local player in half. Camera zoom alone reproduced the
failure. The final particle repro was
`0xF4180104 [31.111177 57.648911 169.804993]`.
This was a renderer contract failure, not bad Sanctuary data. The correction:
- classifies exterior building seeds with retail's `F_EPSILON` instead of the
ordinary 1 cm EnvCell traversal tolerance and retains the exact accepted
`CBldPortal` aperture;
- appends every nested look-in cell's own `portal_view` to the frame clip
buffer, punches only the accepted seed portal, and clips shells plus static
and particle alpha to that view;
- pairs each look-in with only its own exterior building shell and reproduces
retail's per-building alpha barriers;
- keeps dynamic objects whole after the CPU PortalList sphere test, matching
retail `DrawMesh` and preventing the player-slicing regression;
- submits attached and ownerless exterior particles inside `LScape::draw` for
every PView root, eliminating the late post-world replay that let waterfall
alpha repaint already-drawn cathedral cells; and
- treats authored `SeenOutside` open-air cells as atmospheric outdoor cells so
sky/shadow activation no longer flips merely because the camera acquired an
EnvCell root.
The fix is renderer-wide: no Sanctuary coordinate or asset special case is
present in production. Installed-DAT regressions retain the reported camera
handoff, lateral transition, and exact steam-seam views. The temporary live
emitter/shell trace was removed at closeout.
**Acceptance:** owner swept both cells, moved across the seam, and zoomed the
camera through the former trigger positions. Cathedral/world flapping, shadow
toggle, player clipping, exterior geometry, and waterfall/particle bleed were
absent in the accepted build.
## #450 — Fast character re-entry after logout can remain in portal space at `lb 0/0`
**Status:** DONE — OWNER-ACCEPTED 2026-08-26 in the combined client-parity gate.
@ -18959,6 +19001,13 @@ DrawDynamicsParticles only sees dynamics-last cone survivors.
**Gate:** stand inside, look out the doorway at the town portal — the
swirl renders through the door.
**2026-08-27 ordering correction (#451):** the old "once per frame after the
look-ins" placement was sufficient for this gate but did not preserve the
installed `outside_view` and could repaint an already-drawn open-air building.
Ownerless emitters now submit once per outside-view slice with that slice's
clip slot. When building look-ins exist they enter the pre-building alpha
barrier; otherwise they drain at the end of `LScape::draw`.
---
## #132 — Candle flame disappears when the through-opening background is behind it
@ -18999,6 +19048,13 @@ against interiors). The owner-id filter carries over; cell-pass and
dynamics-pass emitters keep their own passes (owners never in the
outdoor-static set → no double-draw).
**2026-08-27 correction (#451):** the post-frame placement fixed this narrow
flame-overpaint case but was too late for nested open-air cathedral cells: an
exterior waterfall could repaint their completed opaque floor. Outdoor-static
and ownerless particles now submit inside `LScape::draw` under the exact
outside-view clip slot, with retail's pre-building/per-building alpha barriers;
the post-world PView replay is deleted.
**Gate:** both sides — indoors with the opening behind the candle, and
outdoors at the angle that previously erased it.