From ceabeab0fd106cbcaf9b33c9c36712e3a620d7c8 Mon Sep 17 00:00:00 2001 From: Sam Hellawell Date: Thu, 4 Apr 2024 00:11:15 +0100 Subject: [PATCH] Fix RotateController not updating skeleton --- apps/openmw/mwrender/rotatecontroller.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/rotatecontroller.cpp b/apps/openmw/mwrender/rotatecontroller.cpp index d7f8bb902c..73c4cddff5 100644 --- a/apps/openmw/mwrender/rotatecontroller.cpp +++ b/apps/openmw/mwrender/rotatecontroller.cpp @@ -1,6 +1,7 @@ #include "rotatecontroller.hpp" #include +#include namespace MWRender { @@ -40,9 +41,19 @@ namespace MWRender osg::Quat orient = worldOrient * mRotate * worldOrientInverse * matrix.getRotate(); matrix.setRotate(orient); matrix.setTrans(matrix.getTrans() + worldOrientInverse * mOffset); - node->setMatrix(matrix); + // If we are linked to a bone we must call setMatrixInSkeletonSpace + osgAnimation::Bone* b = dynamic_cast(node); + if (b) + { + osgAnimation::Bone* parent = b->getBoneParent(); + if (parent) + b->setMatrixInSkeletonSpace(matrix * parent->getMatrixInSkeletonSpace()); + else + b->setMatrixInSkeletonSpace(matrix); + } + traverse(node, nv); }