mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-14 08:30:58 +00:00
Remix mdsprite.c's updateanimation() to look prettier and clearer.
Specifically, - rearrange conditionals - factor out constant expressions - add a couple of debugging printfs for extraordinary events (oob frames) - add VERIFY comments for implicit assertions I'd like to verify sometime Also, one calloc -> malloc. git-svn-id: https://svn.eduke32.com/eduke32@2338 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
5f23cb6bcd
commit
747cb925db
1 changed files with 113 additions and 65 deletions
|
@ -331,7 +331,7 @@ int32_t md_defineanimation(int32_t modelid, const char *framestart, const char *
|
||||||
ma.fpssc = fpssc;
|
ma.fpssc = fpssc;
|
||||||
ma.flags = flags;
|
ma.flags = flags;
|
||||||
|
|
||||||
map = (mdanim_t *)Bcalloc(1,sizeof(mdanim_t));
|
map = Bmalloc(sizeof(mdanim_t));
|
||||||
if (!map) return(-4);
|
if (!map) return(-4);
|
||||||
Bmemcpy(map, &ma, sizeof(ma));
|
Bmemcpy(map, &ma, sizeof(ma));
|
||||||
|
|
||||||
|
@ -921,90 +921,119 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
|
||||||
//Note: even though it says md2model, it works for both md2model&md3model
|
//Note: even though it says md2model, it works for both md2model&md3model
|
||||||
void updateanimation(md2model_t *m, const spritetype *tspr, uint8_t lpal)
|
void updateanimation(md2model_t *m, const spritetype *tspr, uint8_t lpal)
|
||||||
{
|
{
|
||||||
mdanim_t *anim;
|
const mdanim_t *anim;
|
||||||
int32_t i, j, k;
|
int32_t i, j, k;
|
||||||
int32_t fps;
|
int32_t fps;
|
||||||
|
|
||||||
|
int32_t tile, smoothdurationp;
|
||||||
|
spritesmooth_t *smooth;
|
||||||
|
spriteext_t *sprext;
|
||||||
|
|
||||||
if (m->numframes < 2)
|
if (m->numframes < 2)
|
||||||
{
|
{
|
||||||
m->interpol = 0;
|
m->interpol = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m->cframe = m->nframe = tile2model[Ptile2tile(tspr->picnum,lpal)].framenum;
|
tile = Ptile2tile(tspr->picnum,lpal);
|
||||||
|
m->cframe = m->nframe = tile2model[tile].framenum;
|
||||||
|
#ifdef DEBUGGINGAIDS
|
||||||
|
if (m->cframe >= m->numframes)
|
||||||
|
OSD_Printf("1: c > n\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
smoothdurationp = (r_animsmoothing && (tile2model[tile].smoothduration != 0));
|
||||||
|
|
||||||
|
smooth = ((unsigned)tspr->owner < MAXSPRITES+MAXUNIQHUDID) ? &spritesmooth[tspr->owner] : NULL;
|
||||||
|
sprext = ((unsigned)tspr->owner < MAXSPRITES+MAXUNIQHUDID) ? &spriteext[tspr->owner] : NULL;
|
||||||
|
|
||||||
|
for (anim = m->animations; anim && anim->startframe != m->cframe; anim = anim->next)
|
||||||
|
{
|
||||||
|
/* do nothing */;
|
||||||
|
}
|
||||||
|
|
||||||
for (anim = m->animations;
|
|
||||||
anim && anim->startframe != m->cframe;
|
|
||||||
anim = anim->next) ;
|
|
||||||
if (!anim)
|
if (!anim)
|
||||||
{
|
{
|
||||||
if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,lpal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdoldframe != m->cframe))
|
if (!smoothdurationp || ((smooth->mdoldframe == m->cframe) && (smooth->mdcurframe == m->cframe)))
|
||||||
{
|
|
||||||
if (spritesmooth[tspr->owner].mdsmooth == 0)
|
|
||||||
{
|
|
||||||
spriteext[tspr->owner].mdanimtims = mdtims;
|
|
||||||
m->interpol = 0;
|
|
||||||
spritesmooth[tspr->owner].mdsmooth = 1;
|
|
||||||
spritesmooth[tspr->owner].mdcurframe = m->cframe;
|
|
||||||
}
|
|
||||||
if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,lpal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe))
|
|
||||||
{
|
|
||||||
spriteext[tspr->owner].mdanimtims = mdtims;
|
|
||||||
m->interpol = 0;
|
|
||||||
spritesmooth[tspr->owner].mdsmooth = 1;
|
|
||||||
spritesmooth[tspr->owner].mdoldframe = spritesmooth[tspr->owner].mdcurframe;
|
|
||||||
spritesmooth[tspr->owner].mdcurframe = m->cframe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (r_animsmoothing && (tile2model[Ptile2tile(tspr->picnum,lpal)].smoothduration != 0) && (spritesmooth[tspr->owner].mdcurframe != m->cframe))
|
|
||||||
{
|
|
||||||
spriteext[tspr->owner].mdanimtims = mdtims;
|
|
||||||
m->interpol = 0;
|
|
||||||
spritesmooth[tspr->owner].mdsmooth = 1;
|
|
||||||
spritesmooth[tspr->owner].mdoldframe = spritesmooth[tspr->owner].mdcurframe;
|
|
||||||
spritesmooth[tspr->owner].mdcurframe = m->cframe;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
m->interpol = 0;
|
m->interpol = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// assert(smoothdurationp && ((smooth->mdoldframe != m->cframe) || (smooth->mdcurframe != m->cframe)))
|
||||||
|
|
||||||
|
if (smooth->mdoldframe != m->cframe)
|
||||||
|
{
|
||||||
|
if (smooth->mdsmooth == 0)
|
||||||
|
{
|
||||||
|
sprext->mdanimtims = mdtims;
|
||||||
|
m->interpol = 0;
|
||||||
|
smooth->mdsmooth = 1;
|
||||||
|
smooth->mdcurframe = m->cframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anim && (((int32_t)spriteext[tspr->owner].mdanimcur) != anim->startframe))
|
if (smooth->mdcurframe != m->cframe)
|
||||||
{
|
{
|
||||||
//if (spriteext[tspr->owner].flags & SPREXT_NOMDANIM) OSD_Printf("SPREXT_NOMDANIM\n");
|
sprext->mdanimtims = mdtims;
|
||||||
//OSD_Printf("smooth launched ! oldanim %i new anim %i\n", spriteext[tspr->owner].mdanimcur, anim->startframe);
|
|
||||||
spriteext[tspr->owner].mdanimcur = (int16_t)anim->startframe;
|
|
||||||
spriteext[tspr->owner].mdanimtims = mdtims;
|
|
||||||
m->interpol = 0;
|
m->interpol = 0;
|
||||||
if (!r_animsmoothing || (tile2model[Ptile2tile(tspr->picnum,lpal)].smoothduration == 0))
|
smooth->mdsmooth = 1;
|
||||||
|
smooth->mdoldframe = smooth->mdcurframe;
|
||||||
|
smooth->mdcurframe = m->cframe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // if (smooth->mdcurframe != m->cframe)
|
||||||
|
{
|
||||||
|
sprext->mdanimtims = mdtims;
|
||||||
|
m->interpol = 0;
|
||||||
|
smooth->mdsmooth = 1;
|
||||||
|
smooth->mdoldframe = smooth->mdcurframe;
|
||||||
|
smooth->mdcurframe = m->cframe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (/* anim && */ sprext->mdanimcur != anim->startframe)
|
||||||
|
{
|
||||||
|
//if (sprext->flags & SPREXT_NOMDANIM) OSD_Printf("SPREXT_NOMDANIM\n");
|
||||||
|
//OSD_Printf("smooth launched ! oldanim %i new anim %i\n", sprext->mdanimcur, anim->startframe);
|
||||||
|
sprext->mdanimcur = (int16_t)anim->startframe;
|
||||||
|
sprext->mdanimtims = mdtims;
|
||||||
|
m->interpol = 0;
|
||||||
|
|
||||||
|
if (!smoothdurationp)
|
||||||
{
|
{
|
||||||
m->cframe = m->nframe = anim->startframe;
|
m->cframe = m->nframe = anim->startframe;
|
||||||
return;
|
#ifdef DEBUGGINGAIDS
|
||||||
}
|
if (m->cframe >= m->numframes)
|
||||||
m->nframe = anim->startframe;
|
OSD_Printf("2: c > n\n");
|
||||||
m->cframe = spritesmooth[tspr->owner].mdoldframe;
|
#endif
|
||||||
spritesmooth[tspr->owner].mdsmooth = 1;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spritesmooth[tspr->owner].mdsmooth)
|
m->nframe = anim->startframe;
|
||||||
ftol((1.0f / (float)(tile2model[Ptile2tile(tspr->picnum,lpal)].smoothduration)) * 66.f, &fps);
|
m->cframe = smooth->mdoldframe;
|
||||||
|
#ifdef DEBUGGINGAIDS
|
||||||
|
if (m->cframe >= m->numframes)
|
||||||
|
OSD_Printf("3: c > n\n");
|
||||||
|
#endif
|
||||||
|
smooth->mdsmooth = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (smooth->mdsmooth) // VERIFY: (smooth->mdsmooth) implies (tile2model[tile].smoothduration!=0) ?
|
||||||
|
ftol((1.0f / (float)(tile2model[tile].smoothduration)) * 66.f, &fps);
|
||||||
else
|
else
|
||||||
fps = anim->fpssc;
|
fps = anim->fpssc;
|
||||||
|
|
||||||
i = (mdtims-spriteext[tspr->owner].mdanimtims)*((fps*timerticspersec)/120);
|
i = (mdtims - sprext->mdanimtims)*((fps*timerticspersec)/120);
|
||||||
|
|
||||||
if (spritesmooth[tspr->owner].mdsmooth)
|
if (smooth->mdsmooth)
|
||||||
j = 65536;
|
j = 65536;
|
||||||
else
|
else
|
||||||
j = ((anim->endframe+1-anim->startframe)<<16);
|
j = ((anim->endframe+1-anim->startframe)<<16);
|
||||||
//Just in case you play the game for a VERY int32_t time...
|
// XXX: Just in case you play the game for a VERY long time...
|
||||||
if (i < 0) { i = 0; spriteext[tspr->owner].mdanimtims = mdtims; }
|
if (i < 0) { i = 0; sprext->mdanimtims = mdtims; }
|
||||||
//compare with j*2 instead of j to ensure i stays > j-65536 for MDANIM_ONESHOT
|
//compare with j*2 instead of j to ensure i stays > j-65536 for MDANIM_ONESHOT
|
||||||
if ((anim) && (i >= j+j) && (fps) && !mdpause) //Keep mdanimtims close to mdtims to avoid the use of MOD
|
if (anim && (i >= j+j) && (fps) && !mdpause) //Keep mdanimtims close to mdtims to avoid the use of MOD
|
||||||
spriteext[tspr->owner].mdanimtims += j/((fps*timerticspersec)/120);
|
sprext->mdanimtims += j/((fps*timerticspersec)/120);
|
||||||
|
|
||||||
k = i;
|
k = i;
|
||||||
|
|
||||||
|
@ -1012,18 +1041,26 @@ void updateanimation(md2model_t *m, const spritetype *tspr, uint8_t lpal)
|
||||||
{ if (i > j-65536) i = j-65536; }
|
{ if (i > j-65536) i = j-65536; }
|
||||||
else { if (i >= j) { i -= j; if (i >= j) i %= j; } }
|
else { if (i >= j) { i -= j; if (i >= j) i %= j; } }
|
||||||
|
|
||||||
if (r_animsmoothing && spritesmooth[tspr->owner].mdsmooth)
|
if (r_animsmoothing && smooth->mdsmooth)
|
||||||
{
|
{
|
||||||
m->nframe = (anim) ? anim->startframe : spritesmooth[tspr->owner].mdcurframe;
|
m->nframe = anim ? anim->startframe : smooth->mdcurframe;
|
||||||
m->cframe = spritesmooth[tspr->owner].mdoldframe;
|
m->cframe = smooth->mdoldframe;
|
||||||
|
#ifdef DEBUGGINGAIDS
|
||||||
|
if (m->cframe >= m->numframes)
|
||||||
|
OSD_Printf("4: c > n\n");
|
||||||
|
#endif
|
||||||
//OSD_Printf("smoothing... cframe %i nframe %i\n", m->cframe, m->nframe);
|
//OSD_Printf("smoothing... cframe %i nframe %i\n", m->cframe, m->nframe);
|
||||||
if (k > 65535)
|
if (k > 65535)
|
||||||
{
|
{
|
||||||
spriteext[tspr->owner].mdanimtims = mdtims;
|
sprext->mdanimtims = mdtims;
|
||||||
m->interpol = 0;
|
m->interpol = 0;
|
||||||
spritesmooth[tspr->owner].mdsmooth = 0;
|
smooth->mdsmooth = 0;
|
||||||
m->cframe = m->nframe = (anim) ? anim->startframe : spritesmooth[tspr->owner].mdcurframe;
|
m->cframe = m->nframe; // = anim ? anim->startframe : smooth->mdcurframe;
|
||||||
spritesmooth[tspr->owner].mdoldframe = m->cframe;
|
#ifdef DEBUGGINGAIDS
|
||||||
|
if (m->cframe >= m->numframes)
|
||||||
|
OSD_Printf("5: c > n\n");
|
||||||
|
#endif
|
||||||
|
smooth->mdoldframe = m->cframe;
|
||||||
//OSD_Printf("smooth stopped !\n");
|
//OSD_Printf("smooth stopped !\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1031,10 +1068,18 @@ void updateanimation(md2model_t *m, const spritetype *tspr, uint8_t lpal)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m->cframe = (i>>16)+anim->startframe;
|
m->cframe = (i>>16)+anim->startframe;
|
||||||
m->nframe = m->cframe+1; if (m->nframe > anim->endframe) m->nframe = anim->startframe;
|
#ifdef DEBUGGINGAIDS
|
||||||
spritesmooth[tspr->owner].mdoldframe = m->cframe;
|
if (m->cframe >= m->numframes)
|
||||||
|
OSD_Printf("6: c > n\n");
|
||||||
|
#endif
|
||||||
|
m->nframe = m->cframe+1;
|
||||||
|
if (m->nframe > anim->endframe) // VERIFY: (!(r_animsmoothing && smooth->mdsmooth)) implies (anim!=NULL) ?
|
||||||
|
m->nframe = anim->startframe;
|
||||||
|
|
||||||
|
smooth->mdoldframe = m->cframe;
|
||||||
//OSD_Printf("not smoothing... cframe %i nframe %i\n", m->cframe, m->nframe);
|
//OSD_Printf("not smoothing... cframe %i nframe %i\n", m->cframe, m->nframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
m->interpol = ((float)(i&65535))/65536.f;
|
m->interpol = ((float)(i&65535))/65536.f;
|
||||||
//OSD_Printf("interpol %f\n", m->interpol);
|
//OSD_Printf("interpol %f\n", m->interpol);
|
||||||
}
|
}
|
||||||
|
@ -1921,8 +1966,10 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
|
||||||
m->cframe < 0 || m->cframe >= m->numframes ||
|
m->cframe < 0 || m->cframe >= m->numframes ||
|
||||||
m->nframe < 0 || m->nframe >= m->numframes)
|
m->nframe < 0 || m->nframe >= m->numframes)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUGGINGAIDS
|
||||||
OSD_Printf("%s: mdframe oob: c:%d n:%d total:%d interpol:%.02f\n",
|
OSD_Printf("%s: mdframe oob: c:%d n:%d total:%d interpol:%.02f\n",
|
||||||
m->head.nam, m->cframe, m->nframe, m->numframes, m->interpol);
|
m->head.nam, m->cframe, m->nframe, m->numframes, m->interpol);
|
||||||
|
#endif
|
||||||
if (m->interpol < 0)
|
if (m->interpol < 0)
|
||||||
m->interpol = 0;
|
m->interpol = 0;
|
||||||
if (m->interpol > 1)
|
if (m->interpol > 1)
|
||||||
|
@ -2098,6 +2145,7 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
|
||||||
k2 = (float)sintable[(spriteext[tspr->owner].roll+512)&2047] / 16384.0;
|
k2 = (float)sintable[(spriteext[tspr->owner].roll+512)&2047] / 16384.0;
|
||||||
k3 = (float)sintable[spriteext[tspr->owner].roll&2047] / 16384.0;
|
k3 = (float)sintable[spriteext[tspr->owner].roll&2047] / 16384.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (surfi=0; surfi<m->head.numsurfs; surfi++)
|
for (surfi=0; surfi<m->head.numsurfs; surfi++)
|
||||||
{
|
{
|
||||||
s = &m->head.surfs[surfi];
|
s = &m->head.surfs[surfi];
|
||||||
|
|
Loading…
Reference in a new issue