# Progress note: the fix list from the Critique of M1-M3 Coder note, started 2026-10-05, continued 2026-10-06. Workplace `D:\HADAL - The Descent\TheDescentUE`. Source of the list: `Docs\critique\M3.md` and the Administrator's message. Updated after each fix; **a fix is "done" here only when its shot was opened and looked at**. | # | Fix | State | |---|---|---| | 1 | Rock in the headlamp reads as rock (V1) | DONE: cause found, fixed, shots looked at (numbers below) | | 2 | Cargo display fully in the pilot's view (U11) | DONE: looked at `m3_cockpit_cargo_filled.png` (1280x720), `m3_cockpit_cargo_filled_1920x1080.png`, `m3_launch_dock_hud_piloting.png` | | 3 | Moon pool looks like dark water, not a white rectangle | DONE: looked at `m12_boot_bay_pool.png`, `m3_launch_dock_launch_mid.png` | | 4 | The arm's hand takes the room's light | DONE: looked at `arm_character_foot_idle_bridge.png` (pale blue hand in the blue bridge), white in the bay (`m12_boot_bay_pool.png`) | | 5 | HUD vehicle panel stale after a respawn | DONE (dump below) | | 6 | UI-on shots in `m3_swim` and `m3_launch_dock` | DONE: looked at `m3_swim_hud_swim.png`, `m3_launch_dock_hud_piloting.png` | | 7 | Whole chain, then `Docs/STATUS.md` | DONE 2026-10-06: build PASS 0 warnings, import PASS, 67 of 67 tests, 38 scenarios PASS (+ the 2 self-tests that fail on purpose) | **CLOSED 2026-10-06 by the user's change of plan (finish the port first). All six fixes are in. Left for later, not polished:** tunnel mouths and ore veins inside the beam were not pictured specifically; the cracks of the rock are a drawn network (no real geometry); empty cargo cells are still faint; the arm's room light is a stand-in for bounce light. The port continues in `Docs/status/port_progress.md`. What the shots show (2026-10-06): cargo display whole in the picture at both sizes, `CARGO 5/8`, three Fe and two Co chunks in arrival order, chips `Fe 3 Co 2 Pe 0`, `BIO 0.0/4.0` readable, clear of the main dash. Pool: dark teal water with lighter ripples from the bay and from below, no white. HUD shots: depth panel `1,825 m THE THROAT` with compass, HEALTH 100, O2 39s, FOOD 42, `WATER 4.7 C`, crosshair (swim); with `RATING 2,300 m` and no O2 gauge while piloting. Fix 4 needed a second step after the first look: with channel 2 alone the hand was nearly black on the bridge (every lamp of that room is ahead of it), so the character got `ArmRoomFill`, a dim light beside the eye on channel 2 only, in the colour of the room's lamps and 0.30 of one lamp's brightness (`DescentTune_Player.h`), standing for the light the walls throw back. ## Fix 1: rock in the lamp. Cause and fix **Cause: the terrain material had nothing on its surface, and a lamp at the eye lights a wall head-on.** Found with a probe scenario (the headlamp on the wall east of the Great Void, 10 m): switching the volumetric fog off, the water post-process off, and both off left the picture the same flat disc. Block contrast inside the beam (new sidecar number `centre_detail`): | Probe variant | centre luma | centre_detail | |---|---|---| | as shipped | 0.434 | 0.0069 | | volumetric fog off | 0.442 | 0.0068 | | water post-process off | 0.562 | 0.0057 | | both off | 0.570 | 0.0056 | So it is not the fog, the water, the falloff or the exposure. `M_Terrain` had only two smooth low-frequency noises (albedo 0.72-1.22 over 2-3 m) and a weak normal, with roughness 0.9. A lamp at the eye gives Lambert about cos(tilt), 4 % for a 17 degree bump, and casts no shadow the eye can see: a smooth grey disc. In the dense basalt (the carved pocket) the surface was black with roughness 0.25, so the only thing visible was thin bright curves of specular: the "speckle". **Fix (only `Tools\ue\assets_40_terrain_material.py`, the custom node of `M_Terrain`):** mottling from 60 cm down to 8 cm; bedding (layers about 0.9 m thick, each its own tone, a dark seam between); a fracture network (warped cells about 0.9 m, each block with its own tone and facet direction, dark cracks of uneven width); a finer, stronger normal; roughness 0.58-0.82 instead of 0.9 (a wet-rock sheen that follows the bumps). Dense basalt: albedo 0.03 instead of 0.013, roughness 0.5 instead of 0.25, weaker normal, columnar jointing lines. Bloom, exposure, lamp and fog are untouched. **New statistic:** `centre_detail` and `centre_rms` in every shot's sidecar JSON (`Debug\DescentImageStats.*`): the central 40 x 40 % is cut into 8 px blocks (at 1280), `centre_detail` is the mean contrast |a-b|/(a+b+0.02) of neighbouring blocks. | Shot | centre luma before > after | centre_detail before > after | |---|---|---| | `look_near_wall_near_wall` (6 m) | 0.497 > 0.480 | 0.0055 > 0.0484 | | `look_deep_lamp_deep_lamp` (15 m) | 0.348 > 0.335 | 0.0086 > 0.0603 | | `m1_terrain_tour_tour_start` | 0.330 > 0.345 | 0.0222 > 0.0736 | | `m1_terrain_tour_tour_goal` | 0.285 > 0.275 | 0.0180 > 0.0547 | | `m1_carve_carved_after` | 0.363 > 0.310 | 0.0194 > 0.0646 | | `m3_no_walls_rock_east` (dash in the frame) | 0.118 > 0.110 | 0.0631 > 0.0878 | | `m3_no_walls_pocket_cockpit` (speckle before) | 0.103 > 0.066 | 0.1347 > 0.0800 | ("Before" was computed from the old PNGs with the same formula in a small Python PNG reader, checked against the C++ on one shot.) Looked at: `fix_lamp_probe_a_default` (three iterations), `m1_terrain_tour_tour_start`, `m1_carve_carved_after`, `m3_no_walls_pocket_cockpit`: fractured, bedded blocks inside the beam, dark outside it; the pocket's basalt is dim angular rock, no speckle. New scenario `look_rock` (`Debug\Scenarios_Fix.cpp`): the wall from 5, 10, 15 m asserts `centre_detail` >= 0.03 (measured 0.0445, 0.0567, 0.0602), centre luma 0.497 / 0.426 / 0.335 (deeper and farther stays darker), a corner outside the beam 0.000, lamp off 0.000. The luminance bands of `look_near_wall`, `look_deep_lamp`, `look_deep_dark`, `m1_terrain_tour`, `m1_carve`, `m3_no_walls` still pass. Not judged: tunnel mouths and ore veins inside the beam were not pictured specifically (the tour and carve shots show wall shape and one ore fleck). ## Fix 2: cargo display (done, see the table) `DashCargoDZ` -0.30 > -0.25 (`DescentTune_Tender.h`): the display's lower edge was 0.8 degrees below the bottom of a 72-degree-vertical view. By the numbers it now spans 9 to 29 degrees below the horizon and 25 to 46 degrees to the right (the view is +-36 by +-52), 4 degrees clear of the main dash. Inside the hull: the canopy glass is 0.66-0.70 m from the centreline at that station (measured in the model with a read-only Blender script), the display's outer edge is at 0.53 m. New command `Descent.Tender.GiveOre n [i]` (real hold state). `m3_cockpit` gives 3 ferrite + 2 cobalt, asserts the mounted display's model (5 of 8, order kept), shot `cargo_filled`. TO DO: open `m3_cockpit_cargo_filled.png`, `m3_launch_dock_cockpit.png`; run `m3_cockpit` once with `-ResX 1920 -ResY 1080` and look. ## Fix 3: moon pool (done, see the table) Cause: the pool material's brightness parameter `Nits` stayed at the master's default 300 when the integration pass rescaled the other interior brightness numbers by 0.0017 (the pool instance never set it). Fix in `Tools\ue\assets_35_carrier_materials.py`: `POOL_NITS = 0.51` (300 x 0.0017) on master and instance. p99 luma: `m12_boot_bay_pool` 0.997 > 0.859, `m3_launch_dock_launch_mid` 0.991 > 0.388, `_dock_rise` 0.991 > 0.700. TO DO: open the three shots (the rails and the Tender may be what is bright now; check for a cyan fringe). ## Fix 4: the arm's hand (done, see the table) The Arm Coder's guess (ambient term of `M_DescentSurface`) is wrong: the rooms are blue because their LAMPS are blue, and the arm did take lamp light. Cause: the room lamps cast no shadows and reach through walls. On the bridge the back of the hand faces the wall behind the player, and the warm lamps of the quarters (6 m behind that wall) lit it; the bridge's own lamps are ahead of the hand and hardly reach its back. Fix: lighting channel 2 carries the lamps of the room the player stands in (`UCarrierBlockoutComponent::SetViewerRoom`, called from the carrier's Tick), and in dry air the first-person arm takes channel 2 only (`DescentArmViewmodelComponent.cpp`); the player's flashlight is on channel 2 too. `arm_character`'s channel expectation was updated to match. TO DO: open `arm_character_foot_idle_bridge.png`. ## Fix 5: HUD vehicle panel (done) `WriteHudModel` now clears `M.Vehicle` when the player is not in a Tender (`DescentPlayerController.cpp`). `m3_crush_end.json` after the implosion and respawn: panel `visible false`, the struct's empty defaults; before it kept hull 0 / power 97.8 of the dead Tender while the reprinted one had 100 / 60.2. (The other remark, speed 0 against 0.94 in `m3_carousel_end`, is the model's 10 Hz write rate.) ## Fix 6: HUD-on shots (done, see the table) `M3HudShot` in `Scenarios_M3.cpp` (through the UI track's `RequestUiShot`): `m3_swim_hud_swim.png` (swimming in the shaft, sim paused) and `m3_launch_dock_hud_piloting.png` (same moment as `cockpit`). TO DO: open both. ## Also changed on the way * `Debug\DescentImageStats.*`, `DescentDebugSubsystem.cpp`: the two new sidecar numbers. * `Debug\Scenarios_Fix.cpp` (new): `look_rock`. `Debug\Scenarios_Arm.cpp`: one expectation (channels).