diff --git a/docs/research/2026-05-19-indoor-cell-rendering-verification.md b/docs/research/2026-05-19-indoor-cell-rendering-verification.md new file mode 100644 index 0000000..0e89080 --- /dev/null +++ b/docs/research/2026-05-19-indoor-cell-rendering-verification.md @@ -0,0 +1,62 @@ +# Indoor Cell Rendering — Phase 2 Verification + +**Date:** 2026-05-19 +**Outcome:** ✅ Floor renders in Holtburg Inn. User visually confirmed. +**Predecessor:** [Phase 2 cause report](2026-05-19-indoor-cell-rendering-cause.md). + +--- + +## Probe re-capture + +After applying the one-line WB fix at [`ObjectMeshManager.cs:1230`](../../references/WorldBuilder/Chorizite.OpenGLSDLBackend/Lib/ObjectMeshManager.cs:1230): + +| Metric | Pre-fix | Post-fix | +|---|---|---| +| `[wb-error]` lines | 385 | **0** | +| `[indoor-upload] NULL_RESULT` | 55 | **0** | +| `[indoor-upload] FAILED` | 0 | 0 | +| Total `[indoor-upload] requested` | — | 1157 | +| Total `[indoor-upload] completed` | — | **1157** | +| Holtburg (`0xA9B4`) requested | 123 | 123 | +| Holtburg (`0xA9B4`) completed | 97 | **123** | +| Holtburg (`0xA9B4`) missing | 26 | **0** | + +100% success rate on EnvCell uploads. Zero swallowed exceptions. Zero null returns. + +## Visual confirmation + +User walked into Holtburg Inn (and other nearby buildings whose cells were previously failing) and confirmed: + +> "Yes floors are rendering now inside houses." + +The previously-failing cells (`0xA9B40100`, `0xA9B40111`, `0xA9B40112`, `0xA9B40117`, `0xA9B4011B`, etc.) now upload successfully, the dispatcher finds their render data, and the floor / wall / ceiling geometry renders. + +## Regressions checked + +- Outdoor terrain still renders correctly. ✓ +- Outdoor scenery (trees, rocks, stabs) still render. ✓ +- NPCs, mobs, world entities still render. ✓ +- Build clean, no new warnings. ✓ +- No new test failures. ✓ + +## Other observations during the walk + +The user reported **other indoor-related bugs** that are now observable because the floor is rendering. These are all **pre-existing** (not caused by this Phase 2 fix) but were hidden by the missing-floor bug. They are filed as separate issues for follow-up phases: + +1. See-through floor — other buildings visible "below" / "through" the rendered floor (depth/stab-culling). +2. Spot lights on walls indoors (point-light positioning). +3. Camera on 2nd floor goes very dark (per-cell ambient or trigger). +4. Static building stabs don't react to atmospheric lighting changes (shader path). +5. Some slope terrain lit incorrectly (terrain normal calculation). +6. Collision "blocked by air" indoors (cell BSP misalignment). +7. Walking up stairs broken (stair-step physics on EnvCell geometry). +8. Pass through walls from outside→in (one-sided wall collision). +9. Click selection penetrates walls (WorldPicker raycast not testing cell BSP). + +These nine items are tracked in `docs/ISSUES.md` with proposed phase groupings. None block Phase 2 closure. + +## Conclusion + +**Phase 2 of the indoor cell rendering fix is complete.** The single-root-cause exception was identified via the diagnostic chain shipped in Phase 1 + Phase 2, and resolved with a one-line guard at the WB call site that prevented blind `TryGet` deserialization of GfxObj-typed stab ids. + +Total runtime for Phase 2: ~4 client launches.