From d95f14dcdadf262bb3f8a4482bd286a940761e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sun, 18 Feb 2024 15:04:46 +0200 Subject: [PATCH] Fix ViewportPosToMapPos using the wrong rotation --- src/openrct2-ui/input/MouseInput.cpp | 4 ++-- src/openrct2-ui/interface/ViewportInteraction.cpp | 2 +- src/openrct2-ui/scripting/ScViewport.hpp | 2 +- src/openrct2/interface/Viewport.cpp | 10 +++++----- src/openrct2/interface/Viewport.h | 2 +- src/openrct2/interface/Window.cpp | 2 +- src/openrct2/world/Footpath.cpp | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index 80aaa68cbf..2f9eb1915a 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1688,8 +1688,8 @@ void InputScrollViewport(const ScreenCoordsXY& scrollScreenCoords) int32_t y = mainWindow->savedViewPos.y + viewport->view_height / 2; int32_t y_dy = mainWindow->savedViewPos.y + viewport->view_height / 2 + dy; - auto mapCoord = ViewportPosToMapPos({ x, y }, 0); - auto mapCoord_dy = ViewportPosToMapPos({ x, y_dy }, 0); + auto mapCoord = ViewportPosToMapPos({ x, y }, 0, viewport->rotation); + auto mapCoord_dy = ViewportPosToMapPos({ x, y_dy }, 0, viewport->rotation); // Check if we're crossing the boundary // Clamp to the map minimum value diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 276b2c9830..b73668644b 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -805,7 +805,7 @@ CoordsXY ViewportInteractionGetTileStartAtCursor(const ScreenCoordsXY& screenCoo { z = TileElementHeight(mapPos); } - mapPos = ViewportPosToMapPos(initialVPPos, z); + mapPos = ViewportPosToMapPos(initialVPPos, z, viewport->rotation); mapPos.x = std::clamp(mapPos.x, initialPos.x, initialPos.x + 31); mapPos.y = std::clamp(mapPos.y, initialPos.y, initialPos.y + 31); } diff --git a/src/openrct2-ui/scripting/ScViewport.hpp b/src/openrct2-ui/scripting/ScViewport.hpp index a7e2145598..0ef551313a 100644 --- a/src/openrct2-ui/scripting/ScViewport.hpp +++ b/src/openrct2-ui/scripting/ScViewport.hpp @@ -184,7 +184,7 @@ namespace OpenRCT2::Scripting if (viewport != nullptr) { auto centre = viewport->viewPos + ScreenCoordsXY{ viewport->view_width / 2, viewport->view_height / 2 }; - auto coords = ViewportPosToMapPos(centre, 24); + auto coords = ViewportPosToMapPos(centre, 24, viewport->rotation); auto ctx = GetContext()->GetScriptEngine().GetContext(); auto obj = duk_push_object(ctx); diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index bfaac7f70d..d211443826 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -261,7 +261,7 @@ CoordsXYZ ViewportAdjustForMapHeight(const ScreenCoordsXY& startCoords, uint8_t CoordsXY pos{}; for (int32_t i = 0; i < 6; i++) { - pos = ViewportPosToMapPos(startCoords, height); + pos = ViewportPosToMapPos(startCoords, height, rotation); height = TileElementHeight(pos); // HACK: This is to prevent the x and y values being set to values outside @@ -596,7 +596,7 @@ void ViewportUpdatePosition(WindowBase* window) auto viewportMidPoint = ScreenCoordsXY{ window->savedViewPos.x + viewport->view_width / 2, window->savedViewPos.y + viewport->view_height / 2 }; - auto mapCoord = ViewportPosToMapPos(viewportMidPoint, 0); + auto mapCoord = ViewportPosToMapPos(viewportMidPoint, 0, viewport->rotation); // Clamp to the map minimum value int32_t at_map_edge = 0; @@ -1100,11 +1100,11 @@ void Viewport::Invalidate() const ViewportInvalidate(this, { viewPos, viewPos + ScreenCoordsXY{ view_width, view_height } }); } -CoordsXY ViewportPosToMapPos(const ScreenCoordsXY& coords, int32_t z) +CoordsXY ViewportPosToMapPos(const ScreenCoordsXY& coords, int32_t z, uint8_t rotation) { // Reverse of Translate3DTo2DWithZ CoordsXY ret = { coords.y - coords.x / 2 + z, coords.y + coords.x / 2 + z }; - auto inverseRotation = DirectionFlipXAxis(GetCurrentRotation()); + auto inverseRotation = DirectionFlipXAxis(rotation); return ret.Rotate(inverseRotation); } @@ -1953,7 +1953,7 @@ std::optional ScreenGetMapXY(const ScreenCoordsXY& screenCoords, Viewp for (int32_t i = 0; i < 5; i++) { int32_t z = TileElementHeight(cursorMapPos); - cursorMapPos = ViewportPosToMapPos(start_vp_pos, z); + cursorMapPos = ViewportPosToMapPos(start_vp_pos, z, myViewport->rotation); cursorMapPos.x = std::clamp(cursorMapPos.x, info.Loc.x, info.Loc.x + 31); cursorMapPos.y = std::clamp(cursorMapPos.y, info.Loc.y, info.Loc.y + 31); } diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index 76ce230286..3d52d87265 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -139,7 +139,7 @@ void ViewportRender(DrawPixelInfo& dpi, const Viewport* viewport, const ScreenRe CoordsXYZ ViewportAdjustForMapHeight(const ScreenCoordsXY& startCoords, uint8_t rotation); -CoordsXY ViewportPosToMapPos(const ScreenCoordsXY& coords, int32_t z); +CoordsXY ViewportPosToMapPos(const ScreenCoordsXY& coords, int32_t z, uint8_t rotation); std::optional ScreenPosToMapPos(const ScreenCoordsXY& screenCoords, int32_t* direction); void ShowGridlines(); diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 4067a38ed6..afe5165230 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -958,7 +958,7 @@ void WindowViewportGetMapCoordsByCursor( // Compute map coordinate by mouse position. auto viewportPos = w.viewport->ScreenToViewportCoord(mouseCoords); auto coordsXYZ = ViewportAdjustForMapHeight(viewportPos, w.viewport->rotation); - auto mapCoords = ViewportPosToMapPos(viewportPos, coordsXYZ.z); + auto mapCoords = ViewportPosToMapPos(viewportPos, coordsXYZ.z, w.viewport->rotation); *map_x = mapCoords.x; *map_y = mapCoords.y; diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index 9902003726..c54adceb7f 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -289,7 +289,7 @@ CoordsXY FootpathGetCoordinatesFromPos(const ScreenCoordsXY& screenCoords, int32 { z = TileElementHeight(position); } - position = ViewportPosToMapPos(start_vp_pos, z); + position = ViewportPosToMapPos(start_vp_pos, z, viewport->rotation); position.x = std::clamp(position.x, minPosition.x, maxPosition.x); position.y = std::clamp(position.y, minPosition.y, maxPosition.y); }