mirror of https://github.com/OpenRCT2/OpenRCT2.git
Use Coords objects for viewport_create()
This commit is contained in:
parent
e322519025
commit
87f724d038
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -136,8 +136,8 @@ std::optional<ScreenCoordsXY> 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.");
|
||||
|
|
|
@ -131,8 +131,8 @@ extern uint8_t gCurrentRotation;
|
|||
void viewport_init_all();
|
||||
std::optional<ScreenCoordsXY> 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);
|
||||
|
|
Loading…
Reference in New Issue