mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-02 06:45:33 +00:00
Limit oscillating recast mesh object AABB by tile bounds
AABB change outside recast mesh tile should not affect navmesh for this tile.
This commit is contained in:
parent
d122e184cc
commit
f4f9fa4701
4 changed files with 22 additions and 3 deletions
|
@ -1,9 +1,23 @@
|
|||
#include "oscillatingrecastmeshobject.hpp"
|
||||
#include "tilebounds.hpp"
|
||||
|
||||
#include <components/bullethelpers/aabb.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace DetourNavigator
|
||||
{
|
||||
namespace
|
||||
{
|
||||
void limitBy(btAABB& aabb, const TileBounds& bounds)
|
||||
{
|
||||
aabb.m_min.setX(std::max(aabb.m_min.x(), static_cast<btScalar>(bounds.mMin.x())));
|
||||
aabb.m_min.setY(std::max(aabb.m_min.y(), static_cast<btScalar>(bounds.mMin.y())));
|
||||
aabb.m_max.setX(std::min(aabb.m_max.x(), static_cast<btScalar>(bounds.mMax.x())));
|
||||
aabb.m_max.setY(std::min(aabb.m_max.y(), static_cast<btScalar>(bounds.mMax.y())));
|
||||
}
|
||||
}
|
||||
|
||||
OscillatingRecastMeshObject::OscillatingRecastMeshObject(RecastMeshObject&& impl, std::size_t lastChangeRevision)
|
||||
: mImpl(std::move(impl))
|
||||
, mLastChangeRevision(lastChangeRevision)
|
||||
|
@ -19,7 +33,7 @@ namespace DetourNavigator
|
|||
}
|
||||
|
||||
bool OscillatingRecastMeshObject::update(const btTransform& transform, const AreaType areaType,
|
||||
std::size_t lastChangeRevision)
|
||||
std::size_t lastChangeRevision, const TileBounds& bounds)
|
||||
{
|
||||
const btTransform oldTransform = mImpl.getTransform();
|
||||
if (!mImpl.update(transform, areaType))
|
||||
|
@ -37,6 +51,7 @@ namespace DetourNavigator
|
|||
}
|
||||
const btAABB currentAabb = mAabb;
|
||||
mAabb.merge(BulletHelpers::getAabb(mImpl.getShape(), transform));
|
||||
limitBy(mAabb, bounds);
|
||||
return currentAabb != mAabb;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "areatype.hpp"
|
||||
#include "recastmeshobject.hpp"
|
||||
#include "tilebounds.hpp"
|
||||
|
||||
#include <LinearMath/btTransform.h>
|
||||
#include <BulletCollision/Gimpact/btBoxCollision.h>
|
||||
|
@ -15,7 +16,8 @@ namespace DetourNavigator
|
|||
explicit OscillatingRecastMeshObject(RecastMeshObject&& impl, std::size_t lastChangeRevision);
|
||||
explicit OscillatingRecastMeshObject(const RecastMeshObject& impl, std::size_t lastChangeRevision);
|
||||
|
||||
bool update(const btTransform& transform, const AreaType areaType, std::size_t lastChangeRevision);
|
||||
bool update(const btTransform& transform, const AreaType areaType, std::size_t lastChangeRevision,
|
||||
const TileBounds& bounds);
|
||||
|
||||
const RecastMeshObject& getImpl() const { return mImpl; }
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace DetourNavigator
|
|||
RecastMeshManager::RecastMeshManager(const Settings& settings, const TileBounds& bounds, std::size_t generation)
|
||||
: mGeneration(generation)
|
||||
, mMeshBuilder(settings, bounds)
|
||||
, mTileBounds(bounds)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -29,7 +30,7 @@ namespace DetourNavigator
|
|||
return false;
|
||||
const std::size_t lastChangeRevision = mLastNavMeshReportedChange.has_value()
|
||||
? mLastNavMeshReportedChange->mRevision : mRevision;
|
||||
if (!object->second->update(transform, areaType, lastChangeRevision))
|
||||
if (!object->second->update(transform, areaType, lastChangeRevision, mTileBounds))
|
||||
return false;
|
||||
++mRevision;
|
||||
return true;
|
||||
|
|
|
@ -65,6 +65,7 @@ namespace DetourNavigator
|
|||
std::size_t mRevision = 0;
|
||||
std::size_t mGeneration;
|
||||
RecastMeshBuilder mMeshBuilder;
|
||||
TileBounds mTileBounds;
|
||||
std::list<OscillatingRecastMeshObject> mObjectsOrder;
|
||||
std::unordered_map<ObjectId, std::list<OscillatingRecastMeshObject>::iterator> mObjects;
|
||||
std::list<Water> mWaterOrder;
|
||||
|
|
Loading…
Reference in a new issue