diff options
author | jackpoz <giacomopoz@gmail.com> | 2019-03-02 19:53:46 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-24 20:34:56 +0100 |
commit | bd0e9e7aa83f8fef35321832960dc127ddf5f1f0 (patch) | |
tree | 87d7f38b28fbf9922f57dd667caee4fb8bf28348 /dep/recastnavigation | |
parent | 3cfbf0aa1ba319145d4232da0a9e5788d31608d5 (diff) |
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
(cherry picked from commit c602220e02bed1ad76c9e60064eeec5fd97bfe80)
Diffstat (limited to 'dep/recastnavigation')
-rw-r--r-- | dep/recastnavigation/Detour/Source/DetourCommon.cpp | 10 | ||||
-rw-r--r-- | dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp | 4 |
2 files changed, 11 insertions, 3 deletions
diff --git a/dep/recastnavigation/Detour/Source/DetourCommon.cpp b/dep/recastnavigation/Detour/Source/DetourCommon.cpp index 3886f14b04d..e10e6276170 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 c18db1c1968..9e470824287 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; |