mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-07 13:20:25 +00:00
Merge branch '9003rd_times_the_charm' into 'master'
Rework again scripted movement. Partially revert and refine !1324 See merge request OpenMW/openmw!1372
This commit is contained in:
commit
b4a5e8ed19
@ -297,7 +297,7 @@ namespace MWBase
|
|||||||
= 0;
|
= 0;
|
||||||
///< @return an updated Ptr
|
///< @return an updated Ptr
|
||||||
|
|
||||||
virtual MWWorld::Ptr moveObjectBy(const MWWorld::Ptr& ptr, const osg::Vec3f& vec) = 0;
|
virtual MWWorld::Ptr moveObjectBy(const MWWorld::Ptr& ptr, const osg::Vec3f& vec, bool moveToActive) = 0;
|
||||||
///< @return an updated Ptr
|
///< @return an updated Ptr
|
||||||
|
|
||||||
virtual void scaleObject(const MWWorld::Ptr& ptr, float scale, bool force = false) = 0;
|
virtual void scaleObject(const MWWorld::Ptr& ptr, float scale, bool force = false) = 0;
|
||||||
|
@ -185,8 +185,6 @@ namespace MWPhysics
|
|||||||
trans.setOrigin(Misc::Convert::toBullet(newPosition));
|
trans.setOrigin(Misc::Convert::toBullet(newPosition));
|
||||||
trans.setRotation(Misc::Convert::toBullet(mRotation));
|
trans.setRotation(Misc::Convert::toBullet(mRotation));
|
||||||
mCollisionObject->setWorldTransform(trans);
|
mCollisionObject->setWorldTransform(trans);
|
||||||
|
|
||||||
mWorldPositionChanged = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Vec3f Actor::getCollisionObjectPosition() const
|
osg::Vec3f Actor::getCollisionObjectPosition() const
|
||||||
@ -198,14 +196,13 @@ namespace MWPhysics
|
|||||||
bool Actor::setPosition(const osg::Vec3f& position)
|
bool Actor::setPosition(const osg::Vec3f& position)
|
||||||
{
|
{
|
||||||
std::scoped_lock lock(mPositionMutex);
|
std::scoped_lock lock(mPositionMutex);
|
||||||
|
const bool worldPositionChanged = mPositionOffset.length2() != 0;
|
||||||
applyOffsetChange();
|
applyOffsetChange();
|
||||||
bool hasChanged = (mPosition.operator!=(position) && !mSkipSimulation) || mWorldPositionChanged;
|
if (worldPositionChanged || mSkipSimulation)
|
||||||
if (!mSkipSimulation)
|
return true;
|
||||||
{
|
mPreviousPosition = mPosition;
|
||||||
mPreviousPosition = mPosition;
|
mPosition = position;
|
||||||
mPosition = position;
|
return mPreviousPosition != mPosition;
|
||||||
}
|
|
||||||
return hasChanged;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::adjustPosition(const osg::Vec3f& offset)
|
void Actor::adjustPosition(const osg::Vec3f& offset)
|
||||||
@ -214,15 +211,16 @@ namespace MWPhysics
|
|||||||
mPositionOffset += offset;
|
mPositionOffset += offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::applyOffsetChange()
|
osg::Vec3f Actor::applyOffsetChange()
|
||||||
{
|
{
|
||||||
if (mPositionOffset.length() == 0)
|
if (mPositionOffset.length2() != 0)
|
||||||
return;
|
{
|
||||||
mPosition += mPositionOffset;
|
mPosition += mPositionOffset;
|
||||||
mPreviousPosition += mPositionOffset;
|
mPreviousPosition += mPositionOffset;
|
||||||
mSimulationPosition += mPositionOffset;
|
mSimulationPosition += mPositionOffset;
|
||||||
mPositionOffset = osg::Vec3f();
|
mPositionOffset = osg::Vec3f();
|
||||||
mWorldPositionChanged = true;
|
}
|
||||||
|
return mPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::setRotation(osg::Quat quat)
|
void Actor::setRotation(osg::Quat quat)
|
||||||
|
@ -96,7 +96,7 @@ namespace MWPhysics
|
|||||||
void adjustPosition(const osg::Vec3f& offset);
|
void adjustPosition(const osg::Vec3f& offset);
|
||||||
|
|
||||||
// apply position offset. Can't be called during simulation
|
// apply position offset. Can't be called during simulation
|
||||||
void applyOffsetChange();
|
osg::Vec3f applyOffsetChange();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the half extents of the collision body (scaled according to rendering scale)
|
* Returns the half extents of the collision body (scaled according to rendering scale)
|
||||||
@ -176,7 +176,6 @@ namespace MWPhysics
|
|||||||
|
|
||||||
osg::Vec3f mScale;
|
osg::Vec3f mScale;
|
||||||
osg::Vec3f mPositionOffset;
|
osg::Vec3f mPositionOffset;
|
||||||
bool mWorldPositionChanged = false;
|
|
||||||
bool mSkipSimulation = true;
|
bool mSkipSimulation = true;
|
||||||
mutable std::mutex mPositionMutex;
|
mutable std::mutex mPositionMutex;
|
||||||
|
|
||||||
|
@ -475,6 +475,9 @@ namespace MWPhysics
|
|||||||
if (actor.mSkipCollisionDetection) // noclipping/tcl
|
if (actor.mSkipCollisionDetection) // noclipping/tcl
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (actor.mMovement.length2() == 0) // no AI nor player attempted to move, current position is assumed correct
|
||||||
|
return;
|
||||||
|
|
||||||
auto tempPosition = actor.mPosition;
|
auto tempPosition = actor.mPosition;
|
||||||
|
|
||||||
if (actor.mStuckFrames >= 10)
|
if (actor.mStuckFrames >= 10)
|
||||||
|
@ -176,16 +176,15 @@ namespace
|
|||||||
return;
|
return;
|
||||||
auto& [actor, frameDataRef] = *locked;
|
auto& [actor, frameDataRef] = *locked;
|
||||||
auto& frameData = frameDataRef.get();
|
auto& frameData = frameDataRef.get();
|
||||||
actor->applyOffsetChange();
|
frameData.mPosition = actor->applyOffsetChange();
|
||||||
frameData.mPosition = actor->getPosition();
|
|
||||||
if (frameData.mWaterCollision && frameData.mPosition.z() < frameData.mWaterlevel
|
if (frameData.mWaterCollision && frameData.mPosition.z() < frameData.mWaterlevel
|
||||||
&& actor->canMoveToWaterSurface(frameData.mWaterlevel, mCollisionWorld))
|
&& actor->canMoveToWaterSurface(frameData.mWaterlevel, mCollisionWorld))
|
||||||
{
|
{
|
||||||
const auto offset = osg::Vec3f(0, 0, frameData.mWaterlevel - frameData.mPosition.z());
|
const auto offset = osg::Vec3f(0, 0, frameData.mWaterlevel - frameData.mPosition.z());
|
||||||
MWBase::Environment::get().getWorld()->moveObjectBy(actor->getPtr(), offset);
|
MWBase::Environment::get().getWorld()->moveObjectBy(actor->getPtr(), offset, false);
|
||||||
actor->applyOffsetChange();
|
frameData.mPosition = actor->applyOffsetChange();
|
||||||
frameData.mPosition = actor->getPosition();
|
|
||||||
}
|
}
|
||||||
|
actor->updateCollisionObjectPosition();
|
||||||
frameData.mOldHeight = frameData.mPosition.z();
|
frameData.mOldHeight = frameData.mPosition.z();
|
||||||
const auto rotation = actor->getPtr().getRefData().getPosition().asRotationVec3();
|
const auto rotation = actor->getPtr().getRefData().getPosition().asRotationVec3();
|
||||||
frameData.mRotation = osg::Vec2f(rotation.x(), rotation.z());
|
frameData.mRotation = osg::Vec2f(rotation.x(), rotation.z());
|
||||||
|
@ -35,7 +35,7 @@ namespace MWScript
|
|||||||
std::vector<MWWorld::Ptr> actors;
|
std::vector<MWWorld::Ptr> actors;
|
||||||
MWBase::Environment::get().getWorld()->getActorsStandingOn(ptr, actors);
|
MWBase::Environment::get().getWorld()->getActorsStandingOn(ptr, actors);
|
||||||
for (auto& actor : actors)
|
for (auto& actor : actors)
|
||||||
MWBase::Environment::get().getWorld()->moveObjectBy(actor, diff);
|
MWBase::Environment::get().getWorld()->moveObjectBy(actor, diff, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class R>
|
template <class R>
|
||||||
@ -331,7 +331,7 @@ namespace MWScript
|
|||||||
}
|
}
|
||||||
|
|
||||||
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
||||||
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObject(ptr, newPos, true, true));
|
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObjectBy(ptr, newPos - curPos, true));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -753,7 +753,7 @@ namespace MWScript
|
|||||||
// This approach can be used to create elevators.
|
// This approach can be used to create elevators.
|
||||||
moveStandingActors(ptr, diff);
|
moveStandingActors(ptr, diff);
|
||||||
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
||||||
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObjectBy(ptr, diff));
|
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObjectBy(ptr, diff, false));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -788,7 +788,7 @@ namespace MWScript
|
|||||||
// This approach can be used to create elevators.
|
// This approach can be used to create elevators.
|
||||||
moveStandingActors(ptr, diff);
|
moveStandingActors(ptr, diff);
|
||||||
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext())
|
||||||
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObjectBy(ptr, diff));
|
.updatePtr(ptr, MWBase::Environment::get().getWorld()->moveObjectBy(ptr, diff, false));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1265,14 +1265,14 @@ namespace MWWorld
|
|||||||
return moveObject(ptr, cell, position, movePhysics);
|
return moveObject(ptr, cell, position, movePhysics);
|
||||||
}
|
}
|
||||||
|
|
||||||
MWWorld::Ptr World::moveObjectBy(const Ptr& ptr, const osg::Vec3f& vec)
|
MWWorld::Ptr World::moveObjectBy(const Ptr& ptr, const osg::Vec3f& vec, bool moveToActive)
|
||||||
{
|
{
|
||||||
auto* actor = mPhysics->getActor(ptr);
|
auto* actor = mPhysics->getActor(ptr);
|
||||||
osg::Vec3f newpos = ptr.getRefData().getPosition().asVec3() + vec;
|
osg::Vec3f newpos = ptr.getRefData().getPosition().asVec3() + vec;
|
||||||
if (actor)
|
if (actor)
|
||||||
actor->adjustPosition(vec);
|
actor->adjustPosition(vec);
|
||||||
if (ptr.getClass().isActor())
|
if (ptr.getClass().isActor())
|
||||||
return moveObject(ptr, newpos, false, ptr != getPlayerPtr());
|
return moveObject(ptr, newpos, false, moveToActive && ptr != getPlayerPtr());
|
||||||
return moveObject(ptr, newpos);
|
return moveObject(ptr, newpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,7 +378,7 @@ namespace MWWorld
|
|||||||
bool keepActive = false) override;
|
bool keepActive = false) override;
|
||||||
///< @return an updated Ptr
|
///< @return an updated Ptr
|
||||||
|
|
||||||
MWWorld::Ptr moveObjectBy(const Ptr& ptr, const osg::Vec3f& vec) override;
|
MWWorld::Ptr moveObjectBy(const Ptr& ptr, const osg::Vec3f& vec, bool moveToActive) override;
|
||||||
///< @return an updated Ptr
|
///< @return an updated Ptr
|
||||||
|
|
||||||
void scaleObject(const Ptr& ptr, float scale, bool force = false) override;
|
void scaleObject(const Ptr& ptr, float scale, bool force = false) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user