mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-27 12:35:46 +00:00
Rotations: use different rotation order when object is rotated via script (Fixes #2062)
This commit is contained in:
parent
b4ce73f179
commit
3647af8d73
@ -42,15 +42,22 @@ namespace
|
|||||||
rendering.addWaterRippleEmitter(ptr);
|
rendering.addWaterRippleEmitter(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateObjectLocalRotation (const MWWorld::Ptr& ptr, MWPhysics::PhysicsSystem& physics,
|
void updateObjectRotation (const MWWorld::Ptr& ptr, MWPhysics::PhysicsSystem& physics,
|
||||||
MWRender::RenderingManager& rendering)
|
MWRender::RenderingManager& rendering, bool inverseRotationOrder)
|
||||||
{
|
{
|
||||||
if (ptr.getRefData().getBaseNode() != NULL)
|
if (ptr.getRefData().getBaseNode() != NULL)
|
||||||
{
|
{
|
||||||
osg::Quat worldRotQuat(ptr.getRefData().getPosition().rot[2], osg::Vec3(0,0,-1));
|
osg::Quat worldRotQuat(ptr.getRefData().getPosition().rot[2], osg::Vec3(0,0,-1));
|
||||||
if (!ptr.getClass().isActor())
|
if (!ptr.getClass().isActor())
|
||||||
worldRotQuat = worldRotQuat * osg::Quat(ptr.getRefData().getPosition().rot[1], osg::Vec3(0,-1,0)) *
|
{
|
||||||
osg::Quat(ptr.getRefData().getPosition().rot[0], osg::Vec3(-1,0,0));
|
float xr = ptr.getRefData().getPosition().rot[0];
|
||||||
|
float yr = ptr.getRefData().getPosition().rot[1];
|
||||||
|
if (!inverseRotationOrder)
|
||||||
|
worldRotQuat = worldRotQuat * osg::Quat(yr, osg::Vec3(0,-1,0)) *
|
||||||
|
osg::Quat(xr, osg::Vec3(-1,0,0));
|
||||||
|
else
|
||||||
|
worldRotQuat = osg::Quat(xr, osg::Vec3(-1,0,0)) * osg::Quat(yr, osg::Vec3(0,-1,0)) * worldRotQuat;
|
||||||
|
}
|
||||||
|
|
||||||
rendering.rotateObject(ptr, worldRotQuat);
|
rendering.rotateObject(ptr, worldRotQuat);
|
||||||
physics.updateRotation(ptr);
|
physics.updateRotation(ptr);
|
||||||
@ -106,7 +113,7 @@ namespace
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
addObject(ptr, mPhysics, mRendering);
|
addObject(ptr, mPhysics, mRendering);
|
||||||
updateObjectLocalRotation(ptr, mPhysics, mRendering);
|
updateObjectRotation(ptr, mPhysics, mRendering, false);
|
||||||
updateObjectScale(ptr, mPhysics, mRendering);
|
updateObjectScale(ptr, mPhysics, mRendering);
|
||||||
ptr.getClass().adjustPosition (ptr, false);
|
ptr.getClass().adjustPosition (ptr, false);
|
||||||
}
|
}
|
||||||
@ -127,9 +134,9 @@ namespace
|
|||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
|
|
||||||
void Scene::updateObjectLocalRotation (const Ptr& ptr)
|
void Scene::updateObjectRotation (const Ptr& ptr, bool inverseRotationOrder)
|
||||||
{
|
{
|
||||||
::updateObjectLocalRotation(ptr, *mPhysics, mRendering);
|
::updateObjectRotation(ptr, *mPhysics, mRendering, inverseRotationOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::updateObjectScale(const Ptr &ptr)
|
void Scene::updateObjectScale(const Ptr &ptr)
|
||||||
@ -548,7 +555,7 @@ namespace MWWorld
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
addObject(ptr, *mPhysics, mRendering);
|
addObject(ptr, *mPhysics, mRendering);
|
||||||
MWBase::Environment::get().getWorld()->rotateObject(ptr, 0, 0, 0, true);
|
updateObjectRotation(ptr, false);
|
||||||
MWBase::Environment::get().getWorld()->scaleObject(ptr, ptr.getCellRef().getScale());
|
MWBase::Environment::get().getWorld()->scaleObject(ptr, ptr.getCellRef().getScale());
|
||||||
}
|
}
|
||||||
catch (std::exception& e)
|
catch (std::exception& e)
|
||||||
|
@ -107,7 +107,7 @@ namespace MWWorld
|
|||||||
void removeObjectFromScene (const Ptr& ptr);
|
void removeObjectFromScene (const Ptr& ptr);
|
||||||
///< Remove an object from the scene, but not from the world model.
|
///< Remove an object from the scene, but not from the world model.
|
||||||
|
|
||||||
void updateObjectLocalRotation (const Ptr& ptr);
|
void updateObjectRotation (const Ptr& ptr, bool inverseRotationOrder);
|
||||||
void updateObjectScale(const Ptr& ptr);
|
void updateObjectScale(const Ptr& ptr);
|
||||||
|
|
||||||
bool isCellActive(const CellStore &cell);
|
bool isCellActive(const CellStore &cell);
|
||||||
|
@ -1255,7 +1255,7 @@ namespace MWWorld
|
|||||||
ptr.getRefData().setPosition(pos);
|
ptr.getRefData().setPosition(pos);
|
||||||
|
|
||||||
if(ptr.getRefData().getBaseNode() != 0)
|
if(ptr.getRefData().getBaseNode() != 0)
|
||||||
mWorldScene->updateObjectLocalRotation(ptr);
|
mWorldScene->updateObjectRotation(ptr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::adjustPosition(const Ptr &ptr, bool force)
|
void World::adjustPosition(const Ptr &ptr, bool force)
|
||||||
|
@ -350,6 +350,8 @@ namespace MWWorld
|
|||||||
virtual void scaleObject (const Ptr& ptr, float scale);
|
virtual void scaleObject (const Ptr& ptr, float scale);
|
||||||
|
|
||||||
/// World rotates object, uses radians
|
/// World rotates object, uses radians
|
||||||
|
/// @note Rotations via this method use a different rotation order than the initial rotations in the CS. This
|
||||||
|
/// could be considered a bug, but is needed for MW compatibility.
|
||||||
/// \param adjust indicates rotation should be set or adjusted
|
/// \param adjust indicates rotation should be set or adjusted
|
||||||
virtual void rotateObject (const Ptr& ptr,float x,float y,float z, bool adjust = false);
|
virtual void rotateObject (const Ptr& ptr,float x,float y,float z, bool adjust = false);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user