diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index 41a04efc7b..89a30b7913 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -133,10 +133,9 @@ rct_window* window_banner_open(rct_windownumber number) window_init_scroll_widgets(w); auto banner = GetBanner(w->number); - int32_t view_x = banner->position.x << 5; - int32_t view_y = banner->position.y << 5; + auto bannerViewPos = banner->position.ToCoordsXY().ToTileCentre(); - TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); + TileElement* tile_element = map_get_first_element_at(bannerViewPos); if (tile_element == nullptr) return nullptr; while (1) @@ -152,14 +151,12 @@ rct_window* window_banner_open(rct_windownumber number) int32_t view_z = tile_element->GetBaseZ(); w->frame_no = view_z; - view_x += 16; - view_y += 16; - // Create viewport viewportWidget = &window_banner_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 2, - (viewportWidget->bottom - viewportWidget->top) - 2, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 2, (viewportWidget->bottom - viewportWidget->top) - 2, 0, + { bannerViewPos, view_z }, 0, SPRITE_INDEX_NULL); w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; w->Invalidate(); @@ -347,15 +344,14 @@ static void window_banner_viewport_rotate(rct_window* w) auto banner = GetBanner(w->number); - int32_t view_x = (banner->position.x << 5) + 16; - int32_t view_y = (banner->position.y << 5) + 16; - int32_t view_z = w->frame_no; + auto bannerViewPos = CoordsXYZ{ banner->position.ToCoordsXY().ToTileCentre(), w->frame_no }; // Create viewport rct_widget* viewportWidget = &window_banner_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, - (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, + bannerViewPos, 0, SPRITE_INDEX_NULL); if (w->viewport != nullptr) w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; diff --git a/src/openrct2-ui/windows/EditorMain.cpp b/src/openrct2-ui/windows/EditorMain.cpp index 738dbe6913..b5db9e0bc8 100644 --- a/src/openrct2-ui/windows/EditorMain.cpp +++ b/src/openrct2-ui/windows/EditorMain.cpp @@ -66,7 +66,8 @@ rct_window* window_editor_main_open() &window_editor_main_events, WC_MAIN_WINDOW, WF_STICK_TO_BACK); window->widgets = window_editor_main_widgets; - viewport_create(window, window->x, window->y, window->width, window->height, 0, 0x0FFF, 0x0FFF, 0, 0x1, SPRITE_INDEX_NULL); + viewport_create( + window, { window->x, window->y }, window->width, window->height, 0, { 0x0FFF, 0x0FFF, 0 }, 0x1, SPRITE_INDEX_NULL); window->viewport->flags |= 0x0400; gCurrentRotation = 0; diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index b8f9601235..27a7d9a778 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -824,13 +824,13 @@ void window_guest_viewport_init(rct_window* w) if (peep->state != PEEP_STATE_PICKED && w->viewport == nullptr) { auto view_widget = &w->widgets[WIDX_VIEWPORT]; - int32_t x = view_widget->left + 1 + w->x; - int32_t y = view_widget->top + 1 + w->y; + auto screenPos = ScreenCoordsXY{ view_widget->left + 1 + w->x, view_widget->top + 1 + w->y }; int32_t width = view_widget->right - view_widget->left - 1; int32_t height = view_widget->bottom - view_widget->top - 1; viewport_create( - w, x, y, width, height, 0, focus.coordinate.x, focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, focus.coordinate.z, + w, screenPos, width, height, 0, + { focus.coordinate.x, focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, focus.coordinate.z }, focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); if (w->viewport != nullptr && reCreateViewport) { diff --git a/src/openrct2-ui/windows/Main.cpp b/src/openrct2-ui/windows/Main.cpp index a98f3acf21..bcce59b4f0 100644 --- a/src/openrct2-ui/windows/Main.cpp +++ b/src/openrct2-ui/windows/Main.cpp @@ -68,7 +68,8 @@ rct_window* window_main_open() WF_STICK_TO_BACK); window->widgets = window_main_widgets; - viewport_create(window, window->x, window->y, window->width, window->height, 0, 0x0FFF, 0x0FFF, 0, 0x1, SPRITE_INDEX_NULL); + viewport_create( + window, { window->x, window->y }, window->width, window->height, 0, { 0x0FFF, 0x0FFF, 0 }, 0x1, SPRITE_INDEX_NULL); window->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; gCurrentRotation = 0; gShowGridLinesRefCount = 0; diff --git a/src/openrct2-ui/windows/Park.cpp b/src/openrct2-ui/windows/Park.cpp index 9bd1f8a1a3..36b1897259 100644 --- a/src/openrct2-ui/windows/Park.cpp +++ b/src/openrct2-ui/windows/Park.cpp @@ -931,9 +931,9 @@ static void window_park_init_viewport(rct_window* w) { rct_widget* viewportWidget = &window_park_entrance_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, - (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, x, y, - z, w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_MASK, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, + { x, y, z }, w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_MASK, SPRITE_INDEX_NULL); w->flags |= (1 << 2); w->Invalidate(); } diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index d77081a863..d94a7e363b 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -581,7 +581,8 @@ static void window_player_set_page(rct_window* w, int32_t page) { if (w->viewport == nullptr) { - viewport_create(w, w->x, w->y, w->width, w->height, 0, 128 * 32, 128 * 32, 0, 1, SPRITE_INDEX_NULL); + viewport_create( + w, { w->x, w->y }, w->width, w->height, 0, TileCoordsXYZ(128, 128, 0).ToCoordsXYZ(), 1, SPRITE_INDEX_NULL); w->flags |= WF_NO_SCROLLING; window_event_invalidate_call(w); window_player_update_viewport(w, false); diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 8465e5c856..a9ebdfdf62 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1974,13 +1974,13 @@ static void window_ride_init_viewport(rct_window* w) { rct_widget* view_widget = &w->widgets[WIDX_VIEWPORT]; - int32_t x = view_widget->left + 1 + w->x; - int32_t y = view_widget->top + 1 + w->y; + auto screenPos = ScreenCoordsXY{ view_widget->left + 1 + w->x, view_widget->top + 1 + w->y }; int32_t width = view_widget->right - view_widget->left - 1; int32_t height = view_widget->bottom - view_widget->top - 1; viewport_create( - w, x, y, width, height, focus.coordinate.zoom, focus.coordinate.x, focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, - focus.coordinate.z, focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); + w, screenPos, width, height, focus.coordinate.zoom, + { focus.coordinate.x, focus.coordinate.y & VIEWPORT_FOCUS_Y_MASK, focus.coordinate.z }, + focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id); w->flags |= WF_NO_SCROLLING; w->Invalidate(); diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index 8499a4aa8e..499fed40af 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -156,10 +156,9 @@ rct_window* window_sign_open(rct_windownumber number) window_init_scroll_widgets(w); auto banner = GetBanner(w->number); - int32_t view_x = banner->position.x << 5; - int32_t view_y = banner->position.y << 5; + auto signViewPos = banner->position.ToCoordsXY().ToTileCentre(); - TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); + TileElement* tile_element = map_get_first_element_at(signViewPos); if (tile_element == nullptr) return nullptr; @@ -186,14 +185,12 @@ rct_window* window_sign_open(rct_windownumber number) w->var_492 = tile_element->AsLargeScenery()->GetSecondaryColour(); w->var_48C = tile_element->AsLargeScenery()->GetEntryIndex(); - view_x += 16; - view_y += 16; - // Create viewport viewportWidget = &window_sign_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, - (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, + { signViewPos, view_z }, 0, SPRITE_INDEX_NULL); w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; w->Invalidate(); @@ -365,15 +362,14 @@ static void window_sign_viewport_rotate(rct_window* w) auto banner = GetBanner(w->number); - int32_t view_x = (banner->position.x << 5) + 16; - int32_t view_y = (banner->position.y << 5) + 16; - int32_t view_z = w->frame_no; + auto signViewPos = CoordsXYZ{ banner->position.ToCoordsXY().ToTileCentre(), w->frame_no }; // Create viewport rct_widget* viewportWidget = &window_sign_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, - (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, signViewPos, + 0, SPRITE_INDEX_NULL); if (w->viewport != nullptr) w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; w->Invalidate(); @@ -405,10 +401,9 @@ rct_window* window_sign_small_open(rct_windownumber number) w->colours[2] = COLOUR_DARK_BROWN; auto banner = GetBanner(w->number); - int32_t view_x = banner->position.x << 5; - int32_t view_y = banner->position.y << 5; + auto signViewPos = banner->position.ToCoordsXY().ToTileCentre(); - TileElement* tile_element = map_get_first_element_at({ view_x, view_y }); + TileElement* tile_element = map_get_first_element_at(signViewPos); if (tile_element == nullptr) return nullptr; @@ -433,14 +428,12 @@ rct_window* window_sign_small_open(rct_windownumber number) w->var_492 = tile_element->AsWall()->GetSecondaryColour(); w->var_48C = tile_element->AsWall()->GetEntryIndex(); - view_x += 16; - view_y += 16; - // Create viewport viewportWidget = &window_sign_widgets[WIDX_VIEWPORT]; viewport_create( - w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 1, - (viewportWidget->bottom - viewportWidget->top) - 1, 0, view_x, view_y, view_z, 0, SPRITE_INDEX_NULL); + w, { w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1 }, + (viewportWidget->right - viewportWidget->left) - 1, (viewportWidget->bottom - viewportWidget->top) - 1, 0, + { signViewPos, view_z }, 0, SPRITE_INDEX_NULL); w->viewport->flags = gConfigGeneral.always_show_gridlines ? VIEWPORT_FLAG_GRIDLINES : 0; w->flags |= WF_NO_SCROLLING; diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index 2464179487..3fedc0e05e 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -1380,12 +1380,12 @@ void window_staff_viewport_init(rct_window* w) { rct_widget* view_widget = &w->widgets[WIDX_VIEWPORT]; - int32_t x = view_widget->left + 1 + w->x; - int32_t y = view_widget->top + 1 + w->y; + auto screenPos = ScreenCoordsXY{ view_widget->left + 1 + w->x, view_widget->top + 1 + w->y }; int32_t width = view_widget->right - view_widget->left - 1; int32_t height = view_widget->bottom - view_widget->top - 1; - viewport_create(w, x, y, width, height, 0, 0, 0, 0, focus.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite_id); + viewport_create( + w, screenPos, width, height, 0, { 0, 0, 0 }, focus.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite_id); w->flags |= WF_NO_SCROLLING; w->Invalidate(); } diff --git a/src/openrct2-ui/windows/TitleCommandEditor.cpp b/src/openrct2-ui/windows/TitleCommandEditor.cpp index 244dc086bc..faf7fc14b0 100644 --- a/src/openrct2-ui/windows/TitleCommandEditor.cpp +++ b/src/openrct2-ui/windows/TitleCommandEditor.cpp @@ -249,8 +249,8 @@ void window_title_command_editor_open(TitleSequence* sequence, int32_t index, bo rct_widget* const viewportWidget = &window_title_command_editor_widgets[WIDX_VIEWPORT]; viewport_create( - window, window->x + viewportWidget->left + 1, window->y + viewportWidget->top + 1, - viewportWidget->right - viewportWidget->left - 1, viewportWidget->bottom - viewportWidget->top - 1, 0, 0, 0, 0, 0, + window, { window->x + viewportWidget->left + 1, window->y + viewportWidget->top + 1 }, + viewportWidget->right - viewportWidget->left - 1, viewportWidget->bottom - viewportWidget->top - 1, 0, { 0, 0, 0 }, 0, SPRITE_INDEX_NULL); _window_title_command_editor_index = index; diff --git a/src/openrct2-ui/windows/Viewport.cpp b/src/openrct2-ui/windows/Viewport.cpp index 3eac76e2dc..f8327f882d 100644 --- a/src/openrct2-ui/windows/Viewport.cpp +++ b/src/openrct2-ui/windows/Viewport.cpp @@ -94,7 +94,7 @@ rct_window* window_viewport_open() w->number = _viewportNumber++; // Create viewport - viewport_create(w, w->x, w->y, w->width, w->height, 0, 128 * 32, 128 * 32, 0, 1, SPRITE_INDEX_NULL); + viewport_create(w, { w->x, w->y }, w->width, w->height, 0, TileCoordsXYZ(128, 128, 0).ToCoordsXYZ(), 1, SPRITE_INDEX_NULL); rct_window* mainWindow = window_get_main(); if (mainWindow != nullptr) { diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 771ed8c498..d3feb3f968 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -136,8 +136,8 @@ std::optional centre_2d_coordinates(const CoordsXYZ& loc, rct_vi * w: esi */ void viewport_create( - rct_window* w, int32_t x, int32_t y, int32_t width, int32_t height, int32_t zoom, int32_t centre_x, int32_t centre_y, - int32_t centre_z, char flags, uint16_t sprite) + rct_window* w, const ScreenCoordsXY& screenCoords, int32_t width, int32_t height, int32_t zoom, CoordsXYZ centrePos, + char flags, uint16_t sprite) { rct_viewport* viewport = nullptr; for (int32_t i = 0; i < MAX_VIEWPORT_COUNT; i++) @@ -154,8 +154,8 @@ void viewport_create( return; } - viewport->x = x; - viewport->y = y; + viewport->x = screenCoords.x; + viewport->y = screenCoords.y; viewport->width = width; viewport->height = height; @@ -177,16 +177,14 @@ void viewport_create( { w->viewport_target_sprite = sprite; rct_sprite* centre_sprite = get_sprite(sprite); - centre_x = centre_sprite->generic.x; - centre_y = centre_sprite->generic.y; - centre_z = centre_sprite->generic.z; + centrePos = { centre_sprite->generic.x, centre_sprite->generic.y, centre_sprite->generic.z }; } else { w->viewport_target_sprite = SPRITE_INDEX_NULL; } - auto centreLoc = centre_2d_coordinates({ centre_x, centre_y, centre_z }, viewport); + auto centreLoc = centre_2d_coordinates(centrePos, viewport); if (!centreLoc) { log_error("Invalid location for viewport."); diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index b9d8e2eeef..4e5e84998f 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -131,8 +131,8 @@ extern uint8_t gCurrentRotation; void viewport_init_all(); std::optional centre_2d_coordinates(const CoordsXYZ& loc, rct_viewport* viewport); void viewport_create( - rct_window* w, int32_t x, int32_t y, int32_t width, int32_t height, int32_t zoom, int32_t centre_x, int32_t centre_y, - int32_t centre_z, char flags, uint16_t sprite); + rct_window* w, const ScreenCoordsXY& screenCoords, int32_t width, int32_t height, int32_t zoom, CoordsXYZ centrePos, + char flags, uint16_t sprite); void viewport_update_position(rct_window* window); void viewport_update_sprite_follow(rct_window* window); void viewport_update_smart_sprite_follow(rct_window* window);