#include "SkelAnimModelNodeCtrl.h" #include "SkelAnim.h" #include "Skeleton.h" #include "SkinNode.h" #include "Model.h" #include "MainRenderer.h" #include "Skin.h" //====================================================================================================================== // SkelAnimModelNodeCtrl = //====================================================================================================================== SkelAnimModelNodeCtrl::SkelAnimModelNodeCtrl(SkinNode& skinNode_): Controller(CT_SKEL_ANIM_SKIN_NODE, skinNode_), frame(0.0), skinNode(skinNode_) {} //====================================================================================================================== // interpolate = //====================================================================================================================== void SkelAnimModelNodeCtrl::interpolate(const SkelAnim& animation, float frame, Vec& boneTranslations, Vec& boneRotations) { ASSERT(frame < animation.framesNum); // calculate the t (used in slerp and lerp) using the keyframs and the frame and // calc the lPose and rPose witch indicate the pose IDs in witch the frame lies between const Vec& keyframes = animation.keyframes; float t = 0.0; uint lPose = 0, rPose = 0; for(uint j=0; j frame) { lPose = j-1; rPose = j; t = (frame - (float)keyframes[lPose]) / float(keyframes[rPose] - keyframes[lPose]); break; } } // now for all bones update bone's poses ASSERT(boneRotations.size() >= 1); for(uint i=0; i& boneTranslations, Vec& boneRotations) { uint queue[128]; uint head = 0, tail = 0; // put the roots for(uint i=0; igetPos()], boneRotations[boned.parent->getPos()], boneTranslations[boneId], boneRotations[boneId], boneTranslations[boneId], boneRotations[boneId]); } // now add the bone's childes for(uint i=0; igetPos(); } } } //====================================================================================================================== // deform = //====================================================================================================================== void SkelAnimModelNodeCtrl::deform(const Skeleton& skeleton, const Vec& boneTranslations, const Vec& boneRotations, Vec& heads, Vec& tails) { for(uint i=0; i skelAnim->framesNum) // if the crnt is finished then play the next or loop the crnt { frame = 0.0; } if(!controlledNode.isVisible()) { return; } interpolate(*skelAnim, frame, skinNode.getBoneTranslations(), skinNode.getBoneRotations()); updateBoneTransforms(skinNode.getSkin().getSkeleton(), skinNode.getBoneTranslations(), skinNode.getBoneRotations()); if(MainRendererSingleton::getInstance().getDbg().isEnabled() && MainRendererSingleton::getInstance().getDbg().isShowSkeletonsEnabled()) { deform(skinNode.getSkin().getSkeleton(), skinNode.getBoneTranslations(), skinNode.getBoneRotations(), skinNode.getHeads(), skinNode.getTails()); } }