TapestryEngine

A 2D Platformer Game Engine
Log | Files | Refs

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 }