Recast: traverse over every tile in the array

dtNavMesh::getTileCount returns the total number of added tiles, the issue with this is that if the navmesh gets pruned, that means disabling unlinked polygons and removing dead tiles, then some tile instances in the m_tiles array may become empty. Less tiles will be installed and since there are null tiles in between, we won't be traversing each tile.
This commit is contained in:
Kawe Mazidjatari 2024-10-13 21:36:46 +02:00
parent c9c687fc73
commit 9f430a455e
5 changed files with 17 additions and 14 deletions

View File

@ -192,7 +192,7 @@ void CAI_Utility::DrawNavMeshBVTree(
return; // NavMesh for hull not loaded.
OverlayBox_t::Transforms vTransforms;
for (int i = iBVTreeIndex, nt = pMesh->getTileCount(); i < nt; ++i)
for (int i = iBVTreeIndex, nt = pMesh->getMaxTiles(); i < nt; ++i)
{
if (nTileRange > 0 && i > nTileRange)
break;
@ -255,7 +255,7 @@ void CAI_Utility::DrawNavMeshPortals(const dtNavMesh* pMesh,
if (!pMesh)
return; // NavMesh for hull not loaded.
for (int i = iPortalIndex, nt = pMesh->getTileCount(); i < nt; ++i)
for (int i = iPortalIndex, nt = pMesh->getMaxTiles(); i < nt; ++i)
{
if (nTileRange > 0 && i > nTileRange)
break;
@ -375,7 +375,7 @@ void CAI_Utility::DrawNavMeshPolys(const dtNavMesh* pMesh,
if (!pMesh)
return; // NavMesh for hull not loaded.
for (int i = iPolyIndex; i < pMesh->getTileCount(); ++i)
for (int i = iPolyIndex; i < pMesh->getMaxTiles(); ++i)
{
if (nTileRange > 0 && i > nTileRange)
break;
@ -464,7 +464,7 @@ void CAI_Utility::DrawNavMeshPolyBoundaries(const dtNavMesh* pMesh,
const bool bDrawInner = navmesh_draw_poly_bounds_inner.GetBool();
for (int i = iBoundaryIndex, nt = pMesh->getTileCount(); i < nt; ++i)
for (int i = iBoundaryIndex, nt = pMesh->getMaxTiles(); i < nt; ++i)
{
if (nTileRange > 0 && i > nTileRange)
break;

View File

@ -844,7 +844,7 @@ void Editor::buildStaticPathingData()
void Editor::connectOffMeshLinks()
{
for (int i = 0; i < m_navMesh->getTileCount(); i++)
for (int i = 0; i < m_navMesh->getMaxTiles(); i++)
{
dtMeshTile* target = m_navMesh->getTile(i);
const dtMeshHeader* header = target->header;

View File

@ -706,20 +706,20 @@ void Editor_TileMesh::buildTile(const float* pos)
{
// If there are external off-mesh links landing on
// this tile, connect them.
for (int i = 0; i < m_navMesh->getTileCount(); i++)
for (int i = 0; i < m_navMesh->getMaxTiles(); i++)
{
dtMeshTile* target = m_navMesh->getTile(i);
const dtMeshHeader* targetHeader = target->header;
if (!targetHeader)
continue;
const dtTileRef targetRef = m_navMesh->getTileRef(target);
// Connection to self has already been done above.
if (targetRef == tileRef)
continue;
const dtMeshHeader* targetHeader = target->header;
if (!targetHeader)
continue;
for (int j = 0; j < targetHeader->offMeshConCount; j++)
{
const dtOffMeshConnection* con = &target->offMeshCons[j];

View File

@ -159,7 +159,7 @@ static void floodNavmesh(dtNavMesh* nav, NavmeshFlags* flags, dtPolyRef start, u
static void disableUnvisitedPolys(dtNavMesh* nav, NavmeshFlags* flags)
{
for (int i = 0; i < nav->getTileCount(); ++i)
for (int i = 0; i < nav->getMaxTiles(); ++i)
{
const dtMeshTile* tile = nav->getTile(i);
dtMeshHeader* header = tile->header;
@ -197,7 +197,7 @@ static void disableUnvisitedPolys(dtNavMesh* nav, NavmeshFlags* flags)
static void removeUnlinkedTiles(dtNavMesh* nav)
{
for (int i = nav->getTileCount(); i-- > 0;)
for (int i = nav->getMaxTiles(); i-- > 0;)
{
const dtMeshTile* tile = nav->getTile(i);
const dtMeshHeader* header = tile->header;

View File

@ -25,13 +25,16 @@ bool duDumpTraverseLinkDetail(const dtNavMesh& mesh, const dtNavMeshQuery* query
rdTempVector<float> elevationVec;
int totTraverseLinkCount = 0;
const int tileCount = mesh.getTileCount();
const int tileCount = mesh.getMaxTiles();
for (int i = 0; i < tileCount; i++)
{
const dtMeshTile* tile = mesh.getTile(i);
const dtMeshHeader* header = tile->header;
if (!header)
continue;
bool writeTileDetail = false;
for (int j = 0; j < header->polyCount; ++j)