1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-23 07:43:01 +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:
Duncan
2020-10-13 02:25:11 +01:00
committed by GitHub
parent 0c195d14b9
commit 250586cb45
7 changed files with 31 additions and 20 deletions

View File

@@ -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++)

View File

@@ -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;

View File

@@ -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;
if (screenCoords.x >= viewport->pos.x + viewport->width || screenCoords.y >= viewport->pos.y + viewport->height)
return nullptr;
return viewport; 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))
{ {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}; };
/** /**

View File

@@ -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++)
{ {