1.7 KiB
1.7 KiB
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)
- 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).
- Add helper API on
ObjectGeometryto return selection bounds + BG2 mask rectangle from measured extents (tile and pixel). - Create parity tests against
ObjectDimensionTable::GetDimensionsfor a sample set; document intentional deltas (selection vs render). - Add CI guard: lightweight geometry test preset (unit) to catch routine table changes.
- Integration path (not committed yet):
- Swap
ObjectDrawer::CalculateObjectDimensionsto call geometry sidecar. - Editor selection (
object_selection,dungeon_object_interaction,dungeon_canvas_viewer) to consume geometry API. - Remove duplicated size tables in
object_dimensionsafter parity confirmed.
- Swap
References
- Disassembly:
~/Code/usdasm/bank_01.asm(routine table at $018200). - Routine metadata source:
draw_routines/*registry entries.