From d386a676d2bbe8857b5a16f351b5d70e30a1a41c Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:19:51 +0200 Subject: [PATCH] Recast: fix regression in NavMeshTesterTool Caused by the implementation of dtNavMesh::isGoalPolyReachable. when this was false, everything was reset, including the start polyref causing "Set Random End" to always fail. isGoalPolyReachable also wasn't supposed to be checked on every mode, e.g. the neighbourhood or poly circle mode doesn't rely on a goal polyref. --- src/naveditor/NavMeshTesterTool.cpp | 45 +++++++++++++++-------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/naveditor/NavMeshTesterTool.cpp b/src/naveditor/NavMeshTesterTool.cpp index 5322b170..392beb59 100644 --- a/src/naveditor/NavMeshTesterTool.cpp +++ b/src/naveditor/NavMeshTesterTool.cpp @@ -324,18 +324,15 @@ void NavMeshTesterTool::handleMenu() } } - ImGui::BeginDisabled(!m_sposSet); + ImGui::BeginDisabled(!m_sposSet || !m_startRef); if (ImGui::Button("Set Random End")) { - if (m_sposSet) + dtStatus status = m_navQuery->findRandomPointAroundCircle(m_startRef, m_spos, m_randomRadius, &m_filter, frand, &m_endRef, m_epos); + if (dtStatusSucceed(status)) { - dtStatus status = m_navQuery->findRandomPointAroundCircle(m_startRef, m_spos, m_randomRadius, &m_filter, frand, &m_endRef, m_epos); - if (dtStatusSucceed(status)) - { - m_eposSet = true; - recalc(); - } + m_eposSet = true; + recalc(); } } @@ -528,7 +525,9 @@ void NavMeshTesterTool::handleToggle() if (!m_navMesh->isGoalPolyReachable(m_startRef, m_endRef, !hasAnimType, traversalTableIndex)) { printf("%s: end poly '%d' is unreachable from start poly '%d'\n", "m_navMesh->isGoalPolyReachable", m_startRef, m_endRef); - reset(); + + m_npolys = 0; + m_nsmoothPath = 0; return; } @@ -733,22 +732,26 @@ void NavMeshTesterTool::recalc() m_pathFindStatus = DT_FAILURE; - const bool hasAnimType = m_traverseAnimType != ANIMTYPE_NONE; - const int traversalTableIndex = hasAnimType - ? NavMesh_GetTraversalTableIndexForAnimType(m_traverseAnimType) - : NULL; + const bool everythingSet = m_sposSet && m_eposSet && m_startRef && m_endRef; + bool isReachable = true; - if (!m_navMesh->isGoalPolyReachable(m_startRef, m_endRef, !hasAnimType, traversalTableIndex)) + if (m_startRef && m_endRef) { - printf("%s: end poly '%d' is unreachable from start poly '%d'\n", "m_navMesh->isGoalPolyReachable", m_startRef, m_endRef); - reset(); - return; + const bool hasAnimType = m_traverseAnimType != ANIMTYPE_NONE; + const int traversalTableIndex = hasAnimType + ? NavMesh_GetTraversalTableIndexForAnimType(m_traverseAnimType) + : NULL; + + isReachable = m_navMesh->isGoalPolyReachable(m_startRef, m_endRef, !hasAnimType, traversalTableIndex); + + if (!isReachable) + printf("%s: end poly '%d' is unreachable from start poly '%d'\n", "m_navMesh->isGoalPolyReachable", m_startRef, m_endRef); } if (m_toolMode == TOOLMODE_PATHFIND_FOLLOW) { m_pathIterNum = 0; - if (m_sposSet && m_eposSet && m_startRef && m_endRef) + if (everythingSet && isReachable) { #ifdef DUMP_REQS printf("pi %f %f %f %f %f %f 0x%x 0x%x\n", @@ -893,7 +896,7 @@ void NavMeshTesterTool::recalc() } else if (m_toolMode == TOOLMODE_PATHFIND_STRAIGHT) { - if (m_sposSet && m_eposSet && m_startRef && m_endRef) + if (everythingSet && isReachable) { #ifdef DUMP_REQS printf("ps %f %f %f %f %f %f 0x%x 0x%x\n", @@ -923,7 +926,7 @@ void NavMeshTesterTool::recalc() } else if (m_toolMode == TOOLMODE_PATHFIND_SLICED) { - if (m_sposSet && m_eposSet && m_startRef && m_endRef) + if (everythingSet && isReachable) { #ifdef DUMP_REQS printf("ps %f %f %f %f %f %f 0x%x 0x%x\n", @@ -944,7 +947,7 @@ void NavMeshTesterTool::recalc() else if (m_toolMode == TOOLMODE_RAYCAST) { m_nstraightPath = 0; - if (m_sposSet && m_eposSet && m_startRef) + if (m_sposSet && m_eposSet && m_startRef && isReachable) { #ifdef DUMP_REQS printf("rc %f %f %f %f %f %f 0x%x 0x%x\n",