mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-22 11:51:41 +00:00
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:
parent
7c2a241042
commit
b6129a6d42
4 changed files with 33 additions and 6 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue