mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-21 09:09:43 +00:00
Move tile replacement into separate function
This commit is contained in:
parent
b6243e7d1f
commit
14c9190f49
1 changed files with 45 additions and 39 deletions
|
@ -461,6 +461,49 @@ namespace
|
||||||
++power;
|
++power;
|
||||||
return power;
|
return power;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dtStatus addTile(dtNavMesh& navMesh, const NavMeshData& navMeshData)
|
||||||
|
{
|
||||||
|
const dtTileRef lastRef = 0;
|
||||||
|
dtTileRef* const result = nullptr;
|
||||||
|
return navMesh.addTile(navMeshData.mValue.get(), navMeshData.mSize,
|
||||||
|
doNotTransferOwnership, lastRef, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
dtStatus addTile(dtNavMesh& navMesh, const NavMeshTilesCache::Value& cachedNavMeshData)
|
||||||
|
{
|
||||||
|
const dtTileRef lastRef = 0;
|
||||||
|
dtTileRef* const result = nullptr;
|
||||||
|
return navMesh.addTile(cachedNavMeshData.get().mValue, cachedNavMeshData.get().mSize,
|
||||||
|
doNotTransferOwnership, lastRef, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
UpdateNavMeshStatus replaceTile(const SharedNavMeshCacheItem& navMeshCacheItem,
|
||||||
|
const TilePosition& changedTile, T&& navMeshData)
|
||||||
|
{
|
||||||
|
const auto locked = navMeshCacheItem.lock();
|
||||||
|
auto& navMesh = locked->getValue();
|
||||||
|
const int layer = 0;
|
||||||
|
const auto tileRef = navMesh.getTileRefAt(changedTile.x(), changedTile.y(), layer);
|
||||||
|
unsigned char** const data = nullptr;
|
||||||
|
int* const dataSize = nullptr;
|
||||||
|
const auto removed = dtStatusSucceed(navMesh.removeTile(tileRef, data, dataSize));
|
||||||
|
const auto addStatus = addTile(navMesh, navMeshData);
|
||||||
|
|
||||||
|
if (dtStatusSucceed(addStatus))
|
||||||
|
{
|
||||||
|
locked->setUsedTile(changedTile, std::forward<T>(navMeshData));
|
||||||
|
return makeUpdateNavMeshStatus(removed, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (removed)
|
||||||
|
locked->removeUsedTile(changedTile);
|
||||||
|
log("failed to add tile with status=", WriteDtStatus {addStatus});
|
||||||
|
return makeUpdateNavMeshStatus(removed, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace DetourNavigator
|
namespace DetourNavigator
|
||||||
|
@ -583,47 +626,10 @@ namespace DetourNavigator
|
||||||
if (!cachedNavMeshData)
|
if (!cachedNavMeshData)
|
||||||
{
|
{
|
||||||
log("cache overflow");
|
log("cache overflow");
|
||||||
|
return replaceTile(navMeshCacheItem, changedTile, std::move(navMeshData));
|
||||||
const auto locked = navMeshCacheItem.lock();
|
|
||||||
auto& navMesh = locked->getValue();
|
|
||||||
const auto tileRef = navMesh.getTileRefAt(x, y, 0);
|
|
||||||
const auto removed = dtStatusSucceed(navMesh.removeTile(tileRef, nullptr, nullptr));
|
|
||||||
const auto addStatus = navMesh.addTile(navMeshData.mValue.get(), navMeshData.mSize,
|
|
||||||
doNotTransferOwnership, 0, 0);
|
|
||||||
|
|
||||||
if (dtStatusSucceed(addStatus))
|
|
||||||
{
|
|
||||||
locked->setUsedTile(changedTile, std::move(navMeshData));
|
|
||||||
return makeUpdateNavMeshStatus(removed, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (removed)
|
|
||||||
locked->removeUsedTile(changedTile);
|
|
||||||
log("failed to add tile with status=", WriteDtStatus {addStatus});
|
|
||||||
return makeUpdateNavMeshStatus(removed, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto locked = navMeshCacheItem.lock();
|
return replaceTile(navMeshCacheItem, changedTile, std::move(cachedNavMeshData));
|
||||||
auto& navMesh = locked->getValue();
|
|
||||||
const auto tileRef = navMesh.getTileRefAt(x, y, 0);
|
|
||||||
const auto removed = dtStatusSucceed(navMesh.removeTile(tileRef, nullptr, nullptr));
|
|
||||||
const auto addStatus = navMesh.addTile(cachedNavMeshData.get().mValue, cachedNavMeshData.get().mSize,
|
|
||||||
doNotTransferOwnership, 0, 0);
|
|
||||||
|
|
||||||
if (dtStatusSucceed(addStatus))
|
|
||||||
{
|
|
||||||
locked->setUsedTile(changedTile, std::move(cachedNavMeshData));
|
|
||||||
return makeUpdateNavMeshStatus(removed, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (removed)
|
|
||||||
locked->removeUsedTile(changedTile);
|
|
||||||
log("failed to add tile with status=", WriteDtStatus {addStatus});
|
|
||||||
return makeUpdateNavMeshStatus(removed, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue