Add R_SpriteRotationAngle function

Gets the rotation angle for the mobj's sprite. Meant for pitch & roll later, but that part is if'd out currently and just returns mobj->rollangle
This commit is contained in:
Sally Coolatta 2020-10-30 15:54:58 -04:00
parent 7c2a241042
commit b6129a6d42
4 changed files with 33 additions and 6 deletions

View file

@ -5078,6 +5078,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
#ifdef ROTSPRITE #ifdef ROTSPRITE
patch_t *rotsprite = NULL; patch_t *rotsprite = NULL;
INT32 rollangle = 0; INT32 rollangle = 0;
angle_t spriterotangle = 0;
#endif #endif
// uncapped/interpolation // uncapped/interpolation
@ -5245,18 +5246,21 @@ static void HWR_ProjectSprite(mobj_t *thing)
spr_topoffset = spritecachedinfo[lumpoff].topoffset; spr_topoffset = spritecachedinfo[lumpoff].topoffset;
#ifdef ROTSPRITE #ifdef ROTSPRITE
if (interp.spriteroll spriterotangle = R_SpriteRotationAngle(&interp);
if (spriterotangle != 0
&& !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE)))
{ {
if (papersprite) if (papersprite)
{ {
// a positive rollangle should should pitch papersprites upwards relative to their facing angle // a positive rollangle should should pitch papersprites upwards relative to their facing angle
rollangle = R_GetRollAngle(InvAngle(interp.spriteroll)); rollangle = R_GetRollAngle(InvAngle(spriterotangle));
} }
else else
{ {
rollangle = R_GetRollAngle(interp.spriteroll); rollangle = R_GetRollAngle(spriterotangle);
} }
rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle);
if (rotsprite != NULL) if (rotsprite != NULL)

View file

@ -14,6 +14,7 @@
#include "r_defs.h" #include "r_defs.h"
#include "r_picformats.h" #include "r_picformats.h"
#include "r_fps.h"
#include "doomdef.h" #include "doomdef.h"
// Patch functions // Patch functions
@ -38,6 +39,7 @@ patch_t *Patch_GetRotatedSprite(
size_t frame, size_t spriteangle, size_t frame, size_t spriteangle,
boolean flip, boolean adjustfeet, boolean flip, boolean adjustfeet,
void *info, INT32 rotationangle); void *info, INT32 rotationangle);
angle_t R_SpriteRotationAngle(interpmobjstate_t *interp);
INT32 R_GetRollAngle(angle_t rollangle); INT32 R_GetRollAngle(angle_t rollangle);
#endif #endif

View file

@ -13,11 +13,29 @@
#include "r_things.h" // FEETADJUST #include "r_things.h" // FEETADJUST
#include "z_zone.h" #include "z_zone.h"
#include "w_wad.h" #include "w_wad.h"
#include "r_main.h" // R_PointToAngle
#ifdef ROTSPRITE #ifdef ROTSPRITE
fixed_t rollcosang[ROTANGLES]; fixed_t rollcosang[ROTANGLES];
fixed_t rollsinang[ROTANGLES]; fixed_t rollsinang[ROTANGLES];
//
// R_SpriteRotationAngle
//
// Gets the rollangle for the input object.
//
angle_t R_SpriteRotationAngle(interpmobjstate_t *interp)
{
angle_t viewingAngle = R_PointToAngle(interp->x, interp->y);
fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT);
fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT);
angle_t rollOrPitch = FixedMul(interp->pitch, pitchMul) + FixedMul(interp->roll, rollMul);
return (rollOrPitch + interp->spriteroll);
}
INT32 R_GetRollAngle(angle_t rollangle) INT32 R_GetRollAngle(angle_t rollangle)
{ {
INT32 ra = AngleFixed(rollangle)>>FRACBITS; INT32 ra = AngleFixed(rollangle)>>FRACBITS;

View file

@ -1594,6 +1594,7 @@ static void R_ProjectSprite(mobj_t *thing)
#ifdef ROTSPRITE #ifdef ROTSPRITE
patch_t *rotsprite = NULL; patch_t *rotsprite = NULL;
INT32 rollangle = 0; INT32 rollangle = 0;
angle_t spriterotangle = 0;
#endif #endif
// uncapped/interpolation // uncapped/interpolation
@ -1743,17 +1744,19 @@ static void R_ProjectSprite(mobj_t *thing)
patch = W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE); patch = W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
#ifdef ROTSPRITE #ifdef ROTSPRITE
if (interp.spriteroll spriterotangle = R_SpriteRotationAngle(&interp);
if (spriterotangle != 0
&& !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE)))
{ {
if (papersprite && ang >= ANGLE_180) if (papersprite && ang >= ANGLE_180)
{ {
// Makes Software act much more sane like OpenGL // Makes Software act much more sane like OpenGL
rollangle = R_GetRollAngle(InvAngle(interp.spriteroll)); rollangle = R_GetRollAngle(InvAngle(spriterotangle));
} }
else else
{ {
rollangle = R_GetRollAngle(interp.spriteroll); rollangle = R_GetRollAngle(spriterotangle);
} }
rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle);