docs(phase): Cluster A — partial ship + handoff

Cluster A's investigation pinned #86 (picker) as structural and closed
it (Phase B). #84 and #85 both pinned on missing indoor cell tracking;
Phase D promoted CellId via AABB containment which un-stuck the
spawn-in-building case (closes #84 partially) but proved too tight for
threshold/doorway cells to keep CellId indoor during normal walking.
The proper fix is retail's portal-based cell traversal; filed as a
new ISSUES.md issue (see body) for the follow-up phase. Phase E
diagnostic infrastructure ([cell-cache] + extended [indoor-bsp]) stays
in place as scaffolding for that work.

ISSUES.md: #86 → Recently closed. #84 status updated to PARTIAL with
resolution paragraph. #85 status update note added. New issue #87 filed
for portal-based indoor cell tracking.

Roadmap: Cluster A added to Recently shipped with partial-ship note.
Forward entry added for the portal-traversal follow-up under Phase G.

CLAUDE.md: current-phase paragraph updated to reflect Cluster A partial
ship. Next phase deferred to Claude's choice in a future session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-05-19 16:12:24 +02:00
parent 1f11ba9b38
commit f0900ebe12
4 changed files with 373 additions and 17 deletions

View file

@ -239,7 +239,7 @@ to the second floor without getting stuck.
## #84 — Blocked by air indoors
**Status:** OPEN
**Status:** OPEN (partial fix 2026-05-19)
**Severity:** HIGH (blocks indoor navigation)
**Filed:** 2026-05-19
**Component:** physics, collision
@ -266,6 +266,20 @@ visible cell mesh. Possibilities:
**Acceptance:** Walking through interior cell space hits collisions
only where visible walls/furniture exist.
**Resolution (2026-05-19 partial · `c19d6fb`):** Phase D of Cluster A
extended `ResolveOutdoorCellId` in `PhysicsEngine.cs` with an indoor
cell-containment scan: when the player's world position falls inside any
cached EnvCell's AABB, `CellId` is promoted to that indoor cell, which
enables the `FindEnvCollisions` indoor-BSP branch. This resolved the
"spawn in building and be stuck above the floor" variant of #84
player's CellId now promotes to the interior cell on spawn-in, the floor
is walkable, and the player can move freely. The "invisible air obstacle"
symptom for rooms the player walks INTO from outside is now superseded by
the root cause in #87 (AABB containment is too tight for threshold/
doorway cells to keep CellId promoted during normal walking). That
remaining symptom will be resolved by the portal-based cell tracking
fix.
---
## #85 — Pass through walls from outside→in
@ -293,30 +307,65 @@ collision polys or per-poly back-face handling.
**Acceptance:** Walking into an inn wall from outside collides; player
must enter via the door portal.
**Status update (2026-05-19):** The root cause is now pinned as the
same failure as #84's remaining symptom — `CellId` isn't promoted to
the indoor cell during normal outdoor→indoor walking because AABB
containment is too tight for threshold/doorway cells. Without CellId
in the indoor cell, the indoor-BSP collision branch in
`FindEnvCollisions` never fires regardless of approach direction.
See new issue #87 (portal-based indoor cell tracking) for the
retail-faithful fix.
---
## #86 — Click selection penetrates walls
## #87 — Indoor cell tracking uses AABB containment instead of portal traversal
**Status:** OPEN
**Severity:** MEDIUM
**Severity:** HIGH
**Filed:** 2026-05-19
**Component:** input, interaction
**Component:** physics
**Description:** Clicking through a wall from the outside selects NPCs
and objects inside the building. The `WorldPicker` raycast doesn't
intersect cell BSP geometry.
**Description:** `PhysicsDataCache.TryFindContainingCell` promotes the
player's `CellId` to an indoor EnvCell when their world position falls
inside any cached cell's local AABB. This is too tight to keep `CellId`
promoted to an indoor cell during normal walking. Threshold/doorway cells
(the polys that sit at a room boundary) have AABB Z ranges of only ~0.2 m;
a standing player at local Z=0.46 m is OUTSIDE the AABB and containment
fails. Because `CellId` drifts back to the outdoor cell, the indoor-BSP
collision branch in `TransitionTypes.FindEnvCollisions` is gated out for
most movement, so walls don't block from inside the house and the floor
physics is unreliable. The retail fix is portal-based cell traversal —
when the player crosses a cell portal boundary, the cell ownership
propagates through portal connectivity data in `CEnvCell`.
**Root cause / status:** `WorldPicker.BuildRay + Pick` (introduced in
Phase B.4) tests against entity AABBs and scenery BSPs but probably
not cell BSP. Outdoor NPCs are pickable because their entity AABB is
the test target; indoor NPCs are pickable from outside because the
wall isn't in the ray's intersection set.
**Evidence:** `launch-cluster-a-cache-diag3.log` (Cluster A Phase E
capture). Cell `0xA9B40143` (real room) has
`physicsPolyCount=14 bspTotalLeafPolys=14 bspUnmatchedIds=0
aabbMin=(-11.60,-1.60,0.00) aabbMax=(-6.20,7.60,2.80)` — geometry is
complete and the AABB spans 2.8 m height, which works. Cell `0xA9B40146`
(threshold/doorway) has `physicsPolyCount=4
aabbMin=(-11.60,2.80,-0.20) aabbMax=(-10.00,7.60,0.00)` — Z range is
only 0.2 m; a standing player is always outside it. Only 6 `[indoor-bsp]`
lines fired across an entire indoor walking session (all during mid-jump
frames when the player was briefly inside the room AABB at jump height).
**Files:**
- `src/AcDream.App/Rendering/WorldPicker.cs` (or equivalent — check
Phase B.4b reference).
- `src/AcDream.Core/Physics/PhysicsDataCache.cs` (`TryFindContainingCell`,
approximately line 261)
- `src/AcDream.Core/Physics/PhysicsEngine.cs` (`ResolveOutdoorCellId`,
approximately line 238)
- `src/AcDream.Core/Physics/TransitionTypes.cs` (`FindEnvCollisions` cell
branch, approximately line 1188)
**Acceptance:** Clicking on a wall doesn't select NPCs behind it.
**Retail reference:** PDB symbols `CObjMaint::HandleObjectEnterCell` and
`CEnvCell` portal data. See `docs/research/named-retail/acclient.h` lines
31715-31726 for `CCellStructure` shape; `acclient_2013_pseudo_c.txt` for
the implementations.
**Acceptance:** Player walking from outside the Holtburg cottage into the
interior crosses portals and `CellId` updates accordingly; walls block
from both inside and outside; the `[indoor-bsp]` probe fires consistently
during indoor walking (not just during mid-jump frames).
---
@ -2847,6 +2896,23 @@ Unverified. The likely culprits, ranked by suspected probability:
# Recently closed
## #86 — [DONE 2026-05-19 · 3764867 + 4e308d5] Click selection penetrates walls
**Closed:** 2026-05-19
**Commits:** `3764867` — fix(picker): Cluster A #86 — cell-BSP ray occlusion in WorldPicker; `4e308d5` — test(picker): Cluster A #86 — screen-rect cell-occlusion tests
**Component:** input, interaction
**Resolution:** `WorldPicker.Pick` now accepts a `cellOccluder` callback
(`CellBspRayOccluder`). Before returning a hit, both `Pick` overloads
consult the occluder's `NearestWallT` value; any candidate entity whose
ray parameter exceeds the nearest-wall intersection is filtered out.
The occluder is wired from `GameWindow` using the loaded `PhysicsDataCache`
cell structs. Entities behind walls from the camera's perspective are no
longer selectable. Screen-rect occlusion tests verify the filter across
several hit/miss scenarios.
---
## #77 — [DONE 2026-05-18 · 3be7000] Auto-walk doesn't engage at walking range; pickup at walking range overshoots and snaps back
**Closed:** 2026-05-18