Public roads: Reuse AyStar finder instance

pull/491/head
Jonathan G Rennison 1 year ago
parent 06ffc0ba70
commit 3967a9fdb0

@ -902,15 +902,21 @@ static int32 PublicRoad_CalculateH(AyStar *aystar, AyStarNode *current, OpenList
return DistanceManhattan(static_cast<TileIndex>(reinterpret_cast<uintptr_t>(aystar->user_target)), current->tile) * BASE_COST_PER_TILE;
}
bool FindPath(AyStar& finder, const TileIndex from, TileIndex to)
static AyStar PublicRoadAyStar()
{
AyStar finder;
finder.CalculateG = PublicRoad_CalculateG;
finder.CalculateH = PublicRoad_CalculateH;
finder.GetNeighbours = PublicRoad_GetNeighbours;
finder.EndNodeCheck = PublicRoad_EndNodeCheck;
finder.FoundEndNode = PublicRoad_FoundEndNode;
finder.user_target = reinterpret_cast<void *>(static_cast<uintptr_t>(to));
finder.max_search_nodes = 1 << 20;
return finder;
}
static bool PublicRoadFindPath(AyStar& finder, const TileIndex from, TileIndex to)
{
finder.user_target = reinterpret_cast<void *>(static_cast<uintptr_t>(to));
finder.Init(1 << _public_road_hash_size);
@ -927,6 +933,8 @@ bool FindPath(AyStar& finder, const TileIndex from, TileIndex to)
const bool found_path = (result == AYSTAR_FOUND_END_NODE);
finder.Clear();
return found_path;
}
@ -936,7 +944,7 @@ struct TownNetwork
std::vector<TileIndex> towns;
};
void PostProcessNetworks(const std::vector<TownNetwork *>& town_networks)
void PostProcessNetworks(AyStar &finder, const std::vector<TownNetwork *> &town_networks)
{
for (auto network : town_networks) {
if (network->towns.size() <= 3) {
@ -948,16 +956,11 @@ void PostProcessNetworks(const std::vector<TownNetwork *>& town_networks)
for (auto town_a : network->towns) {
std::sort(towns.begin(), towns.end(), [&](const TileIndex& a, const TileIndex& b) { return DistanceManhattan(a, town_a) < DistanceManhattan(b, town_a); });
const auto second_closest_town = *(towns.begin() + 2);
const auto third_closest_town = *(towns.begin() + 3);
TileIndex second_closest_town = towns[2];
TileIndex third_closest_town = towns[3];
AyStar finder {};
{
FindPath(finder, town_a, second_closest_town);
finder.Clear();
FindPath(finder, town_a, third_closest_town);
}
finder.Free();
PublicRoadFindPath(finder, town_a, second_closest_town);
PublicRoadFindPath(finder, town_a, third_closest_town);
IncreaseGeneratingWorldProgress(GWP_PUBLIC_ROADS);
}
@ -1025,6 +1028,8 @@ void GeneratePublicRoads()
std::sort(towns.begin(), towns.end(), [&](auto a, auto b) { return DistanceManhattan(a, main_town) < DistanceManhattan(b, main_town); });
AyStar finder = PublicRoadAyStar();
for (auto start_town : towns) {
// Check if we can connect to any of the networks.
_towns_visited_along_the_way.clear();
@ -1042,11 +1047,7 @@ void GeneratePublicRoads()
const TileIndex end_town = *reachable_network->towns.begin();
checked_towns.emplace(end_town);
AyStar finder {};
{
found_path = FindPath(finder, start_town, end_town);
}
finder.Free();
found_path = PublicRoadFindPath(finder, start_town, end_town);
if (found_path) {
reachable_network->towns.push_back(start_town);
@ -1086,11 +1087,7 @@ void GeneratePublicRoads()
checked_towns.emplace(end_town);
AyStar finder {};
{
found_path = FindPath(finder, start_town, end_town);
}
finder.Free();
found_path = PublicRoadFindPath(finder, start_town, end_town);
if (found_path) {
network->towns.push_back(start_town);
@ -1143,7 +1140,7 @@ void GeneratePublicRoads()
IncreaseGeneratingWorldProgress(GWP_PUBLIC_ROADS);
}
PostProcessNetworks(networks);
PostProcessNetworks(finder, networks);
}
/* ========================================================================= */

Loading…
Cancel
Save