Use Coords objects for viewport_create()

This commit is contained in:
Tulio Leao 2020-03-01 01:53:21 -03:00
parent e322519025
commit 87f724d038
13 changed files with 53 additions and 63 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)
{

View File

@ -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;

View File

@ -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();
}

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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();
}

View File

@ -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;

View File

@ -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)
{

View File

@ -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.");

View File

@ -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);