diff options
author | psi29a <psi29a@gmail.com> | 2022-01-21 00:28:57 +0000 |
---|---|---|
committer | psi29a <psi29a@gmail.com> | 2022-01-21 00:28:57 +0000 |
commit | 063af50deebe66e6a6555055c6d88feaa6a27148 (patch) | |
tree | 7b25acdf6203ea5d8dc3621e3b6dcaab0417207a | |
parent | 7ae018993a23b7cc01622a9e29042974655101ce (diff) | |
parent | 580edf18b9cd9ec8911ae8ccfb2c03efa2eb0a06 (diff) |
Merge branch 'fix_fargoth_hiding_crash' into 'master'
Use weak_ptr for Actor and Projectile simulations (#6515)
Closes #6515
See merge request OpenMW/openmw!1573
-rw-r--r-- | apps/openmw/mwphysics/mtphysics.cpp | 25 | ||||
-rw-r--r-- | apps/openmw/mwphysics/physicssystem.hpp | 4 |
2 files changed, 22 insertions, 7 deletions
diff --git a/apps/openmw/mwphysics/mtphysics.cpp b/apps/openmw/mwphysics/mtphysics.cpp index 2f7e3b5995..2bbd751f63 100644 --- a/apps/openmw/mwphysics/mtphysics.cpp +++ b/apps/openmw/mwphysics/mtphysics.cpp @@ -118,7 +118,10 @@ namespace const btCollisionWorld* mCollisionWorld; void operator()(MWPhysics::ActorSimulation& sim) const { - auto& [actor, frameData] = sim; + auto& [actorPtr, frameData] = sim; + const auto actor = actorPtr.lock(); + if (actor == nullptr) + return; actor->applyOffsetChange(); frameData.mPosition = actor->getPosition(); if (frameData.mWaterCollision && frameData.mPosition.z() < frameData.mWaterlevel && actor->canMoveToWaterSurface(frameData.mWaterlevel, mCollisionWorld)) @@ -157,7 +160,10 @@ namespace btCollisionWorld* mCollisionWorld; void operator()(MWPhysics::ActorSimulation& sim) const { - auto& [actor, frameData] = sim; + auto& [actorPtr, frameData] = sim; + const auto actor = actorPtr.lock(); + if (actor == nullptr) + return; if (actor->setPosition(frameData.mPosition)) { frameData.mPosition = actor->getPosition(); // account for potential position change made by script @@ -167,7 +173,10 @@ namespace } void operator()(MWPhysics::ProjectileSimulation& sim) const { - auto& [proj, frameData] = sim; + auto& [projPtr, frameData] = sim; + const auto proj = projPtr.lock(); + if (proj == nullptr) + return; proj->setPosition(frameData.mPosition); proj->updateCollisionObjectPosition(); mCollisionWorld->updateSingleAabb(proj->getCollisionObject()); @@ -197,7 +206,10 @@ namespace const MWPhysics::PhysicsTaskScheduler* scheduler; void operator()(MWPhysics::ActorSimulation& sim) const { - auto& [actor, frameData] = sim; + auto& [actorPtr, frameData] = sim; + const auto actor = actorPtr.lock(); + if (actor == nullptr) + return; auto ptr = actor->getPtr(); MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr); @@ -229,7 +241,10 @@ namespace } void operator()(MWPhysics::ProjectileSimulation& sim) const { - auto& [proj, frameData] = sim; + auto& [projPtr, frameData] = sim; + const auto proj = projPtr.lock(); + if (proj == nullptr) + return; proj->setSimulationPosition(::interpolateMovements(*proj, mTimeAccum, mPhysicsDt)); } }; diff --git a/apps/openmw/mwphysics/physicssystem.hpp b/apps/openmw/mwphysics/physicssystem.hpp index c31bbfbf65..d2b535c427 100644 --- a/apps/openmw/mwphysics/physicssystem.hpp +++ b/apps/openmw/mwphysics/physicssystem.hpp @@ -117,8 +117,8 @@ namespace MWPhysics osg::Vec3f mStormDirection; }; - using ActorSimulation = std::pair<std::shared_ptr<Actor>, ActorFrameData>; - using ProjectileSimulation = std::pair<std::shared_ptr<Projectile>, ProjectileFrameData>; + using ActorSimulation = std::pair<std::weak_ptr<Actor>, ActorFrameData>; + using ProjectileSimulation = std::pair<std::weak_ptr<Projectile>, ProjectileFrameData>; using Simulation = std::variant<ActorSimulation, ProjectileSimulation>; class PhysicsSystem : public RayCastingInterface |