From 4246b841301be35b9cd8a38245bd5a83e3d7c885 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Dec 2017 18:04:10 +0100 Subject: [PATCH] Invalidate virtual floor once selection has changed. Cache the position of the last invalidate call to prevent a big dip in performance. --- src/openrct2-ui/windows/TopToolbar.cpp | 3 ++- src/openrct2/world/Map.cpp | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index af1c635be1..b0023b58ec 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1284,7 +1284,7 @@ static void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid *parameter_1 = (selected_scenery & 0xFF) << 8; *parameter_2 = (cl ^ (1 << 1)) | (gWindowSceneryPrimaryColour << 8); *parameter_3 = rotation | (gWindowScenerySecondaryColour << 16); - + map_set_virtual_floor_height(gSceneryPlaceZ); return; @@ -2368,6 +2368,7 @@ static money32 try_place_ghost_scenery(LocationXY16 map_tile, uint32 parameter_1 static void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ map_invalidate_selection_rect(); map_invalidate_map_selection_tiles(); + map_invalidate_virtual_floor_tiles(); gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_CONSTRUCT; diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 232a4257f9..c21d4a9432 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -104,6 +104,7 @@ sint16 gMapBaseZ; rct_tile_element gTileElements[MAX_TILE_TILE_ELEMENT_POINTERS * 3]; rct_tile_element *gTileElementTilePointers[MAX_TILE_TILE_ELEMENT_POINTERS]; LocationXY16 gMapSelectionTiles[300]; +static LocationXYZ16 gVirtualFloorLastLocation; rct2_peep_spawn gPeepSpawns[MAX_PEEP_SPAWNS]; rct_tile_element *gNextFreeTileElement; @@ -4745,7 +4746,7 @@ void map_set_virtual_floor_height(sint16 height) if (gMapVirtualFloorHeight != height) { map_invalidate_virtual_floor_tiles(); - gMapVirtualFloorHeight = height; + gMapVirtualFloorHeight = height; } } @@ -4753,8 +4754,9 @@ void map_remove_virtual_floor() { if (gMapVirtualFloorHeight != 0) { + gVirtualFloorLastLocation.z = -1; map_invalidate_virtual_floor_tiles(); - gMapVirtualFloorHeight = 0; + gMapVirtualFloorHeight = 0; } } @@ -4767,7 +4769,7 @@ void map_invalidate_virtual_floor_tiles() LocationXY16 min_position = { 0x7FFF, 0x7FFF }; LocationXY16 max_position = { 0, 0 }; - + if ((gMapSelectFlags & MAP_SELECT_FLAG_ENABLE)) { min_position = gMapSelectPositionA; @@ -4789,6 +4791,11 @@ void map_invalidate_virtual_floor_tiles() max_position.x += gMapVirtualFloorBaseSize + 1; max_position.y += gMapVirtualFloorBaseSize + 1; + if (gVirtualFloorLastLocation.x == min_position.x && + gVirtualFloorLastLocation.y == min_position.y && + gVirtualFloorLastLocation.z == gMapVirtualFloorHeight) + return; + for (sint16 x = min_position.x; x < max_position.x; x++) { for (sint16 y = min_position.y; y < max_position.y; y++) @@ -4796,6 +4803,10 @@ void map_invalidate_virtual_floor_tiles() map_invalidate_tile_full(x, y); } } + + gVirtualFloorLastLocation.x = min_position.x; + gVirtualFloorLastLocation.y = min_position.y; + gVirtualFloorLastLocation.z = gMapVirtualFloorHeight; } bool map_tile_is_part_of_virtual_floor(sint16 x, sint16 y)