void Animation::handleAnimationTransforms(){ Ogre::SkeletonInstance* skel = base->getSkeleton(); Ogre::Bone* b = skel->getRootBone(); b->setOrientation(Ogre::Real(.3),Ogre::Real(.3),Ogre::Real(.3), Ogre::Real(.3)); //This is a trick skel->_updateTransforms(); //skel->_notifyManualBonesDirty(); base->getAllAnimationStates()->_notifyDirty(); //base->_updateAnimation(); //base->_notifyMoved(); std::vector<Nif::NiKeyframeData>::iterator iter; int slot = 0; if(transformations){ for(iter = transformations->begin(); iter != transformations->end(); iter++){ if(time < iter->getStartTime() || time < startTime || time > iter->getStopTime()) { slot++; continue; } float x; float x2; const std::vector<Ogre::Quaternion> & quats = iter->getQuat(); const std::vector<float> & ttime = iter->gettTime(); const std::vector<float> & rtime = iter->getrTime(); int rindexJ = rindexI[slot]; timeIndex(time, rtime, rindexI[slot], rindexJ, x2); int tindexJ = tindexI[slot]; const std::vector<Ogre::Vector3> & translist1 = iter->getTranslist1(); timeIndex(time, ttime, tindexI[slot], tindexJ, x); Ogre::Vector3 t; Ogre::Quaternion r; bool bTrans = translist1.size() > 0; bool bQuats = quats.size() > 0; if(skel->hasBone(iter->getBonename())){ Ogre::Bone* bone = skel->getBone(iter->getBonename()); if(bTrans){ Ogre::Vector3 v1 = translist1[tindexI[slot]]; Ogre::Vector3 v2 = translist1[tindexJ]; t = (v1 + (v2 - v1) * x); bone->setPosition(t); } if(bQuats){ r = Ogre::Quaternion::Slerp(x2, quats[rindexI[slot]], quats[rindexJ], true); bone->setOrientation(r); } } slot++; } skel->_updateTransforms(); base->getAllAnimationStates()->_notifyDirty(); } }