1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-18 05:42:40 +00:00

Merge branch 'weak_ptr' into 'master'

Store std::weak_ptr into mUpdateAabb.

See merge request OpenMW/openmw!1578
This commit is contained in:
Alexei Kotov 2022-02-23 06:10:29 +00:00
commit 38a0659b7f
2 changed files with 10 additions and 5 deletions

View File

@ -550,7 +550,7 @@ namespace MWPhysics
mCollisionWorld->removeCollisionObject(collisionObject); mCollisionWorld->removeCollisionObject(collisionObject);
} }
void PhysicsTaskScheduler::updateSingleAabb(std::shared_ptr<PtrHolder> ptr, bool immediate) void PhysicsTaskScheduler::updateSingleAabb(const std::shared_ptr<PtrHolder>& ptr, bool immediate)
{ {
if (immediate || mNumThreads == 0) if (immediate || mNumThreads == 0)
{ {
@ -559,7 +559,7 @@ namespace MWPhysics
else else
{ {
MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads); MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads);
mUpdateAabb.insert(std::move(ptr)); mUpdateAabb.insert(ptr);
} }
} }
@ -602,7 +602,12 @@ namespace MWPhysics
{ {
MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads); MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads);
std::for_each(mUpdateAabb.begin(), mUpdateAabb.end(), std::for_each(mUpdateAabb.begin(), mUpdateAabb.end(),
[this](const std::shared_ptr<PtrHolder>& ptr) { updatePtrAabb(ptr); }); [this](const std::weak_ptr<PtrHolder>& ptr)
{
auto p = ptr.lock();
if (p != nullptr)
updatePtrAabb(p);
});
mUpdateAabb.clear(); mUpdateAabb.clear();
} }

View File

@ -54,7 +54,7 @@ namespace MWPhysics
void setCollisionFilterMask(btCollisionObject* collisionObject, int collisionFilterMask); void setCollisionFilterMask(btCollisionObject* collisionObject, int collisionFilterMask);
void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask); void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask);
void removeCollisionObject(btCollisionObject* collisionObject); void removeCollisionObject(btCollisionObject* collisionObject);
void updateSingleAabb(std::shared_ptr<PtrHolder> ptr, bool immediate=false); void updateSingleAabb(const std::shared_ptr<PtrHolder>& ptr, bool immediate=false);
bool getLineOfSight(const std::shared_ptr<Actor>& actor1, const std::shared_ptr<Actor>& actor2); bool getLineOfSight(const std::shared_ptr<Actor>& actor1, const std::shared_ptr<Actor>& actor2);
void debugDraw(); void debugDraw();
void* getUserPointer(const btCollisionObject* object) const; void* getUserPointer(const btCollisionObject* object) const;
@ -85,7 +85,7 @@ namespace MWPhysics
btCollisionWorld* mCollisionWorld; btCollisionWorld* mCollisionWorld;
MWRender::DebugDrawer* mDebugDrawer; MWRender::DebugDrawer* mDebugDrawer;
std::vector<LOSRequest> mLOSCache; std::vector<LOSRequest> mLOSCache;
std::set<std::shared_ptr<PtrHolder>> mUpdateAabb; std::set<std::weak_ptr<PtrHolder>, std::owner_less<std::weak_ptr<PtrHolder>>> mUpdateAabb;
// TODO: use std::experimental::flex_barrier or std::barrier once it becomes a thing // TODO: use std::experimental::flex_barrier or std::barrier once it becomes a thing
std::unique_ptr<Misc::Barrier> mPreStepBarrier; std::unique_ptr<Misc::Barrier> mPreStepBarrier;