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:
parent
1f11ba9b38
commit
f0900ebe12
4 changed files with 373 additions and 17 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue