From 8cc53324b670be66b9662e4f7f366563de706bb5 Mon Sep 17 00:00:00 2001 From: Michael Bernardi Date: Fri, 20 Sep 2024 02:03:35 +1000 Subject: [PATCH] Remove view width and height from Viewport struct --- src/openrct2-ui/WindowManager.cpp | 10 ++----- src/openrct2-ui/input/MouseInput.cpp | 6 ++-- src/openrct2-ui/ride/VehicleSounds.cpp | 8 ++--- src/openrct2-ui/scripting/CustomWindow.cpp | 2 -- src/openrct2-ui/scripting/ScViewport.hpp | 14 ++++----- src/openrct2-ui/windows/Guest.cpp | 2 -- src/openrct2-ui/windows/Map.cpp | 9 +++--- src/openrct2-ui/windows/Player.cpp | 2 -- src/openrct2-ui/windows/Staff.cpp | 2 -- src/openrct2-ui/windows/Viewport.cpp | 8 ++--- src/openrct2/entity/Peep.cpp | 4 +-- src/openrct2/interface/InteractiveConsole.cpp | 2 +- src/openrct2/interface/Screenshot.cpp | 20 +++++-------- src/openrct2/interface/Viewport.cpp | 30 +++++-------------- src/openrct2/interface/Window.cpp | 18 ++++------- src/openrct2/interface/Window.h | 16 ++++++++-- src/openrct2/ride/RideAudio.cpp | 6 ++-- src/openrct2/ride/TrackDesign.cpp | 2 -- 18 files changed, 64 insertions(+), 97 deletions(-) diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index b2c4d427c1..07e85644d9 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -614,20 +614,14 @@ public: if (mainWindow != nullptr) { auto viewport = WindowGetViewport(mainWindow); - auto zoomDifference = zoom - viewport->zoom; mainWindow->viewport_target_sprite = EntityId::GetNull(); mainWindow->savedViewPos = viewPos; viewport->zoom = zoom; viewport->rotation = rotation; - if (zoomDifference != ZoomLevel{ 0 }) - { - viewport->view_width = zoomDifference.ApplyTo(viewport->view_width); - viewport->view_height = zoomDifference.ApplyTo(viewport->view_height); - } - mainWindow->savedViewPos.x -= viewport->view_width >> 1; - mainWindow->savedViewPos.y -= viewport->view_height >> 1; + mainWindow->savedViewPos.x -= viewport->ViewWidth() / 2; + mainWindow->savedViewPos.y -= viewport->ViewHeight() / 2; // Make sure the viewport has correct coordinates set. ViewportUpdatePosition(mainWindow); diff --git a/src/openrct2-ui/input/MouseInput.cpp b/src/openrct2-ui/input/MouseInput.cpp index 5ea6805e5b..355225f573 100644 --- a/src/openrct2-ui/input/MouseInput.cpp +++ b/src/openrct2-ui/input/MouseInput.cpp @@ -1668,9 +1668,9 @@ void InputScrollViewport(const ScreenCoordsXY& scrollScreenCoords) { // Speed up scrolling horizontally when at the edge of the map // so that the speed is consistent with vertical edge scrolling. - int32_t x = mainWindow->savedViewPos.x + viewport->view_width / 2 + dx; - int32_t y = mainWindow->savedViewPos.y + viewport->view_height / 2; - int32_t y_dy = mainWindow->savedViewPos.y + viewport->view_height / 2 + dy; + int32_t x = mainWindow->savedViewPos.x + viewport->ViewWidth() / 2 + dx; + int32_t y = mainWindow->savedViewPos.y + viewport->ViewHeight() / 2; + int32_t y_dy = mainWindow->savedViewPos.y + viewport->ViewHeight() / 2 + dy; auto mapCoord = ViewportPosToMapPos({ x, y }, 0, viewport->rotation); auto mapCoord_dy = ViewportPosToMapPos({ x, y_dy }, 0, viewport->rotation); diff --git a/src/openrct2-ui/ride/VehicleSounds.cpp b/src/openrct2-ui/ride/VehicleSounds.cpp index a12152fac4..dc302fcffe 100644 --- a/src/openrct2-ui/ride/VehicleSounds.cpp +++ b/src/openrct2-ui/ride/VehicleSounds.cpp @@ -113,8 +113,8 @@ namespace OpenRCT2::Audio if (g_music_tracking_viewport == nullptr) return false; - const auto quarter_w = g_music_tracking_viewport->view_width / 4; - const auto quarter_h = g_music_tracking_viewport->view_height / 4; + const auto quarter_w = g_music_tracking_viewport->ViewWidth() / 4; + const auto quarter_h = g_music_tracking_viewport->ViewHeight() / 4; auto left = g_music_tracking_viewport->viewPos.x; auto bottom = g_music_tracking_viewport->viewPos.y; @@ -128,8 +128,8 @@ namespace OpenRCT2::Audio if (left >= vehicle.SpriteData.SpriteRect.GetRight() || bottom >= vehicle.SpriteData.SpriteRect.GetBottom()) return false; - auto right = g_music_tracking_viewport->view_width + left; - auto top = g_music_tracking_viewport->view_height + bottom; + auto right = g_music_tracking_viewport->ViewWidth() + left; + auto top = g_music_tracking_viewport->ViewHeight() + bottom; if (Ui::Windows::WindowGetClassification(*gWindowAudioExclusive) == WindowClass::MainWindow) { diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 3d2bc6db39..4924c089c3 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -804,8 +804,6 @@ namespace OpenRCT2::Ui::Windows viewport->pos.y = top; viewport->width = wwidth; viewport->height = wheight; - viewport->view_width = viewport->zoom.ApplyTo(wwidth); - viewport->view_height = viewport->zoom.ApplyTo(wheight); Invalidate(); } } diff --git a/src/openrct2-ui/scripting/ScViewport.hpp b/src/openrct2-ui/scripting/ScViewport.hpp index 12110787e5..5315050b53 100644 --- a/src/openrct2-ui/scripting/ScViewport.hpp +++ b/src/openrct2-ui/scripting/ScViewport.hpp @@ -77,7 +77,7 @@ namespace OpenRCT2::Scripting auto viewport = GetViewport(); if (viewport != nullptr) { - return viewport->viewPos.x + viewport->view_width; + return viewport->viewPos.x + viewport->ViewWidth(); } return 0; } @@ -86,7 +86,7 @@ namespace OpenRCT2::Scripting auto viewport = GetViewport(); if (viewport != nullptr) { - SetViewLeftTop(value - viewport->view_width, viewport->viewPos.y); + SetViewLeftTop(value - viewport->ViewWidth(), viewport->viewPos.y); } } @@ -95,7 +95,7 @@ namespace OpenRCT2::Scripting auto viewport = GetViewport(); if (viewport != nullptr) { - return viewport->viewPos.y + viewport->view_height; + return viewport->viewPos.y + viewport->ViewHeight(); } return 0; } @@ -104,7 +104,7 @@ namespace OpenRCT2::Scripting auto viewport = GetViewport(); if (viewport != nullptr) { - SetViewLeftTop(viewport->viewPos.x, value - viewport->view_height); + SetViewLeftTop(viewport->viewPos.x, value - viewport->ViewHeight()); } } @@ -182,7 +182,7 @@ namespace OpenRCT2::Scripting auto viewport = GetViewport(); if (viewport != nullptr) { - auto centre = viewport->viewPos + ScreenCoordsXY{ viewport->view_width / 2, viewport->view_height / 2 }; + auto centre = viewport->viewPos + ScreenCoordsXY{ viewport->ViewWidth() / 2, viewport->ViewHeight() / 2 }; auto coords = ViewportPosToMapPos(centre, 24, viewport->rotation); auto ctx = GetContext()->GetScriptEngine().GetContext(); @@ -208,8 +208,8 @@ namespace OpenRCT2::Scripting if (coords) { auto screenCoords = Translate3DTo2DWithZ(viewport->rotation, *coords); - auto left = screenCoords.x - (viewport->view_width / 2); - auto top = screenCoords.y - (viewport->view_height / 2); + auto left = screenCoords.x - (viewport->ViewWidth() / 2); + auto top = screenCoords.y - (viewport->ViewHeight() / 2); SetViewLeftTop(left, top); } } diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index abee03be76..3af21288cb 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -611,8 +611,6 @@ namespace OpenRCT2::Ui::Windows { viewport->width = reqViewportWidth; viewport->height = reqViewportHeight; - viewport->view_width = viewport->zoom.ApplyInversedTo(viewport->width); - viewport->view_height = viewport->zoom.ApplyInversedTo(viewport->height); } } OnViewportRotate(); diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 77c490133d..db4acc0421 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -725,8 +725,8 @@ namespace OpenRCT2::Ui::Windows // calculate centre view point of viewport and transform it to minimap coordinates - cx = ((mainWindow->viewport->view_width >> 1) + mainWindow->viewport->viewPos.x) >> 5; - dx = ((mainWindow->viewport->view_height >> 1) + mainWindow->viewport->viewPos.y) >> 4; + cx = ((mainWindow->viewport->ViewWidth() / 2) + mainWindow->viewport->viewPos.x) / kCoordsXYStep; + dx = ((mainWindow->viewport->ViewHeight() / 2) + mainWindow->viewport->viewPos.y) / kCoordsXYHalfTile; cx += offset.x * getPracticalMapSize(); dx += offset.y * getPracticalMapSize(); @@ -1043,8 +1043,9 @@ namespace OpenRCT2::Ui::Windows mapOffset.y *= getPracticalMapSize(); auto leftTop = widgetOffset + mapOffset - + ScreenCoordsXY{ (mainViewport->viewPos.x >> 5), (mainViewport->viewPos.y >> 4) }; - auto rightBottom = leftTop + ScreenCoordsXY{ mainViewport->view_width >> 5, mainViewport->view_height >> 4 }; + + ScreenCoordsXY{ (mainViewport->viewPos.x / kCoordsXYStep), (mainViewport->viewPos.y / kCoordsXYHalfTile) }; + auto rightBottom = leftTop + + ScreenCoordsXY{ mainViewport->ViewWidth() / kCoordsXYStep, mainViewport->ViewHeight() / kCoordsXYHalfTile }; auto rightTop = ScreenCoordsXY{ rightBottom.x, leftTop.y }; auto leftBottom = ScreenCoordsXY{ leftTop.x, rightBottom.y }; diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index 27cf11a5ee..86bbd2daba 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -412,8 +412,6 @@ namespace OpenRCT2::Ui::Windows viewport->pos = windowPos + ScreenCoordsXY{ viewportWidget->left, viewportWidget->top }; viewport->width = viewportWidget->width(); viewport->height = viewportWidget->height(); - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); - viewport->view_height = viewport->zoom.ApplyTo(viewport->height); } // Only enable kick button for other players diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index 1514ffed2b..469c99b369 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -627,8 +627,6 @@ namespace OpenRCT2::Ui::Windows { viewport->width = newWidth; viewport->height = newHeight; - viewport->view_width = viewport->zoom.ApplyTo(newWidth); - viewport->view_height = viewport->zoom.ApplyTo(newHeight); } } diff --git a/src/openrct2-ui/windows/Viewport.cpp b/src/openrct2-ui/windows/Viewport.cpp index 39bbb10caf..11a463541d 100644 --- a/src/openrct2-ui/windows/Viewport.cpp +++ b/src/openrct2-ui/windows/Viewport.cpp @@ -91,9 +91,9 @@ namespace OpenRCT2::Ui::Windows if (mainWindow != nullptr) { Viewport* mainViewport = mainWindow->viewport; - int32_t x = mainViewport->viewPos.x + (mainViewport->view_width / 2); - int32_t y = mainViewport->viewPos.y + (mainViewport->view_height / 2); - savedViewPos = { x - (viewport->view_width / 2), y - (viewport->view_height / 2) }; + int32_t x = mainViewport->viewPos.x + (mainViewport->ViewWidth() / 2); + int32_t y = mainViewport->viewPos.y + (mainViewport->ViewHeight() / 2); + savedViewPos = { x - (viewport->ViewWidth() / 2), y - (viewport->ViewHeight() / 2) }; } viewport->flags |= VIEWPORT_FLAG_SOUND_ON | VIEWPORT_FLAG_INDEPEDENT_ROTATION; @@ -219,8 +219,6 @@ namespace OpenRCT2::Ui::Windows viewport->pos = windowPos + ScreenCoordsXY{ viewportWidget->left + 1, viewportWidget->top + 1 }; viewport->width = widgets[WIDX_VIEWPORT].width() - 1; viewport->height = widgets[WIDX_VIEWPORT].height() - 1; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); - viewport->view_height = viewport->zoom.ApplyTo(viewport->height); } } }; diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index 6c79310803..84e25d70b6 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1313,11 +1313,11 @@ void PeepUpdateCrowdNoise() continue; if (viewport->viewPos.x > peep->SpriteData.SpriteRect.GetRight()) continue; - if (viewport->viewPos.x + viewport->view_width < peep->SpriteData.SpriteRect.GetLeft()) + if (viewport->viewPos.x + viewport->ViewWidth() < peep->SpriteData.SpriteRect.GetLeft()) continue; if (viewport->viewPos.y > peep->SpriteData.SpriteRect.GetBottom()) continue; - if (viewport->viewPos.y + viewport->view_height < peep->SpriteData.SpriteRect.GetTop()) + if (viewport->viewPos.y + viewport->ViewHeight() < peep->SpriteData.SpriteRect.GetTop()) continue; visiblePeeps += peep->State == PeepState::Queuing ? 1 : 2; diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 57582e3811..ce4fc8fe7e 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -694,7 +694,7 @@ static int32_t ConsoleCommandGet(InteractiveConsole& console, const arguments_t& { Viewport* viewport = WindowGetViewport(w); auto info = GetMapCoordinatesFromPos( - { viewport->view_width / 2, viewport->view_height / 2 }, EnumsToFlags(ViewportInteractionItem::Terrain)); + { viewport->ViewWidth() / 2, viewport->ViewHeight() / 2 }, EnumsToFlags(ViewportInteractionItem::Terrain)); auto tileMapCoord = TileCoordsXY(info.Loc); console.WriteFormatLine("location %d %d", tileMapCoord.x, tileMapCoord.y); diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 91e7345ef7..f95599b0e4 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -297,10 +297,8 @@ static Viewport GetGiantViewport(int32_t rotation, ZoomLevel zoom) Viewport viewport{}; viewport.viewPos = { left, top }; - viewport.view_width = right - left; - viewport.view_height = bottom - top; - viewport.width = zoom.ApplyInversedTo(viewport.view_width); - viewport.height = zoom.ApplyInversedTo(viewport.view_height); + viewport.width = zoom.ApplyInversedTo(right - left); + viewport.height = zoom.ApplyInversedTo(bottom - top); viewport.zoom = zoom; viewport.rotation = rotation; @@ -514,8 +512,6 @@ int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOpti viewport.width = resolutionWidth; viewport.height = resolutionHeight; - viewport.view_width = viewport.width; - viewport.view_height = viewport.height; if (customLocation) { if (centreMapX) @@ -528,8 +524,8 @@ int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOpti auto coords2d = Translate3DTo2DWithZ(customRotation, coords3d); - viewport.viewPos = { coords2d.x - ((viewport.view_width << customZoom) / 2), - coords2d.y - ((viewport.view_height << customZoom) / 2) }; + viewport.viewPos = { coords2d.x - ((viewport.ViewWidth() << customZoom) / 2), + coords2d.y - ((viewport.ViewHeight() << customZoom) / 2) }; viewport.zoom = ZoomLevel{ static_cast(customZoom) }; viewport.rotation = customRotation; } @@ -537,7 +533,7 @@ int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOpti { auto& gameState = GetGameState(); viewport.viewPos = { gameState.SavedView - - ScreenCoordsXY{ (viewport.view_width / 2), (viewport.view_height / 2) } }; + - ScreenCoordsXY{ (viewport.ViewWidth() / 2), (viewport.ViewHeight() / 2) } }; viewport.zoom = gameState.SavedViewZoom; viewport.rotation = gameState.SavedViewRotation; } @@ -618,14 +614,12 @@ void CaptureImage(const CaptureOptions& options) { viewport.width = options.View->Width; viewport.height = options.View->Height; - viewport.view_width = viewport.width; - viewport.view_height = viewport.height; auto z = TileElementHeight(options.View->Position); CoordsXYZ coords3d(options.View->Position, z); auto coords2d = Translate3DTo2DWithZ(options.Rotation, coords3d); - viewport.viewPos = { coords2d.x - ((options.Zoom.ApplyTo(viewport.view_width)) / 2), - coords2d.y - ((options.Zoom.ApplyTo(viewport.view_height)) / 2) }; + viewport.viewPos = { coords2d.x - ((options.Zoom.ApplyTo(viewport.ViewWidth())) / 2), + coords2d.y - ((options.Zoom.ApplyTo(viewport.ViewHeight())) / 2) }; viewport.zoom = options.Zoom; viewport.rotation = options.Rotation; } diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 1f6605e1c4..320d07a270 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -127,8 +127,8 @@ std::optional centre_2d_coordinates(const CoordsXYZ& loc, Viewpo } auto screenCoord = Translate3DTo2DWithZ(viewport->rotation, loc); - screenCoord.x -= viewport->view_width / 2; - screenCoord.y -= viewport->view_height / 2; + screenCoord.x -= viewport->ViewWidth() / 2; + screenCoord.y -= viewport->ViewHeight() / 2; return { screenCoord }; } @@ -190,8 +190,6 @@ void ViewportCreate(WindowBase* w, const ScreenCoordsXY& screenCoords, int32_t w viewport->height = height; const auto zoom = focus.zoom; - viewport->view_width = zoom.ApplyTo(width); - viewport->view_height = zoom.ApplyTo(height); viewport->zoom = zoom; viewport->flags = 0; viewport->rotation = GetCurrentRotation(); @@ -352,49 +350,41 @@ static void ViewportRedrawAfterShift(DrawPixelInfo& dpi, WindowBase* window, Vie if (viewport->pos.x < window->windowPos.x) { viewport->width = window->windowPos.x - viewport->pos.x; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); viewport->pos.x += viewport->width; viewport->viewPos.x += viewport->zoom.ApplyTo(viewport->width); viewport->width = view_copy.width - viewport->width; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); } else if (viewport->pos.x + viewport->width > window->windowPos.x + window->width) { viewport->width = window->windowPos.x + window->width - viewport->pos.x; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); viewport->pos.x += viewport->width; viewport->viewPos.x += viewport->zoom.ApplyTo(viewport->width); viewport->width = view_copy.width - viewport->width; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); } else if (viewport->pos.y < window->windowPos.y) { viewport->height = window->windowPos.y - viewport->pos.y; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); viewport->pos.y += viewport->height; viewport->viewPos.y += viewport->zoom.ApplyTo(viewport->height); viewport->height = view_copy.height - viewport->height; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); } else if (viewport->pos.y + viewport->height > window->windowPos.y + window->height) { viewport->height = window->windowPos.y + window->height - viewport->pos.y; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); viewport->pos.y += viewport->height; viewport->viewPos.y += viewport->zoom.ApplyTo(viewport->height); viewport->height = view_copy.height - viewport->height; - viewport->view_width = viewport->zoom.ApplyTo(viewport->width); ViewportRedrawAfterShift(dpi, window, viewport, coords); } @@ -538,7 +528,6 @@ static void ViewportMove(const ScreenCoordsXY& coords, WindowBase* w, Viewport* if (viewport->pos.x < 0) { viewport->width += viewport->pos.x; - viewport->view_width += zoom.ApplyTo(viewport->pos.x); viewport->viewPos.x -= zoom.ApplyTo(viewport->pos.x); viewport->pos.x = 0; } @@ -547,7 +536,6 @@ static void ViewportMove(const ScreenCoordsXY& coords, WindowBase* w, Viewport* if (eax > 0) { viewport->width -= eax; - viewport->view_width -= zoom.ApplyTo(eax); } if (viewport->width <= 0) @@ -559,7 +547,6 @@ static void ViewportMove(const ScreenCoordsXY& coords, WindowBase* w, Viewport* if (viewport->pos.y < 0) { viewport->height += viewport->pos.y; - viewport->view_height += zoom.ApplyTo(viewport->pos.y); viewport->viewPos.y -= zoom.ApplyTo(viewport->pos.y); viewport->pos.y = 0; } @@ -568,7 +555,6 @@ static void ViewportMove(const ScreenCoordsXY& coords, WindowBase* w, Viewport* if (eax > 0) { viewport->height -= eax; - viewport->view_height -= zoom.ApplyTo(eax); } if (viewport->height <= 0) @@ -635,8 +621,8 @@ void ViewportUpdatePosition(WindowBase* window) ViewportSetUndergroundFlag(0, window, viewport); - auto viewportMidPoint = ScreenCoordsXY{ window->savedViewPos.x + viewport->view_width / 2, - window->savedViewPos.y + viewport->view_height / 2 }; + auto viewportMidPoint = ScreenCoordsXY{ window->savedViewPos.x + viewport->ViewWidth() / 2, + window->savedViewPos.y + viewport->ViewHeight() / 2 }; auto mapCoord = ViewportPosToMapPos(viewportMidPoint, 0, viewport->rotation); @@ -873,7 +859,7 @@ static void ViewportRotateSingleInternal(WindowBase& w, int32_t direction) // mapXYCoords is nullopt if middle of viewport is obstructed by another window? if (!mapXYCoords.has_value() || other != viewport) { - auto viewPos = ScreenCoordsXY{ (viewport->view_width >> 1), (viewport->view_height >> 1) } + viewport->viewPos; + auto viewPos = ScreenCoordsXY{ (viewport->ViewWidth() >> 1), (viewport->ViewHeight() >> 1) } + viewport->viewPos; coords = ViewportAdjustForMapHeight(viewPos, viewport->rotation); } @@ -1185,7 +1171,7 @@ std::optional ScreenPosToMapPos(const ScreenCoordsXY& screenCoords, in void Viewport::Invalidate() const { - ViewportInvalidate(this, { viewPos, viewPos + ScreenCoordsXY{ view_width, view_height } }); + ViewportInvalidate(this, { viewPos, viewPos + ScreenCoordsXY{ ViewWidth(), ViewHeight() } }); } CoordsXY ViewportPosToMapPos(const ScreenCoordsXY& coords, int32_t z, uint8_t rotation) @@ -1826,7 +1812,7 @@ void ViewportInvalidate(const Viewport* viewport, const ScreenRect& screenRect) auto [topLeft, bottomRight] = screenRect; const auto [viewportRight, viewportBottom] = viewport->viewPos - + ScreenCoordsXY{ viewport->view_width, viewport->view_height }; + + ScreenCoordsXY{ viewport->ViewWidth(), viewport->ViewHeight() }; if (bottomRight.x > viewport->viewPos.x && bottomRight.y > viewport->viewPos.y) { @@ -2041,7 +2027,7 @@ void ViewportSetSavedView() Viewport* viewport = w->viewport; auto& gameState = GetGameState(); - gameState.SavedView = ScreenCoordsXY{ viewport->view_width / 2, viewport->view_height / 2 } + viewport->viewPos; + gameState.SavedView = ScreenCoordsXY{ viewport->ViewWidth() / 2, viewport->ViewHeight() / 2 } + viewport->viewPos; gameState.SavedViewZoom = viewport->zoom; gameState.SavedViewRotation = viewport->rotation; diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 1abcfe53ef..75d018f067 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -833,8 +833,8 @@ void WindowScrollToLocation(WindowBase& w, const CoordsXYZ& coords) if (!(w.flags & WF_NO_SCROLLING)) { w.savedViewPos = screenCoords - - ScreenCoordsXY{ static_cast(w.viewport->view_width * window_scroll_locations[i][0]), - static_cast(w.viewport->view_height * window_scroll_locations[i][1]) }; + - ScreenCoordsXY{ static_cast(w.viewport->ViewWidth() * window_scroll_locations[i][0]), + static_cast(w.viewport->ViewHeight() * window_scroll_locations[i][1]) }; w.flags |= WF_SCROLLING_TO_LOCATION; } } @@ -934,20 +934,16 @@ void WindowZoomSet(WindowBase& w, ZoomLevel zoomLevel, bool atCursor) while (v->zoom > zoomLevel) { v->zoom--; - w.savedViewPos.x += v->view_width / 4; - w.savedViewPos.y += v->view_height / 4; - v->view_width /= 2; - v->view_height /= 2; + w.savedViewPos.x += v->ViewWidth() / 4; + w.savedViewPos.y += v->ViewHeight() / 4; } // Zoom out while (v->zoom < zoomLevel) { v->zoom++; - w.savedViewPos.x -= v->view_width / 2; - w.savedViewPos.y -= v->view_height / 2; - v->view_width *= 2; - v->view_height *= 2; + w.savedViewPos.x -= v->ViewWidth() / 2; + w.savedViewPos.y -= v->ViewHeight() / 2; } // Zooming to cursor? Centre around the tile we were hovering over just now. @@ -1258,8 +1254,6 @@ void WindowResizeGuiScenarioEditor(int32_t width, int32_t height) mainWind->height = height; viewport->width = width; viewport->height = height; - viewport->view_width = viewport->zoom.ApplyTo(width); - viewport->view_height = viewport->zoom.ApplyTo(height); if (mainWind->widgets != nullptr && mainWind->widgets[WC_MAIN_WINDOW__0].type == WindowWidgetType::Viewport) { mainWind->widgets[WC_MAIN_WINDOW__0].right = width; diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 8cb59d69be..536b39db17 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -155,19 +155,29 @@ struct Viewport int32_t height{}; ScreenCoordsXY pos{}; ScreenCoordsXY viewPos{}; - int32_t view_width{}; - int32_t view_height{}; uint32_t flags{}; ZoomLevel zoom{}; uint8_t rotation{}; VisibilityCache visibility{}; + [[nodiscard]] constexpr int32_t ViewWidth() const + { + return zoom.ApplyTo(width); + } + + [[nodiscard]] constexpr int32_t ViewHeight() const + { + return zoom.ApplyTo(height); + } + // 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 { + // TODO (mber), change to compare in screen space coords. return ( - vpos.y >= viewPos.y && vpos.y < viewPos.y + view_height && vpos.x >= viewPos.x && vpos.x < viewPos.x + view_width); + vpos.y >= viewPos.y && vpos.y < viewPos.y + ViewHeight() && vpos.x >= viewPos.x + && vpos.x < viewPos.x + ViewWidth()); } // Use this function on coordinates that are relative to the screen that is been drawn i.e. the cursor position diff --git a/src/openrct2/ride/RideAudio.cpp b/src/openrct2/ride/RideAudio.cpp index 5964872087..e07610a1f2 100644 --- a/src/openrct2/ride/RideAudio.cpp +++ b/src/openrct2/ride/RideAudio.cpp @@ -385,12 +385,12 @@ namespace OpenRCT2::RideAudio { auto rotatedCoords = Translate3DTo2DWithZ(GetCurrentRotation(), rideCoords); auto viewport = g_music_tracking_viewport; - auto viewWidth = viewport->view_width; + auto viewWidth = viewport->ViewWidth(); auto viewWidth2 = viewWidth * 2; auto viewX = viewport->viewPos.x - viewWidth2; auto viewY = viewport->viewPos.y - viewWidth; - auto viewX2 = viewWidth2 + viewWidth2 + viewport->view_width + viewX; - auto viewY2 = viewWidth + viewWidth + viewport->view_height + viewY; + auto viewX2 = viewWidth2 + viewWidth2 + viewport->ViewWidth() + viewX; + auto viewY2 = viewWidth + viewWidth + viewport->ViewHeight() + viewY; if (viewX >= rotatedCoords.x || viewY >= rotatedCoords.y || viewX2 < rotatedCoords.x || viewY2 < rotatedCoords.y) { RideUpdateMusicPosition(ride); diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 0c91b12c3a..847fb4eec0 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -2112,8 +2112,6 @@ void TrackDesignDrawPreview(TrackDesign& td, uint8_t* pixels) Viewport view; view.width = 370; view.height = 217; - view.view_width = size_x; - view.view_height = size_y; view.pos = { 0, 0 }; view.zoom = zoom_level; view.flags = VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_ENTITIES;