1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-25 06:35:30 +00:00

Enable collision for postponed objects when any object is disabled

This commit is contained in:
Evil Eye 2022-06-19 20:16:31 +02:00
parent e40461a8e3
commit aa2fab8db5
3 changed files with 30 additions and 20 deletions

View File

@ -575,26 +575,7 @@ namespace MWWorld
return cellsPositionsToLoad;
};
for(const auto& cell : mActiveCells)
{
cell->forEach([&](const MWWorld::Ptr& ptr)
{
if(ptr.mRef->mData.mPhysicsPostponed)
{
ptr.mRef->mData.mPhysicsPostponed = false;
if (ptr.mRef->mData.isEnabled() && ptr.mRef->mData.getCount() > 0)
{
std::string model = getModel(ptr, MWBase::Environment::get().getResourceSystem()->getVFS());
if (!model.empty())
{
const auto rotation = makeNodeRotation(ptr, RotationOrder::direct);
ptr.getClass().insertObjectPhysics(ptr, model, rotation, *mPhysics);
}
}
}
return true;
});
}
addPostponedPhysicsObjects();
auto cellsPositionsToLoad = cellsToLoad(mActiveCells,mHalfGridSize);
@ -637,6 +618,30 @@ namespace MWWorld
mNavigator.wait(*loadingListener, DetourNavigator::WaitConditionType::requiredTilesPresent);
}
void Scene::addPostponedPhysicsObjects()
{
for(const auto& cell : mActiveCells)
{
cell->forEach([&](const MWWorld::Ptr& ptr)
{
if(ptr.mRef->mData.mPhysicsPostponed)
{
ptr.mRef->mData.mPhysicsPostponed = false;
if (ptr.mRef->mData.isEnabled() && ptr.mRef->mData.getCount() > 0)
{
std::string model = getModel(ptr, MWBase::Environment::get().getResourceSystem()->getVFS());
if (!model.empty())
{
const auto rotation = makeNodeRotation(ptr, RotationOrder::direct);
ptr.getClass().insertObjectPhysics(ptr, model, rotation, *mPhysics);
}
}
}
return true;
});
}
}
void Scene::testExteriorCells()
{
// Note: temporary disable ICO to decrease memory usage

View File

@ -174,6 +174,8 @@ namespace MWWorld
void removeObjectFromScene (const Ptr& ptr, bool keepActive = false);
///< Remove an object from the scene, but not from the world model.
void addPostponedPhysicsObjects();
void removeFromPagedRefs(const Ptr &ptr);
void updateObjectRotation(const Ptr& ptr, RotationOrder order);

View File

@ -881,7 +881,10 @@ namespace MWWorld
}
if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end() && reference.getRefData().getCount())
{
mWorldScene->removeObjectFromScene (reference);
mWorldScene->addPostponedPhysicsObjects();
}
}
void World::advanceTime (double hours, bool incremental)