Files
yaze/docs/internal/plans/dungeon-geometry-sidecar.md

26 lines
1.7 KiB
Markdown

# Dungeon Geometry Sidecar Plan
Status: Draft | Owner: zelda3-hacking-expert | Created: 2025-12-08 | Next Review: 2025-12-15
## Goal
Establish a reusable geometry engine that derives object bounds directly from draw routines so selection/hitboxes/BG2 masks stay in lockstep with rendering.
## Current State
- Sidecar module added: `src/zelda3/dungeon/geometry/object_geometry.{h,cc}`.
- Uses draw routine registry to replay routines against a dummy buffer and reports extents in tiles/pixels.
- Anchor handling for upward diagonals; size=0 → 32 semantics preserved.
- Tests added: `test/unit/zelda3/dungeon/object_geometry_test.cc` (size=0 rightwards/downwards, diagonal acute upward growth).
## Next Steps (Implementation)
1) Expand routine coverage: add metadata/anchors for corner/special routines that move upward/left; add tests for corner routines (e.g., corner BothBG) and Somaria lines (size+1 growth).
2) Add helper API on `ObjectGeometry` to return selection bounds + BG2 mask rectangle from measured extents (tile and pixel).
3) Create parity tests against `ObjectDimensionTable::GetDimensions` for a sample set; document intentional deltas (selection vs render).
4) Add CI guard: lightweight geometry test preset (unit) to catch routine table changes.
5) Integration path (not committed yet):
- Swap `ObjectDrawer::CalculateObjectDimensions` to call geometry sidecar.
- Editor selection (`object_selection`, `dungeon_object_interaction`, `dungeon_canvas_viewer`) to consume geometry API.
- Remove duplicated size tables in `object_dimensions` after parity confirmed.
## References
- Disassembly: `~/Code/usdasm/bank_01.asm` (routine table at $018200).
- Routine metadata source: `draw_routines/*` registry entries.