]> git.lizzy.rs Git - irrlicht.git/blobdiff - source/Irrlicht/CSkinnedMesh.cpp
Avoid some broken calculations for IBoneSceneNode positions.
[irrlicht.git] / source / Irrlicht / CSkinnedMesh.cpp
index 75e2ca645a9f2b7d5e15c3540d7a36424cdf1675..07e86d6b009c57e8a5e25bee4a559a2cef747e46 100644 (file)
@@ -1347,9 +1347,24 @@ void CSkinnedMesh::recoverJointsFromMesh(core::array<IBoneSceneNode*> &jointChil
        {\r
                IBoneSceneNode* node=jointChildSceneNodes[i];\r
                SJoint *joint=AllJoints[i];\r
-               node->setPosition(joint->LocalAnimatedMatrix.getTranslation());\r
-               node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees());\r
-               node->setScale(joint->LocalAnimatedMatrix.getScale());\r
+\r
+               if ( joint->UseAnimationFrom )  // Seems to work better (else solution seems to mess up sometimes) and would be faster. Any disadvantage?\r
+               {\r
+                       node->setPosition(joint->Animatedposition);\r
+                       core::quaternion qrot = joint->Animatedrotation;\r
+                       qrot.W *= -1.f; // Animation system uses right-handed rotations? Argh... \r
+                       irr::core::vector3df euler;\r
+                       qrot.toEuler(euler);\r
+                       euler *= core::RADTODEG;\r
+                       node->setRotation(euler);\r
+                       node->setScale(joint->Animatedscale);\r
+               }\r
+               else\r
+               {\r
+                       node->setPosition(joint->LocalAnimatedMatrix.getTranslation());\r
+                       node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees());\r
+                       node->setScale(joint->LocalAnimatedMatrix.getScale());\r
+               }\r
 \r
                node->positionHint=joint->positionHint;\r
                node->scaleHint=joint->scaleHint;\r