Invalidate virtual floor once selection has changed.

Cache the position of the last invalidate call to prevent a big dip in performance.
This commit is contained in:
Aaron van Geffen 2017-12-27 18:04:10 +01:00
parent fb745d1575
commit 4246b84130
2 changed files with 16 additions and 4 deletions

View File

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

View File

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