Do not update viewport sign kd tree in network dedicated mode, or during savegame conversion

This commit is contained in:
Jonathan G Rennison
2019-04-02 03:48:19 +01:00
parent c7d96d037b
commit 53ff27370d
9 changed files with 26 additions and 14 deletions

View File

@@ -609,6 +609,8 @@ bool AfterLoadGame()
RebuildTownKdtree(); RebuildTownKdtree();
RebuildStationKdtree(); RebuildStationKdtree();
_viewport_sign_kdtree_valid = false;
if (IsSavegameVersionBefore(SLV_98)) GamelogGRFAddList(_grfconfig); if (IsSavegameVersionBefore(SLV_98)) GamelogGRFAddList(_grfconfig);
if (IsSavegameVersionBefore(SLV_119)) { if (IsSavegameVersionBefore(SLV_119)) {

View File

@@ -59,7 +59,7 @@ CommandCost CmdPlaceSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
si->name = stredup(text); si->name = stredup(text);
} }
si->UpdateVirtCoord(); si->UpdateVirtCoord();
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index));
InvalidateWindowData(WC_SIGN_LIST, 0, 0); InvalidateWindowData(WC_SIGN_LIST, 0, 0);
_new_sign_id = si->index; _new_sign_id = si->index;
} }
@@ -101,7 +101,7 @@ CommandCost CmdRenameSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
} else { // Delete sign } else { // Delete sign
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
si->sign.MarkDirty(); si->sign.MarkDirty();
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index));
delete si; delete si;
InvalidateWindowData(WC_SIGN_LIST, 0, 0); InvalidateWindowData(WC_SIGN_LIST, 0, 0);

View File

@@ -168,7 +168,7 @@ Station::~Station()
CargoPacket::InvalidateAllFrom(this->index); CargoPacket::InvalidateAllFrom(this->index);
_station_kdtree.Remove(this->index); _station_kdtree.Remove(this->index);
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
} }

View File

@@ -439,13 +439,13 @@ void Station::MoveSign(TileIndex new_xy)
{ {
if (this->xy == new_xy) return; if (this->xy == new_xy) return;
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
_station_kdtree.Remove(this->index); _station_kdtree.Remove(this->index);
this->BaseStation::MoveSign(new_xy); this->BaseStation::MoveSign(new_xy);
_station_kdtree.Insert(this->index); _station_kdtree.Insert(this->index);
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
} }
/** Update the virtual coords needed to draw the station sign for all stations. */ /** Update the virtual coords needed to draw the station sign for all stations. */
@@ -730,7 +730,7 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
*st = new Station(area.tile); *st = new Station(area.tile);
_station_kdtree.Insert((*st)->index); _station_kdtree.Insert((*st)->index);
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index));
(*st)->town = ClosestTownFromTile(area.tile, UINT_MAX); (*st)->town = ClosestTownFromTile(area.tile, UINT_MAX);
(*st)->string_id = GenerateStationName(*st, area.tile, name_class); (*st)->string_id = GenerateStationName(*st, area.tile, name_class);
@@ -4222,7 +4222,7 @@ void BuildOilRig(TileIndex tile)
st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE); st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
st->UpdateVirtCoord(); st->UpdateVirtCoord();
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
st->RecomputeCatchment(); st->RecomputeCatchment();
UpdateStationAcceptance(st, false); UpdateStationAcceptance(st, false);
ZoningMarkDirtyStationCoverageArea(st); ZoningMarkDirtyStationCoverageArea(st);

View File

@@ -1886,7 +1886,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize
t->townnameparts = townnameparts; t->townnameparts = townnameparts;
t->UpdateVirtCoord(); t->UpdateVirtCoord();
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index));
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0); InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0);
t->InitializeLayout(layout); t->InitializeLayout(layout);
@@ -3116,7 +3116,7 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
/* The town destructor will delete the other things related to the town. */ /* The town destructor will delete the other things related to the town. */
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
_town_kdtree.Remove(t->index); _town_kdtree.Remove(t->index);
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index));
delete t; delete t;
} }

View File

@@ -122,6 +122,7 @@ Point _tile_fract_coords;
ViewportSignKdtree _viewport_sign_kdtree(&Kdtree_ViewportSignXYFunc); ViewportSignKdtree _viewport_sign_kdtree(&Kdtree_ViewportSignXYFunc);
bool _viewport_sign_kdtree_valid = false;
static int _viewport_sign_maxwidth = 0; static int _viewport_sign_maxwidth = 0;
@@ -3345,6 +3346,14 @@ void RebuildViewportKdtree()
/* Reset biggest size sign seen */ /* Reset biggest size sign seen */
_viewport_sign_maxwidth = 0; _viewport_sign_maxwidth = 0;
if (_network_dedicated) {
_viewport_sign_kdtree_valid = false;
_viewport_sign_kdtree.Build<ViewportSignKdtreeItem*>(nullptr, nullptr);
return;
}
_viewport_sign_kdtree_valid = true;
std::vector<ViewportSignKdtreeItem> items; std::vector<ViewportSignKdtreeItem> items;
items.reserve(BaseStation::GetNumItems() + Town::GetNumItems() + Sign::GetNumItems()); items.reserve(BaseStation::GetNumItems() + Town::GetNumItems() + Sign::GetNumItems());

View File

@@ -77,6 +77,7 @@ inline int32 Kdtree_ViewportSignXYFunc(const ViewportSignKdtreeItem &item, int d
typedef Kdtree<ViewportSignKdtreeItem, decltype(&Kdtree_ViewportSignXYFunc), int32, int32> ViewportSignKdtree; typedef Kdtree<ViewportSignKdtreeItem, decltype(&Kdtree_ViewportSignXYFunc), int32, int32> ViewportSignKdtree;
extern ViewportSignKdtree _viewport_sign_kdtree; extern ViewportSignKdtree _viewport_sign_kdtree;
extern bool _viewport_sign_kdtree_valid;
void RebuildViewportKdtree(); void RebuildViewportKdtree();

View File

@@ -56,6 +56,6 @@ Waypoint::~Waypoint()
if (CleaningPool()) return; if (CleaningPool()) return;
DeleteWindowById(WC_WAYPOINT_VIEW, this->index); DeleteWindowById(WC_WAYPOINT_VIEW, this->index);
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index); RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index); TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index);
} }

View File

@@ -245,7 +245,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
need_sign_update = true; need_sign_update = true;
} else if (!wp->IsInUse()) { } else if (!wp->IsInUse()) {
/* Move existing (recently deleted) waypoint to the new location */ /* Move existing (recently deleted) waypoint to the new location */
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
wp->xy = start_tile; wp->xy = start_tile;
need_sign_update = true; need_sign_update = true;
} }
@@ -262,7 +262,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
if (wp->town == NULL) MakeDefaultName(wp); if (wp->town == NULL) MakeDefaultName(wp);
wp->UpdateVirtCoord(); wp->UpdateVirtCoord();
if (need_sign_update) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); if (need_sign_update && _viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
byte map_spec_index = AllocateSpecToStation(spec, wp, true); byte map_spec_index = AllocateSpecToStation(spec, wp, true);
@@ -320,7 +320,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
wp = new Waypoint(tile); wp = new Waypoint(tile);
} else { } else {
/* Move existing (recently deleted) buoy to the new location */ /* Move existing (recently deleted) buoy to the new location */
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
wp->xy = tile; wp->xy = tile;
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
} }
@@ -339,7 +339,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
wp->UpdateVirtCoord(); wp->UpdateVirtCoord();
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
} }