From 0066c446f828570e029aa4267bbdb29fb9aa1642 Mon Sep 17 00:00:00 2001 From: elsid Date: Tue, 17 Aug 2021 12:10:22 +0200 Subject: [PATCH] Remove navmesh tiles outside allowed range first * Change job change type to remove when tile is outside allowed range. * Swap try number and change type in job priority. To make sure remove jobs always processed before any other. --- components/detournavigator/asyncnavmeshupdater.cpp | 12 +++++++++++- components/detournavigator/asyncnavmeshupdater.hpp | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/components/detournavigator/asyncnavmeshupdater.cpp b/components/detournavigator/asyncnavmeshupdater.cpp index c6db079ce8..5c88d0cfa2 100644 --- a/components/detournavigator/asyncnavmeshupdater.cpp +++ b/components/detournavigator/asyncnavmeshupdater.cpp @@ -8,6 +8,8 @@ #include #include +#include + #include #include @@ -48,7 +50,7 @@ namespace auto getPriority(const Job& job) noexcept { - return std::make_tuple(job.mProcessTime, job.mTryNumber, job.mChangeType, job.mDistanceToPlayer, job.mDistanceToOrigin); + return std::make_tuple(job.mProcessTime, job.mChangeType, job.mTryNumber, job.mDistanceToPlayer, job.mDistanceToOrigin); } struct LessByJobPriority @@ -123,11 +125,19 @@ namespace DetourNavigator if (!playerTileChanged && changedTiles.empty()) return; + const dtNavMeshParams params = *navMeshCacheItem->lockConst()->getImpl().getParams(); + const std::lock_guard lock(mMutex); if (playerTileChanged) + { for (JobIt job : mWaiting) + { job->mDistanceToPlayer = getManhattanDistance(job->mChangedTile, playerTile); + if (!shouldAddTile(job->mChangedTile, playerTile, std::min(mSettings.get().mMaxTilesNumber, params.maxTiles))) + job->mChangeType = ChangeType::remove; + } + } for (const auto& [changedTile, changeType] : changedTiles) { diff --git a/components/detournavigator/asyncnavmeshupdater.hpp b/components/detournavigator/asyncnavmeshupdater.hpp index 9e521ad509..2d915ad434 100644 --- a/components/detournavigator/asyncnavmeshupdater.hpp +++ b/components/detournavigator/asyncnavmeshupdater.hpp @@ -60,7 +60,7 @@ namespace DetourNavigator const TilePosition mChangedTile; const std::chrono::steady_clock::time_point mProcessTime; unsigned mTryNumber = 0; - const ChangeType mChangeType; + ChangeType mChangeType; int mDistanceToPlayer; const int mDistanceToOrigin;