1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-21 20:39:41 +00:00

Add navmesh update status builder

This commit is contained in:
elsid 2019-03-08 15:06:47 +03:00
parent 14c9190f49
commit 0c16fef285
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
3 changed files with 50 additions and 20 deletions

View file

@ -32,11 +32,11 @@ namespace DetourNavigator
{ {
switch (value) switch (value)
{ {
case UpdateNavMeshStatus::ignore: case UpdateNavMeshStatus::ignored:
return stream << "ignore"; return stream << "ignore";
case UpdateNavMeshStatus::removed: case UpdateNavMeshStatus::removed:
return stream << "removed"; return stream << "removed";
case UpdateNavMeshStatus::add: case UpdateNavMeshStatus::added:
return stream << "add"; return stream << "add";
case UpdateNavMeshStatus::replaced: case UpdateNavMeshStatus::replaced:
return stream << "replaced"; return stream << "replaced";

View file

@ -441,17 +441,47 @@ namespace
return NavMeshData(navMeshData, navMeshDataSize); return NavMeshData(navMeshData, navMeshDataSize);
} }
UpdateNavMeshStatus makeUpdateNavMeshStatus(bool removed, bool add) class UpdateNavMeshStatusBuilder
{ {
if (removed && add) public:
return UpdateNavMeshStatus::replaced; UpdateNavMeshStatusBuilder() = default;
else if (removed)
return UpdateNavMeshStatus::removed; UpdateNavMeshStatusBuilder removed(bool value)
else if (add) {
return UpdateNavMeshStatus::add; if (value)
else set(UpdateNavMeshStatus::removed);
return UpdateNavMeshStatus::ignore; else
} unset(UpdateNavMeshStatus::removed);
return *this;
}
UpdateNavMeshStatusBuilder added(bool value)
{
if (value)
set(UpdateNavMeshStatus::added);
else
unset(UpdateNavMeshStatus::added);
return *this;
}
UpdateNavMeshStatus getResult() const
{
return mResult;
}
private:
UpdateNavMeshStatus mResult = UpdateNavMeshStatus::ignored;
void set(UpdateNavMeshStatus value)
{
mResult = static_cast<UpdateNavMeshStatus>(static_cast<unsigned>(mResult) | static_cast<unsigned>(value));
}
void unset(UpdateNavMeshStatus value)
{
mResult = static_cast<UpdateNavMeshStatus>(static_cast<unsigned>(mResult) & ~static_cast<unsigned>(value));
}
};
template <class T> template <class T>
unsigned long getMinValuableBitsNumber(const T value) unsigned long getMinValuableBitsNumber(const T value)
@ -494,14 +524,14 @@ namespace
if (dtStatusSucceed(addStatus)) if (dtStatusSucceed(addStatus))
{ {
locked->setUsedTile(changedTile, std::forward<T>(navMeshData)); locked->setUsedTile(changedTile, std::forward<T>(navMeshData));
return makeUpdateNavMeshStatus(removed, true); return UpdateNavMeshStatusBuilder().added(true).removed(removed).getResult();
} }
else else
{ {
if (removed) if (removed)
locked->removeUsedTile(changedTile); locked->removeUsedTile(changedTile);
log("failed to add tile with status=", WriteDtStatus {addStatus}); log("failed to add tile with status=", WriteDtStatus {addStatus});
return makeUpdateNavMeshStatus(removed, false); return UpdateNavMeshStatusBuilder().removed(removed).getResult();
} }
} }
} }
@ -565,7 +595,7 @@ namespace DetourNavigator
const auto removed = dtStatusSucceed(navMesh.removeTile(tileRef, nullptr, nullptr)); const auto removed = dtStatusSucceed(navMesh.removeTile(tileRef, nullptr, nullptr));
if (removed) if (removed)
locked->removeUsedTile(changedTile); locked->removeUsedTile(changedTile);
return makeUpdateNavMeshStatus(removed, false); return UpdateNavMeshStatusBuilder().removed(removed).getResult();
}; };
if (!recastMesh) if (!recastMesh)

View file

@ -20,12 +20,12 @@ namespace DetourNavigator
class RecastMesh; class RecastMesh;
struct Settings; struct Settings;
enum class UpdateNavMeshStatus enum class UpdateNavMeshStatus : unsigned
{ {
ignore, ignored = 0,
removed, removed = 1 << 0,
add, added = 1 << 1,
replaced replaced = removed | added,
}; };
inline float getLength(const osg::Vec2i& value) inline float getLength(const osg::Vec2i& value)