Merge campaign-hover-ui-round: #419 post-mortem record (tunnel fix attempts discarded, apparatus-first protocol)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-17 23:15:48 +02:00
commit 15539a22a6

View file

@ -53,6 +53,77 @@ parameters in the viewport render setup), port the roll drift, express
the exit as the view-plane distance animation. Retail-faithfulness fix —
no tuning knobs.
**TWO FIX ATTEMPTS DISCARDED BY USER DIRECTION (2026-08-17 evening;
commits removed from the branch, patches preserved in the session
scratchpad `tunnel-419-patches/`). Read this record before the next
attempt.**
*Attempt 1 (was `9e83a49b`) — scoped winding mirror.* Theory: retail
draws the tunnel's `sides_type 0` polys with `D3DCULL_CW` through an
improper det1 view basis; our proper basis flips screen winding, so the
inherited cull mapping keeps the mirror-image face set. Changed:
`WbDrawDispatcher.cs` (+`PushMirroredAuthoredWinding` scope +
`MirrorAuthoredCullMode` + one `EffectiveCullMode` chokepoint),
`WbDrawDispatcher.PackedOracle.cs`, `PortalTunnelPresentation.cs` (draw
inside the scope), `TeleportViewPlaneController.cs` (citations),
`PortalTunnelInteriorTests.cs` (new). USER GATE RESULT: exit flash gone
BUT the tunnel showed as a dark tube seen from OUTSIDE — the mirror
culled the interior; the "fixed" exit was a FALSE POSITIVE (nothing
drawn cannot flash).
*Attempt 2 (was `213345bd`) — revert attempt 1 + Surface.Luminosity
emissive port.* The revert's justification (verified, durable):
`MeshExtractor.BuildPolygonIndices` emits positive-surface fans in
REVERSED index order — WB's baked D3D↔GL compensation — so
(bake reversal) ∘ (proper det+1 look-at) ≡ retail's
(authored order) ∘ (improper det1 + `D3DCULL_CW`): the DEFAULT cull
mapping already keeps retail's faces and attempt 1 double-mirrored it.
Theory 2: the rim/flash = ambient-only dark facets because the swirl
surface `0x08000C31` authors `Surface.Luminosity = 1.0` (retail's
material emissive — `FUN_0059DA60` writes `Material.Emissive.rgb =
Luminosity`; the sky shader ports this law, the OBJECT path never did).
Changed: luminosity plumbing extractor→`WbMeshAdapter` startup
luminous-surface map→`ObjectRenderBatch`/`InstanceGroup`/`CachedBatch`/
`PackedClassifiedBatch``BatchData.Reserved` float bits→`mesh_modern`
shader term (recompiled SPIR-V, 13 .spv files), plus
`PortalTunnelPresentation.cs`. USER GATE RESULT: **tunnel looked
IDENTICAL to baseline** — the rim and exit flash are back (expected,
attempt 1 reverted) and the luminosity change produced NO VISIBLE
DIFFERENCE, meaning either theory 2 is wrong or the plumbing never
reached the tunnel's draw (UNRESOLVED — never verified live; the
per-batch value could be defaulting to 0 anywhere along the six-hop
chain).
*Durable byte-decoded facts (PDB-paired binary, keep):* roll drift
`duration = RandDouble(0.6, 1.8)`, `endAngle = RandDouble(0.0, 360.0)`,
interp `start + (endstart)·GetAnimLevel/1024`, applied
`SetCameraDirection_Degrees(0, angle, 0)` @0x004D6FD6704E;
`TRANSITION_VIEW_PLANE_DISTANCE @0x007BD260 = 0.001` (double),
`TELEPORT_ANIM_FADE_TIME @0x007BD278 = 1.0`, MIN/MAX_CONTINUE
@0x007BD268/70 = 2.0/5.0, `TELEPORT_ANIM_FPS @0x007BD280 = 40.0f`;
fade `dist = (TVPD gameVDist)·level/1024 + gameVDist`;
`set_vdst @0x0054B240`: `fov = 2·atan(1/d)` clamp (0.001, π),
`znear = d<0.4 ? 0.1 : d·0.25`. CreatureMode ambient (0.3,0.3,0.3)
@0x004543CF (ours matches), distant light 2.0 dir (0.3,1.9,0.65)
(matches). The original filing's "own fixed projection" premise is
REFUTED: `gmSmartBoxUI::PostInit @0x004D6DB3` calls
`CreatureMode::UseSmartboxFOV` — the tunnel FOLLOWING the Config FOV is
retail. Camera IS at the authored eye (three-way enclosure proof: 0
escape rays at all 120 frames, live-pak batches identical to fresh
extraction). Tunnel = Setup `0x02000306`, two half-torus parts of GfxObj
`0x0100080B` (360 polys `sides_type 0` + 4 unstippled pos-surface quads
— the purple floaters are authored content).
**MANDATORY NEXT PROTOCOL (agreed with the user after two failed
rounds): apparatus BEFORE any further fix.** (1) a probe-gated tunnel
FREEZE (`ACDREAM_PROBE_*` family) holding TAS_TUNNEL indefinitely so
the scene is statically inspectable; (2) ONE RenderDoc capture of the
frozen frame — which triangles draw, cull state, material constants
actually bound; (3) the ACViewer oracle on Setup `0x02000306` (clean
interior there ⇒ our pipeline, rings there ⇒ shared dat
interpretation); (4) a retail side-by-side screenshot for ground truth
(brightness included). Fix only against that evidence.
## #418 — Login world load takes ~27 s: publication advances at a flat 32 blocks/s
**Status:** IN-PROGRESS 2026-08-17 — producer half landed (this commit's