diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b00ea6440..0be2e2c86 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4902,6 +4902,7 @@ static void HWR_ProjectSprite(mobj_t *thing) #ifdef ROTSPRITE patch_t *rotsprite = NULL; INT32 rollangle = 0; + angle_t spriterotangle = 0; #endif if (!thing) @@ -5025,9 +5026,11 @@ static void HWR_ProjectSprite(mobj_t *thing) spr_topoffset = spritecachedinfo[lumpoff].topoffset; #ifdef ROTSPRITE - if (thing->rollangle) + spriterotangle = R_SpriteRotationAngle(thing); + + if (spriterotangle != 0) { - rollangle = R_GetRollAngle(thing->rollangle); + rollangle = R_GetRollAngle(spriterotangle); if (!(sprframe->rotsprite.cached & (1<sprite, (thing->frame & FF_FRAMEMASK), sprinfo, sprframe, rot, flip); rotsprite = sprframe->rotsprite.patch[rot][rollangle]; diff --git a/src/r_picformats.c b/src/r_picformats.c index 95fe23aeb..19079d3b7 100644 --- a/src/r_picformats.c +++ b/src/r_picformats.c @@ -23,6 +23,7 @@ #include "v_video.h" #include "z_zone.h" #include "w_wad.h" +#include "r_main.h" // R_PointToAngle #ifdef HWRENDER #include "hardware/hw_glob.h" @@ -1605,6 +1606,27 @@ void R_LoadSpriteInfoLumps(UINT16 wadnum, UINT16 numlumps) } #ifdef ROTSPRITE +// +// R_SpriteRotationAngle +// +// Gets the rollangle for the input object. +// +angle_t R_SpriteRotationAngle(mobj_t *mobj) +{ +#if 0 + 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 + mobj->rollangle); +#else + return mobj->rollangle; +#endif +} + // // R_GetRollAngle // diff --git a/src/r_picformats.h b/src/r_picformats.h index 3ee76a92f..d677e783b 100644 --- a/src/r_picformats.h +++ b/src/r_picformats.h @@ -122,6 +122,7 @@ void R_ParseSPRTINFOLump(UINT16 wadNum, UINT16 lumpNum); // Sprite rotation #ifdef ROTSPRITE +angle_t R_SpriteRotationAngle(mobj_t *mobj); INT32 R_GetRollAngle(angle_t rollangle); void R_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, spriteframe_t *sprframe, INT32 rot, UINT8 flip); void R_FreeSingleRotSprite(spritedef_t *spritedef); diff --git a/src/r_things.c b/src/r_things.c index fd200cf87..3110d86bc 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1446,6 +1446,7 @@ static void R_ProjectSprite(mobj_t *thing) #ifdef ROTSPRITE patch_t *rotsprite = NULL; INT32 rollangle = 0; + angle_t spriterotangle = 0; #endif // transform the origin point @@ -1571,9 +1572,11 @@ static void R_ProjectSprite(mobj_t *thing) spr_topoffset = spritecachedinfo[lump].topoffset; #ifdef ROTSPRITE - if (thing->rollangle) + spriterotangle = R_SpriteRotationAngle(thing); + + if (spriterotangle != 0) { - rollangle = R_GetRollAngle(thing->rollangle); + rollangle = R_GetRollAngle(spriterotangle); if (!(sprframe->rotsprite.cached & (1<sprite, frame, sprinfo, sprframe, rot, flip); rotsprite = sprframe->rotsprite.patch[rot][rollangle];