#ifndef AnimationTrack_h__ #define AnimationTrack_h__ #include "AnimationFrame.h" #include "LString.h" #include "math/LifeMath.h" namespace LifeGraphics { class AnimationTrack { public: String Name; int Layer; AnimationFrame* Frames; BoneTransform* transformations; int FramesCount; int ID; int prev; float Weight; bool Enabled; float TrackTime; bool Loop; float TrackPosition; bool Playing; AnimationTrack(int framesCount) :Layer(0), ID(0), Weight(1.0f),TrackPosition(0.0f), prev(0) { Frames = new AnimationFrame[framesCount]; transformations = new BoneTransform[framesCount]; FramesCount = framesCount; } ~AnimationTrack() { if(Frames) delete[] Frames; if(transformations) delete[] transformations; } void setFrame(AnimationFrame& frame, int id) { Frames[id] = frame; } const BoneTransform* GetTransform() { /*if (TrackPosition > Frames[FramesCount - 1].time) if (Loop) TrackPosition = 0.0f; else TrackPosition = Frames[FramesCount - 1].time;*/ //if(TrackPosition < 0.0f || TrackPosition > Frames[FramesCount - 1].time) //printf("OMFGNAH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); for (int i = 0; i < FramesCount; i++) { if (Frames[i].time == TrackPosition) { Frames[i].getTransformations(transformations); return transformations; } int next = i + 1; if(next >= FramesCount) next = 0; if (TrackPosition > Frames[i].time && TrackPosition < Frames[next].time) { float amount = (TrackPosition - Frames[i].time) / (Frames[next].time - Frames[i].time); InterpolateFrames(Frames + i, Frames + (next), amount); return transformations; } } return transformations; } void InterpolateFrames(AnimationFrame* start, AnimationFrame* end, float amount) { for (int i = 0; i < start->boneCount; i++) { BoneTransform newTransform; //BoneTransform tr1 = start->getTransform(i); BoneTransform tr2 = end->getTransform(i); /* QuatSLerp(tr1.Rotation, tr2.Rotation, amount, newTransform.Rotation); Vec3Lerp(tr1.Translation, tr2.Translation, amount, newTransform.Translation); if(amount < 0.0f | amount > 1.0f) { printf("PIZDEC!"); } printf("Select frame: %i, Frame time: %f\n", end->name, end->time); */ newTransform.boneId = tr2.boneId; newTransform.Translation = tr2.Translation; newTransform.Rotation = tr2.Rotation; transformations[i] = newTransform; } } void AdvanceTime(float dt) { if (Playing && Weight >0) { TrackPosition += dt; // TrackPosition = Frames[1].time; //printf("Frame one id: %i\n", Frames[1].name); if (TrackPosition > Frames[FramesCount - 1].time) { if (Loop) { //DoEvents(prevPos, TrackTime); TrackPosition = TrackPosition - Frames[FramesCount - 1].time; //OnTrackEnd(); //OnTrackStart(); // } else { TrackPosition = TrackTime; //OnTrackEnd(); Playing = false; } } if (TrackPosition < 0) { TrackPosition = 0; // OnTrackStart(); } if (TrackPosition == 0) { //OnTrackStart(); } else { //DoEvents(prevPos, TrackPosition); } } } void Stop() { Playing = false; } void Play() { if (TrackPosition >= TrackTime) TrackPosition = 0; Playing = true; } void Reset() { TrackPosition = 0; } }; } #endif // AnimationTrack_h__