From c602220e02bed1ad76c9e60064eeec5fd97bfe80 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 2 Mar 2019 19:53:46 +0100 Subject: [PATCH] Core/MMaps: Fix infinite loop in Detour Fix another infinite loop in Detour caused by degenerated triangles. Check the result of some previously ignored Detour calls. Update recastnavigation to 3a619d773deb7e3a15ee215217c825995fe71312 and apply some more custom changes --- dep/PackageList.txt | 3 ++- dep/recastnavigation/Detour/Source/DetourCommon.cpp | 10 +++++++++- .../Detour/Source/DetourNavMeshQuery.cpp | 4 ++-- src/server/game/Movement/PathGenerator.cpp | 9 ++++++--- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/dep/PackageList.txt b/dep/PackageList.txt index a84594e492..5cfdcae5b8 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -62,4 +62,5 @@ gSOAP (a portable development toolkit for C and C++ XML Web services and XML dat recastnavigation (Recast is state of the art navigation mesh construction toolset for games) https://github.com/recastnavigation/recastnavigation - Version: 14b2631527c4792e95b2c78ebfa8ac4cd3413363 + Version: 3a619d773deb7e3a15ee215217c825995fe71312 + Custom changes: https://github.com/TrinityCore/recastnavigation/tree/3.3.5 diff --git a/dep/recastnavigation/Detour/Source/DetourCommon.cpp b/dep/recastnavigation/Detour/Source/DetourCommon.cpp index 3886f14b04..e10e627617 100644 --- a/dep/recastnavigation/Detour/Source/DetourCommon.cpp +++ b/dep/recastnavigation/Detour/Source/DetourCommon.cpp @@ -226,7 +226,15 @@ bool dtClosestHeightPointTriangle(const float* p, const float* a, const float* b // If point lies inside the triangle, return interpolated ycoord. if (u >= epsilon && v >= epsilon && (u+v) <= denom - epsilon) { - h = a[1] + (v0[1]*u + v1[1]*v) / denom; + + if (denom == 0.f && u == 0.f && v == 0.f) + h = a[1]; + else + h = a[1] + (v0[1]*u + v1[1]*v) / denom; + + if (!dtMathIsfinite(h)) + return false; + return true; } return false; diff --git a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp index c18db1c196..9e47082428 100644 --- a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp +++ b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp @@ -1301,8 +1301,8 @@ dtStatus dtNavMeshQuery::initSlicedFindPath(dtPolyRef startRef, dtPolyRef endRef m_query.raycastLimitSqr = FLT_MAX; // Validate input - if (!m_nav->isValidPolyRef(startRef) || !m_nav->isValidPolyRef(endRef) - || !startPos || !dtVisfinite(startPos) || + if (!m_nav->isValidPolyRef(startRef) || !m_nav->isValidPolyRef(endRef) || + !startPos || !dtVisfinite(startPos) || !endPos || !dtVisfinite(endPos) || !filter) { return DT_FAILURE | DT_INVALID_PARAM; diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index d133fc2baf..d9769181df 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -817,10 +817,12 @@ dtStatus PathGenerator::FindSmoothPath(float const* startPos, float const* endPo dtPolyRef visited[MAX_VISIT_POLY]; uint32 nvisited = 0; - _navMeshQuery->moveAlongSurface(polys[0], iterPos, moveTgt, &_filter, result, visited, (int*)&nvisited, MAX_VISIT_POLY); + if (dtStatusFailed(_navMeshQuery->moveAlongSurface(polys[0], iterPos, moveTgt, &_filter, result, visited, (int*)&nvisited, MAX_VISIT_POLY))) + return DT_FAILURE; npolys = FixupCorridor(polys, npolys, MAX_PATH_LENGTH, visited, nvisited); - _navMeshQuery->getPolyHeight(polys[0], result, &result[1]); + if (dtStatusFailed(_navMeshQuery->getPolyHeight(polys[0], result, &result[1]))) + return DT_FAILURE; result[1] += 0.5f; dtVcopy(iterPos, result); @@ -865,7 +867,8 @@ dtStatus PathGenerator::FindSmoothPath(float const* startPos, float const* endPo } // Move position at the other side of the off-mesh link. dtVcopy(iterPos, connectionEndPos); - _navMeshQuery->getPolyHeight(polys[0], iterPos, &iterPos[1]); + if (dtStatusFailed(_navMeshQuery->getPolyHeight(polys[0], iterPos, &iterPos[1]))) + return DT_FAILURE; iterPos[1] += 0.5f; } }