From 278dd9b1d2859cf8f725f4eee0e4bf62ca02b201 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 12 Nov 2019 20:11:48 +0000 Subject: [PATCH 1/3] Remove global variables from get_map_coordinates_from_pos_window --- src/openrct2/interface/Viewport.cpp | 55 +++++++++++++++++------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index afad6a699f..7f17dadfb3 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -43,7 +43,6 @@ uint8_t gShowConstuctionRightsRefCount; rct_viewport g_viewport_list[MAX_VIEWPORT_COUNT]; rct_viewport* g_music_tracking_viewport; -static TileElement* _interaction_element = nullptr; static std::unique_ptr _paintJobs; int16_t gSavedViewX; @@ -58,10 +57,12 @@ static uint32_t _currentImageType; static rct_drawpixelinfo _viewportDpi1; static rct_drawpixelinfo _viewportDpi2; -static uint8_t _interactionSpriteType; -static int16_t _interactionMapX; -static int16_t _interactionMapY; -static uint16_t _interactionFlags; +struct InteractionInfo +{ + CoordsXY loc; + TileElement* element; + uint8_t SpriteType; +}; static void viewport_paint_weather_gloom(rct_drawpixelinfo* dpi); @@ -1260,12 +1261,12 @@ void viewport_set_visibility(uint8_t mode) * Originally checked 0x0141F569 at start * rct2: 0x00688697 */ -static void store_interaction_info(paint_struct* ps) +static std::optional GetInteractionInfoFromPS(paint_struct* ps, uint16_t flags) { if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_NONE || ps->sprite_type == 11 // 11 as a type seems to not exist, maybe part of the typo mentioned later on. || ps->sprite_type > VIEWPORT_INTERACTION_ITEM_BANNER) - return; + return {}; uint16_t mask; if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_BANNER) @@ -1274,13 +1275,17 @@ static void store_interaction_info(paint_struct* ps) else mask = 1 << (ps->sprite_type - 1); - if (!(_interactionFlags & mask)) + if (flags & mask) { - _interactionSpriteType = ps->sprite_type; - _interactionMapX = ps->map_x; - _interactionMapY = ps->map_y; - _interaction_element = ps->tileElement; + return {}; } + + InteractionInfo info = { + { ps->map_x, ps->map_y }, + ps->tileElement, + ps->sprite_type, + }; + return { info }; } /** @@ -1574,10 +1579,11 @@ static bool is_sprite_interacted_with(rct_drawpixelinfo* dpi, int32_t imageId, i * * rct2: 0x0068862C */ -static void set_interaction_info_from_paint_session(paint_session* session) +static InteractionInfo set_interaction_info_from_paint_session(paint_session* session, uint16_t flags) { paint_struct* ps = &session->PaintHead; rct_drawpixelinfo* dpi = &session->DPI; + InteractionInfo info{}; while ((ps = ps->next_quadrant_ps) != nullptr) { @@ -1588,7 +1594,10 @@ static void set_interaction_info_from_paint_session(paint_session* session) ps = next_ps; if (is_sprite_interacted_with(dpi, ps->image_id, ps->x, ps->y)) { - store_interaction_info(ps); + if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo) + { + info = *newInfo; + } } next_ps = ps->children; } @@ -1598,12 +1607,16 @@ static void set_interaction_info_from_paint_session(paint_session* session) if (is_sprite_interacted_with( dpi, attached_ps->image_id, (attached_ps->x + ps->x) & 0xFFFF, (attached_ps->y + ps->y) & 0xFFFF)) { - store_interaction_info(ps); + if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo) + { + info = *newInfo; + } } } ps = old_ps; } + return info; } /** @@ -1645,8 +1658,7 @@ void get_map_coordinates_from_pos_window( rct_window* window, ScreenCoordsXY screenCoords, int32_t flags, CoordsXY& mapCoords, int32_t* interactionType, TileElement** tileElement, rct_viewport** viewport) { - _interactionFlags = flags & 0xFFFF; - _interactionSpriteType = 0; + InteractionInfo info{}; if (window != nullptr && window->viewport != nullptr) { rct_viewport* myviewport = window->viewport; @@ -1674,20 +1686,19 @@ void get_map_coordinates_from_pos_window( paint_session* session = paint_session_alloc(dpi, myviewport->flags); paint_session_generate(session); paint_session_arrange(session); - set_interaction_info_from_paint_session(session); + info = set_interaction_info_from_paint_session(session, flags & 0xFFFF); paint_session_free(session); } if (viewport != nullptr) *viewport = myviewport; } if (interactionType != nullptr) - *interactionType = _interactionSpriteType; + *interactionType = info.SpriteType; - mapCoords.x = _interactionMapX; - mapCoords.y = _interactionMapY; + mapCoords = info.loc; if (tileElement != nullptr) - *tileElement = _interaction_element; + *tileElement = info.element; } /** From 57baeeaa3c6c37a085595a1c12caa139d2e38c3b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 13 Nov 2019 18:58:17 +0000 Subject: [PATCH 2/3] Refactor to remove std::optional --- src/openrct2/interface/Viewport.cpp | 44 ++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 7f17dadfb3..9b36573a30 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -59,8 +59,15 @@ static rct_drawpixelinfo _viewportDpi1; static rct_drawpixelinfo _viewportDpi2; struct InteractionInfo { - CoordsXY loc; - TileElement* element; + InteractionInfo() = default; + InteractionInfo(const paint_struct* ps) + : Loc(ps->map_x, ps->map_y) + , Element(ps->tileElement) + , SpriteType(ps->sprite_type) + { + } + CoordsXY Loc; + TileElement* Element = nullptr; uint8_t SpriteType; }; @@ -1257,16 +1264,14 @@ void viewport_set_visibility(uint8_t mode) } /** - * Stores some info about the element pointed at, if requested for this particular type through the interaction mask. - * Originally checked 0x0141F569 at start - * rct2: 0x00688697 + * Checks if a paint_struct sprite type is in the filter mask. */ -static std::optional GetInteractionInfoFromPS(paint_struct* ps, uint16_t flags) +static bool PSSpriteTypeIsInFilter(paint_struct* ps, uint16_t filter) { if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_NONE || ps->sprite_type == 11 // 11 as a type seems to not exist, maybe part of the typo mentioned later on. || ps->sprite_type > VIEWPORT_INTERACTION_ITEM_BANNER) - return {}; + return false; uint16_t mask; if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_BANNER) @@ -1275,17 +1280,12 @@ static std::optional GetInteractionInfoFromPS(paint_struct* ps, else mask = 1 << (ps->sprite_type - 1); - if (flags & mask) + if (filter & mask) { - return {}; + return false; } - InteractionInfo info = { - { ps->map_x, ps->map_y }, - ps->tileElement, - ps->sprite_type, - }; - return { info }; + return true; } /** @@ -1579,7 +1579,7 @@ static bool is_sprite_interacted_with(rct_drawpixelinfo* dpi, int32_t imageId, i * * rct2: 0x0068862C */ -static InteractionInfo set_interaction_info_from_paint_session(paint_session* session, uint16_t flags) +static InteractionInfo set_interaction_info_from_paint_session(paint_session* session, uint16_t filter) { paint_struct* ps = &session->PaintHead; rct_drawpixelinfo* dpi = &session->DPI; @@ -1594,9 +1594,9 @@ static InteractionInfo set_interaction_info_from_paint_session(paint_session* se ps = next_ps; if (is_sprite_interacted_with(dpi, ps->image_id, ps->x, ps->y)) { - if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo) + if (PSSpriteTypeIsInFilter(ps, filter)) { - info = *newInfo; + info = { ps }; } } next_ps = ps->children; @@ -1607,9 +1607,9 @@ static InteractionInfo set_interaction_info_from_paint_session(paint_session* se if (is_sprite_interacted_with( dpi, attached_ps->image_id, (attached_ps->x + ps->x) & 0xFFFF, (attached_ps->y + ps->y) & 0xFFFF)) { - if (auto newInfo = GetInteractionInfoFromPS(ps, flags); newInfo) + if (PSSpriteTypeIsInFilter(ps, filter)) { - info = *newInfo; + info = { ps }; } } } @@ -1695,10 +1695,10 @@ void get_map_coordinates_from_pos_window( if (interactionType != nullptr) *interactionType = info.SpriteType; - mapCoords = info.loc; + mapCoords = info.Loc; if (tileElement != nullptr) - *tileElement = info.element; + *tileElement = info.Element; } /** From 0af10781f1278d9975acdcbbf3677a0283347d85 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Wed, 13 Nov 2019 19:04:01 +0000 Subject: [PATCH 3/3] Remove unused globals --- src/openrct2/interface/Viewport.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 9b36573a30..95cd06e7fa 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -55,8 +55,6 @@ uint8_t gCurrentRotation; static uint32_t _currentImageType; -static rct_drawpixelinfo _viewportDpi1; -static rct_drawpixelinfo _viewportDpi2; struct InteractionInfo { InteractionInfo() = default; @@ -1671,19 +1669,16 @@ void get_map_coordinates_from_pos_window( screenCoords.y <<= myviewport->zoom; screenCoords.x += (int32_t)myviewport->view_x; screenCoords.y += (int32_t)myviewport->view_y; - _viewportDpi1.zoom_level = myviewport->zoom; screenCoords.x &= (0xFFFF << myviewport->zoom) & 0xFFFF; screenCoords.y &= (0xFFFF << myviewport->zoom) & 0xFFFF; - _viewportDpi1.x = screenCoords.x; - _viewportDpi1.y = screenCoords.y; - rct_drawpixelinfo* dpi = &_viewportDpi2; - dpi->y = _viewportDpi1.y; - dpi->height = 1; - dpi->zoom_level = _viewportDpi1.zoom_level; - dpi->x = _viewportDpi1.x; - dpi->width = 1; + rct_drawpixelinfo dpi; + dpi.x = screenCoords.x; + dpi.y = screenCoords.y; + dpi.height = 1; + dpi.zoom_level = myviewport->zoom; + dpi.width = 1; - paint_session* session = paint_session_alloc(dpi, myviewport->flags); + paint_session* session = paint_session_alloc(&dpi, myviewport->flags); paint_session_generate(session); paint_session_arrange(session); info = set_interaction_info_from_paint_session(session, flags & 0xFFFF);