From 832ab103cb864eda905f4c0aa52fe90145dca864 Mon Sep 17 00:00:00 2001 From: elsid Date: Wed, 2 Feb 2022 01:09:34 +0100 Subject: [PATCH] Filter out unchanged animated objects for navigator update --- apps/openmw/mwphysics/physicssystem.cpp | 9 +++++++-- apps/openmw/mwphysics/physicssystem.hpp | 2 +- apps/openmw/mwworld/worldimp.cpp | 7 ++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index ef7fffa034..f5f22529ff 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -490,7 +490,7 @@ namespace MWPhysics mObjects.emplace(ptr.mRef, obj); if (obj->isAnimated()) - mAnimatedObjects.insert(obj.get()); + mAnimatedObjects.emplace(obj.get(), false); } void PhysicsSystem::remove(const MWWorld::Ptr &ptr) @@ -739,13 +739,18 @@ namespace MWPhysics void PhysicsSystem::stepSimulation(float dt, bool skipSimulation, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) { - for (Object* animatedObject : mAnimatedObjects) + for (auto& [animatedObject, changed] : mAnimatedObjects) { if (animatedObject->animateCollisionShapes()) { auto obj = mObjects.find(animatedObject->getPtr().mRef); assert(obj != mObjects.end()); mTaskScheduler->updateSingleAabb(obj->second); + changed = true; + } + else + { + changed = false; } } diff --git a/apps/openmw/mwphysics/physicssystem.hpp b/apps/openmw/mwphysics/physicssystem.hpp index 1606ac084c..b165f10761 100644 --- a/apps/openmw/mwphysics/physicssystem.hpp +++ b/apps/openmw/mwphysics/physicssystem.hpp @@ -300,7 +300,7 @@ namespace MWPhysics using ObjectMap = std::unordered_map>; ObjectMap mObjects; - std::set mAnimatedObjects; // stores pointers to elements in mObjects + std::map mAnimatedObjects; // stores pointers to elements in mObjects ActorMap mActors; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 706ce4859f..61abb7fcc2 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1525,7 +1525,12 @@ namespace MWWorld void World::updateNavigator() { - mPhysics->forEachAnimatedObject([&] (const MWPhysics::Object* object) { updateNavigatorObject(*object); }); + mPhysics->forEachAnimatedObject([&] (const auto& pair) + { + const auto [object, changed] = pair; + if (changed) + updateNavigatorObject(*object); + }); for (const auto& door : mDoorStates) if (const auto object = mPhysics->getObject(door.first))