diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 080e2f3..b81f0bf 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -113,3 +113,40 @@ resolves to the one model it names. **So two of the three candidates are gone** (this one and `include_external`), leaving **mirror handling** and **the exhaust cones** — and the still-untried visual comparison, which remains the right next step. + +--- + +## Viewer: mirror handling and the exhaust cones are cleared too — the static avenue is exhausted + +**Checked 2026-08-11.** Both remaining candidates were tested across every ship +on the disc, and neither shows the reported signature. + +**Mirror handling.** The concern was that `ScenePart::apply` bakes `R·(S·v)+T` +while the viewer takes its winding-flip decision from `det(m)` alone and rotates +normals by `m` alone — both ignoring `s`. A mirror encoded as a *negative scale* +would then reflect geometry without flipping winding, drawing the part +inside-out. It never happens: across **1 485 assembled parts** in all 22 +containers there are **22 mirrored parts, every one with `det(m) < 0`**, and +**zero** parts with a negative scale or a non-uniform one. `apply_twin_mirrors` +writes the reflection into `m` (negating its X column), so the viewer's flip +always fires, and ignoring `s` for normals is harmless because `s` is always +uniform. + +**Exhaust cones.** These are the one piece of geometry the viewer *invents* — a +cone at each `GN_Jet`/`GN_SJet` frame, because the real engine geometry is +recessed and the game draws FX there instead. If they landed wrongly they would +read exactly as "a part in the wrong place". Across **335 assembled ships, 192 of +which have exhaust frames, not one cone sits outside its hull's bounding box** +(tolerance 10 % of the axis span). + +**Caveat, stated rather than glossed:** "inside the hull box" does not prove a +cone is *right* — orientation and size are untested, and a cone could be wrong +while still inside. What it does rule out is the reported symptom for that part. + +So every mechanism this diagnosis proposed is now eliminated: `include_external`, +duplicate resource names, mirror handling, and cones-in-the-wrong-place. The +format and assembly layers pass every static test available, and **the visual +comparison is no longer merely the next step — it is the only remaining one.** +Render `e106` in the viewer beside `ship_render`'s output of the same +`assemble_ship` result; if they agree, the bug is in neither and the original +report needs re-grounding against a specific ship and a specific expectation.