46a8f9654bc2905d76d6c7630f512ecc70d32b4d.svn-base (3024B)
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 //mAnimPack.GetAnimation(AnimID)->mFeed.Subscribe(this); 24 return true; 25 } 26 return false; 27 } 28 29 bool AnimGraphData::CreateTranisitionMatrix() //call only after all loops have been defined 30 { 31 mTransitionMatrix = new int*[mLoopsAnimIDs.size()]; 32 33 for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++) 34 { 35 mTransitionMatrix[i] = new int[mLoopsAnimIDs.size()]; 36 for (int j = 0; j < (int)mLoopsAnimIDs.size(); j++) 37 { 38 mTransitionMatrix[i][j] = -1; //-1 represents no transition 39 } 40 } 41 return true; 42 } 43 44 bool AnimGraphData::PopulateTransitionMatrix(int initState, int targetState, int transitionID) 45 { 46 int initIndex = -1; 47 int targetIndex = -1; 48 49 for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++) 50 { 51 if (initState == mLoopsAnimIDs.at(i)) 52 { 53 initIndex = i; 54 } 55 if (targetState == mLoopsAnimIDs.at(i)) 56 { 57 targetIndex = i; 58 } 59 } 60 61 if ((initIndex != -1) && (targetIndex != -1)) 62 { 63 mTransitionMatrix[initIndex][targetIndex] = transitionID; 64 return true; 65 } 66 return false; 67 } 68 69 //Anim Graph Functions 70 int AnimGraph::GetTransitionID(int initState, int targetState) 71 { 72 int initIndex = -1; 73 int targetIndex = -1; 74 75 for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++) 76 { 77 if (initState == mAGD->mLoopsAnimIDs.at(i)) 78 { 79 initIndex = i; 80 } 81 if (targetState == mAGD->mLoopsAnimIDs.at(i)) 82 { 83 targetIndex = i; 84 } 85 } 86 87 if ((initIndex != -1) && (targetIndex != -1)) 88 { 89 return mAGD->mTransitionMatrix[initIndex][targetIndex]; 90 } 91 else 92 { 93 return -1; 94 } 95 } 96 97 Frame* AnimGraph::UpdateAnimation() 98 { 99 if (mState != *mActorState) 100 { 101 if ( (GetTransitionID(mState, *mActorState) != -1) && mState != 0 ) 102 { 103 mCurrentFrame = mAnimPack.ActivateAnimation(GetTransitionID(mState, *mActorState), ONCE)->GetCurrentFrame(); 104 return &mCurrentFrame; 105 } 106 else 107 { 108 mState = *mActorState; 109 return &mCurrentFrame; 110 } 111 } 112 else 113 { 114 for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++) 115 { 116 if (mAGD->mLoopsAnimIDs.at(i) == mState) 117 { 118 mCurrentFrame = mAnimPack.ActivateAnimation(mAGD->mLoopsAnimIDs.at(i))->GetCurrentFrame(); 119 return &mCurrentFrame; 120 } 121 } 122 } 123 return NULL; 124 } 125 126 Frame* AnimGraph::PlayOnce(int AnimID) 127 { 128 mCurrentFrame = mAnimPack.ActivateAnimation(AnimID, ONCE)->GetCurrentFrame(); 129 return &mCurrentFrame; 130 } 131 132 bool AnimGraph::EventProcess(Event eve) 133 { 134 switch (*eve.GetEventType()) 135 { 136 case ANIM_COMPLETE: 137 mState = *mActorState; 138 mFeed.EventProcess(Event(ANIM_COMPLETE, eve.GetEventData()->i)); 139 return true; 140 default: 141 gCons->ConsPrintf("Animation Graph asked to process unrecgonized event\n"); 142 return false; 143 } 144 }