165 lines
3.4 KiB
C++
165 lines
3.4 KiB
C++
#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__
|