From 240217ae421c1455b08459533e471482600195b9 Mon Sep 17 00:00:00 2001 From: Glorf Date: Thu, 25 Apr 2013 20:52:38 +0200 Subject: [PATCH] Fixed rotations more than 360 degrees --- apps/openmw/mwworld/worldimp.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 2f488a230..d3190e0b5 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -818,6 +818,22 @@ namespace MWWorld objRot[1] = rot.y; objRot[2] = rot.z; + float fullRotateRad=Ogre::Degree(360).valueRadians(); + + while(objRot[0]>=fullRotateRad) + objRot[0] -= fullRotateRad; + while(objRot[1]>=fullRotateRad) + objRot[1] -= fullRotateRad; + while(objRot[2]>=fullRotateRad) + objRot[2] -= fullRotateRad; + + while(objRot[0]<=-fullRotateRad) + objRot[0] += fullRotateRad; + while(objRot[1]<=-fullRotateRad) + objRot[1] += fullRotateRad; + while(objRot[2]<=-fullRotateRad) + objRot[2] += fullRotateRad; + if (ptr.getRefData().getBaseNode() != 0) { mPhysics->rotateObject(ptr); } @@ -832,6 +848,22 @@ namespace MWWorld ptr.getRefData().getLocalRotation().rot[1]=Ogre::Degree(y).valueRadians(); ptr.getRefData().getLocalRotation().rot[2]=Ogre::Degree(z).valueRadians(); + float fullRotateRad=Ogre::Degree(360).valueRadians(); + + while(ptr.getRefData().getLocalRotation().rot[0]>=fullRotateRad) + ptr.getRefData().getLocalRotation().rot[0]-=fullRotateRad; + while(ptr.getRefData().getLocalRotation().rot[1]>=fullRotateRad) + ptr.getRefData().getLocalRotation().rot[1]-=fullRotateRad; + while(ptr.getRefData().getLocalRotation().rot[2]>=fullRotateRad) + ptr.getRefData().getLocalRotation().rot[2]-=fullRotateRad; + + while(ptr.getRefData().getLocalRotation().rot[0]<=-fullRotateRad) + ptr.getRefData().getLocalRotation().rot[0]+=fullRotateRad; + while(ptr.getRefData().getLocalRotation().rot[1]<=-fullRotateRad) + ptr.getRefData().getLocalRotation().rot[1]+=fullRotateRad; + while(ptr.getRefData().getLocalRotation().rot[2]<=-fullRotateRad) + ptr.getRefData().getLocalRotation().rot[2]+=fullRotateRad; + float *worldRot = ptr.getRefData().getPosition().rot; Ogre::Quaternion worldRotQuat(Ogre::Quaternion(Ogre::Radian(-worldRot[0]), Ogre::Vector3::UNIT_X)*