From aae21c6f53f64d83e0a68311dc454455d8b08322 Mon Sep 17 00:00:00 2001 From: epochwon Date: Wed, 30 Jul 2025 14:51:18 -0400 Subject: [PATCH] Get physics fps delta time from physics system --- apps/openmw/mwbase/world.hpp | 2 ++ apps/openmw/mwphysics/physicssystem.hpp | 4 ++-- apps/openmw/mwsound/openaloutput.cpp | 2 -- apps/openmw/mwsound/soundmanagerimp.cpp | 17 +++++------------ apps/openmw/mwworld/worldimp.cpp | 5 +++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index f268ed0e52..9b2755ac8a 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -481,6 +481,8 @@ namespace MWBase virtual float getSunVisibility() const = 0; virtual float getSunPercentage() const = 0; + virtual float getPhysicsFrameRateDT() const = 0; + virtual bool findInteriorPositionInWorldSpace(const MWWorld::CellStore* cell, osg::Vec3f& result) = 0; /// Teleports \a ptr to the closest reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker) diff --git a/apps/openmw/mwphysics/physicssystem.hpp b/apps/openmw/mwphysics/physicssystem.hpp index 546d72676e..e85fc23067 100644 --- a/apps/openmw/mwphysics/physicssystem.hpp +++ b/apps/openmw/mwphysics/physicssystem.hpp @@ -287,6 +287,8 @@ namespace MWPhysics void reportStats(unsigned int frameNumber, osg::Stats& stats) const; void reportCollision(const btVector3& position, const btVector3& normal); + float mPhysicsDt; + private: void updateWater(); @@ -330,8 +332,6 @@ namespace MWPhysics osg::ref_ptr mParentNode; - float mPhysicsDt; - std::size_t mSimulationsCounter = 0; std::array, 2> mSimulations; std::vector> mActorsPositions; diff --git a/apps/openmw/mwsound/openaloutput.cpp b/apps/openmw/mwsound/openaloutput.cpp index 58f78ac280..ed6e448645 100644 --- a/apps/openmw/mwsound/openaloutput.cpp +++ b/apps/openmw/mwsound/openaloutput.cpp @@ -1587,8 +1587,6 @@ namespace MWSound : SoundOutput(mgr) , mDevice(nullptr) , mContext(nullptr) - , mListenerPos(0.0f, 0.0f, 0.0f) - , mListenerVel(0.0f, 0.0f, 0.0f) , mListenerEnv(Env_Normal) , mWaterFilter(0) , mWaterEffect(0) diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp index 3933af1523..de285e4b3b 100644 --- a/apps/openmw/mwsound/soundmanagerimp.cpp +++ b/apps/openmw/mwsound/soundmanagerimp.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -43,8 +42,6 @@ namespace MWSound constexpr float sSfxFadeOutDuration = 1.0f; constexpr float sSoundCullDistance = 2000.f; - float physicsFramerate = 60.f; - WaterSoundUpdaterSettings makeWaterSoundUpdaterSettings() { WaterSoundUpdaterSettings settings; @@ -142,13 +139,6 @@ namespace MWSound return; } - if (const char* env = getenv("OPENMW_PHYSICS_FPS")) - { - if (const auto physFramerate = Misc::StringUtils::toNumeric(env); - physFramerate.has_value() && *physFramerate > 0) - physicsFramerate = *physFramerate; - } - std::vector names = mOutput->enumerate(); std::stringstream stream; @@ -991,7 +981,9 @@ namespace MWSound { sound->setLastPosition(sound->getPosition()); sound->setPosition(ptr.getRefData().getPosition().asVec3()); - sound->setVelocity((sound->getPosition() - sound->getLastPosition()) * physicsFramerate); + MWBase::World* world = MWBase::Environment::get().getWorld(); + sound->setVelocity( + (sound->getPosition() - sound->getLastPosition()) / world->getPhysicsFrameRateDT()); } cull3DSound(sound); @@ -1031,7 +1023,8 @@ namespace MWSound sound->setLastPosition(sound->getPosition()); MWBase::World* world = MWBase::Environment::get().getWorld(); sound->setPosition(world->getActorHeadTransform(ptr).getTrans()); - sound->setVelocity((sound->getPosition() - sound->getLastPosition()) * physicsFramerate); + sound->setVelocity( + (sound->getPosition() - sound->getLastPosition()) / world->getPhysicsFrameRateDT()); } cull3DSound(sound); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index eaa8799e84..1ed18a25af 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -3152,6 +3152,11 @@ namespace MWWorld return mWeatherManager->getSunPercentage(getTimeStamp().getHour()); } + float World::getPhysicsFrameRateDT() const + { + return mPhysics->mPhysicsDt; + } + bool World::findInteriorPositionInWorldSpace(const MWWorld::CellStore* cell, osg::Vec3f& result) { if (cell->isExterior()) diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index b1286d5532..c0a7c37b8f 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -576,6 +576,8 @@ namespace MWWorld float getSunVisibility() const override; float getSunPercentage() const override; + float getPhysicsFrameRateDT() const override; + bool findInteriorPositionInWorldSpace(const MWWorld::CellStore* cell, osg::Vec3f& result) override; /// Teleports \a ptr to the closest reference of \a id (e.g. DivineMarker, PrisonMarker, TempleMarker)