Files
LifeProject/LifeGraphics/AnimationTrack.h
T
2025-05-13 02:46:21 +03:00

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__