Side-car geometry engine that replays draw routines against an off-screen buffer to calculate real extents. More...
#include <object_geometry.h>
Public Member Functions | |
| const DrawRoutineInfo * | LookupRoutine (int routine_id) const |
| absl::StatusOr< GeometryBounds > | MeasureByRoutineId (int routine_id, const RoomObject &object) const |
| absl::StatusOr< GeometryBounds > | MeasureRoutine (const DrawRoutineInfo &routine, const RoomObject &object) const |
| absl::StatusOr< GeometryBounds > | MeasureForLayerCompositing (int routine_id, const RoomObject &object) const |
| Measure bounds for a BG2 overlay object and mark it for masking. | |
Static Public Member Functions | |
| static ObjectGeometry & | Get () |
| static bool | IsLayerOneRoutine (int routine_id) |
| Get list of routine IDs that draw to BG2 layer. | |
| static bool | IsDiagonalCeilingRoutine (int routine_id) |
| Check if a routine ID corresponds to a diagonal ceiling. | |
| static GeometryBounds | ApplySelectionBounds (GeometryBounds render_bounds, int routine_id) |
| Compute tighter selection bounds for diagonal shapes. | |
Private Member Functions | |
| ObjectGeometry () | |
| void | BuildRegistry () |
Private Attributes | |
| std::vector< DrawRoutineInfo > | routines_ |
| std::unordered_map< int, DrawRoutineInfo > | routine_map_ |
Side-car geometry engine that replays draw routines against an off-screen buffer to calculate real extents.
This is intentionally self-contained (no ROM or editor coupling) so it can be tested in isolation and later dropped into ObjectDrawer/editor hit-testing paths.
Definition at line 116 of file object_geometry.h.
|
private |
Definition at line 56 of file object_geometry.cc.
References BuildRegistry().

|
static |
Definition at line 51 of file object_geometry.cc.
| const DrawRoutineInfo * yaze::zelda3::ObjectGeometry::LookupRoutine | ( | int | routine_id | ) | const |
Definition at line 72 of file object_geometry.cc.
References routine_map_.
Referenced by MeasureByRoutineId().
| absl::StatusOr< GeometryBounds > yaze::zelda3::ObjectGeometry::MeasureByRoutineId | ( | int | routine_id, |
| const RoomObject & | object ) const |
Definition at line 80 of file object_geometry.cc.
References LookupRoutine(), and MeasureRoutine().
Referenced by MeasureForLayerCompositing().

| absl::StatusOr< GeometryBounds > yaze::zelda3::ObjectGeometry::MeasureRoutine | ( | const DrawRoutineInfo & | routine, |
| const RoomObject & | object ) const |
Definition at line 90 of file object_geometry.cc.
References yaze::zelda3::DrawRoutineInfo::function, yaze::gfx::BackgroundBuffer::GetTileAt(), yaze::zelda3::GeometryBounds::height_tiles, yaze::zelda3::GeometryBounds::is_bg2_overlay, yaze::zelda3::DrawContext::kMaxTilesX, yaze::zelda3::DrawContext::kMaxTilesY, yaze::zelda3::GeometryBounds::min_x_tiles, yaze::zelda3::GeometryBounds::min_y_tiles, yaze::zelda3::DrawContext::target_bg, yaze::zelda3::RoomObject::tiles(), yaze::zelda3::GeometryBounds::width_tiles, yaze::zelda3::RoomObject::x_, and yaze::zelda3::RoomObject::y_.
Referenced by MeasureByRoutineId().

| absl::StatusOr< GeometryBounds > yaze::zelda3::ObjectGeometry::MeasureForLayerCompositing | ( | int | routine_id, |
| const RoomObject & | object ) const |
Measure bounds for a BG2 overlay object and mark it for masking.
This is a convenience method that measures the object and sets the is_bg2_overlay flag if the object's layer indicates it draws to BG2. Used by the dungeon editor to determine BG1 mask regions.
| routine_id | Draw routine ID |
| object | Object with layer information |
Definition at line 151 of file object_geometry.cc.
References yaze::zelda3::RoomObject::BG2, yaze::zelda3::GeometryBounds::is_bg2_overlay, and MeasureByRoutineId().

|
static |
Get list of routine IDs that draw to BG2 layer.
These routines write to the lower tilemap (BG2) and require corresponding BG1 transparency for proper compositing.
Definition at line 167 of file object_geometry.cc.
|
static |
Check if a routine ID corresponds to a diagonal ceiling.
Diagonal ceilings (routines 75-78 for objects 0xA0-0xA3) have triangular fill patterns that require tighter selection bounds than their bounding box.
Definition at line 183 of file object_geometry.cc.
Referenced by ApplySelectionBounds().
|
static |
Compute tighter selection bounds for diagonal shapes.
For triangular diagonal ceilings, this computes a selection rectangle that's roughly 70% of the bounding box, centered on the visual content.
| render_bounds | Full render bounds from MeasureRoutine |
| routine_id | The routine ID to check for diagonal shapes |
Definition at line 192 of file object_geometry.cc.
References yaze::zelda3::SelectionRect::height_tiles, yaze::zelda3::GeometryBounds::height_tiles, IsDiagonalCeilingRoutine(), yaze::zelda3::GeometryBounds::min_x_tiles, yaze::zelda3::GeometryBounds::min_y_tiles, yaze::zelda3::GeometryBounds::selection_bounds, yaze::zelda3::SelectionRect::width_tiles, yaze::zelda3::GeometryBounds::width_tiles, yaze::zelda3::SelectionRect::x_tiles, and yaze::zelda3::SelectionRect::y_tiles.

|
private |
Definition at line 58 of file object_geometry.cc.
References yaze::zelda3::DrawRoutineRegistry::Get(), routine_map_, and routines_.
Referenced by ObjectGeometry().

|
private |
Definition at line 178 of file object_geometry.h.
Referenced by BuildRegistry().
|
private |
Definition at line 179 of file object_geometry.h.
Referenced by BuildRegistry(), and LookupRoutine().