openmw/components/detournavigator/recastmeshmanager.cpp

66 lines
2 KiB
C++
Raw Normal View History

2018-03-14 01:49:08 +03:00
#include "recastmeshmanager.hpp"
2018-05-26 17:44:25 +03:00
#include <BulletCollision/CollisionShapes/btCompoundShape.h>
2018-03-14 01:49:08 +03:00
#include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
namespace DetourNavigator
{
2018-04-16 01:07:18 +03:00
RecastMeshManager::RecastMeshManager(const Settings& settings, const TileBounds& bounds)
2018-03-14 01:49:08 +03:00
: mShouldRebuild(false)
2018-04-16 01:07:18 +03:00
, mMeshBuilder(settings, bounds)
{
}
2018-03-14 01:49:08 +03:00
2018-07-12 11:44:11 +03:00
bool RecastMeshManager::addObject(std::size_t id, const btCollisionShape& shape, const btTransform& transform,
2018-07-18 22:09:50 +03:00
const AreaType areaType)
2018-03-14 01:49:08 +03:00
{
2018-07-18 22:09:50 +03:00
if (!mObjects.emplace(id, RecastMeshObject(shape, transform, areaType)).second)
2018-03-14 01:49:08 +03:00
return false;
mShouldRebuild = true;
2018-05-26 17:44:25 +03:00
return mShouldRebuild;
2018-03-14 01:49:08 +03:00
}
2018-07-18 22:09:50 +03:00
bool RecastMeshManager::updateObject(std::size_t id, const btTransform& transform, const AreaType areaType)
2018-05-26 17:44:25 +03:00
{
const auto object = mObjects.find(id);
if (object == mObjects.end())
return false;
2018-07-18 22:09:50 +03:00
if (!object->second.update(transform, areaType))
2018-05-26 17:44:25 +03:00
return false;
mShouldRebuild = true;
return mShouldRebuild;
}
boost::optional<RemovedRecastMeshObject> RecastMeshManager::removeObject(std::size_t id)
2018-03-14 01:49:08 +03:00
{
const auto object = mObjects.find(id);
if (object == mObjects.end())
return boost::none;
2018-05-26 17:44:25 +03:00
const RemovedRecastMeshObject result {object->second.getShape(), object->second.getTransform()};
mObjects.erase(object);
2018-03-14 01:49:08 +03:00
mShouldRebuild = true;
return result;
2018-03-14 01:49:08 +03:00
}
std::shared_ptr<RecastMesh> RecastMeshManager::getMesh()
{
rebuild();
return mMeshBuilder.create();
}
2018-04-16 01:07:18 +03:00
bool RecastMeshManager::isEmpty() const
{
return mObjects.empty();
}
2018-03-14 01:49:08 +03:00
void RecastMeshManager::rebuild()
{
if (!mShouldRebuild)
return;
mMeshBuilder.reset();
for (const auto& v : mObjects)
2018-07-18 22:09:50 +03:00
mMeshBuilder.addObject(v.second.getShape(), v.second.getTransform(), v.second.getAreaType());
2018-03-14 01:49:08 +03:00
mShouldRebuild = false;
}
}