From 09fad0ef7f15ce074c387d1bd9c27789ff827828 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Sun, 1 Mar 2020 09:56:14 -0300 Subject: [PATCH] Change rct_viewport to use ScreenCoordsXY --- src/openrct2-ui/UiContext.cpp | 8 +- src/openrct2-ui/interface/InGameConsole.cpp | 6 +- .../interface/ViewportInteraction.cpp | 4 +- src/openrct2-ui/windows/Map.cpp | 12 +- src/openrct2-ui/windows/Player.cpp | 6 +- src/openrct2-ui/windows/Viewport.cpp | 7 +- src/openrct2/audio/Audio.cpp | 6 +- src/openrct2/cmdline/BenchSpriteSort.cpp | 6 +- src/openrct2/drawing/LightFX.cpp | 4 +- src/openrct2/interface/Screenshot.cpp | 11 +- src/openrct2/interface/Viewport.cpp | 199 +++++++++--------- src/openrct2/interface/Window.cpp | 31 ++- src/openrct2/interface/Window.h | 18 +- src/openrct2/peep/Peep.cpp | 8 +- src/openrct2/ride/Ride.cpp | 8 +- src/openrct2/ride/TrackDesign.cpp | 6 +- src/openrct2/ride/Vehicle.cpp | 12 +- src/openrct2/world/Location.hpp | 19 ++ src/openrct2/world/MoneyEffect.cpp | 2 +- 19 files changed, 187 insertions(+), 186 deletions(-) diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index a161570b10..351a9174c8 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -794,10 +794,10 @@ private: auto vp = original_w->viewport; if (vp != nullptr) { - left = std::max(left, vp->x); - right = std::min(right, vp->x + vp->width); - top = std::max(top, vp->y); - bottom = std::min(bottom, vp->y + vp->height); + left = std::max(left, vp->pos.x); + right = std::min(right, vp->pos.x + vp->width); + top = std::max(top, vp->pos.y); + bottom = std::min(bottom, vp->pos.y + vp->height); if (left < right && top < bottom) { auto width = right - left; diff --git a/src/openrct2-ui/interface/InGameConsole.cpp b/src/openrct2-ui/interface/InGameConsole.cpp index 044d20c685..617593bdcf 100644 --- a/src/openrct2-ui/interface/InGameConsole.cpp +++ b/src/openrct2-ui/interface/InGameConsole.cpp @@ -242,10 +242,10 @@ void InGameConsole::Update() rct_viewport* mainViewport = window_get_viewport(mainWindow); if (mainViewport != nullptr) { - if (_lastMainViewportX != mainViewport->view_x || _lastMainViewportY != mainViewport->view_y) + if (_lastMainViewportX != mainViewport->viewPos.x || _lastMainViewportY != mainViewport->viewPos.y) { - _lastMainViewportX = mainViewport->view_x; - _lastMainViewportY = mainViewport->view_y; + _lastMainViewportX = mainViewport->viewPos.x; + _lastMainViewportY = mainViewport->viewPos.y; gfx_invalidate_screen(); } diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index da962828bc..269249b475 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -627,8 +627,8 @@ static Peep* viewport_interaction_get_closest_peep(ScreenCoordsXY screenCoords, if (viewport == nullptr || viewport->zoom >= 2) return nullptr; - screenCoords.x = ((screenCoords.x - viewport->x) << viewport->zoom) + viewport->view_x; - screenCoords.y = ((screenCoords.y - viewport->y) << viewport->zoom) + viewport->view_y; + screenCoords.x = ((screenCoords.x - viewport->pos.x) << viewport->zoom) + viewport->viewPos.x; + screenCoords.y = ((screenCoords.y - viewport->pos.y) << viewport->zoom) + viewport->viewPos.y; closestPeep = nullptr; closestDistance = 0xFFFF; diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 0d34def9fc..015fbc37fd 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -926,8 +926,8 @@ static void window_map_centre_on_view_point() // calculate centre view point of viewport and transform it to minimap coordinates - cx = ((w->viewport->view_width >> 1) + w->viewport->view_x) >> 5; - dx = ((w->viewport->view_height >> 1) + w->viewport->view_y) >> 4; + cx = ((w->viewport->view_width >> 1) + w->viewport->viewPos.x) >> 5; + dx = ((w->viewport->view_height >> 1) + w->viewport->viewPos.y) >> 4; cx += offset.x; dx += offset.y; @@ -1132,10 +1132,10 @@ static void window_map_paint_hud_rectangle(rct_drawpixelinfo* dpi) return; auto offset = MiniMapOffsets[get_current_rotation()]; - int16_t left = (viewport->view_x >> 5) + offset.x; - int16_t right = ((viewport->view_x + viewport->view_width) >> 5) + offset.x; - int16_t top = (viewport->view_y >> 4) + offset.y; - int16_t bottom = ((viewport->view_y + viewport->view_height) >> 4) + offset.y; + int16_t left = (viewport->viewPos.x >> 5) + offset.x; + int16_t right = ((viewport->viewPos.x + viewport->view_width) >> 5) + offset.x; + int16_t top = (viewport->viewPos.y >> 4) + offset.y; + int16_t bottom = ((viewport->viewPos.y + viewport->view_height) >> 4) + offset.y; // top horizontal lines gfx_fill_rect(dpi, left, top, left + 3, top, PALETTE_INDEX_56); diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index d94a7e363b..ed67b779ae 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -456,8 +456,7 @@ void window_player_overview_invalidate(rct_window* w) { rct_widget* viewportWidget = &window_player_overview_widgets[WIDX_VIEWPORT]; - viewport->x = w->x + viewportWidget->left; - viewport->y = w->y + viewportWidget->top; + viewport->pos = { w->x + viewportWidget->left, w->y + viewportWidget->top }; viewport->width = viewportWidget->right - viewportWidget->left; viewport->height = viewportWidget->bottom - viewportWidget->top; viewport->view_width = viewport->width << viewport->zoom; @@ -667,8 +666,7 @@ static void window_player_update_viewport(rct_window* w, bool scroll) w->saved_view_y = centreLoc->y; if (!scroll) { - w->viewport->view_x = centreLoc->x; - w->viewport->view_y = centreLoc->y; + w->viewport->viewPos = *centreLoc; } widget_invalidate(w, WIDX_VIEWPORT); } diff --git a/src/openrct2-ui/windows/Viewport.cpp b/src/openrct2-ui/windows/Viewport.cpp index f8327f882d..0f0c877b84 100644 --- a/src/openrct2-ui/windows/Viewport.cpp +++ b/src/openrct2-ui/windows/Viewport.cpp @@ -99,8 +99,8 @@ rct_window* window_viewport_open() if (mainWindow != nullptr) { rct_viewport* mainViewport = mainWindow->viewport; - int32_t x = mainViewport->view_x + (mainViewport->view_width / 2); - int32_t y = mainViewport->view_y + (mainViewport->view_height / 2); + int32_t x = mainViewport->viewPos.x + (mainViewport->view_width / 2); + int32_t y = mainViewport->viewPos.y + (mainViewport->view_height / 2); w->saved_view_x = x - (w->viewport->view_width / 2); w->saved_view_y = y - (w->viewport->view_height / 2); } @@ -211,8 +211,7 @@ static void window_viewport_invalidate(rct_window* w) if (viewport->zoom >= 3) w->disabled_widgets |= 1 << WIDX_ZOOM_OUT; - viewport->x = w->x + viewportWidget->left; - viewport->y = w->y + viewportWidget->top; + viewport->pos = ScreenCoordsXY{ w->x + viewportWidget->left, w->y + viewportWidget->top }; viewport->width = viewportWidget->right - viewportWidget->left; viewport->height = viewportWidget->bottom - viewportWidget->top; viewport->view_width = viewport->width << viewport->zoom; diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index 7faedd1df8..5679a76b37 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -220,9 +220,9 @@ static AudioParams audio_get_params_from_location(SoundId soundId, const CoordsX { if (viewport->flags & VIEWPORT_FLAG_SOUND_ON) { - int16_t vy = pos2.y - viewport->view_y; - int16_t vx = pos2.x - viewport->view_x; - params.pan = viewport->x + (vx >> viewport->zoom); + int16_t vy = pos2.y - viewport->viewPos.x; + int16_t vx = pos2.x - viewport->viewPos.y; + params.pan = viewport->pos.x + (vx >> viewport->zoom); params.volume = SoundVolumeAdjust[static_cast(soundId)] + ((-1024 * viewport->zoom - 1) * (1 << volumeDown)) + 1; diff --git a/src/openrct2/cmdline/BenchSpriteSort.cpp b/src/openrct2/cmdline/BenchSpriteSort.cpp index 2341e72612..f1daccfe66 100644 --- a/src/openrct2/cmdline/BenchSpriteSort.cpp +++ b/src/openrct2/cmdline/BenchSpriteSort.cpp @@ -92,8 +92,7 @@ static std::vector extract_paint_session(const std::string parkFi resolutionHeight += 128; rct_viewport viewport; - viewport.x = 0; - viewport.y = 0; + viewport.pos = { 0, 0 }; viewport.width = resolutionWidth; viewport.height = resolutionHeight; viewport.view_width = viewport.width; @@ -109,8 +108,7 @@ static std::vector extract_paint_session(const std::string parkFi x = customY - customX; y = ((customX + customY) / 2) - z; - viewport.view_x = x - ((viewport.view_width) / 2); - viewport.view_y = y - ((viewport.view_height) / 2); + viewport.viewPos = { x - ((viewport.view_width) / 2), y - ((viewport.view_height) / 2) }; viewport.zoom = 0; gCurrentRotation = 0; diff --git a/src/openrct2/drawing/LightFX.cpp b/src/openrct2/drawing/LightFX.cpp index 0ad903932d..8a0b0a18f0 100644 --- a/src/openrct2/drawing/LightFX.cpp +++ b/src/openrct2/drawing/LightFX.cpp @@ -441,8 +441,8 @@ void lightfx_update_viewport_settings() if (mainWindow) { rct_viewport* viewport = window_get_viewport(mainWindow); - _current_view_x_back = viewport->view_x; - _current_view_y_back = viewport->view_y; + _current_view_x_back = viewport->viewPos.x; + _current_view_y_back = viewport->viewPos.y; _current_view_rotation_back = get_current_rotation(); _current_view_zoom_back = viewport->zoom; } diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index e4378eacf0..84bb502af7 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -367,8 +367,7 @@ static rct_viewport GetGiantViewport(int32_t mapSize, int32_t rotation, int32_t int32_t bottom = translate_3d_to_2d_with_z(rotation, CoordsXYZ(bottomTileCoords, 0)).y; rct_viewport viewport{}; - viewport.view_x = left; - viewport.view_y = top; + viewport.viewPos = { left, top }; viewport.view_width = right - left; viewport.view_height = bottom - top; viewport.width = viewport.view_width >> zoom; @@ -726,15 +725,15 @@ int32_t cmdline_for_screenshot(const char** argv, int32_t argc, ScreenshotOption auto coords2d = translate_3d_to_2d_with_z(customRotation, coords3d); - viewport.view_x = coords2d.x - ((viewport.view_width << customZoom) / 2); - viewport.view_y = coords2d.y - ((viewport.view_height << customZoom) / 2); + viewport.viewPos = { coords2d.x - ((viewport.view_width << customZoom) / 2), + coords2d.y - ((viewport.view_height << customZoom) / 2) }; viewport.zoom = customZoom; gCurrentRotation = customRotation; } else { - viewport.view_x = gSavedView.x - (viewport.view_width / 2); - viewport.view_y = gSavedView.y - (viewport.view_height / 2); + viewport.viewPos = { gSavedView.x - (viewport.view_width / 2), gSavedView.y - (viewport.view_height / 2) }; + viewport.zoom = gSavedViewZoom; gCurrentRotation = gSavedViewRotation; } diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index d3feb3f968..487da524a7 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -154,8 +154,7 @@ void viewport_create( return; } - viewport->x = screenCoords.x; - viewport->y = screenCoords.y; + viewport->pos = screenCoords; viewport->width = width; viewport->height = height; @@ -192,8 +191,7 @@ void viewport_create( } w->saved_view_x = centreLoc->x; w->saved_view_y = centreLoc->y; - viewport->view_x = centreLoc->x; - viewport->view_y = centreLoc->y; + viewport->viewPos = *centreLoc; } /** @@ -237,9 +235,9 @@ static void viewport_redraw_after_shift( if (window != nullptr) { // skip current window and non-intersecting windows - if (viewport == window->viewport || viewport->x + viewport->width <= window->x - || viewport->x >= window->x + window->width || viewport->y + viewport->height <= window->y - || viewport->y >= window->y + window->height) + if (viewport == window->viewport || viewport->pos.x + viewport->width <= window->x + || viewport->pos.x >= window->x + window->width || viewport->pos.y + viewport->height <= window->y + || viewport->pos.y >= window->y + window->height) { auto itWindowPos = window_get_iterator(window); auto itNextWindow = itWindowPos != g_window_list.end() ? std::next(itWindowPos) : g_window_list.end(); @@ -252,50 +250,50 @@ static void viewport_redraw_after_shift( rct_viewport view_copy; std::memcpy(&view_copy, viewport, sizeof(rct_viewport)); - if (viewport->x < window->x) + if (viewport->pos.x < window->x) { - viewport->width = window->x - viewport->x; + viewport->width = window->x - viewport->pos.x; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); - viewport->x += viewport->width; - viewport->view_x += viewport->width << viewport->zoom; + viewport->pos.x += viewport->width; + viewport->viewPos.x += viewport->width << viewport->zoom; viewport->width = view_copy.width - viewport->width; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); } - else if (viewport->x + viewport->width > window->x + window->width) + else if (viewport->pos.x + viewport->width > window->x + window->width) { - viewport->width = window->x + window->width - viewport->x; + viewport->width = window->x + window->width - viewport->pos.x; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); - viewport->x += viewport->width; - viewport->view_x += viewport->width << viewport->zoom; + viewport->pos.x += viewport->width; + viewport->viewPos.x += viewport->width << viewport->zoom; viewport->width = view_copy.width - viewport->width; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); } - else if (viewport->y < window->y) + else if (viewport->pos.y < window->y) { - viewport->height = window->y - viewport->y; + viewport->height = window->y - viewport->pos.y; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); - viewport->y += viewport->height; - viewport->view_y += viewport->height << viewport->zoom; + viewport->pos.y += viewport->height; + viewport->viewPos.y += viewport->height << viewport->zoom; viewport->height = view_copy.height - viewport->height; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); } - else if (viewport->y + viewport->height > window->y + window->height) + else if (viewport->pos.y + viewport->height > window->y + window->height) { - viewport->height = window->y + window->height - viewport->y; + viewport->height = window->y + window->height - viewport->pos.y; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); - viewport->y += viewport->height; - viewport->view_y += viewport->height << viewport->zoom; + viewport->pos.y += viewport->height; + viewport->viewPos.y += viewport->height << viewport->zoom; viewport->height = view_copy.height - viewport->height; viewport->view_width = viewport->width << viewport->zoom; viewport_redraw_after_shift(dpi, window, viewport, x, y); @@ -306,28 +304,28 @@ static void viewport_redraw_after_shift( } else { - int16_t left = viewport->x; - int16_t right = viewport->x + viewport->width; - int16_t top = viewport->y; - int16_t bottom = viewport->y + viewport->height; + int16_t left = viewport->pos.x; + int16_t right = viewport->pos.x + viewport->width; + int16_t top = viewport->pos.y; + int16_t bottom = viewport->pos.y + viewport->height; // if moved more than the viewport size if (abs(x) < viewport->width && abs(y) < viewport->height) { // update whole block ? - drawing_engine_copy_rect(viewport->x, viewport->y, viewport->width, viewport->height, x, y); + drawing_engine_copy_rect(viewport->pos.x, viewport->pos.y, viewport->width, viewport->height, x, y); if (x > 0) { // draw left - int16_t _right = viewport->x + x; + int16_t _right = viewport->pos.x + x; window_draw_all(dpi, left, top, _right, bottom); left += x; } else if (x < 0) { // draw right - int16_t _left = viewport->x + viewport->width + x; + int16_t _left = viewport->pos.x + viewport->width + x; window_draw_all(dpi, _left, top, right, bottom); right += x; } @@ -335,13 +333,13 @@ static void viewport_redraw_after_shift( if (y > 0) { // draw top - bottom = viewport->y + y; + bottom = viewport->pos.y + y; window_draw_all(dpi, left, top, right, bottom); } else if (y < 0) { // draw bottom - top = viewport->y + viewport->height + y; + top = viewport->pos.y + viewport->height + y; window_draw_all(dpi, left, top, right, bottom); } } @@ -365,14 +363,14 @@ static void viewport_shift_pixels( if (w->viewport == viewport) continue; - if (viewport->x + viewport->width <= w->x) + if (viewport->pos.x + viewport->width <= w->x) continue; - if (w->x + w->width <= viewport->x) + if (w->x + w->width <= viewport->pos.x) continue; - if (viewport->y + viewport->height <= w->y) + if (viewport->pos.y + viewport->height <= w->y) continue; - if (w->y + w->height <= viewport->y) + if (w->y + w->height <= viewport->pos.y) continue; auto left = w->x; @@ -380,15 +378,15 @@ static void viewport_shift_pixels( auto top = w->y; auto bottom = w->y + w->height; - if (left < viewport->x) - left = viewport->x; - if (right > viewport->x + viewport->width) - right = viewport->x + viewport->width; + if (left < viewport->pos.x) + left = viewport->pos.x; + if (right > viewport->pos.x + viewport->width) + right = viewport->pos.x + viewport->width; - if (top < viewport->y) - top = viewport->y; - if (bottom > viewport->y + viewport->height) - bottom = viewport->y + viewport->height; + if (top < viewport->pos.y) + top = viewport->pos.y; + if (bottom > viewport->pos.y + viewport->height) + bottom = viewport->pos.y + viewport->height; if (left >= right) continue; @@ -408,11 +406,10 @@ static void viewport_move(int16_t x, int16_t y, rct_window* w, rct_viewport* vie // Note: do not do the subtraction and then divide! // Note: Due to arithmetic shift != /zoom a shift will have to be used // hopefully when 0x006E7FF3 is finished this can be converted to /zoom. - int16_t x_diff = (viewport->view_x >> viewport->zoom) - (x >> viewport->zoom); - int16_t y_diff = (viewport->view_y >> viewport->zoom) - (y >> viewport->zoom); + int16_t x_diff = (viewport->viewPos.x >> viewport->zoom) - (x >> viewport->zoom); + int16_t y_diff = (viewport->viewPos.y >> viewport->zoom) - (y >> viewport->zoom); - viewport->view_x = x; - viewport->view_y = y; + viewport->viewPos = { x, y }; // If no change in viewing area if ((!x_diff) && (!y_diff)) @@ -420,10 +417,10 @@ static void viewport_move(int16_t x, int16_t y, rct_window* w, rct_viewport* vie if (w->flags & WF_7) { - int32_t left = std::max(viewport->x, 0); - int32_t top = std::max(viewport->y, 0); - int32_t right = std::min(viewport->x + viewport->width, context_get_width()); - int32_t bottom = std::min(viewport->y + viewport->height, context_get_height()); + int32_t left = std::max(viewport->pos.x, 0); + int32_t top = std::max(viewport->pos.y, 0); + int32_t right = std::min(viewport->pos.x + viewport->width, context_get_width()); + int32_t bottom = std::min(viewport->pos.y + viewport->height, context_get_height()); if (left >= right) return; @@ -441,15 +438,15 @@ static void viewport_move(int16_t x, int16_t y, rct_window* w, rct_viewport* vie rct_viewport view_copy; std::memcpy(&view_copy, viewport, sizeof(rct_viewport)); - if (viewport->x < 0) + if (viewport->pos.x < 0) { - viewport->width += viewport->x; - viewport->view_width += viewport->x * zoom; - viewport->view_x -= viewport->x * zoom; - viewport->x = 0; + viewport->width += viewport->pos.x; + viewport->view_width += viewport->pos.x * zoom; + viewport->viewPos.x -= viewport->pos.x * zoom; + viewport->pos.x = 0; } - int32_t eax = viewport->x + viewport->width - context_get_width(); + int32_t eax = viewport->pos.x + viewport->width - context_get_width(); if (eax > 0) { viewport->width -= eax; @@ -462,15 +459,15 @@ static void viewport_move(int16_t x, int16_t y, rct_window* w, rct_viewport* vie return; } - if (viewport->y < 0) + if (viewport->pos.y < 0) { - viewport->height += viewport->y; - viewport->view_height += viewport->y * zoom; - viewport->view_y -= viewport->y * zoom; - viewport->y = 0; + viewport->height += viewport->pos.y; + viewport->view_height += viewport->pos.y * zoom; + viewport->viewPos.y -= viewport->pos.y * zoom; + viewport->pos.y = 0; } - eax = viewport->y + viewport->height - context_get_height(); + eax = viewport->pos.y + viewport->height - context_get_height(); if (eax > 0) { viewport->height -= eax; @@ -586,13 +583,13 @@ void viewport_update_position(rct_window* window) { // Moves the viewport if focusing in on an item uint8_t flags = 0; - x -= viewport->view_x; + x -= viewport->viewPos.x; if (x < 0) { x = -x; flags |= 1; } - y -= viewport->view_y; + y -= viewport->viewPos.y; if (y < 0) { y = -y; @@ -614,8 +611,8 @@ void viewport_update_position(rct_window* window) { y = -y; } - x += viewport->view_x; - y += viewport->view_y; + x += viewport->viewPos.x; + y += viewport->viewPos.y; } viewport_move(x, y, window, viewport); @@ -784,33 +781,33 @@ void viewport_render( rct_drawpixelinfo* dpi, const rct_viewport* viewport, int32_t left, int32_t top, int32_t right, int32_t bottom, std::vector* sessions) { - if (right <= viewport->x) + if (right <= viewport->pos.x) return; - if (bottom <= viewport->y) + if (bottom <= viewport->pos.y) return; - if (left >= viewport->x + viewport->width) + if (left >= viewport->pos.x + viewport->width) return; - if (top >= viewport->y + viewport->height) + if (top >= viewport->pos.y + viewport->height) return; #ifdef DEBUG_SHOW_DIRTY_BOX int32_t l = left, t = top, r = right, b = bottom; #endif - left = std::max(left - viewport->x, 0); - right = std::min(right - viewport->x, viewport->width); - top = std::max(top - viewport->y, 0); - bottom = std::min(bottom - viewport->y, viewport->height); + left = std::max(left - viewport->pos.x, 0); + right = std::min(right - viewport->pos.x, viewport->width); + top = std::max(top - viewport->pos.y, 0); + bottom = std::min(bottom - viewport->pos.y, viewport->height); left <<= viewport->zoom; right <<= viewport->zoom; top <<= viewport->zoom; bottom <<= viewport->zoom; - left += viewport->view_x; - right += viewport->view_x; - top += viewport->view_y; - bottom += viewport->view_y; + left += viewport->viewPos.x; + right += viewport->viewPos.x; + top += viewport->viewPos.y; + bottom += viewport->viewPos.y; viewport_paint(viewport, dpi, left, top, right, bottom, sessions); @@ -910,13 +907,13 @@ void viewport_paint( right = left + width; bottom = top + height; - int16_t x = (int16_t)(left - (int16_t)(viewport->view_x & bitmask)); + int16_t x = (int16_t)(left - (int16_t)(viewport->viewPos.x & bitmask)); x >>= viewport->zoom; - x += viewport->x; + x += viewport->pos.x; - int16_t y = (int16_t)(top - (int16_t)(viewport->view_y & bitmask)); + int16_t y = (int16_t)(top - (int16_t)(viewport->viewPos.y & bitmask)); y >>= viewport->zoom; - y += viewport->y; + y += viewport->pos.y; rct_drawpixelinfo dpi1 = *dpi; dpi1.bits = dpi->bits + (x - dpi->x) + ((y - dpi->y) * (dpi->width + dpi->pitch)); @@ -1062,8 +1059,8 @@ std::optional screen_pos_to_map_pos(const ScreenCoordsXY& screenCoords ScreenCoordsXY screen_coord_to_viewport_coord(rct_viewport* viewport, const ScreenCoordsXY& screenCoords) { ScreenCoordsXY ret; - ret.x = ((screenCoords.x - viewport->x) << viewport->zoom) + viewport->view_x; - ret.y = ((screenCoords.y - viewport->y) << viewport->zoom) + viewport->view_y; + ret.x = ((screenCoords.x - viewport->pos.x) << viewport->zoom) + viewport->viewPos.x; + ret.y = ((screenCoords.y - viewport->pos.y) << viewport->zoom) + viewport->viewPos.y; return ret; } @@ -1651,15 +1648,13 @@ void get_map_coordinates_from_pos_window( if (window != nullptr && window->viewport != nullptr) { rct_viewport* myviewport = window->viewport; - screenCoords.x -= (int32_t)myviewport->x; - screenCoords.y -= (int32_t)myviewport->y; + screenCoords -= myviewport->pos; if (screenCoords.x >= 0 && screenCoords.x < (int32_t)myviewport->width && screenCoords.y >= 0 && screenCoords.y < (int32_t)myviewport->height) { screenCoords.x <<= myviewport->zoom; screenCoords.y <<= myviewport->zoom; - screenCoords.x += (int32_t)myviewport->view_x; - screenCoords.y += (int32_t)myviewport->view_y; + screenCoords += myviewport->viewPos; screenCoords.x &= (0xFFFF << myviewport->zoom) & 0xFFFF; screenCoords.y &= (0xFFFF << myviewport->zoom) & 0xFFFF; rct_drawpixelinfo dpi; @@ -1710,10 +1705,10 @@ void viewport_invalidate(rct_viewport* viewport, int32_t left, int32_t top, int3 if (viewport->visibility == VC_COVERED) return; - int32_t viewportLeft = viewport->view_x; - int32_t viewportTop = viewport->view_y; - int32_t viewportRight = viewport->view_x + viewport->view_width; - int32_t viewportBottom = viewport->view_y + viewport->view_height; + int32_t viewportLeft = viewport->viewPos.x; + int32_t viewportTop = viewport->viewPos.y; + int32_t viewportRight = viewport->viewPos.x + viewport->view_width; + int32_t viewportBottom = viewport->viewPos.y + viewport->view_height; if (right > viewportLeft && bottom > viewportTop) { left = std::max(left, viewportLeft); @@ -1730,10 +1725,10 @@ void viewport_invalidate(rct_viewport* viewport, int32_t left, int32_t top, int3 top /= zoom; right /= zoom; bottom /= zoom; - left += viewport->x; - top += viewport->y; - right += viewport->x; - bottom += viewport->y; + left += viewport->pos.x; + top += viewport->pos.y; + right += viewport->pos.x; + bottom += viewport->pos.y; gfx_set_dirty_blocks(left, top, right, bottom); } } @@ -1748,9 +1743,9 @@ static rct_viewport* viewport_find_from_point(const ScreenCoordsXY& screenCoords if (viewport == nullptr) return nullptr; - if (screenCoords.x < viewport->x || screenCoords.y < viewport->y) + if (screenCoords.x < viewport->pos.x || screenCoords.y < viewport->pos.y) return nullptr; - if (screenCoords.x >= viewport->x + viewport->width || screenCoords.y >= viewport->y + viewport->height) + if (screenCoords.x >= viewport->pos.x + viewport->width || screenCoords.y >= viewport->pos.y + viewport->height) return nullptr; return viewport; @@ -1919,8 +1914,8 @@ void viewport_set_saved_view() { rct_viewport* viewport = w->viewport; - gSavedView = ScreenCoordsXY{ viewport->view_width / 2 + viewport->view_x, - viewport->view_height / 2 + viewport->view_y }; + gSavedView = ScreenCoordsXY{ viewport->view_width / 2 + viewport->viewPos.x, + viewport->view_height / 2 + viewport->viewPos.y }; gSavedViewZoom = viewport->zoom; gSavedViewRotation = get_current_rotation(); diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index e7d9ebeabf..9dcdffaf7c 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -666,7 +666,7 @@ rct_window* window_bring_to_front(rct_window* w) int32_t i = 20 - w->x; w->x += i; if (w->viewport != nullptr) - w->viewport->x += i; + w->viewport->pos.x += i; w->Invalidate(); } } @@ -742,7 +742,7 @@ void window_push_others_right(rct_window* window) w->x += push_amount; w->Invalidate(); if (w->viewport != nullptr) - w->viewport->x += push_amount; + w->viewport->pos.x += push_amount; }); } @@ -780,7 +780,7 @@ void window_push_others_below(rct_window* w1) // Update viewport position if necessary if (w2->viewport != nullptr) - w2->viewport->y += push_amount; + w2->viewport->pos.y += push_amount; }); } @@ -844,8 +844,8 @@ void window_scroll_to_location(rct_window* w, int32_t x, int32_t y, int32_t z) bool found = false; while (!found) { - int16_t x2 = w->viewport->x + (int16_t)(w->viewport->width * window_scroll_locations[i][0]); - int16_t y2 = w->viewport->y + (int16_t)(w->viewport->height * window_scroll_locations[i][1]); + int16_t x2 = w->viewport->pos.x + (int16_t)(w->viewport->width * window_scroll_locations[i][0]); + int16_t y2 = w->viewport->pos.y + (int16_t)(w->viewport->height * window_scroll_locations[i][1]); auto it = window_get_iterator(w); for (; it != g_window_list.end(); it++) @@ -910,22 +910,20 @@ void window_rotate_camera(rct_window* w, int32_t direction) if (viewport == nullptr) return; - int16_t x = (viewport->width >> 1) + viewport->x; - int16_t y = (viewport->height >> 1) + viewport->y; + auto windowPos = ScreenCoordsXY{ (viewport->width >> 1), (viewport->height >> 1) } + viewport->pos; // has something to do with checking if middle of the viewport is obstructed rct_viewport* other; - auto mapXYCoords = screen_get_map_xy({ x, y }, &other); + auto mapXYCoords = screen_get_map_xy(windowPos, &other); CoordsXYZ coords{}; // other != viewport probably triggers on viewports in ride or guest window? // naoXYCoords is nullopt if middle of viewport is obstructed by another window? if (!mapXYCoords || other != viewport) { - int16_t view_x = (viewport->view_width >> 1) + viewport->view_x; - int16_t view_y = (viewport->view_height >> 1) + viewport->view_y; + auto viewPos = ScreenCoordsXY{ (viewport->view_width >> 1), (viewport->view_height >> 1) } + viewport->viewPos; - coords = viewport_adjust_for_map_height({ view_x, view_y }); + coords = viewport_adjust_for_map_height(viewPos); } else { @@ -942,8 +940,7 @@ void window_rotate_camera(rct_window* w, int32_t direction) { w->saved_view_x = centreLoc->x; w->saved_view_y = centreLoc->y; - viewport->view_x = centreLoc->x; - viewport->view_y = centreLoc->y; + viewport->viewPos = *centreLoc; } w->Invalidate(); @@ -1274,8 +1271,8 @@ void window_move_position(rct_window* w, const ScreenCoordsXY& deltaCoords) w->y += deltaCoords.y; if (w->viewport != nullptr) { - w->viewport->x += deltaCoords.x; - w->viewport->y += deltaCoords.y; + w->viewport->pos.x += deltaCoords.x; + w->viewport->pos.y += deltaCoords.y; } // Invalidate new region @@ -1618,8 +1615,8 @@ void window_relocate_windows(int32_t width, int32_t height) // Adjust the viewport if required. if (w->viewport != nullptr) { - w->viewport->x -= x - w->x; - w->viewport->y -= y - w->y; + w->viewport->pos.x -= x - w->x; + w->viewport->pos.y -= y - w->y; } }); } diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 09854ee100..7cf543d15f 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -89,16 +89,14 @@ struct rct_widget */ struct rct_viewport { - int16_t width; // 0x00 - int16_t height; // 0x02 - int16_t x; // 0x04 - int16_t y; // 0x06 - int16_t view_x; // 0x08 - int16_t view_y; // 0x0A - int16_t view_width; // 0x0C - int16_t view_height; // 0x0E - uint32_t flags; // 0x12 - uint8_t zoom; // 0x10 + int16_t width; + int16_t height; + ScreenCoordsXY pos; + ScreenCoordsXY viewPos; + int16_t view_width; + int16_t view_height; + uint32_t flags; + uint8_t zoom; uint8_t var_11; uint8_t visibility; // VISIBILITY_CACHE }; diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index e7a44dc06e..13bf14a5dd 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -1376,13 +1376,13 @@ void peep_update_crowd_noise() { if (peep->sprite_left == LOCATION_NULL) continue; - if (viewport->view_x > peep->sprite_right) + if (viewport->viewPos.x > peep->sprite_right) continue; - if (viewport->view_x + viewport->view_width < peep->sprite_left) + if (viewport->viewPos.x + viewport->view_width < peep->sprite_left) continue; - if (viewport->view_y > peep->sprite_bottom) + if (viewport->viewPos.y > peep->sprite_bottom) continue; - if (viewport->view_y + viewport->view_height < peep->sprite_top) + if (viewport->viewPos.y + viewport->view_height < peep->sprite_top) continue; visiblePeeps += peep->state == PEEP_STATE_QUEUING ? 1 : 2; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index ffcbbc4980..f17d8789cf 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3549,8 +3549,8 @@ int32_t ride_music_params_update( rct_viewport* viewport = g_music_tracking_viewport; int16_t view_width = viewport->view_width; int16_t view_width2 = view_width * 2; - int16_t view_x = viewport->view_x - view_width2; - int16_t view_y = viewport->view_y - view_width; + int16_t view_x = viewport->viewPos.x - view_width2; + int16_t view_y = viewport->viewPos.y - view_width; int16_t view_x2 = view_width2 + view_width2 + viewport->view_width + view_x; int16_t view_y2 = view_width + view_width + viewport->view_height + view_y; @@ -3559,7 +3559,7 @@ int32_t ride_music_params_update( return ride_music_params_update_label_58(position, tuneId); } - int32_t x2 = viewport->x + ((rotatedCoords.x - viewport->view_x) >> viewport->zoom); + int32_t x2 = viewport->pos.x + ((rotatedCoords.x - viewport->viewPos.x) >> viewport->zoom); x2 *= 0x10000; uint16_t screenwidth = context_get_width(); if (screenwidth < 64) @@ -3568,7 +3568,7 @@ int32_t ride_music_params_update( } int32_t pan_x = ((x2 / screenwidth) - 0x8000) >> 4; - int32_t y2 = viewport->y + ((rotatedCoords.y - viewport->view_y) >> viewport->zoom); + int32_t y2 = viewport->pos.y + ((rotatedCoords.y - viewport->viewPos.y) >> viewport->zoom); y2 *= 0x10000; uint16_t screenheight = context_get_height(); if (screenheight < 64) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 6463a9771d..2d4771e54b 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -2017,8 +2017,7 @@ void track_design_draw_preview(TrackDesign* td6, uint8_t* pixels) view.height = 217; view.view_width = size_x; view.view_height = size_y; - view.x = 0; - view.y = 0; + view.pos = { 0, 0 }; view.zoom = zoom_level; view.flags = VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_INVISIBLE_SPRITES; @@ -2048,8 +2047,7 @@ void track_design_draw_preview(TrackDesign* td6, uint8_t* pixels) int32_t right = left + size_x; int32_t bottom = top + size_y; - view.view_x = left; - view.view_y = top; + view.viewPos = { left, top }; viewport_paint(&view, &dpi, left, top, right, bottom); dpi.bits += TRACK_PREVIEW_IMAGE_SIZE; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index f959fd6183..dceb628c9c 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -880,8 +880,8 @@ bool Vehicle::SoundCanPlay() const if (g_music_tracking_viewport == nullptr) return false; - int16_t left = g_music_tracking_viewport->view_x; - int16_t bottom = g_music_tracking_viewport->view_y; + int16_t left = g_music_tracking_viewport->viewPos.x; + int16_t bottom = g_music_tracking_viewport->viewPos.y; int16_t quarter_w = g_music_tracking_viewport->view_width / 4; int16_t quarter_h = g_music_tracking_viewport->view_height / 4; @@ -937,9 +937,9 @@ rct_vehicle_sound_params Vehicle::CreateSoundParam(uint16_t priority) const { rct_vehicle_sound_params param; param.priority = priority; - int32_t panX = (sprite_left / 2) + (sprite_right / 2) - g_music_tracking_viewport->view_x; + int32_t panX = (sprite_left / 2) + (sprite_right / 2) - g_music_tracking_viewport->viewPos.x; panX >>= g_music_tracking_viewport->zoom; - panX += g_music_tracking_viewport->x; + panX += g_music_tracking_viewport->pos.x; uint16_t screenWidth = context_get_width(); if (screenWidth < 64) @@ -948,9 +948,9 @@ rct_vehicle_sound_params Vehicle::CreateSoundParam(uint16_t priority) const } param.pan_x = ((((panX * 65536) / screenWidth) - 0x8000) >> 4); - int32_t panY = (sprite_top / 2) + (sprite_bottom / 2) - g_music_tracking_viewport->view_y; + int32_t panY = (sprite_top / 2) + (sprite_bottom / 2) - g_music_tracking_viewport->viewPos.y; panY >>= g_music_tracking_viewport->zoom; - panY += g_music_tracking_viewport->y; + panY += g_music_tracking_viewport->pos.y; uint16_t screenHeight = context_get_height(); if (screenHeight < 64) diff --git a/src/openrct2/world/Location.hpp b/src/openrct2/world/Location.hpp index 5f15192054..cf8187fc1f 100644 --- a/src/openrct2/world/Location.hpp +++ b/src/openrct2/world/Location.hpp @@ -53,6 +53,25 @@ struct ScreenCoordsXY { return { x - rhs.x, y - rhs.y }; } + + ScreenCoordsXY& operator+=(const ScreenCoordsXY& rhs) + { + x += rhs.x; + y += rhs.y; + return *this; + } + + ScreenCoordsXY& operator-=(const ScreenCoordsXY& rhs) + { + x -= rhs.x; + y -= rhs.y; + return *this; + } + + const ScreenCoordsXY operator+(const ScreenCoordsXY& rhs) const + { + return { x + rhs.x, y + rhs.y }; + } }; /** diff --git a/src/openrct2/world/MoneyEffect.cpp b/src/openrct2/world/MoneyEffect.cpp index 5425c7e2c0..0714a8658a 100644 --- a/src/openrct2/world/MoneyEffect.cpp +++ b/src/openrct2/world/MoneyEffect.cpp @@ -93,7 +93,7 @@ void MoneyEffect::Create(money32 value, CoordsXYZ loc) rct_viewport* mainViewport = window_get_viewport(mainWindow); auto mapPositionXY = screen_get_map_xy( - { mainViewport->x + (mainViewport->width / 2), mainViewport->y + (mainViewport->height / 2) }, nullptr); + { mainViewport->pos.x + (mainViewport->width / 2), mainViewport->pos.y + (mainViewport->height / 2) }, nullptr); if (!mapPositionXY) return;