00001 #include "Animation.h"
00002
00003 void Animation::Load(Tokenizer &tokens)
00004 {
00005 char temp[64];
00006 tokens.FindToken("keyframes");
00007 numKeys = tokens.GetInt();
00008
00009 bool rootTranslation = false;
00010 tokens.GetToken(temp);
00011 if(strcmp(temp,"roottranslation") == 0)
00012 {
00013 rootTranslation = true;
00014 tokens.FindToken("endtype");
00015 }
00016 pose.SetRootTranslation(rootTranslation);
00017 endType = (enum AnimEndType)tokens.GetInt();
00018
00019 tokens.FindToken("numbones");
00020 numBones = tokens.GetInt();
00021 keyRate = 0.03333f;
00022 pose.Init(numBones);
00023
00024 keyFrames = new AnimPose[numKeys];
00025
00026 for(int key = 0; key < numKeys; key++)
00027 {
00028 keyFrames[key].Init(numBones);
00029 tokens.FindToken("time");
00030 float t = tokens.GetFloat();
00031
00032 keyFrames[key].SetTime(key*keyRate);
00033 keyFrames[key].SetRootTranslation(rootTranslation);
00034
00035 Vector3 *currKey = keyFrames[key].GetPose();
00036 if(rootTranslation)
00037 {
00038 float x = tokens.GetFloat() * 0.0533;
00039 float y = tokens.GetFloat() * 0.0533;
00040 float z = tokens.GetFloat() * 0.0533;
00041 keyFrames[key].SetRootPos(x,y,z);
00042 }
00043 for(int bone = 0; bone < numBones; bone++)
00044 {
00045 float x = tokens.GetFloat();
00046 float y = tokens.GetFloat();
00047 float z = tokens.GetFloat();
00048 currKey[bone].Set(x,y,z);
00049 }
00050 }
00051 }
00052
00053 AnimPose *Animation::GetPose(float time)
00054 {
00055 int key0, key1;
00056 float tdiff, percent;
00057
00058 done = false;
00059 if(time > (numKeys * keyRate))
00060 {
00061 if(endType == ANIM_END_HOLD || endType == ANIM_END_STOP)
00062 {
00063 key0 = numKeys - 1;
00064 key1 = 0;
00065 tdiff = percent = 0.0f;
00066 }
00067 else
00068 {
00069 key0 = (int)floorf(time/keyRate) % numKeys;
00070 key1 = (int)ceilf(time/keyRate) % numKeys;
00071 tdiff = fmodf(time,(float)numKeys*keyRate) - keyFrames[key0].GetTime();
00072 percent = tdiff/keyRate;
00073 }
00074 if(endType == ANIM_END_STOP)
00075 done = true;
00076 }
00077 else
00078 {
00079 key0 = (int)floorf(time/keyRate) % numKeys;
00080 key1 = (int)ceilf(time/keyRate) % numKeys;
00081 tdiff = fmodf(time,(float)numKeys*keyRate) - keyFrames[key0].GetTime();
00082 percent = tdiff/keyRate;
00083 }
00084
00085 pose.SetTime(time);
00086
00087 Vector3 *pose0 = keyFrames[key0].GetPose();
00088 Vector3 *pose1 = keyFrames[key1].GetPose();
00089 Vector3 *newPose = pose.GetPose();
00090 if(pose.GetRootTranslation())
00091 {
00092 Vector3 r0 = keyFrames[key0].GetRootPos();
00093 Vector3 r1 = keyFrames[key1].GetRootPos();
00094 pose.SetRootPos(r0.x + (percent * (r1.x - r0.x)),
00095 r0.y + (percent * (r1.y - r0.y)),
00096 r0.z + (percent * (r1.z - r0.z)));
00097 }
00098
00099 for(int i = 0; i < numBones; i++)
00100 {
00101 newPose[i].x = pose0[i].x + (percent * (pose1[i].x - pose0[i].x));
00102 newPose[i].y = pose0[i].y + (percent * (pose1[i].y - pose0[i].y));
00103 newPose[i].z = pose0[i].z + (percent * (pose1[i].z - pose0[i].z));
00104 }
00105
00106 return &pose;
00107 }