mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-18 06:06:45 +00:00
Merge branch 'altitude_fix' into 'master'
Fix z offset for Actors from SetPos and Move See merge request OpenMW/openmw!702
This commit is contained in:
commit
86719c26b3
2 changed files with 11 additions and 11 deletions
|
@ -3,6 +3,8 @@
|
||||||
#include <BulletCollision/CollisionShapes/btBoxShape.h>
|
#include <BulletCollision/CollisionShapes/btBoxShape.h>
|
||||||
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
||||||
|
|
||||||
|
#include <apps/openmw/mwmechanics/actorutil.hpp>
|
||||||
|
#include <apps/openmw/mwworld/cellstore.hpp>
|
||||||
#include <components/sceneutil/positionattitudetransform.hpp>
|
#include <components/sceneutil/positionattitudetransform.hpp>
|
||||||
#include <components/resource/bulletshape.hpp>
|
#include <components/resource/bulletshape.hpp>
|
||||||
#include <components/debug/debuglog.hpp>
|
#include <components/debug/debuglog.hpp>
|
||||||
|
@ -195,6 +197,15 @@ void Actor::applyOffsetChange()
|
||||||
{
|
{
|
||||||
if (mPositionOffset.length() == 0)
|
if (mPositionOffset.length() == 0)
|
||||||
return;
|
return;
|
||||||
|
if (mPositionOffset.z() != 0)
|
||||||
|
{
|
||||||
|
// Often, offset are set in sequence x, y, z
|
||||||
|
// We don't want actors to be moved under the ground
|
||||||
|
// Check terrain height at new coordinate and update z offset if necessary
|
||||||
|
const auto pos = mWorldPosition + mPositionOffset;
|
||||||
|
const auto terrainHeight = mPtr.getCell()->isExterior() ? MWBase::Environment::get().getWorld()->getTerrainHeightAt(pos) : -std::numeric_limits<float>::max();
|
||||||
|
mPositionOffset.z() = std::max(pos.z(), terrainHeight) - mWorldPosition.z();
|
||||||
|
}
|
||||||
mWorldPosition += mPositionOffset;
|
mWorldPosition += mPositionOffset;
|
||||||
mPosition += mPositionOffset;
|
mPosition += mPositionOffset;
|
||||||
mPreviousPosition += mPositionOffset;
|
mPreviousPosition += mPositionOffset;
|
||||||
|
|
|
@ -284,17 +284,6 @@ namespace MWScript
|
||||||
}
|
}
|
||||||
else if(axis == "z")
|
else if(axis == "z")
|
||||||
{
|
{
|
||||||
// We should not place actors under ground
|
|
||||||
if (ptr.getClass().isActor())
|
|
||||||
{
|
|
||||||
float terrainHeight = -std::numeric_limits<float>::max();
|
|
||||||
if (ptr.getCell()->isExterior())
|
|
||||||
terrainHeight = MWBase::Environment::get().getWorld()->getTerrainHeightAt(curPos);
|
|
||||||
|
|
||||||
if (pos < terrainHeight)
|
|
||||||
pos = terrainHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
newPos[2] = pos;
|
newPos[2] = pos;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue