Resolve the Fix D contradiction with decomp (workflow wf_f660eb88 + adversarial verify) + 4 live cdb captures. The D3D-FF model was the WRONG oracle: retail has TWO light systems — STATIC torches BAKE into wall vertices (calc_point_light, triple-clamped: range gate + per-channel min(scale*color,color) + per-vertex [0,1] from black), DYNAMIC lights go D3D hardware. The captured intensity=100 is the purple PORTAL (magenta, dynamic), not a wall torch. Ground truth: 38 static warm torches (orange (1,0.588,0.314)/cream, intensity=100, falloff 3-5) + 2 dynamic. acdream over-brightness = two confirmed bugs: D-1 mesh_modern.vert folds ambient+sun+torches into one UNCLAMPED accumulator (single frag clamp) -> warm blowout; D-2 EnvCellRenderer never binds SSBO 4/5 so the cell shell reads a leaked light set. Spec: D-1 in-shader clamp-split (clamp the torch sum on its own before ambient/sun); D-2 bind the shell's own per-cell light set (mirror WbDrawDispatcher); LightBake.cs is the C# conformance oracle. Adds the 4 reusable cdb capture scripts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
2.3 KiB
Text
36 lines
2.3 KiB
Text
$$
|
|
$$ A7 Fix D (#140) v2 — fills the two gaps v1 left:
|
|
$$ (1) light COLORS (v1's dt did not expand RGBColor); expanded here as a
|
|
$$ typed RGBColor dump + raw dd hex backup (reinterpret IEEE-754 if dt fails).
|
|
$$ (2) the STATIC wall torches (the lights that actually BAKE the walls) — these
|
|
$$ only re-register on a visible-cell-set change, so the player must MOVE
|
|
$$ (walk IN and OUT of the meeting hall, circle past the torches) to trigger
|
|
$$ Render::add_static_light.
|
|
$$
|
|
$$ v1 already proved: intensity=100/falloff=6 light is DYNAMIC (add_dynamic_light,
|
|
$$ d3dIdx=2) = the portal/effect on the hardware path, NOT a baked wall torch.
|
|
$$ viewer light = intensity 2.25 / falloff 10 (dynamic, d3dIdx=1).
|
|
$$
|
|
$$ add_static_light / add_dynamic_light(LIGHTINFO* info, cellID, Frame* offset):
|
|
$$ LIGHTINFO* = poi(@esp+4). color@+0x50 (r/g/b floats), origin@+0x38, intensity@+0x5C, falloff@+0x60.
|
|
$$
|
|
$$ Dynamic logging is limited to the first 8 hits (we already characterised them);
|
|
$$ ALL static hits log. qd when 12 static torches captured OR 1500 total hits (safety).
|
|
|
|
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\a7-fixd-lights-v2.log
|
|
.sympath C:\Users\erikn\source\repos\acdream\refs
|
|
.symopt+ 0x40
|
|
.reload /f acclient.exe
|
|
|
|
r $t0 = 0
|
|
r $t2 = 0
|
|
r $t3 = 0
|
|
|
|
$$ STATIC wall torches (baked path) — MOVE to trigger. Color (typed + hex) + origin.
|
|
bp acclient!Render::add_static_light "r $t0=@$t0+1; r $t2=@$t2+1; .printf /D \"[STATIC torch] hit#%d\\n\", @$t2; dt acclient!LIGHTINFO poi(@esp+4) type intensity falloff cone_angle; .echo color_typed:; dt acclient!RGBColor poi(@esp+4)+0x50; .echo color_hex(r,g,b):; dd poi(@esp+4)+0x50 L3; .echo origin_hex(x,y,z):; dd poi(@esp+4)+0x38 L3; .if (@$t2 >= 12) { qd } .elsif (@$t0 >= 1500) { qd } .else { gc }"
|
|
|
|
$$ DYNAMIC lights (portal/viewer) — log first 8 with color, then silent gc.
|
|
bp acclient!Render::add_dynamic_light "r $t0=@$t0+1; r $t3=@$t3+1; .if (@$t3 <= 8) { .printf /D \"[DYNAMIC light] hit#%d\\n\", @$t3; dt acclient!LIGHTINFO poi(@esp+4) type intensity falloff; .echo color_typed:; dt acclient!RGBColor poi(@esp+4)+0x50; .echo color_hex(r,g,b):; dd poi(@esp+4)+0x50 L3 }; .if (@$t0 >= 1500) { qd } .else { gc }"
|
|
|
|
.printf "v2 armed: STATIC=wall torches (MOVE in/out of hall to trigger), DYNAMIC=portal/viewer; colors expanded. qd at 12 statics or 1500 total.\\n"
|
|
g
|