1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-19 19:39:41 +00:00

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.
This commit is contained in:
elsid 2021-08-17 12:10:22 +02:00
parent 0f11acf709
commit 0066c446f8
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
2 changed files with 12 additions and 2 deletions

View file

@ -8,6 +8,8 @@
#include <components/misc/thread.hpp>
#include <components/loadinglistener/loadinglistener.hpp>
#include <DetourNavMesh.h>
#include <osg/Stats>
#include <algorithm>
@ -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<std::mutex> 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)
{

View file

@ -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;