feat(render) Campaign FW1: doorway-still conformant - deg_mul is dynamic

Render::deg_mul is auto-tuned by frame load and SWUNG between oracle
captures: doorway-still ran right after the heavy terrace-edge capture
with the multiplier depressed (mul <= 0 puts thresholds at/below ideal,
so 001e/0026/002f select the portless level 1 - retail's zero look-in
floods, reproduced exactly at mul = 0), while every other fixture pins
~ +0.99 (thresholds at max). The recon session's "-0.99" live dump was
real - taken under the same cdb load. RetailFrameWalk now exposes the
multiplier; the doorway test pins 0, the rest use the default.

foundry-entry: frames 1-66 reproduce exactly; the F67-F79 standing
segment diverges ONLY in building 0036's intra-building DC order
(retail 116,118,11d vs replay 11d,116,118). The BSP-traversal microscope
pins the flip to 0036's ROOT plane (N=(0,0,-1) D=2.8): replay eye z
2.33 (d=+0.47, NEG-first) vs retail behaving as d<0 (POS-first) - a
structural ~0.5 m frame question (positionPush(2)/part-scale), only
adjudicable live. Turnkey probe:
tools/walk-oracle/fw1-f67-viewpoint-probe.cdb.

Fixture status: nine of ten fully conformant; foundry-entry exact
through F66 with the 13-frame order segment parked on the probe.
Suites: Walk 127/1 skip; hermetic 6,687/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-30 11:49:27 +02:00
parent c1a029edf9
commit 77f5342b62
4 changed files with 148 additions and 25 deletions

View file

@ -59,6 +59,15 @@ public sealed class RetailFrameWalk
/// regardless of per-cell visibility.</summary>
public bool AlwaysDrawObjects = true;
/// <summary>Retail global <c>Render::deg_mul</c> — DYNAMIC: the
/// auto-tuner (<c>auto_update_deg_mul</c>) swings it with frame load
/// (positive ⇒ degrade thresholds slide toward each level's max;
/// negative ⇒ toward its min). The oracle captures pin ≈+0.99 for every
/// fixture except doorway-still, whose capture ran under cdb load with
/// the multiplier depressed (the recon session's live dump read 0.99
/// under the same conditions).</summary>
public float DegradeMultiplier = WalkBuilding.DefaultDegradeMultiplier;
/// <summary>The per-frame root (<c>SmartBox::RenderNormalMode</c>).
/// <paramref name="cameraCell"/> may be null only when the camera is
/// outdoors.</summary>
@ -153,7 +162,9 @@ public sealed class RetailFrameWalk
// Retail walks the CURRENT degrade level's drawing BSP
// (part->gfxobj[deg_level]); a degraded-out slot skips everything
// after publishing the portal list.
WalkBspNode? bsp = building.SelectDrawingBsp(ctx.ViewerDistanceTo(building));
WalkBspNode? bsp = building.SelectDrawingBsp(
ctx.ViewerDistanceTo(building),
degradeMultiplier: DegradeMultiplier);
if (bsp is null) return;
int viewCount = Math.Max(activeViews.ViewCount, 0);