Recast: several fixes for traverse link renderer

-1 is used by the game, and means only traverse links on the same polygon island. This has now been properly implemented. Also fixed a crash when enabling the "Traverse Links" Detour render option with no navmesh loaded.
This commit is contained in:
Kawe Mazidjatari 2024-08-11 23:13:04 +02:00
parent 40d07f09a4
commit ba43a1ab72
3 changed files with 9 additions and 6 deletions

View File

@ -862,12 +862,12 @@ void Editor::renderDetourDebugMenu()
if (ImGui::Checkbox("Traverse Links", &isEnabled))
toggleNavMeshDrawFlag(DU_DRAWNAVMESH_TRAVERSE_LINKS);
if (isEnabled)
if (isEnabled && m_navMesh) // Supplemental options only available with a valid navmesh!
{
ImGui::PushItemWidth(190);
ImGui::SliderInt("Traverse Type", &m_traverseLinkParams.traverseLinkType, -1, 31);
ImGui::SliderInt("Traverse Dist", &m_traverseLinkParams.traverseLinkDistance, -1, 255);
ImGui::SliderInt("Traverse Anim", &m_traverseLinkParams.traverseAnimType, -1, m_navMesh->getParams()->traverseTableCount-1);
ImGui::SliderInt("Traverse Anim", &m_traverseLinkParams.traverseAnimType, -2, m_navMesh->getParams()->traverseTableCount-1);
ImGui::PopItemWidth();
}
}

View File

@ -48,11 +48,14 @@ struct duDrawTraverseLinkParams
duDrawTraverseLinkParams() :
traverseLinkType(-1),
traverseLinkDistance(-1),
traverseAnimType(-1)
traverseAnimType(-2)
{}
int traverseLinkType;
int traverseLinkDistance;
// -2 means all, -1 means disjoint poly groups only, anything above
// refers to an actual anim type and indexes into the traverse tables.
int traverseAnimType;
};

View File

@ -171,9 +171,9 @@ static void drawTraverseLinks(duDebugDraw* dd, const dtNavMesh& mesh, const dtNa
const int drawAnimType = traverseLinkParams.traverseAnimType;
const dtPolyRef basePolyRef = mesh.getPolyRefBase(tile) | (dtPolyRef)i;
if (drawAnimType != -1 &&
!mesh.isGoalPolyReachable(basePolyRef, link->ref, false, drawAnimType) &&
!mesh.isGoalPolyReachable(link->ref, basePolyRef, false, drawAnimType))
if (drawAnimType != -2 &&
!mesh.isGoalPolyReachable(basePolyRef, link->ref, drawAnimType == -1, drawAnimType) &&
!mesh.isGoalPolyReachable(link->ref, basePolyRef, drawAnimType == -1, drawAnimType))
continue;
const dtPoly* endPoly;