Avoid unnecessary AABB update when actor position has not changed

coverity_scan^2
scrawl 8 years ago
parent fb073e5c14
commit a55604c549

@ -1419,14 +1419,18 @@ namespace MWPhysics
osg::Vec3f position = physicActor->getPosition(); osg::Vec3f position = physicActor->getPosition();
float oldHeight = position.z(); float oldHeight = position.z();
bool positionChanged = false;
for (int i=0; i<numSteps; ++i) for (int i=0; i<numSteps; ++i)
{ {
position = MovementSolver::move(position, physicActor->getPtr(), physicActor, iter->second, physicsDt, position = MovementSolver::move(position, physicActor->getPtr(), physicActor, iter->second, physicsDt,
world->isFlying(iter->first), world->isFlying(iter->first),
waterlevel, slowFall, mCollisionWorld, mStandingCollisions); waterlevel, slowFall, mCollisionWorld, mStandingCollisions);
physicActor->setPosition(position); if (position != physicActor->getPosition())
positionChanged = true;
physicActor->setPosition(position); // always set even if unchanged to make sure interpolation is correct
} }
mCollisionWorld->updateSingleAabb(physicActor->getCollisionObject()); if (positionChanged)
mCollisionWorld->updateSingleAabb(physicActor->getCollisionObject());
float interpolationFactor = mTimeAccum / physicsDt; float interpolationFactor = mTimeAccum / physicsDt;
osg::Vec3f interpolated = position * interpolationFactor + physicActor->getPreviousPosition() * (1.f - interpolationFactor); osg::Vec3f interpolated = position * interpolationFactor + physicActor->getPreviousPosition() * (1.f - interpolationFactor);

Loading…
Cancel
Save