mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-27 00:40:21 +00:00
Merge pull request #1479 from akortunov/physics
Make physics framerate configurable
This commit is contained in:
commit
e5d1fd022f
@ -1,5 +1,6 @@
|
||||
#include "physicssystem.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <osg/Group>
|
||||
@ -683,6 +684,7 @@ namespace MWPhysics
|
||||
, mWaterHeight(0)
|
||||
, mWaterEnabled(false)
|
||||
, mParentNode(parentNode)
|
||||
, mPhysicsDt(1.f / 60.f)
|
||||
{
|
||||
mResourceSystem->addResourceManager(mShapeManager.get());
|
||||
|
||||
@ -695,6 +697,20 @@ namespace MWPhysics
|
||||
// Don't update AABBs of all objects every frame. Most objects in MW are static, so we don't need this.
|
||||
// Should a "static" object ever be moved, we have to update its AABB manually using DynamicsWorld::updateSingleAabb.
|
||||
mCollisionWorld->setForceUpdateAllAabbs(false);
|
||||
|
||||
// Check if a user decided to override a physics system FPS
|
||||
const char* env = getenv("OPENMW_PHYSICS_FPS");
|
||||
if (env)
|
||||
{
|
||||
std::string str(env);
|
||||
|
||||
float physFramerate = std::atof(env);
|
||||
if (physFramerate > 0)
|
||||
{
|
||||
mPhysicsDt = 1.f / physFramerate;
|
||||
std::cerr << "Warning: physics framerate was overriden (a new value is " << physFramerate << ")." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PhysicsSystem::~PhysicsSystem()
|
||||
@ -1357,13 +1373,12 @@ namespace MWPhysics
|
||||
mMovementResults.clear();
|
||||
|
||||
mTimeAccum += dt;
|
||||
const float physicsDt = 1.f/60.0f;
|
||||
|
||||
const int maxAllowedSteps = 20;
|
||||
int numSteps = mTimeAccum / (physicsDt);
|
||||
int numSteps = mTimeAccum / (mPhysicsDt);
|
||||
numSteps = std::min(numSteps, maxAllowedSteps);
|
||||
|
||||
mTimeAccum -= numSteps * physicsDt;
|
||||
mTimeAccum -= numSteps * mPhysicsDt;
|
||||
|
||||
if (numSteps)
|
||||
{
|
||||
@ -1412,7 +1427,7 @@ namespace MWPhysics
|
||||
bool positionChanged = false;
|
||||
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, mPhysicsDt,
|
||||
flying, waterlevel, slowFall, mCollisionWorld, mStandingCollisions);
|
||||
if (position != physicActor->getPosition())
|
||||
positionChanged = true;
|
||||
@ -1421,7 +1436,7 @@ namespace MWPhysics
|
||||
if (positionChanged)
|
||||
mCollisionWorld->updateSingleAabb(physicActor->getCollisionObject());
|
||||
|
||||
float interpolationFactor = mTimeAccum / physicsDt;
|
||||
float interpolationFactor = mTimeAccum / mPhysicsDt;
|
||||
osg::Vec3f interpolated = position * interpolationFactor + physicActor->getPreviousPosition() * (1.f - interpolationFactor);
|
||||
|
||||
float heightDiff = position.z() - oldHeight;
|
||||
|
@ -220,6 +220,8 @@ namespace MWPhysics
|
||||
|
||||
osg::ref_ptr<osg::Group> mParentNode;
|
||||
|
||||
float mPhysicsDt;
|
||||
|
||||
PhysicsSystem (const PhysicsSystem&);
|
||||
PhysicsSystem& operator= (const PhysicsSystem&);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user