1
1
forked from 0ad/0ad

Make the terrain analysis slightly more efficient for pathfinding passability classes, and fix a mistake introduced in 1709353e2c.

This was SVN commit r16787.
This commit is contained in:
Nicolas Auvray 2015-06-17 20:48:41 +00:00
parent 155c6e6ccd
commit 989f164500

View File

@ -564,17 +564,22 @@ void CCmpPathfinder::UpdateGrid()
// Expand the impassability grid, for any class with non-zero clearance, // Expand the impassability grid, for any class with non-zero clearance,
// so that we can stop units getting too close to impassable navcells // so that we can stop units getting too close to impassable navcells
std::map<int, u16> clearancesMasks;
for (PathfinderPassability& passability : m_PassClasses) for (PathfinderPassability& passability : m_PassClasses)
{ {
if (passability.m_Clearance != fixed::Zero()) if (passability.m_Clearance == fixed::Zero())
continue; continue;
// TODO: if multiple classes have the same clearance, we should
// only bother doing this once for them all
int clearance = (passability.m_Clearance / Pathfinding::NAVCELL_SIZE).ToInt_RoundToInfinity(); int clearance = (passability.m_Clearance / Pathfinding::NAVCELL_SIZE).ToInt_RoundToInfinity();
if (clearance > 0)
ExpandImpassableCells(*m_Grid, clearance, passability.m_Mask); auto it = clearancesMasks.find(clearance);
if (it == clearancesMasks.end())
clearancesMasks[clearance] = passability.m_Mask;
else
it->second |= passability.m_Mask;
} }
for (auto& pair : clearancesMasks)
ExpandImpassableCells(*m_Grid, pair.first, pair.second);
// Store the updated terrain-only grid // Store the updated terrain-only grid
*m_TerrainOnlyGrid = *m_Grid; *m_TerrainOnlyGrid = *m_Grid;