Merge pull request #300 from OpenMW/master

Add OpenMW commits up to 28 Sep 2017
experimental
David Cernat 7 years ago committed by GitHub
commit 44fb7518ee

@ -1038,14 +1038,17 @@ namespace MWMechanics
MWWorld::Ptr victim;
bool isAllowed = true;
const MWWorld::CellRef* ownerCellRef = &item.getCellRef();
if (!container.isEmpty())
{
// Inherit the owner of the container
ownerCellRef = &container.getCellRef();
isAllowed = isAllowedToUse(ptr, container, victim);
}
else
{
isAllowed = isAllowedToUse(ptr, item, victim);
if (!item.getCellRef().hasContentFile())
{
// this is a manually placed item, which means it was already stolen
@ -1053,7 +1056,7 @@ namespace MWMechanics
}
}
if (isAllowedToUse(ptr, item, victim))
if (isAllowed)
return;
Owner owner;

@ -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…
Cancel
Save