aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2019-03-02 19:53:46 +0100
committerjackpoz <giacomopoz@gmail.com>2019-03-02 19:53:46 +0100
commitc602220e02bed1ad76c9e60064eeec5fd97bfe80 (patch)
tree9a588f4eebd8f39bb0daa31356846fa6df505422
parente9957b1765ceac9d8966ec50b0d64cb80e18d17a (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
-rw-r--r--dep/PackageList.txt3
-rw-r--r--dep/recastnavigation/Detour/Source/DetourCommon.cpp10
-rw-r--r--dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp4
-rw-r--r--src/server/game/Movement/PathGenerator.cpp9
4 files changed, 19 insertions, 7 deletions
diff --git a/dep/PackageList.txt b/dep/PackageList.txt
index a84594e4927..5cfdcae5b87 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 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;
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index d133fc2baf0..d9769181dfc 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;
}
}