- use a dedicated type for SOP angle interpolation

This allows reusing the already existing pointer.
This commit is contained in:
Christoph Oelckers 2021-11-02 18:41:42 +01:00
parent e75258f57b
commit e4e164a07f

View file

@ -50,6 +50,7 @@ enum
soi_sprx = 0x8000000, soi_sprx = 0x8000000,
soi_spry = 0x9000000, soi_spry = 0x9000000,
soi_sprz = 0xa000000, soi_sprz = 0xa000000,
soi_sprang = 0xb000000,
}; };
static struct so_interp static struct so_interp
@ -132,12 +133,12 @@ static void so_setspriteanginterpolation(so_interp *interp, int32_t spritenum)
return; return;
for (i = 0; i < interp->numinterpolations; i++) for (i = 0; i < interp->numinterpolations; i++)
if (interp->data[i].curelement == -1 && interp->data[i].actorofang->GetSpriteIndex() == spritenum) if (interp->data[i].curelement == soi_sprang && interp->data[i].actorofang->GetSpriteIndex() == spritenum)
return; return;
so_interp::interp_data *data = &interp->data[interp->numinterpolations++]; so_interp::interp_data *data = &interp->data[interp->numinterpolations++];
data->curelement = -1; data->curelement = soi_sprang;
data->oldipos = data->oldipos =
data->lastipos = data->lastipos =
data->lastoldipos = sprite[spritenum].ang; data->lastoldipos = sprite[spritenum].ang;
@ -270,7 +271,7 @@ void so_updateinterpolations(void) // Stick at beginning of domovethings
interp->tic += synctics; interp->tic += synctics;
for (i = 0, data = interp->data; i < interp->numinterpolations; i++, data++) for (i = 0, data = interp->data; i < interp->numinterpolations; i++, data++)
{ {
if (data->actorofang != nullptr) if (data->curelement == soi_sprang)
{ {
USERp u = data->actorofang->u(); USERp u = data->actorofang->u();
if (u) if (u)
@ -307,7 +308,7 @@ void so_dointerpolations(int32_t smoothratio) // Stick at b
continue; continue;
for (i = 0; i < interp->numinterpolations; i++) for (i = 0; i < interp->numinterpolations; i++)
interp->data[i].bakipos = (interp->data[i].actorofang != nullptr) ? interp->data[i].bakipos = (interp->data[i].curelement == soi_sprang) ?
interp->data[i].actorofang->s().ang : interp->data[i].actorofang->s().ang :
getvalue(interp->data[i].curelement, false); getvalue(interp->data[i].curelement, false);
@ -317,7 +318,7 @@ void so_dointerpolations(int32_t smoothratio) // Stick at b
{ {
data->lastipos = data->bakipos; data->lastipos = data->bakipos;
data->lastoldipos = data->oldipos; data->lastoldipos = data->oldipos;
if (data->actorofang != nullptr) if (data->curelement == soi_sprang)
{ {
USERp u = data->actorofang->u(); USERp u = data->actorofang->u();
data->lastangdiff = u ? u->oangdiff : 0; data->lastangdiff = u ? u->oangdiff : 0;
@ -368,7 +369,7 @@ void so_dointerpolations(int32_t smoothratio) // Stick at b
continue; continue;
} }
if (data->actorofang != nullptr) if (data->curelement == soi_sprang)
data->actorofang->s().ang = NORM_ANGLE(data->lastoldipos + MulScale(data->lastangdiff, ratio, 16)); data->actorofang->s().ang = NORM_ANGLE(data->lastoldipos + MulScale(data->lastangdiff, ratio, 16));
else else
{ {
@ -394,7 +395,7 @@ void so_restoreinterpolations(void) // Stick at end of drawscree
continue; continue;
for (i = 0, data = interp->data; i < interp->numinterpolations; i++, data++) for (i = 0, data = interp->data; i < interp->numinterpolations; i++, data++)
if (data->actorofang != nullptr) if (data->curelement == soi_sprang)
data->actorofang->s().ang = data->bakipos; data->actorofang->s().ang = data->bakipos;
else else
getvalue(data->curelement, true) = data->bakipos; getvalue(data->curelement, true) = data->bakipos;