Rotations: remove LocalRotation

This never existed in vanilla MW in the first place. The reason we got confused was because of a strange behaviour where the order of applying rotations changes as soon as a script touches the object's rotation.
pull/802/head
scrawl 9 years ago
parent 666fbba1e0
commit b4ce73f179

@ -270,8 +270,6 @@ namespace MWBase
virtual void rotateObject(const MWWorld::Ptr& ptr,float x,float y,float z, bool adjust = false) = 0;
virtual void localRotateObject (const MWWorld::Ptr& ptr, float x, float y, float z) = 0;
virtual MWWorld::Ptr safePlaceObject(const MWWorld::Ptr& ptr, MWWorld::CellStore* cell, ESM::Position pos) = 0;
///< place an object in a "safe" location (ie not in the void, etc).

@ -188,7 +188,12 @@ namespace MWScript
if (ptr.getTypeName() == typeid(ESM::Door).name() && !ptr.getCellRef().getTeleport())
{
MWBase::Environment::get().getWorld()->activateDoor(ptr, 0);
MWBase::Environment::get().getWorld()->localRotateObject(ptr, 0, 0, 0);
float xr = ptr.getCellRef().getPosition().rot[0];
float yr = ptr.getCellRef().getPosition().rot[1];
float zr = ptr.getCellRef().getPosition().rot[2];
MWBase::Environment::get().getWorld()->rotateObject(ptr, xr, yr, zr);
}
}
};

@ -92,26 +92,12 @@ namespace MWScript
float ay = ptr.getRefData().getPosition().rot[1];
float az = ptr.getRefData().getPosition().rot[2];
MWWorld::LocalRotation localRot = ptr.getRefData().getLocalRotation();
if (axis == "x")
{
localRot.rot[0] = 0;
ptr.getRefData().setLocalRotation(localRot);
MWBase::Environment::get().getWorld()->rotateObject(ptr,angle,ay,az);
}
else if (axis == "y")
{
localRot.rot[1] = 0;
ptr.getRefData().setLocalRotation(localRot);
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,angle,az);
}
else if (axis == "z")
{
localRot.rot[2] = 0;
ptr.getRefData().setLocalRotation(localRot);
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay,angle);
}
else
throw std::runtime_error ("invalid rotation axis: " + axis);
}
@ -568,25 +554,19 @@ namespace MWScript
std::string axis = runtime.getStringLiteral (runtime[0].mInteger);
runtime.pop();
Interpreter::Type_Float rotation = (runtime[0].mFloat*MWBase::Environment::get().getFrameDuration());
Interpreter::Type_Float rotation = osg::DegreesToRadians(runtime[0].mFloat*MWBase::Environment::get().getFrameDuration());
runtime.pop();
float ax = osg::RadiansToDegrees(ptr.getRefData().getLocalRotation().rot[0]);
float ay = osg::RadiansToDegrees(ptr.getRefData().getLocalRotation().rot[1]);
float az = osg::RadiansToDegrees(ptr.getRefData().getLocalRotation().rot[2]);
float ax = ptr.getRefData().getPosition().rot[0];
float ay = ptr.getRefData().getPosition().rot[1];
float az = ptr.getRefData().getPosition().rot[2];
if (axis == "x")
{
MWBase::Environment::get().getWorld()->localRotateObject(ptr,ax+rotation,ay,az);
}
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax+rotation,ay,az);
else if (axis == "y")
{
MWBase::Environment::get().getWorld()->localRotateObject(ptr,ax,ay+rotation,az);
}
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay+rotation,az);
else if (axis == "z")
{
MWBase::Environment::get().getWorld()->localRotateObject(ptr,ax,ay,az+rotation);
}
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay,az+rotation);
else
throw std::runtime_error ("invalid rotation axis: " + axis);
}
@ -641,13 +621,11 @@ namespace MWScript
if (!ptr.isInCell())
return;
MWWorld::LocalRotation rot;
rot.rot[0] = 0;
rot.rot[1] = 0;
rot.rot[2] = 0;
ptr.getRefData().setLocalRotation(rot);
float xr = ptr.getCellRef().getPosition().rot[0];
float yr = ptr.getCellRef().getPosition().rot[1];
float zr = ptr.getCellRef().getPosition().rot[2];
MWBase::Environment::get().getWorld()->rotateObject(ptr, 0,0,0,true);
MWBase::Environment::get().getWorld()->rotateObject(ptr, xr, yr, zr);
dynamic_cast<MWScript::InterpreterContext&>(runtime.getContext()).updatePtr(
MWBase::Environment::get().getWorld()->moveObject(ptr, ptr.getCellRef().getPosition().pos[0],

@ -17,7 +17,6 @@ namespace MWWorld
mEnabled = refData.mEnabled;
mCount = refData.mCount;
mPosition = refData.mPosition;
mLocalRotation = refData.mLocalRotation;
mChanged = refData.mChanged;
mDeleted = refData.mDeleted;
@ -37,7 +36,6 @@ namespace MWWorld
{
for (int i=0; i<3; ++i)
{
mLocalRotation.rot[i] = 0;
mPosition.pos[i] = 0;
mPosition.rot[i] = 0;
}
@ -49,9 +47,6 @@ namespace MWWorld
mCustomData (0),
mChanged(false) // Loading from ESM/ESP files -> assume unchanged
{
mLocalRotation.rot[0]=0;
mLocalRotation.rot[1]=0;
mLocalRotation.rot[2]=0;
}
RefData::RefData (const ESM::ObjectState& objectState)
@ -62,8 +57,6 @@ namespace MWWorld
mCustomData (0),
mChanged(true) // Loading from a savegame -> assume changed
{
for (int i=0; i<3; ++i)
mLocalRotation.rot[i] = objectState.mLocalRotation[i];
}
RefData::RefData (const RefData& refData)
@ -87,9 +80,6 @@ namespace MWWorld
objectState.mEnabled = mEnabled;
objectState.mCount = mCount;
objectState.mPosition = mPosition;
for (int i=0; i<3; ++i)
objectState.mLocalRotation[i] = mLocalRotation.rot[i];
}
RefData& RefData::operator= (const RefData& refData)
@ -197,17 +187,6 @@ namespace MWWorld
return mPosition;
}
void RefData::setLocalRotation(const LocalRotation& rot)
{
mChanged = true;
mLocalRotation = rot;
}
const LocalRotation& RefData::getLocalRotation()
{
return mLocalRotation;
}
void RefData::setCustomData (CustomData *data)
{
mChanged = true; // We do not currently track CustomData, so assume anything with a CustomData is changed

@ -21,9 +21,6 @@ namespace ESM
namespace MWWorld
{
struct LocalRotation{
float rot[3];
};
class CustomData;
@ -40,8 +37,6 @@ namespace MWWorld
ESM::Position mPosition;
LocalRotation mLocalRotation;
CustomData *mCustomData;
void copy (const RefData& refData);
@ -110,9 +105,6 @@ namespace MWWorld
void setPosition (const ESM::Position& pos);
const ESM::Position& getPosition();
void setLocalRotation (const LocalRotation& rotation);
const LocalRotation& getLocalRotation();
void setCustomData (CustomData *data);
///< Set custom data (potentially replacing old custom data). The ownership of \a data is
/// transferred to this.

@ -52,15 +52,7 @@ namespace
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 x = ptr.getRefData().getLocalRotation().rot[0];
float y = ptr.getRefData().getLocalRotation().rot[1];
float z = ptr.getRefData().getLocalRotation().rot[2];
osg::Quat rot(z, osg::Vec3(0,0,-1));
if (!ptr.getClass().isActor())
rot = rot * osg::Quat(y, osg::Vec3(0,-1,0)) * osg::Quat(x, osg::Vec3(-1,0,0));
rendering.rotateObject(ptr, rot * worldRotQuat);
rendering.rotateObject(ptr, worldRotQuat);
physics.updateRotation(ptr);
}
}

@ -1258,21 +1258,6 @@ namespace MWWorld
mWorldScene->updateObjectLocalRotation(ptr);
}
void World::localRotateObject (const Ptr& ptr, float x, float y, float z)
{
LocalRotation rot = ptr.getRefData().getLocalRotation();
rot.rot[0]=osg::DegreesToRadians(x);
rot.rot[1]=osg::DegreesToRadians(y);
rot.rot[2]=osg::DegreesToRadians(z);
ptr.getRefData().setLocalRotation(rot);
if (ptr.getRefData().getBaseNode() != 0)
{
mWorldScene->updateObjectLocalRotation(ptr);
}
}
void World::adjustPosition(const Ptr &ptr, bool force)
{
ESM::Position pos (ptr.getRefData().getPosition());
@ -1829,11 +1814,6 @@ namespace MWWorld
object.getClass().copyToCell(object, *cell, pos);
// Reset some position values that could be uninitialized if this item came from a container
LocalRotation localRotation;
localRotation.rot[0] = 0;
localRotation.rot[1] = 0;
localRotation.rot[2] = 0;
dropped.getRefData().setLocalRotation(localRotation);
dropped.getCellRef().setPosition(pos);
dropped.getCellRef().unsetRefNum();

@ -353,9 +353,6 @@ namespace MWWorld
/// \param adjust indicates rotation should be set or adjusted
virtual void rotateObject (const Ptr& ptr,float x,float y,float z, bool adjust = false);
/// Local rotates object, uses degrees
virtual void localRotateObject (const Ptr& ptr, float x, float y, float z);
virtual MWWorld::Ptr safePlaceObject(const MWWorld::Ptr& ptr, MWWorld::CellStore* cell, ESM::Position pos);
///< place an object in a "safe" location (ie not in the void, etc). Makes a copy of the Ptr.

@ -23,7 +23,8 @@ void ESM::ObjectState::load (ESMReader &esm)
esm.getHNOT (mPosition, "POS_", 24);
esm.getHNOT (mLocalRotation, "LROT", 12);
if (esm.isNextSub("LROT"))
esm.skipHSub(); // local rotation, no longer used
// obsolete
int unused;
@ -51,10 +52,7 @@ void ESM::ObjectState::save (ESMWriter &esm, bool inInventory) const
esm.writeHNT ("COUN", mCount);
if (!inInventory)
{
esm.writeHNT ("POS_", mPosition, 24);
esm.writeHNT ("LROT", mLocalRotation, 12);
}
if (!mHasCustomState)
esm.writeHNT ("HCUS", false);
@ -70,7 +68,6 @@ void ESM::ObjectState::blank()
{
mPosition.pos[i] = 0;
mPosition.rot[i] = 0;
mLocalRotation[i] = 0;
}
mHasCustomState = true;
}

@ -24,7 +24,6 @@ namespace ESM
unsigned char mEnabled;
int mCount;
ESM::Position mPosition;
float mLocalRotation[3];
// Is there any class-specific state following the ObjectState
bool mHasCustomState;

Loading…
Cancel
Save