diff --git a/src/p_user.c b/src/p_user.c index 058e26bd4..b3a85e6fc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4302,7 +4302,7 @@ DoABarrelRoll (player_t *player) return; } - slope = InvAngle(R_SpriteRotationAngle(player->mo)); + slope = InvAngle(R_GetPitchRollAngle(player->mo)); if (AbsAngle(slope) < ANGLE_11hh) { diff --git a/src/r_patch.h b/src/r_patch.h index c04a3b275..c6d222617 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -39,6 +39,7 @@ patch_t *Patch_GetRotatedSprite( boolean flip, boolean adjustfeet, void *info, INT32 rotationangle); INT32 R_GetRollAngle(angle_t rollangle); +angle_t R_GetPitchRollAngle(mobj_t *mobj); angle_t R_SpriteRotationAngle(mobj_t *mobj); #endif diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index f4165f3ff..9f8c9b415 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -20,18 +20,27 @@ fixed_t rollcosang[ROTANGLES]; fixed_t rollsinang[ROTANGLES]; +angle_t R_GetPitchRollAngle(mobj_t *mobj) +{ + angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); + + fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); + fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); + + angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + + return rollOrPitch; +} + angle_t R_SpriteRotationAngle(mobj_t *mobj) { angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); angle_t angleDelta = (viewingAngle - mobj->angle); - fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); - fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); - angle_t sliptideLift = mobj->player ? K_Sliptiding(mobj->player) * ANGLE_11hh : 0; - angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + angle_t rollOrPitch = R_GetPitchRollAngle(mobj); angle_t rollAngle = (rollOrPitch + mobj->rollangle); if (sliptideLift)