aafefe9abab6be9c1c00693cbc0197a43331dd49.svn-base (3245B)
1 #include "AnimationGraph.h" 2 3 //AnimGraphData functions 4 bool AnimGraphData::DefineLoop(int AnimID) 5 { 6 if (mAnimData.GetAnimationData(AnimID) != NULL) 7 { 8 mLoopsAnimIDs.push_back(AnimID); 9 return true; 10 } 11 else 12 { 13 gCons->ConsPrintf("Invalid animation ID, Animation Graph could not define loop\n"); 14 return false; 15 } 16 } 17 18 bool AnimGraphData::DefineTransitions(int AnimID) 19 { 20 if (mAnimData.GetAnimationData(AnimID) != NULL) 21 { 22 mTransitionsAnimIDs.push_back(AnimID); 23 return true; 24 } 25 return false; 26 } 27 28 bool AnimGraphData::DefineFireables(int AnimID) 29 { 30 if (mAnimData.GetAnimationData(AnimID) != NULL) 31 { 32 mFireablesAnimIDs.push_back(AnimID); 33 return true; 34 } 35 else 36 { 37 gCons->ConsPrintf("Invalid animation ID, Animation Graph could not define fireable\n"); 38 return false; 39 } 40 } 41 42 bool AnimGraphData::CreateTranisitionMatrix() //call only after all loops have been defined 43 { 44 mTransitionMatrix = new int*[mLoopsAnimIDs.size()]; 45 46 for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++) 47 { 48 mTransitionMatrix[i] = new int[mLoopsAnimIDs.size()]; 49 for (int j = 0; j < (int)mLoopsAnimIDs.size(); j++) 50 { 51 mTransitionMatrix[i][j] = -1; //-1 represents no transition 52 } 53 } 54 return true; 55 } 56 57 bool AnimGraphData::PopulateTransitionMatrix(int initState, int targetState, int transitionID) 58 { 59 int initIndex = -1; 60 int targetIndex = -1; 61 62 for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++) 63 { 64 if (initState == mLoopsAnimIDs.at(i)) 65 { 66 initIndex = i; 67 } 68 if (targetState == mLoopsAnimIDs.at(i)) 69 { 70 targetIndex = i; 71 } 72 } 73 74 if ((initIndex != -1) && (targetIndex != -1)) 75 { 76 mTransitionMatrix[initIndex][targetIndex] = transitionID; 77 return true; 78 } 79 return false; 80 } 81 82 //Anim Graph Functions 83 int AnimGraph::GetTransitionID(int initState, int targetState) 84 { 85 int initIndex = -1; 86 int targetIndex = -1; 87 88 for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++) 89 { 90 if (initState == mAGD->mLoopsAnimIDs.at(i)) 91 { 92 initIndex = i; 93 } 94 if (targetState == mAGD->mLoopsAnimIDs.at(i)) 95 { 96 targetIndex = i; 97 } 98 } 99 100 if ((initIndex != -1) && (targetIndex != -1)) 101 { 102 return mAGD->mTransitionMatrix[initIndex][targetIndex]; 103 } 104 else 105 { 106 return -1; 107 } 108 } 109 110 Frame* AnimGraph::UpdateAnimation() 111 { 112 if (mState != *mActorState) 113 { 114 if ( (GetTransitionID(mState, *mActorState) != -1) && mState != 0 ) 115 { 116 mCurrentFrame = mAnimPack.ActivateAnimation(GetTransitionID(mState, *mActorState), ONCE)->GetCurrentFrame(); 117 return &mCurrentFrame; 118 } 119 else 120 { 121 mState = *mActorState; 122 return &mCurrentFrame; 123 } 124 } 125 else 126 { 127 for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++) 128 { 129 if (mAGD->mLoopsAnimIDs.at(i) == mState) 130 { 131 mCurrentFrame = mAnimPack.ActivateAnimation(mAGD->mLoopsAnimIDs.at(i))->GetCurrentFrame(); 132 return &mCurrentFrame; 133 } 134 } 135 } 136 return NULL; 137 } 138 139 Frame* AnimGraph::PlayOnce(int AnimID) 140 { 141 mCurrentFrame = mAnimPack.ActivateAnimation(AnimID, ONCE)->GetCurrentFrame(); 142 return &mCurrentFrame; 143 } 144 145 bool AnimGraph::EventProcess(Event eve) 146 { 147 switch (*eve.GetEventType()) 148 { 149 case ANIM_COMPLETE: 150 mState = *mActorState; 151 mFeed.EventProcess(Event(ANIM_COMPLETE, eve.GetEventData()->i)); 152 return true; 153 default: 154 gCons->ConsPrintf("Animation Graph asked to process unrecgonized event\n"); 155 return false; 156 } 157 }