Added GetAngularDeltaOverTime() to return the animation's angular delta over time

This commit is contained in:
smallmodel 2023-08-11 21:09:47 +02:00
parent 41f7003747
commit 059dacf2a7
No known key found for this signature in database
GPG key ID: A96F163ED4891440
2 changed files with 45 additions and 4 deletions

View file

@ -106,9 +106,9 @@ SkelVec3 skelAnimDataGameHeader_s::GetDeltaOverTime( float time1, float time2 )
deltaWeight2 = time2 / frameTime;
frameNum1 = ( int )( deltaWeight1 + 1.0 );
frameNum2 = ( int )( deltaWeight2 + 1.0 );
d = frameNum1 - ( time1 / frameTime );
s = 1.0 - ( frameNum2 - ( time2 / frameTime ) );
d = frameNum1 - deltaWeight1;
s = 1.0 - (frameNum2 - deltaWeight2);
if( frameNum1 < frameNum2 )
{
@ -141,6 +141,46 @@ SkelVec3 skelAnimDataGameHeader_s::GetDeltaOverTime( float time1, float time2 )
return delta;
}
float skelAnimDataGameHeader_s::GetAngularDeltaOverTime(float time1, float time2)
{
float deltaWeight1;
int frameNum1;
float deltaWeight2;
int frameNum2;
float delta;
int currFrame;
float s, d;
deltaWeight1 = time1 / frameTime;
deltaWeight2 = time2 / frameTime;
frameNum1 = (int)(deltaWeight1 + 1.0);
frameNum2 = (int)(deltaWeight2 + 1.0);
d = frameNum1 - deltaWeight1;
s = 1.0 - (frameNum2 - deltaWeight2);
if (frameNum2 > frameNum1) {
delta = m_frame[frameNum1 % numFrames].angleDelta;
for (currFrame = frameNum1 + 1; currFrame < frameNum2; currFrame++)
{
delta += m_frame[currFrame % numFrames].angleDelta;
}
}
else
{
s = s - (1.0 - d);
}
delta += m_frame[frameNum2 % numFrames].angleDelta * s;
if (delta > -0.001f && delta < 0.001f) {
delta = 0;
}
return delta;
}
skelAnimDataGameHeader_t *skelAnimDataGameHeader_s::AllocAnimData( size_t numFrames, size_t numChannels )
{
skelAnimDataGameHeader_t *data;

View file

@ -99,7 +99,8 @@ typedef struct skelAnimDataGameHeader_s {
static skelAnimDataGameHeader_t *AllocRLEChannelData(size_t numChannels);
int GetFrameNums( float timeSeconds, float timeTolerance, int *beforeFrame, int *afterFrame, float *beforeWeight, float *afterWeight );
SkelVec3 GetDeltaOverTime( float, float );
SkelVec3 GetDeltaOverTime( float time1, float time2 );
float GetAngularDeltaOverTime( float time1, float time2 );
static skelAnimDataGameHeader_t *AllocAnimData(size_t numFrames, size_t numChannels );
static void DeallocAnimData( skelAnimDataGameHeader_t *data );
} skelAnimDataGameHeader_t;