mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-02 02:45:34 +00:00
Move OffMeshConnectionsManager implementation into cpp
This commit is contained in:
parent
7f65a2c4c2
commit
81e569c3d9
3 changed files with 85 additions and 67 deletions
|
@ -183,6 +183,7 @@ add_component_dir(detournavigator
|
|||
raycast
|
||||
navmeshtileview
|
||||
oscillatingrecastmeshobject
|
||||
offmeshconnectionsmanager
|
||||
)
|
||||
|
||||
set (ESM_UI ${CMAKE_SOURCE_DIR}/files/ui/contentselector.ui
|
||||
|
|
80
components/detournavigator/offmeshconnectionsmanager.cpp
Normal file
80
components/detournavigator/offmeshconnectionsmanager.cpp
Normal file
|
@ -0,0 +1,80 @@
|
|||
#include "offmeshconnectionsmanager.hpp"
|
||||
#include "settings.hpp"
|
||||
#include "settingsutils.hpp"
|
||||
#include "tileposition.hpp"
|
||||
#include "objectid.hpp"
|
||||
#include "offmeshconnection.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
namespace DetourNavigator
|
||||
{
|
||||
OffMeshConnectionsManager::OffMeshConnectionsManager(const Settings& settings)
|
||||
: mSettings(settings)
|
||||
{}
|
||||
|
||||
void OffMeshConnectionsManager::add(const ObjectId id, const OffMeshConnection& value)
|
||||
{
|
||||
const auto values = mValues.lock();
|
||||
|
||||
values->mById.insert(std::make_pair(id, value));
|
||||
|
||||
const auto startTilePosition = getTilePosition(mSettings, value.mStart);
|
||||
const auto endTilePosition = getTilePosition(mSettings, value.mEnd);
|
||||
|
||||
values->mByTilePosition[startTilePosition].insert(id);
|
||||
|
||||
if (startTilePosition != endTilePosition)
|
||||
values->mByTilePosition[endTilePosition].insert(id);
|
||||
}
|
||||
|
||||
std::set<TilePosition> OffMeshConnectionsManager::remove(const ObjectId id)
|
||||
{
|
||||
const auto values = mValues.lock();
|
||||
|
||||
const auto byId = values->mById.equal_range(id);
|
||||
|
||||
if (byId.first == byId.second)
|
||||
return {};
|
||||
|
||||
std::set<TilePosition> removed;
|
||||
|
||||
std::for_each(byId.first, byId.second, [&] (const auto& v) {
|
||||
const auto startTilePosition = getTilePosition(mSettings, v.second.mStart);
|
||||
const auto endTilePosition = getTilePosition(mSettings, v.second.mEnd);
|
||||
|
||||
removed.emplace(startTilePosition);
|
||||
if (startTilePosition != endTilePosition)
|
||||
removed.emplace(endTilePosition);
|
||||
});
|
||||
|
||||
values->mById.erase(byId.first, byId.second);
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
std::vector<OffMeshConnection> OffMeshConnectionsManager::get(const TilePosition& tilePosition)
|
||||
{
|
||||
std::vector<OffMeshConnection> result;
|
||||
|
||||
const auto values = mValues.lock();
|
||||
|
||||
const auto itByTilePosition = values->mByTilePosition.find(tilePosition);
|
||||
|
||||
if (itByTilePosition == values->mByTilePosition.end())
|
||||
return result;
|
||||
|
||||
std::for_each(itByTilePosition->second.begin(), itByTilePosition->second.end(),
|
||||
[&] (const ObjectId v)
|
||||
{
|
||||
const auto byId = values->mById.equal_range(v);
|
||||
std::for_each(byId.first, byId.second, [&] (const auto& v) { result.push_back(v.second); });
|
||||
});
|
||||
|
||||
std::sort(result.begin(), result.end());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -2,16 +2,12 @@
|
|||
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_OFFMESHCONNECTIONSMANAGER_H
|
||||
|
||||
#include "settings.hpp"
|
||||
#include "settingsutils.hpp"
|
||||
#include "tileposition.hpp"
|
||||
#include "objectid.hpp"
|
||||
#include "offmeshconnection.hpp"
|
||||
|
||||
#include <components/misc/guarded.hpp>
|
||||
|
||||
#include <osg/Vec3f>
|
||||
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
@ -22,72 +18,13 @@ namespace DetourNavigator
|
|||
class OffMeshConnectionsManager
|
||||
{
|
||||
public:
|
||||
OffMeshConnectionsManager(const Settings& settings)
|
||||
: mSettings(settings)
|
||||
{}
|
||||
OffMeshConnectionsManager(const Settings& settings);
|
||||
|
||||
void add(const ObjectId id, const OffMeshConnection& value)
|
||||
{
|
||||
const auto values = mValues.lock();
|
||||
void add(const ObjectId id, const OffMeshConnection& value);
|
||||
|
||||
values->mById.insert(std::make_pair(id, value));
|
||||
std::set<TilePosition> remove(const ObjectId id);
|
||||
|
||||
const auto startTilePosition = getTilePosition(mSettings, value.mStart);
|
||||
const auto endTilePosition = getTilePosition(mSettings, value.mEnd);
|
||||
|
||||
values->mByTilePosition[startTilePosition].insert(id);
|
||||
|
||||
if (startTilePosition != endTilePosition)
|
||||
values->mByTilePosition[endTilePosition].insert(id);
|
||||
}
|
||||
|
||||
std::set<TilePosition> remove(const ObjectId id)
|
||||
{
|
||||
const auto values = mValues.lock();
|
||||
|
||||
const auto byId = values->mById.equal_range(id);
|
||||
|
||||
if (byId.first == byId.second)
|
||||
return {};
|
||||
|
||||
std::set<TilePosition> removed;
|
||||
|
||||
std::for_each(byId.first, byId.second, [&] (const auto& v) {
|
||||
const auto startTilePosition = getTilePosition(mSettings, v.second.mStart);
|
||||
const auto endTilePosition = getTilePosition(mSettings, v.second.mEnd);
|
||||
|
||||
removed.emplace(startTilePosition);
|
||||
if (startTilePosition != endTilePosition)
|
||||
removed.emplace(endTilePosition);
|
||||
});
|
||||
|
||||
values->mById.erase(byId.first, byId.second);
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
std::vector<OffMeshConnection> get(const TilePosition& tilePosition)
|
||||
{
|
||||
std::vector<OffMeshConnection> result;
|
||||
|
||||
const auto values = mValues.lock();
|
||||
|
||||
const auto itByTilePosition = values->mByTilePosition.find(tilePosition);
|
||||
|
||||
if (itByTilePosition == values->mByTilePosition.end())
|
||||
return result;
|
||||
|
||||
std::for_each(itByTilePosition->second.begin(), itByTilePosition->second.end(),
|
||||
[&] (const ObjectId v)
|
||||
{
|
||||
const auto byId = values->mById.equal_range(v);
|
||||
std::for_each(byId.first, byId.second, [&] (const auto& v) { result.push_back(v.second); });
|
||||
});
|
||||
|
||||
std::sort(result.begin(), result.end());
|
||||
|
||||
return result;
|
||||
}
|
||||
std::vector<OffMeshConnection> get(const TilePosition& tilePosition);
|
||||
|
||||
private:
|
||||
struct Values
|
||||
|
|
Loading…
Reference in a new issue