Tuesday, October 19, 2010

And this is why your API should fail violently...

Animations aren't working any more. Crap, what changed? Let's see... I reorganized my animation system. Shit, I probably changed something wrong.

Debug. Debug. Step through. Print matrices. Wait... all the keyframes have the same transforms. What? Oh! Am I serializing out BoneTransform[0] instead of BoneTransform[i]? No... no because all the time deltas are correct.

It must be in the keyframe generation code. Damn, what did I change in there? Hmmm... well I changed the animation's name to something more reasonable than "Take001". But that wouldn't affe-- oh wait:

//Should be lTakeNames[i]->Buffer(),
//but this is always dumb: "Take001".
lAnimation->SetName(lFile.FileName());

//...

//Recalculate the animations of each bone:
for(unsigned j = 0; j < mSkeleton->mFbxBones.size(); ++j)
{
  CalculateKeyFrames(mSkeleton->mFbxBones[j],
  lAnimation.GetName().c_str(),
  lAnimation->GetTimelines()[j],
  mAxisConvertor,
  lStart,
  lKeyFrameTimes);
}

Shit, it's using the file name to request keyframe data instead of the take name...

//Should be lTakeNames[i]->Buffer(),
//but this is always dumb: "Take001".
lAnimation->SetName(lFile.FileName());

//...

//Recalculate the animations of each bone:
for(unsigned j = 0; j < mSkeleton->mFbxBones.size(); ++j)
{
  CalculateKeyFrames(mSkeleton->mFbxBones[j],
  //vvv THIS LINE DOWN HERE CHANGED
  lTakeName[i]->Buffer(),
  lAnimation->GetTimelines()[j],
  mAxisConvertor,
  lStart,
  lKeyFrameTimes);
}

Yes! That fixed it! ... WAIT... why the HELL did the FBX SDK not throw any warnings or assertions that I was requesting a take that didn't exist. It crashes on almost anything else that goes awry; why not this? Instead it repeatedly gave me the first keyframe on the global timeline.

Thanks, API.

No comments:

Post a Comment