From 26bdba88a2a9a48a4779b11cda6555f5f6f30d6f Mon Sep 17 00:00:00 2001 From: fredzio Date: Sat, 22 Jan 2022 17:17:20 +0100 Subject: [PATCH] Store std::weak_ptr into mUpdateAabb. This avoid extending the lifetime of collision objects beyond what they should. --- apps/openmw/mwphysics/mtphysics.cpp | 11 ++++++++--- apps/openmw/mwphysics/mtphysics.hpp | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwphysics/mtphysics.cpp b/apps/openmw/mwphysics/mtphysics.cpp index 2bbd751f63..29a59314b9 100644 --- a/apps/openmw/mwphysics/mtphysics.cpp +++ b/apps/openmw/mwphysics/mtphysics.cpp @@ -518,7 +518,7 @@ namespace MWPhysics mCollisionWorld->removeCollisionObject(collisionObject); } - void PhysicsTaskScheduler::updateSingleAabb(std::shared_ptr ptr, bool immediate) + void PhysicsTaskScheduler::updateSingleAabb(const std::shared_ptr& ptr, bool immediate) { if (immediate || mNumThreads == 0) { @@ -527,7 +527,7 @@ namespace MWPhysics else { MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads); - mUpdateAabb.insert(std::move(ptr)); + mUpdateAabb.insert(ptr); } } @@ -570,7 +570,12 @@ namespace MWPhysics { MaybeExclusiveLock lock(mUpdateAabbMutex, mNumThreads); std::for_each(mUpdateAabb.begin(), mUpdateAabb.end(), - [this](const std::shared_ptr& ptr) { updatePtrAabb(ptr); }); + [this](const std::weak_ptr& ptr) + { + auto p = ptr.lock(); + if (p != nullptr) + updatePtrAabb(p); + }); mUpdateAabb.clear(); } diff --git a/apps/openmw/mwphysics/mtphysics.hpp b/apps/openmw/mwphysics/mtphysics.hpp index 9ded1262d6..685d4eefab 100644 --- a/apps/openmw/mwphysics/mtphysics.hpp +++ b/apps/openmw/mwphysics/mtphysics.hpp @@ -54,7 +54,7 @@ namespace MWPhysics void setCollisionFilterMask(btCollisionObject* collisionObject, int collisionFilterMask); void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask); void removeCollisionObject(btCollisionObject* collisionObject); - void updateSingleAabb(std::shared_ptr ptr, bool immediate=false); + void updateSingleAabb(const std::shared_ptr& ptr, bool immediate=false); bool getLineOfSight(const std::shared_ptr& actor1, const std::shared_ptr& actor2); void debugDraw(); void* getUserPointer(const btCollisionObject* object) const; @@ -85,7 +85,7 @@ namespace MWPhysics btCollisionWorld* mCollisionWorld; MWRender::DebugDrawer* mDebugDrawer; std::vector mLOSCache; - std::set> mUpdateAabb; + std::set, std::owner_less>> mUpdateAabb; // TODO: use std::experimental::flex_barrier or std::barrier once it becomes a thing std::unique_ptr mPreStepBarrier;