1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-20 15:40:32 +00:00

Filter out unchanged animated objects for navigator update

This commit is contained in:
elsid 2022-02-02 01:09:34 +01:00
parent 05b54cbfb8
commit 832ab103cb
No known key found for this signature in database
GPG Key ID: B845CB9FEE18AB40
3 changed files with 14 additions and 4 deletions

View File

@ -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;
}
}

View File

@ -300,7 +300,7 @@ namespace MWPhysics
using ObjectMap = std::unordered_map<const MWWorld::LiveCellRefBase*, std::shared_ptr<Object>>;
ObjectMap mObjects;
std::set<Object*> mAnimatedObjects; // stores pointers to elements in mObjects
std::map<Object*, bool> mAnimatedObjects; // stores pointers to elements in mObjects
ActorMap mActors;

View File

@ -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))