fix(render): drawn-once look-in dynamics + farther-than-building alpha drains

Two retail-parity corrections on top of 684380d4, user-gated together
(no regressions; door/creature-through-opening rendering verified live
at Holtburg; cathedral waterfall and look-north casts pass):

1. Drawn-once look-in dynamics. Retail marks every drawn non-player
part for the frame (DrawMeshInternal @0x0059F360 GetDrawnThisFrame), so
an object draws once, with its cell. acdream drew a look-in cell's
dynamics twice under an outdoor root - once correctly with the look-in,
then again in dynamics-last after the boundary alpha drain, where the
second draw overpainted nearer flames. Both the accepted path
(_lookInCellIds) and the frame product (BuildDynamicLastRoute) now
exclude dynamics whose parent cell drew as a look-in.

2. Pre/inter-building barriers drain only content FARTHER than the
building they precede (FlushLandscapeAlphaFartherThan +
RetailAlphaQueue.FlushFartherThan + conservative anchor-origin
threshold). Retail's far-to-near walk guarantees a building's
FlushAlphaList(0f) @0x0059F2A0 has only farther content queued; a
nearer emitter composites at a later flush. AP-236 documents the
remaining barrier-order divergence.

The #132 candle-before-door overdraw is NOT yet fixed by these steps
and stays open: the current suspect is that houses without a
constructed look-in still draw their interior-parented door in
dynamics-last after the outdoor candle's boundary drain (see the
2026-08-29 ledger for the retail flush-after-objects hypothesis).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-29 16:06:04 +02:00
parent 684380d421
commit fc30285fd7
3 changed files with 84 additions and 13 deletions

View file

@ -306,7 +306,7 @@ public sealed class RetailPViewPassExecutorTests
"landscape-early",
"unattached-particles-outdoor",
"landscape-static-particles",
"landscape-alpha",
"landscape-alpha-farther",
"look-in-punch",
"landscape-late",
"landscape-alpha",
@ -380,7 +380,7 @@ public sealed class RetailPViewPassExecutorTests
"look-in-punch",
"landscape-building-shell",
"landscape-static-particles",
"landscape-alpha",
"landscape-alpha-farther",
"look-in-punch",
"landscape-building-shell");
}
@ -795,6 +795,8 @@ public sealed class RetailPViewPassExecutorTests
? "unattached-particles-outdoor"
: "unattached-particles-interior");
public void FlushLandscapeAlpha() => Operations.Add("landscape-alpha");
public void FlushLandscapeAlphaFartherThan(float minViewerDistance) =>
Operations.Add("landscape-alpha-farther");
public void DrawCellParticles(RetailPViewFrameInput frame, RetailPViewCellSliceContext context) => Operations.Add("cell-particles");
public void DrawDynamicsParticles(
RetailPViewFrameInput frame,