diff --git a/apps/navmeshtool/navmesh.cpp b/apps/navmeshtool/navmesh.cpp index 4187197947..36ed448e72 100644 --- a/apps/navmeshtool/navmesh.cpp +++ b/apps/navmeshtool/navmesh.cpp @@ -35,6 +35,7 @@ #include #include #include +#include namespace NavMeshTool { @@ -180,26 +181,31 @@ namespace NavMeshTool SceneUtil::WorkQueue workQueue(threadsNumber); auto navMeshTileConsumer = std::make_shared(std::move(db)); std::size_t tiles = 0; + std::mt19937_64 random; for (const std::unique_ptr& input : data.mNavMeshInputs) { + std::vector worldspaceTiles; + DetourNavigator::getTilesPositions( Misc::Convert::toOsg(input->mAabb.m_min), Misc::Convert::toOsg(input->mAabb.m_max), settings.mRecast, - [&] (const TilePosition& tilePosition) - { - workQueue.addWorkItem(new GenerateNavMeshTile( - input->mWorldspace, - tilePosition, - RecastMeshProvider(input->mTileCachedRecastMeshManager), - agentHalfExtents, - settings, - navMeshTileConsumer - )); + [&] (const TilePosition& tilePosition) { worldspaceTiles.push_back(tilePosition); }); - ++tiles; - }); + tiles += worldspaceTiles.size(); navMeshTileConsumer->mExpected = tiles; + + std::shuffle(worldspaceTiles.begin(), worldspaceTiles.end(), random); + + for (const TilePosition& tilePosition : worldspaceTiles) + workQueue.addWorkItem(new GenerateNavMeshTile( + input->mWorldspace, + tilePosition, + RecastMeshProvider(input->mTileCachedRecastMeshManager), + agentHalfExtents, + settings, + navMeshTileConsumer + )); } navMeshTileConsumer->wait();