*
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
#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__
|
||||
Reference in New Issue
Block a user