Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   Related Pages  

/home/rdbrown/doxygen/cse125g1/src/modules/actor/Animation.cpp

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                 //ignore the t in the file for now
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         //see if animation is 'done'
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 //if(endType == ANIM_END_LOOP)
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 }

Generated on Thu Aug 18 16:03:09 2005 for Robin Hood: Thieves & Knights by doxygen1.2.18