From ac5844cad25ceab73ed1067e0cda7f72ae244f05 Mon Sep 17 00:00:00 2001 From: elsid Date: Wed, 25 May 2022 20:41:11 +0200 Subject: [PATCH] Do not perform physics simulation for actors outside processing range Actors with disabled collisions still have physics simulations. Assuming they should not be processed at all instead of disabling collision add a new flag to make them inactive. --- apps/openmw/mwbase/world.hpp | 2 ++ apps/openmw/mwmechanics/actors.cpp | 4 +++- apps/openmw/mwphysics/actor.cpp | 1 + apps/openmw/mwphysics/actor.hpp | 5 +++++ apps/openmw/mwphysics/physicssystem.cpp | 3 +++ apps/openmw/mwworld/worldimp.cpp | 6 ++++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ 7 files changed, 22 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 3d904631cd..23bd70d8db 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -672,6 +672,8 @@ namespace MWBase virtual MWRender::RenderingManager* getRenderingManager() = 0; virtual MWRender::PostProcessor* getPostProcessor() = 0; + + virtual void setActorActive(const MWWorld::Ptr& ptr, bool value) = 0; }; } diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index a60d5ce0f3..cd53220c23 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1593,10 +1593,12 @@ namespace MWMechanics if (!inRange) { actor.getPtr().getRefData().getBaseNode()->setNodeMask(0); - world->setActorCollisionMode(actor.getPtr(), false, false); + world->setActorActive(actor.getPtr(), false); continue; } + world->setActorActive(actor.getPtr(), true); + const bool isDead = actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isDead(); if (!isDead && (!godmode || !isPlayer) && actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isParalyzed()) ctrl.skipAnim(); diff --git a/apps/openmw/mwphysics/actor.cpp b/apps/openmw/mwphysics/actor.cpp index a1f5a48388..e4edb32845 100644 --- a/apps/openmw/mwphysics/actor.cpp +++ b/apps/openmw/mwphysics/actor.cpp @@ -27,6 +27,7 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic , mForce(0.f, 0.f, 0.f), mOnGround(true), mOnSlope(false) , mInternalCollisionMode(true) , mExternalCollisionMode(true) + , mActive(false) , mTaskScheduler(scheduler) { mPtr = ptr; diff --git a/apps/openmw/mwphysics/actor.hpp b/apps/openmw/mwphysics/actor.hpp index d19211d49e..2b67f265c6 100644 --- a/apps/openmw/mwphysics/actor.hpp +++ b/apps/openmw/mwphysics/actor.hpp @@ -152,6 +152,10 @@ namespace MWPhysics bool canMoveToWaterSurface(float waterlevel, const btCollisionWorld* world) const; + bool isActive() const { return mActive; } + + void setActive(bool value) { mActive = value; } + private: MWWorld::Ptr mStandingOnPtr; /// Removes then re-adds the collision object to the dynamics world @@ -190,6 +194,7 @@ namespace MWPhysics bool mOnSlope; bool mInternalCollisionMode; bool mExternalCollisionMode; + bool mActive; PhysicsTaskScheduler* mTaskScheduler; diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 4de60f4900..e20d5c0439 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -712,6 +712,9 @@ namespace MWPhysics const MWBase::World *world = MWBase::Environment::get().getWorld(); for (const auto& [ref, physicActor] : mActors) { + if (!physicActor->isActive()) + continue; + auto ptr = physicActor->getPtr(); if (!ptr.getClass().isMobile(ptr)) continue; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 6b9930a989..5036c1721d 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -4002,4 +4002,10 @@ namespace MWWorld { return mRendering->getPostProcessor(); } + + void World::setActorActive(const MWWorld::Ptr& ptr, bool value) + { + if (MWPhysics::Actor* const actor = mPhysics->getActor(ptr)) + actor->setActive(value); + } } diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index c6e316c25a..91ca90090b 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -754,6 +754,8 @@ namespace MWWorld MWRender::RenderingManager* getRenderingManager() override { return mRendering.get(); } MWRender::PostProcessor* getPostProcessor() override; + + void setActorActive(const MWWorld::Ptr& ptr, bool value) override; }; }