diff --git a/lib/rmg/modificators/ObjectManager.cpp b/lib/rmg/modificators/ObjectManager.cpp index 15a4f890a..5a0a22844 100644 --- a/lib/rmg/modificators/ObjectManager.cpp +++ b/lib/rmg/modificators/ObjectManager.cpp @@ -76,23 +76,27 @@ void ObjectManager::addNearbyObject(CGObjectInstance * obj, CGObjectInstance * n void ObjectManager::updateDistances(const rmg::Object & obj) { - RecursiveLock lock(externalAccessMutex); - tilesByDistance.clear(); - for (auto tile : zone.areaPossible().getTiles()) //don't need to mark distance for not possible tiles + updateDistances([obj](const int3& tile) -> ui32 { - ui32 d = obj.getArea().distanceSqr(tile); //optimization, only relative distance is interesting - map.setNearestObjectDistance(tile, std::min(static_cast(d), map.getNearestObjectDistance(tile))); - tilesByDistance.push(std::make_pair(tile, map.getNearestObjectDistance(tile))); - } + return obj.getArea().distanceSqr(tile); //optimization, only relative distance is interesting + }); } void ObjectManager::updateDistances(const int3 & pos) +{ + updateDistances([pos](const int3& tile) -> ui32 + { + return pos.dist2dSQ(tile); //optimization, only relative distance is interesting + }); +} + +void ObjectManager::updateDistances(std::function distanceFunction) { RecursiveLock lock(externalAccessMutex); tilesByDistance.clear(); for (auto tile : zone.areaPossible().getTiles()) //don't need to mark distance for not possible tiles { - ui32 d = pos.dist2dSQ(tile); //optimization, only relative distance is interesting + ui32 d = distanceFunction(tile); map.setNearestObjectDistance(tile, std::min(static_cast(d), map.getNearestObjectDistance(tile))); tilesByDistance.push(std::make_pair(tile, map.getNearestObjectDistance(tile))); } diff --git a/lib/rmg/modificators/ObjectManager.h b/lib/rmg/modificators/ObjectManager.h index 5e17a3303..402743048 100644 --- a/lib/rmg/modificators/ObjectManager.h +++ b/lib/rmg/modificators/ObjectManager.h @@ -63,6 +63,7 @@ public: void updateDistances(const rmg::Object & obj); void updateDistances(const int3& pos); + void updateDistances(std::function distanceFunction); void createDistancesPriorityQueue(); const rmg::Area & getVisitableArea() const;