From bd98404890dd64178925fcc53d1f68d39f6eba34 Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 16 Sep 2022 23:43:02 +0200 Subject: [PATCH] Initialize PtrHolder::mPtr and positions by its constructor --- apps/openmw/mwphysics/actor.cpp | 6 ++---- apps/openmw/mwphysics/actor.hpp | 2 +- apps/openmw/mwphysics/object.cpp | 4 ++-- apps/openmw/mwphysics/projectile.cpp | 3 ++- apps/openmw/mwphysics/ptrholder.hpp | 8 ++++++++ 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwphysics/actor.cpp b/apps/openmw/mwphysics/actor.cpp index a23a2e56f4..70a718223c 100644 --- a/apps/openmw/mwphysics/actor.cpp +++ b/apps/openmw/mwphysics/actor.cpp @@ -22,7 +22,8 @@ namespace MWPhysics Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, PhysicsTaskScheduler* scheduler, bool canWaterWalk, DetourNavigator::CollisionShapeType collisionShapeType) - : mStandingOnPtr(nullptr), mCanWaterWalk(canWaterWalk), mWalkingOnWater(false) + : PtrHolder(ptr, ptr.getRefData().getPosition().asVec3()) + , mStandingOnPtr(nullptr), mCanWaterWalk(canWaterWalk), mWalkingOnWater(false) , mMeshTranslation(shape->mCollisionBox.mCenter), mOriginalHalfExtents(shape->mCollisionBox.mExtents) , mStuckFrames(0), mLastStuckPosition{0, 0, 0} , mForce(0.f, 0.f, 0.f), mOnGround(true), mOnSlope(false) @@ -31,8 +32,6 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic , mActive(false) , mTaskScheduler(scheduler) { - mPtr = ptr; - // We can not create actor without collisions - he will fall through the ground. // In this case we should autogenerate collision box based on mesh shape // (NPCs have bodyparts and use a different approach) @@ -99,7 +98,6 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic if(!mRotationallyInvariant) setRotation(mPtr.getRefData().getBaseNode()->getAttitude()); - updatePosition(); addCollisionMask(getCollisionMask()); updateCollisionObjectPosition(); } diff --git a/apps/openmw/mwphysics/actor.hpp b/apps/openmw/mwphysics/actor.hpp index 146a065063..f7c3ce1872 100644 --- a/apps/openmw/mwphysics/actor.hpp +++ b/apps/openmw/mwphysics/actor.hpp @@ -190,7 +190,7 @@ namespace MWPhysics osg::Vec3f mScale; osg::Vec3f mPositionOffset; bool mWorldPositionChanged; - bool mSkipSimulation; + bool mSkipSimulation = true; mutable std::mutex mPositionMutex; unsigned int mStuckFrames; diff --git a/apps/openmw/mwphysics/object.cpp b/apps/openmw/mwphysics/object.cpp index f222a38340..b646925ab1 100644 --- a/apps/openmw/mwphysics/object.cpp +++ b/apps/openmw/mwphysics/object.cpp @@ -15,14 +15,14 @@ namespace MWPhysics { Object::Object(const MWWorld::Ptr& ptr, osg::ref_ptr shapeInstance, osg::Quat rotation, int collisionType, PhysicsTaskScheduler* scheduler) - : mShapeInstance(std::move(shapeInstance)) + : PtrHolder(ptr, osg::Vec3f()) + , mShapeInstance(std::move(shapeInstance)) , mSolid(true) , mScale(ptr.getCellRef().getScale(), ptr.getCellRef().getScale(), ptr.getCellRef().getScale()) , mPosition(ptr.getRefData().getPosition().asVec3()) , mRotation(rotation) , mTaskScheduler(scheduler) { - mPtr = ptr; mCollisionObject = BulletHelpers::makeCollisionObject(mShapeInstance->mCollisionShape.get(), Misc::Convert::toBullet(mPosition), Misc::Convert::toBullet(rotation)); mCollisionObject->setUserPointer(this); diff --git a/apps/openmw/mwphysics/projectile.cpp b/apps/openmw/mwphysics/projectile.cpp index 29ec4387b1..d9bfd74bf5 100644 --- a/apps/openmw/mwphysics/projectile.cpp +++ b/apps/openmw/mwphysics/projectile.cpp @@ -15,7 +15,8 @@ namespace MWPhysics { Projectile::Projectile(const MWWorld::Ptr& caster, const osg::Vec3f& position, float radius, PhysicsTaskScheduler* scheduler, PhysicsSystem* physicssystem) - : mHitWater(false) + : PtrHolder(MWWorld::Ptr(), position) + , mHitWater(false) , mActive(true) , mHitTarget(nullptr) , mPhysics(physicssystem) diff --git a/apps/openmw/mwphysics/ptrholder.hpp b/apps/openmw/mwphysics/ptrholder.hpp index c4141d14bc..e2ba60518c 100644 --- a/apps/openmw/mwphysics/ptrholder.hpp +++ b/apps/openmw/mwphysics/ptrholder.hpp @@ -16,6 +16,14 @@ namespace MWPhysics class PtrHolder { public: + explicit PtrHolder(const MWWorld::Ptr& ptr, const osg::Vec3f& position) + : mPtr(ptr) + , mSimulationPosition(position) + , mPosition(position) + , mPreviousPosition(position) + { + } + virtual ~PtrHolder() = default; void updatePtr(const MWWorld::Ptr& updated)