mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-21 18:40:01 +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:
parent
0f11acf709
commit
0066c446f8
@ -8,6 +8,8 @@
|
|||||||
#include <components/misc/thread.hpp>
|
#include <components/misc/thread.hpp>
|
||||||
#include <components/loadinglistener/loadinglistener.hpp>
|
#include <components/loadinglistener/loadinglistener.hpp>
|
||||||
|
|
||||||
|
#include <DetourNavMesh.h>
|
||||||
|
|
||||||
#include <osg/Stats>
|
#include <osg/Stats>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -48,7 +50,7 @@ namespace
|
|||||||
|
|
||||||
auto getPriority(const Job& job) noexcept
|
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
|
struct LessByJobPriority
|
||||||
@ -123,11 +125,19 @@ namespace DetourNavigator
|
|||||||
if (!playerTileChanged && changedTiles.empty())
|
if (!playerTileChanged && changedTiles.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const dtNavMeshParams params = *navMeshCacheItem->lockConst()->getImpl().getParams();
|
||||||
|
|
||||||
const std::lock_guard<std::mutex> lock(mMutex);
|
const std::lock_guard<std::mutex> lock(mMutex);
|
||||||
|
|
||||||
if (playerTileChanged)
|
if (playerTileChanged)
|
||||||
|
{
|
||||||
for (JobIt job : mWaiting)
|
for (JobIt job : mWaiting)
|
||||||
|
{
|
||||||
job->mDistanceToPlayer = getManhattanDistance(job->mChangedTile, playerTile);
|
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)
|
for (const auto& [changedTile, changeType] : changedTiles)
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,7 @@ namespace DetourNavigator
|
|||||||
const TilePosition mChangedTile;
|
const TilePosition mChangedTile;
|
||||||
const std::chrono::steady_clock::time_point mProcessTime;
|
const std::chrono::steady_clock::time_point mProcessTime;
|
||||||
unsigned mTryNumber = 0;
|
unsigned mTryNumber = 0;
|
||||||
const ChangeType mChangeType;
|
ChangeType mChangeType;
|
||||||
int mDistanceToPlayer;
|
int mDistanceToPlayer;
|
||||||
const int mDistanceToOrigin;
|
const int mDistanceToOrigin;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user