Reduce screen re-draw area for tunnel/bridge end signal updates

This commit is contained in:
Jonathan G Rennison
2021-08-30 03:09:01 +01:00
parent f6c2a81f72
commit b08cc3cf38
6 changed files with 91 additions and 14 deletions

View File

@@ -2766,13 +2766,9 @@ static void DrawSingleSignal(TileIndex tile, const RailtypeInfo *rti, Track trac
DrawSingleSignal(tile, rti, track, condition, image, pos, type, variant, show_restricted);
}
void MarkSingleSignalDirty(TileIndex tile, Trackdir td)
template <typename F>
void MarkSingleSignalDirtyIntl(TileIndex tile, Trackdir td, F get_z)
{
if (_signal_sprite_oversized || td >= TRACKDIR_END) {
MarkTileDirtyByTile(tile, VMDF_NOT_MAP_MODE);
return;
}
static const uint8 trackdir_to_pos[TRACKDIR_END] = {
8, // TRACKDIR_X_NE
10, // TRACKDIR_Y_SE
@@ -2794,7 +2790,7 @@ void MarkSingleSignalDirty(TileIndex tile, Trackdir td)
uint x, y;
GetSignalXY(tile, trackdir_to_pos[td], x, y);
Point pt = RemapCoords(x, y, GetSaveSlopeZ(x, y, TrackdirToTrack(td)));
Point pt = RemapCoords(x, y, get_z(x, y));
MarkAllViewportsDirty(
pt.x - SIGNAL_DIRTY_LEFT,
pt.y - SIGNAL_DIRTY_TOP,
@@ -2804,6 +2800,25 @@ void MarkSingleSignalDirty(TileIndex tile, Trackdir td)
);
}
void MarkSingleSignalDirty(TileIndex tile, Trackdir td)
{
if (_signal_sprite_oversized || td >= TRACKDIR_END) {
MarkTileDirtyByTile(tile, VMDF_NOT_MAP_MODE);
return;
}
MarkSingleSignalDirtyIntl(tile, td, [td](uint x, uint y) -> uint {
return GetSaveSlopeZ(x, y, TrackdirToTrack(td));
});
}
void MarkSingleSignalDirtyAtZ(TileIndex tile, Trackdir td, uint z)
{
MarkSingleSignalDirtyIntl(tile, td, [z](uint x, uint y) -> uint {
return z;
});
}
static uint32 _drawtile_track_palette;