summaryrefslogtreecommitdiff
path: root/src/station_cmd.cpp
diff options
context:
space:
mode:
authorNiels Martin Hansen <nielsm@indvikleren.dk>2019-03-23 12:39:13 +0100
committerNiels Martin Hansen <nielsm@indvikleren.dk>2019-03-24 19:26:13 +0100
commitce10d9be3f3ae1422e4e1f79fc5c867ab38526e7 (patch)
treef2f38a9ccc503f04c0a7667703c405ab3cdb8443 /src/station_cmd.cpp
parent3860a2ce2acf3e295af087c4ca3bb409a61632fc (diff)
downloadopenttd-ce10d9be3f3ae1422e4e1f79fc5c867ab38526e7.tar.xz
Fix #7374: Ensure k-d trees are always updated when station sign moves
Diffstat (limited to 'src/station_cmd.cpp')
-rw-r--r--src/station_cmd.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index 72c70456f..6121424d5 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -429,6 +429,23 @@ void Station::UpdateVirtCoord()
SetWindowDirty(WC_STATION_VIEW, this->index);
}
+/**
+ * Move the station main coordinate somewhere else.
+ * @param new_xy new tile location of the sign
+ */
+void Station::MoveSign(TileIndex new_xy)
+{
+ if (this->xy == new_xy) return;
+
+ _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
+ _station_kdtree.Remove(this->index);
+
+ this->BaseStation::MoveSign(new_xy);
+
+ _station_kdtree.Insert(this->index);
+ _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
+}
+
/** Update the virtual coords needed to draw the station sign for all stations. */
void UpdateAllStationVirtCoords()
{
@@ -672,14 +689,7 @@ static void UpdateStationSignCoord(BaseStation *st)
/* clamp sign coord to be inside the station rect */
TileIndex new_xy = TileXY(ClampU(TileX(st->xy), r->left, r->right), ClampU(TileY(st->xy), r->top, r->bottom));
- if (new_xy != st->xy) {
- _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(st->index));
- _station_kdtree.Remove(st->index);
- st->xy = new_xy;
- _station_kdtree.Insert(st->index);
- _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
- st->UpdateVirtCoord();
- }
+ st->MoveSign(new_xy);
if (!Station::IsExpected(st)) return;
Station *full_station = Station::From(st);