diff --git a/src/base_station_base.h b/src/base_station_base.h index 16b451cd74..c840882a6c 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -16,6 +16,7 @@ #include "command_type.h" #include "viewport_type.h" #include "station_map.h" +#include "core/geometry_type.hpp" typedef Pool StationPool; extern StationPool _station_pool; @@ -76,6 +77,8 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { TileArea train_station; ///< Tile area the train 'station' part covers StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions + Point viewport_sign_kdtree_pt; ///< NOSAVE: Viewport sign kd tree: saved point (for tree removals) + /** * Initialize the base station. * @param tile The location of the station sign diff --git a/src/station.cpp b/src/station.cpp index 072633232f..4cba537ca7 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -168,7 +168,7 @@ Station::~Station() CargoPacket::InvalidateAllFrom(this->index); _station_kdtree.Remove(this->index); - if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); + if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index, this->viewport_sign_kdtree_pt)); } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0889ef1973..b3fa1499db 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -439,7 +439,7 @@ void Station::MoveSign(TileIndex new_xy) { if (this->xy == new_xy) return; - if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); + if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index, this->viewport_sign_kdtree_pt)); _station_kdtree.Remove(this->index); this->BaseStation::MoveSign(new_xy); diff --git a/src/viewport.cpp b/src/viewport.cpp index 8094c6147b..cbc92cae60 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -3266,12 +3266,14 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id) item.type = VKI_STATION; item.id.station = id; - const Station *st = Station::Get(id); + Station *st = Station::Get(id); Point pt = RemapCoords2(TileX(st->xy) * TILE_SIZE, TileY(st->xy) * TILE_SIZE); pt.y -= 32 * ZOOM_LVL_BASE; if ((st->facilities & FACIL_AIRPORT) && st->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE; + st->viewport_sign_kdtree_pt = pt; + item.center = pt.x; item.top = pt.y; @@ -3281,17 +3283,29 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id) return item; } +ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id, Point pt) +{ + ViewportSignKdtreeItem item; + item.type = VKI_STATION; + item.id.station = id; + item.center = pt.x; + item.top = pt.y; + return item; +} + ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id) { ViewportSignKdtreeItem item; item.type = VKI_WAYPOINT; item.id.station = id; - const Waypoint *st = Waypoint::Get(id); + Waypoint *st = Waypoint::Get(id); Point pt = RemapCoords2(TileX(st->xy) * TILE_SIZE, TileY(st->xy) * TILE_SIZE); pt.y -= 32 * ZOOM_LVL_BASE; + st->viewport_sign_kdtree_pt = pt; + item.center = pt.x; item.top = pt.y; @@ -3301,6 +3315,16 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id) return item; } +ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id, Point pt) +{ + ViewportSignKdtreeItem item; + item.type = VKI_WAYPOINT; + item.id.station = id; + item.center = pt.x; + item.top = pt.y; + return item; +} + ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeTown(TownID id) { ViewportSignKdtreeItem item; diff --git a/src/viewport_kdtree.h b/src/viewport_kdtree.h index 18cbd3af01..af79e552ef 100644 --- a/src/viewport_kdtree.h +++ b/src/viewport_kdtree.h @@ -65,7 +65,9 @@ struct ViewportSignKdtreeItem { } static ViewportSignKdtreeItem MakeStation(StationID id); + static ViewportSignKdtreeItem MakeStation(StationID id, Point pt); static ViewportSignKdtreeItem MakeWaypoint(StationID id); + static ViewportSignKdtreeItem MakeWaypoint(StationID id, Point pt); static ViewportSignKdtreeItem MakeTown(TownID id); static ViewportSignKdtreeItem MakeSign(SignID id); }; diff --git a/src/waypoint.cpp b/src/waypoint.cpp index 5b08c62475..175c24c7a4 100644 --- a/src/waypoint.cpp +++ b/src/waypoint.cpp @@ -56,6 +56,6 @@ Waypoint::~Waypoint() if (CleaningPool()) return; DeleteWindowById(WC_WAYPOINT_VIEW, this->index); RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index); - if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); + if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index, this->viewport_sign_kdtree_pt)); TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index); } diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index ff420a44f7..bf028cc64a 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -245,7 +245,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint need_sign_update = true; } else if (!wp->IsInUse()) { /* Move existing (recently deleted) waypoint to the new location */ - if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); + if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index, wp->viewport_sign_kdtree_pt)); wp->xy = start_tile; need_sign_update = true; } @@ -320,7 +320,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 wp = new Waypoint(tile); } else { /* Move existing (recently deleted) buoy to the new location */ - if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); + if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index, wp->viewport_sign_kdtree_pt)); wp->xy = tile; InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); }