diff --git a/components/detournavigator/asyncnavmeshupdater.cpp b/components/detournavigator/asyncnavmeshupdater.cpp index 48860c33d..d5b6d380f 100644 --- a/components/detournavigator/asyncnavmeshupdater.cpp +++ b/components/detournavigator/asyncnavmeshupdater.cpp @@ -45,12 +45,16 @@ namespace DetourNavigator const std::shared_ptr& navMeshCacheItem, const TilePosition& playerTile, const std::set& changedTiles) { + setRecastMesh(recastMesh); + + if (changedTiles.empty()) + return; + const std::lock_guard lock(mMutex); + for (const auto& changedTile : changedTiles) - { - mJobs.push(Job {agentHalfExtents, recastMesh, navMeshCacheItem, changedTile, - makePriority(changedTile, playerTile)}); - } + mJobs.push(Job {agentHalfExtents, navMeshCacheItem, changedTile, makePriority(changedTile, playerTile)}); + mHasJob.notify_all(); } @@ -85,12 +89,14 @@ namespace DetourNavigator const auto start = std::chrono::steady_clock::now(); - updateNavMesh(job.mAgentHalfExtents, *job.mRecastMesh, job.mChangedTile, mSettings, + const auto recastMesh = getRecastMesh(); + + updateNavMesh(job.mAgentHalfExtents, *recastMesh, job.mChangedTile, mSettings, job.mNavMeshCacheItem->mValue); const auto finish = std::chrono::steady_clock::now(); - writeDebugFiles(job); + writeDebugFiles(job, *recastMesh); using FloatMs = std::chrono::duration; @@ -114,7 +120,7 @@ namespace DetourNavigator return job; } - void AsyncNavMeshUpdater::writeDebugFiles(const Job& job) const + void AsyncNavMeshUpdater::writeDebugFiles(const Job& job, const RecastMesh& recastMesh) const { std::string revision; std::string recastMeshRevision; @@ -130,8 +136,20 @@ namespace DetourNavigator navMeshRevision = revision; } if (mSettings.get().mEnableWriteRecastMeshToFile) - writeToFile(*job.mRecastMesh, mSettings.get().mRecastMeshPathPrefix, recastMeshRevision); + writeToFile(recastMesh, mSettings.get().mRecastMeshPathPrefix, recastMeshRevision); if (mSettings.get().mEnableWriteNavMeshToFile) writeToFile(*job.mNavMeshCacheItem->mValue.lock(), mSettings.get().mNavMeshPathPrefix, navMeshRevision); } + + std::shared_ptr AsyncNavMeshUpdater::getRecastMesh() + { + const std::lock_guard lock(mRecastMeshMutex); + return mRecastMesh; + } + + void AsyncNavMeshUpdater::setRecastMesh(const std::shared_ptr& value) + { + const std::lock_guard lock(mRecastMeshMutex); + mRecastMesh = value; + } } diff --git a/components/detournavigator/asyncnavmeshupdater.hpp b/components/detournavigator/asyncnavmeshupdater.hpp index a9432ceaf..8a70278fb 100644 --- a/components/detournavigator/asyncnavmeshupdater.hpp +++ b/components/detournavigator/asyncnavmeshupdater.hpp @@ -44,7 +44,6 @@ namespace DetourNavigator struct Job { osg::Vec3f mAgentHalfExtents; - std::shared_ptr mRecastMesh; std::shared_ptr mNavMeshCacheItem; TilePosition mChangedTile; std::pair mPriority; @@ -63,6 +62,8 @@ namespace DetourNavigator std::condition_variable mHasJob; std::condition_variable mDone; Jobs mJobs; + std::mutex mRecastMeshMutex; + std::shared_ptr mRecastMesh; std::thread mThread; void process() throw(); @@ -73,7 +74,11 @@ namespace DetourNavigator void notifyHasJob(); - void writeDebugFiles(const Job& job) const; + void writeDebugFiles(const Job& job, const RecastMesh& recastMesh) const; + + std::shared_ptr getRecastMesh(); + + void setRecastMesh(const std::shared_ptr& value); }; }