diff --git a/apps/openmw/mwrender/rotatecontroller.cpp b/apps/openmw/mwrender/rotatecontroller.cpp index 5d9339ae09..b8bcde9ee6 100644 --- a/apps/openmw/mwrender/rotatecontroller.cpp +++ b/apps/openmw/mwrender/rotatecontroller.cpp @@ -35,13 +35,25 @@ namespace MWRender return; } osg::Matrix matrix = node->getMatrix(); - osg::Quat worldOrient = getWorldOrientation(node); + + osg::Quat worldOrient; + osg::Vec3d worldScale(1.0, 1.0, 1.0); + + osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); + + if (!nodepaths.empty()) + { + osg::Matrixf worldMat = osg::computeLocalToWorld(nodepaths[0]); + worldOrient = worldMat.getRotate(); + worldScale = worldMat.getScale(); + } + osg::Quat worldOrientInverse = worldOrient.inverse(); osg::Quat orient = worldOrient * mRotate * worldOrientInverse * matrix.getRotate(); matrix.setRotate(orient); - matrix *= osg::Matrix::scale(getParentScale(node)); + matrix *= osg::Matrix::scale(worldScale); node->setMatrix(matrix); @@ -58,28 +70,4 @@ namespace MWRender traverse(node, nv); } - - osg::Quat RotateController::getWorldOrientation(osg::Node* node) - { - // this could be optimized later, we just need the world orientation, not the full matrix - osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); - osg::Quat worldOrient; - if (!nodepaths.empty()) - { - osg::Matrixf worldMat = osg::computeLocalToWorld(nodepaths[0]); - worldOrient = worldMat.getRotate(); - } - return worldOrient; - } - - osg::Vec3d RotateController::getParentScale(osg::Node* node) - { - osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); - if (!nodepaths.empty()) - { - return osg::computeLocalToWorld(nodepaths[0]).getScale(); - } - return osg::Vec3d(1.0, 1.0, 1.0); - } - } diff --git a/apps/openmw/mwrender/rotatecontroller.hpp b/apps/openmw/mwrender/rotatecontroller.hpp index d19b133b28..3c7e130d98 100644 --- a/apps/openmw/mwrender/rotatecontroller.hpp +++ b/apps/openmw/mwrender/rotatecontroller.hpp @@ -27,9 +27,6 @@ namespace MWRender void operator()(osg::MatrixTransform* node, osg::NodeVisitor* nv); protected: - osg::Quat getWorldOrientation(osg::Node* node); - osg::Vec3d getParentScale(osg::Node* node); - bool mEnabled; osg::Vec3f mOffset; osg::Quat mRotate;