yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
yaze::zelda3::ObjectGeometry Class Reference

Side-car geometry engine that replays draw routines against an off-screen buffer to calculate real extents. More...

#include <object_geometry.h>

Classes

struct  CacheKey
 
struct  CacheKeyHash
 

Public Member Functions

const DrawRoutineInfoLookupRoutine (int routine_id) const
 
absl::StatusOr< GeometryBoundsMeasureByRoutineId (int routine_id, const RoomObject &object) const
 
absl::StatusOr< GeometryBoundsMeasureByObjectId (const RoomObject &object) const
 
absl::StatusOr< GeometryBoundsMeasureByObjectIdForState (const RoomObject &object, const DungeonState *state) const
 
void ClearCache ()
 
absl::StatusOr< GeometryBoundsMeasureRoutine (const DrawRoutineInfo &routine, const RoomObject &object) const
 
absl::StatusOr< GeometryBoundsMeasureRoutineForState (const DrawRoutineInfo &routine, const RoomObject &object, const DungeonState *state) const
 
std::pair< int, int > ResolveAnchor (int16_t object_id, uint8_t size_byte) const
 Resolve the canvas anchor (x, y) for a given object's draw routine.
 
absl::StatusOr< GeometryBoundsMeasureForLayerCompositing (int routine_id, const RoomObject &object) const
 Measure bounds for a BG2 overlay object and mark it for masking.
 

Static Public Member Functions

static ObjectGeometryGet ()
 
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< DrawRoutineInforoutines_
 
std::unordered_map< int, DrawRoutineInforoutine_map_
 
std::unordered_map< CacheKey, GeometryBounds, CacheKeyHashcache_
 

Detailed Description

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 121 of file object_geometry.h.

Constructor & Destructor Documentation

◆ ObjectGeometry()

yaze::zelda3::ObjectGeometry::ObjectGeometry ( )
private

Definition at line 130 of file object_geometry.cc.

References BuildRegistry().

Here is the call graph for this function:

Member Function Documentation

◆ Get()

◆ LookupRoutine()

const DrawRoutineInfo * yaze::zelda3::ObjectGeometry::LookupRoutine ( int routine_id) const

Definition at line 148 of file object_geometry.cc.

References routine_map_.

Referenced by MeasureByObjectIdForState(), MeasureByRoutineId(), and ResolveAnchor().

◆ MeasureByRoutineId()

absl::StatusOr< GeometryBounds > yaze::zelda3::ObjectGeometry::MeasureByRoutineId ( int routine_id,
const RoomObject & object ) const

Definition at line 156 of file object_geometry.cc.

References ApplySelectionBounds(), LookupRoutine(), and MeasureRoutine().

Referenced by MeasureByObjectId(), and MeasureForLayerCompositing().

Here is the call graph for this function:

◆ MeasureByObjectId()

◆ MeasureByObjectIdForState()

◆ ClearCache()

void yaze::zelda3::ObjectGeometry::ClearCache ( )

Definition at line 311 of file object_geometry.cc.

References cache_.

◆ MeasureRoutine()

absl::StatusOr< GeometryBounds > yaze::zelda3::ObjectGeometry::MeasureRoutine ( const DrawRoutineInfo & routine,
const RoomObject & object ) const

Definition at line 186 of file object_geometry.cc.

References MeasureRoutineForState().

Referenced by MeasureByRoutineId().

Here is the call graph for this function:

◆ MeasureRoutineForState()

◆ ResolveAnchor()

std::pair< int, int > yaze::zelda3::ObjectGeometry::ResolveAnchor ( int16_t object_id,
uint8_t size_byte ) const

Resolve the canvas anchor (x, y) for a given object's draw routine.

Replay-style preview/editor pipelines that call ObjectDrawer::DrawObject with hardcoded coordinates clip routines that draw upward or leftward (acute diagonals 0x09-0x14 / 0x15-0x20, diagonal ceilings 0xA0-0xAC, and moving wall west 0xCD). This returns the same anchor that ObjectGeometry uses internally for MeasureRoutine, so callers can position their RoomObject at coordinates that keep the full extent within the trace canvas.

Returns (0, 0) for unknown routines, or for routines whose draw direction does not require headroom.

Definition at line 170 of file object_geometry.cc.

References yaze::zelda3::DrawRoutineRegistry::Get(), yaze::zelda3::DrawRoutineRegistry::GetRoutineIdForObject(), and LookupRoutine().

Referenced by yaze::editor::TileObjectHandler::CalculateGhostPreviewGeometry(), and yaze::zelda3::ObjectTileEditor::CaptureObjectLayout().

Here is the call graph for this function:

◆ MeasureForLayerCompositing()

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.

Parameters
routine_idDraw routine ID
objectObject with layer information
Returns
GeometryBounds with is_bg2_overlay set appropriately

Definition at line 315 of file object_geometry.cc.

References yaze::zelda3::RoomObject::BG2, yaze::zelda3::GeometryBounds::is_bg2_overlay, and MeasureByRoutineId().

Here is the call graph for this function:

◆ IsLayerOneRoutine()

bool yaze::zelda3::ObjectGeometry::IsLayerOneRoutine ( int routine_id)
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 331 of file object_geometry.cc.

◆ IsDiagonalCeilingRoutine()

bool yaze::zelda3::ObjectGeometry::IsDiagonalCeilingRoutine ( int routine_id)
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 348 of file object_geometry.cc.

Referenced by ApplySelectionBounds().

◆ ApplySelectionBounds()

GeometryBounds yaze::zelda3::ObjectGeometry::ApplySelectionBounds ( GeometryBounds render_bounds,
int routine_id )
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.

Parameters
render_boundsFull render bounds from MeasureRoutine
routine_idThe routine ID to check for diagonal shapes
Returns
GeometryBounds with selection_bounds set if applicable

Definition at line 357 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.

Referenced by MeasureByObjectIdForState(), and MeasureByRoutineId().

Here is the call graph for this function:

◆ BuildRegistry()

void yaze::zelda3::ObjectGeometry::BuildRegistry ( )
private

Definition at line 134 of file object_geometry.cc.

References yaze::zelda3::DrawRoutineRegistry::Get(), routine_map_, and routines_.

Referenced by ObjectGeometry().

Here is the call graph for this function:

Member Data Documentation

◆ routines_

std::vector<DrawRoutineInfo> yaze::zelda3::ObjectGeometry::routines_
private

Definition at line 240 of file object_geometry.h.

Referenced by BuildRegistry().

◆ routine_map_

std::unordered_map<int, DrawRoutineInfo> yaze::zelda3::ObjectGeometry::routine_map_
private

Definition at line 241 of file object_geometry.h.

Referenced by BuildRegistry(), and LookupRoutine().

◆ cache_

std::unordered_map<CacheKey, GeometryBounds, CacheKeyHash> yaze::zelda3::ObjectGeometry::cache_
mutableprivate

Definition at line 242 of file object_geometry.h.

Referenced by ClearCache(), and MeasureByObjectId().


The documentation for this class was generated from the following files: