mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-22 23:33:04 +01:00
Port some OpenLoco helper functions (#13113)
* Port some OpenLoco helper functions Added a few helper functions from OpenLoco to make viewport code a bit simpler
This commit is contained in:
@@ -693,8 +693,7 @@ static Peep* viewport_interaction_get_closest_peep(ScreenCoordsXY screenCoords,
|
|||||||
if (viewport == nullptr || viewport->zoom >= 2)
|
if (viewport == nullptr || viewport->zoom >= 2)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
screenCoords.x = ((screenCoords.x - viewport->pos.x) * viewport->zoom) + viewport->viewPos.x;
|
auto viewportCoords = viewport->ScreenToViewportCoord(screenCoords);
|
||||||
screenCoords.y = ((screenCoords.y - viewport->pos.y) * viewport->zoom) + viewport->viewPos.y;
|
|
||||||
|
|
||||||
Peep* closestPeep = nullptr;
|
Peep* closestPeep = nullptr;
|
||||||
auto closestDistance = std::numeric_limits<int32_t>::max();
|
auto closestDistance = std::numeric_limits<int32_t>::max();
|
||||||
@@ -703,8 +702,8 @@ static Peep* viewport_interaction_get_closest_peep(ScreenCoordsXY screenCoords,
|
|||||||
if (peep->sprite_left == LOCATION_NULL)
|
if (peep->sprite_left == LOCATION_NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto distance = abs(((peep->sprite_left + peep->sprite_right) / 2) - screenCoords.x)
|
auto distance = abs(((peep->sprite_left + peep->sprite_right) / 2) - viewportCoords.x)
|
||||||
+ abs(((peep->sprite_top + peep->sprite_bottom) / 2) - screenCoords.y);
|
+ abs(((peep->sprite_top + peep->sprite_bottom) / 2) - viewportCoords.y);
|
||||||
if (distance > maxDistance)
|
if (distance > maxDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -748,7 +747,7 @@ CoordsXY sub_68A15E(const ScreenCoordsXY& screenCoords)
|
|||||||
waterHeight = info.Element->AsSurface()->GetWaterHeight();
|
waterHeight = info.Element->AsSurface()->GetWaterHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto initialVPPos = screen_coord_to_viewport_coord(viewport, screenCoords);
|
auto initialVPPos = viewport->ScreenToViewportCoord(screenCoords);
|
||||||
CoordsXY mapPos = initialPos + CoordsXY{ 16, 16 };
|
CoordsXY mapPos = initialPos + CoordsXY{ 16, 16 };
|
||||||
|
|
||||||
for (int32_t i = 0; i < 5; i++)
|
for (int32_t i = 0; i < 5; i++)
|
||||||
|
|||||||
@@ -223,12 +223,11 @@ namespace OpenRCT2::Audio
|
|||||||
if (viewport->flags & VIEWPORT_FLAG_SOUND_ON)
|
if (viewport->flags & VIEWPORT_FLAG_SOUND_ON)
|
||||||
{
|
{
|
||||||
int16_t vx = pos2.x - viewport->viewPos.x;
|
int16_t vx = pos2.x - viewport->viewPos.x;
|
||||||
int16_t vy = pos2.y - viewport->viewPos.y;
|
|
||||||
params.pan = viewport->pos.x + (vx / viewport->zoom);
|
params.pan = viewport->pos.x + (vx / viewport->zoom);
|
||||||
params.volume = SoundVolumeAdjust[static_cast<uint8_t>(soundId)]
|
params.volume = SoundVolumeAdjust[static_cast<uint8_t>(soundId)]
|
||||||
+ ((-1024 * viewport->zoom - 1) * (1 << volumeDown)) + 1;
|
+ ((-1024 * viewport->zoom - 1) * (1 << volumeDown)) + 1;
|
||||||
|
|
||||||
if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || params.volume < -10000)
|
if (!viewport->Contains(pos2) || params.volume < -10000)
|
||||||
{
|
{
|
||||||
params.in_range = false;
|
params.in_range = false;
|
||||||
return params;
|
return params;
|
||||||
|
|||||||
@@ -1079,11 +1079,11 @@ std::optional<CoordsXY> screen_pos_to_map_pos(const ScreenCoordsXY& screenCoords
|
|||||||
return { mapCoords->ToTileStart() };
|
return { mapCoords->ToTileStart() };
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenCoordsXY screen_coord_to_viewport_coord(rct_viewport* viewport, const ScreenCoordsXY& screenCoords)
|
[[nodiscard]] ScreenCoordsXY rct_viewport::ScreenToViewportCoord(const ScreenCoordsXY& screenCoords) const
|
||||||
{
|
{
|
||||||
ScreenCoordsXY ret;
|
ScreenCoordsXY ret;
|
||||||
ret.x = ((screenCoords.x - viewport->pos.x) * viewport->zoom) + viewport->viewPos.x;
|
ret.x = ((screenCoords.x - pos.x) * zoom) + viewPos.x;
|
||||||
ret.y = ((screenCoords.y - viewport->pos.y) * viewport->zoom) + viewport->viewPos.y;
|
ret.y = ((screenCoords.y - pos.y) * zoom) + viewPos.y;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1746,12 +1746,10 @@ static rct_viewport* viewport_find_from_point(const ScreenCoordsXY& screenCoords
|
|||||||
if (viewport == nullptr)
|
if (viewport == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
if (screenCoords.x < viewport->pos.x || screenCoords.y < viewport->pos.y)
|
if (viewport->ContainsScreen(screenCoords))
|
||||||
return nullptr;
|
return viewport;
|
||||||
if (screenCoords.x >= viewport->pos.x + viewport->width || screenCoords.y >= viewport->pos.y + viewport->height)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return viewport;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1781,7 +1779,7 @@ std::optional<CoordsXY> screen_get_map_xy(const ScreenCoordsXY& screenCoords, rc
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start_vp_pos = screen_coord_to_viewport_coord(myViewport, screenCoords);
|
auto start_vp_pos = myViewport->ScreenToViewportCoord(screenCoords);
|
||||||
CoordsXY cursorMapPos = info.Loc.ToTileCentre();
|
CoordsXY cursorMapPos = info.Loc.ToTileCentre();
|
||||||
|
|
||||||
// Iterates the cursor location to work out exactly where on the tile it is
|
// Iterates the cursor location to work out exactly where on the tile it is
|
||||||
@@ -1811,7 +1809,7 @@ std::optional<CoordsXY> screen_get_map_xy_with_z(const ScreenCoordsXY& screenCoo
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto vpCoords = screen_coord_to_viewport_coord(viewport, screenCoords);
|
auto vpCoords = viewport->ScreenToViewportCoord(screenCoords);
|
||||||
auto mapPosition = viewport_coord_to_map_coord(vpCoords, z);
|
auto mapPosition = viewport_coord_to_map_coord(vpCoords, z);
|
||||||
if (!map_is_location_valid(mapPosition))
|
if (!map_is_location_valid(mapPosition))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -136,7 +136,6 @@ void viewport_paint(
|
|||||||
|
|
||||||
CoordsXYZ viewport_adjust_for_map_height(const ScreenCoordsXY& startCoords);
|
CoordsXYZ viewport_adjust_for_map_height(const ScreenCoordsXY& startCoords);
|
||||||
|
|
||||||
ScreenCoordsXY screen_coord_to_viewport_coord(rct_viewport* viewport, const ScreenCoordsXY& screenCoords);
|
|
||||||
CoordsXY viewport_coord_to_map_coord(const ScreenCoordsXY& coords, int32_t z);
|
CoordsXY viewport_coord_to_map_coord(const ScreenCoordsXY& coords, int32_t z);
|
||||||
std::optional<CoordsXY> screen_pos_to_map_pos(const ScreenCoordsXY& screenCoords, int32_t* direction);
|
std::optional<CoordsXY> screen_pos_to_map_pos(const ScreenCoordsXY& screenCoords, int32_t* direction);
|
||||||
|
|
||||||
|
|||||||
@@ -948,7 +948,7 @@ void window_viewport_get_map_coords_by_cursor(
|
|||||||
auto mouseCoords = context_get_cursor_position_scaled();
|
auto mouseCoords = context_get_cursor_position_scaled();
|
||||||
|
|
||||||
// Compute map coordinate by mouse position.
|
// Compute map coordinate by mouse position.
|
||||||
auto viewportPos = screen_coord_to_viewport_coord(w->viewport, mouseCoords);
|
auto viewportPos = w->viewport->ScreenToViewportCoord(mouseCoords);
|
||||||
auto coordsXYZ = viewport_adjust_for_map_height(viewportPos);
|
auto coordsXYZ = viewport_adjust_for_map_height(viewportPos);
|
||||||
auto mapCoords = viewport_coord_to_map_coord(viewportPos, coordsXYZ.z);
|
auto mapCoords = viewport_coord_to_map_coord(viewportPos, coordsXYZ.z);
|
||||||
*map_x = mapCoords.x;
|
*map_x = mapCoords.x;
|
||||||
|
|||||||
@@ -147,6 +147,22 @@ struct rct_viewport
|
|||||||
ZoomLevel zoom;
|
ZoomLevel zoom;
|
||||||
uint8_t var_11;
|
uint8_t var_11;
|
||||||
VisibilityCache visibility;
|
VisibilityCache visibility;
|
||||||
|
|
||||||
|
// Use this function on coordinates that are relative to the viewport zoom i.e. a peeps x, y position after transforming
|
||||||
|
// from its x, y, z
|
||||||
|
[[nodiscard]] constexpr bool Contains(const ScreenCoordsXY& vpos) const
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
vpos.y >= viewPos.y && vpos.y < viewPos.y + view_height && vpos.x >= viewPos.x && vpos.x < viewPos.x + view_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use this function on coordinates that are relative to the screen that is been drawn i.e. the cursor position
|
||||||
|
[[nodiscard]] constexpr bool ContainsScreen(const ScreenCoordsXY& sPos) const
|
||||||
|
{
|
||||||
|
return (sPos.x >= pos.x && sPos.x < pos.x + width && sPos.y >= pos.y && sPos.y < pos.y + height);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] ScreenCoordsXY ScreenToViewportCoord(const ScreenCoordsXY& screenCoord) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ CoordsXY footpath_get_coordinates_from_pos(const ScreenCoordsXY& screenCoords, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start_vp_pos = screen_coord_to_viewport_coord(viewport, screenCoords);
|
auto start_vp_pos = viewport->ScreenToViewportCoord(screenCoords);
|
||||||
|
|
||||||
for (int32_t i = 0; i < 5; i++)
|
for (int32_t i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user