checkpoint: preserve user-gated FW closeout fixes

This commit is contained in:
Erik 2026-08-31 08:27:37 +02:00
parent a2f2eb7d78
commit b8befded8b
22 changed files with 1005 additions and 198 deletions

View file

@ -1096,34 +1096,47 @@ devtools, and screenshots; then closes the GPU-flight transaction in
> `TerrainModernRenderer` (terrain), fed by the unified PView stack. This is the
> authoritative current draw model; the 2026-05-31 reset handoff is historical.
**One visibility owner.** `RetailPViewRenderer.DrawInside` is the production
world gate. Its root is the collided camera/viewer cell, or the synthetic
outdoor cell adaptation; the player's current cell separately owns sunlight
and indoor lighting. A null root exists only for login/debug/streaming-gap
fallback frames. `RetailPViewRenderer` is the one authoritative PView owner and
product family: it builds the main frame, deliberate per-building exterior
floods for the synthetic outdoor root, and separate interior-root look-in
frames. No second per-frame ACME visibility BFS competes with that family.
**One visibility owner.** `RetailFrameWalk`, driven once per frame by
`WalkFrameDriver.Collect`, is the production authority for rooting, portal
recursion, visible cells/buildings, per-view admission, and draw order. Its root
is the collided camera/viewer cell or retail's synthetic outdoor cell; the
player's current cell separately owns sunlight and indoor lighting. A null root
exists only for login/debug/streaming-gap fallback frames. The classes named
`RetailPViewRenderer` and `RetailPViewPassExecutor` remain composition/pass
facades around that one walk; they do not build a second visibility product.
`PortalVisibilityBuilder` is retained only by tests and research diagnostics and
has no production caller. `CellVisibility` does not decide frame visibility.
**Current draw discipline.** Outside-view slices draw sky, terrain, and outdoor
statics first. Interior-root building look-ins then punch all entry apertures
before drawing their shell and contents. The landscape shared-alpha scope
flushes before the root-specific depth boundary. Interior roots perform the
conditional depth clear and then write true-depth exit seals; the synthetic
outdoor root retains world depth and writes far-Z building-entry punches.
Opaque EnvCell shells, immediate far-to-near transparent EnvCell shells, cell
statics and their particles, then the surviving main-stage dynamics and their
particles follow. Look-in and outside-stage dynamics intentionally draw in
their earlier landscape phases. The final world shared-alpha scope flushes
before private portal/paperdoll viewports and UI.
**Current draw discipline.** The walk records one ordered event stream for
landscape cells, building portals, EnvCell shells, statics, dynamics, particles,
depth boundaries, and alpha barriers. `WalkFrameDriver` replays those events in
retail order through the Vulkan leaf renderers. Interior roots preserve retail's
conditional depth clear and true-depth exit seals; the synthetic outdoor root
retains world depth and stamps far-Z entry punches. World translucents and scene
particles share `RetailAlphaQueue` and drain at the walk's exact barriers.
Private portal/paperdoll viewports and retained UI execute only after the world
stream finishes. Projectiles are ordinary live-entity draws, never a separate
global pass.
The modern renderer intentionally does not hard-clip every shell or entity to
the accumulated polygon. It combines PView admission and viewcone checks with
retail's punch/seal depth discipline; terrain/outside slices use the bounded
clip-plane/scissor adaptation. World Wb translucents and Scene particles share
one stable far-to-near `RetailAlphaQueue`; EnvCell transparent shells and
private viewports remain immediate. Projectiles are ordinary live-entity draws,
never a separate global pass.
**Portal-slice clipping is part of admission, not a later approximation.** Each
walk visit retains the exact authored pixel-space portal polygon. The frame
adapter converts it once to a Vulkan GPU clip slot, and the cell shell, statics,
and dynamics admitted by that visit draw through that same slot. A content
drawing sphere may reject a slice before submission, but an accepted slice
never emits the whole mesh unclipped. The same cell can therefore draw more
than once through distinct apertures, exactly as retail's `viewconeCheck` plus
`portal_view` loop requires. Particles remain unclipped at submission because
retail contains them positionally through owner-cell ordering, opaque depth,
and alpha barriers. The complete visibility answer is the union of the walk's
visited EnvCells and visited landscape land cells. EnvCell batch preparation
consumes only the former; particle, light, and shadow visibility consume the
union. Omitting the landscape half disables every outdoor emitter even though
its owner still reaches the draw stream.
WorldBuilder contributes DAT decoding, mesh preparation, residency, and Vulkan
batch mechanics only; it makes no visibility or ordering decision. Forced merge
breaks at walk event boundaries preserve retail order while compatible draws
inside a leaf may still use order-preserving MDI merging.
Retail anchors are `SmartBox::RenderNormalMode @ 0x00453AA0`,
`PView::DrawInside @ 0x005A5860`, `PView::DrawCells @ 0x005A4840`,