Fix mis-scaling of rolling offsets

This commit is contained in:
Anonimus 2025-09-12 20:21:57 -04:00
parent 462d18186c
commit 93a4824549
5 changed files with 40 additions and 19 deletions

View file

@ -90,8 +90,8 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0x8846aa9e124c1530
#define ASSET_HASH_MAPPATCH_PK3 0x86007ab217bbd375
#define ASSET_HASH_MAIN_PK3 0xb3474f459596cde4
#define ASSET_HASH_MAPPATCH_PK3 0x7690e687eb1b7a6c
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE
#define ASSET_HASH_PATCH_PK3 0x0000000000000000

View file

@ -4712,7 +4712,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
patch_t *rotsprite = NULL;
INT32 rollangle = 0;
angle_t spriterotangle = 0;
vector2_t visoffs;
vector2_t visoffs, rotoffset;
#endif
// uncapped/interpolation
@ -4879,9 +4879,11 @@ static void HWR_ProjectSprite(mobj_t *thing)
}
}
// initialize and rotate pitch/roll vector
// initialize and rotate pitch/roll vectors
visoffs.x = 0;
visoffs.y = 0;
rotoffset.x = 0;
rotoffset.y = 0;
const fixed_t visoffymul = (vflip ? -FRACUNIT : FRACUNIT);
@ -4891,7 +4893,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
vflip,
hflip,
&interp,
&visoffs);
&visoffs,
&rotoffset);
rotoffset.x *= FRACUNIT;
}
#endif
@ -4899,7 +4904,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
{
spr_offset = interp.spritexoffset;
#ifdef ROTSPRITE
spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), mapobjectscale));
spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), mapobjectscale) + (rotoffset.y * visoffymul));
#else
spr_topoffset = interp.spriteyoffset;
#endif
@ -4914,7 +4919,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
spr_offset += interp.spritexoffset * flipoffset;
#ifdef ROTSPRITE
spr_topoffset += (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul),
mapobjectscale)) * flipoffset;
mapobjectscale) + (rotoffset.y * visoffymul)) * flipoffset;
#else
spr_topoffset += interp.spriteyoffset * flipoffset;
#endif
@ -4978,6 +4983,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
{
#ifdef ROTSPRITE
spr_offset -= visoffs.x;
spr_offset -= rotoffset.x;
#endif
x1 = (FIXED_TO_FLOAT((spr_width - spr_offset)) * this_xscale);
x2 = (FIXED_TO_FLOAT(spr_offset) * this_xscale);
@ -4986,6 +4992,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
{
#ifdef ROTSPRITE
spr_offset += visoffs.x;
spr_offset += rotoffset.x;
#endif
x1 = (FIXED_TO_FLOAT(spr_offset) * this_xscale);
x2 = (FIXED_TO_FLOAT(spr_width - spr_offset) * this_xscale);

View file

@ -55,7 +55,8 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
boolean vflip,
boolean hflip,
interpmobjstate_t *interp,
vector2_t* out);
vector2_t* out,
vector2_t* rolloffs);
#endif
#ifdef __cplusplus

View file

@ -138,7 +138,8 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
boolean vflip,
boolean hflip,
interpmobjstate_t *interp,
vector2_t* out)
vector2_t* out,
vector2_t* rolloffs)
{
fixed_t rotcos, rotsin, finx, finy;
vector2_t xvec, yvec;
@ -192,8 +193,8 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
vypiv = (INT16)(FixedMul((xpiv / FRACUNIT), pitchMul));
// rotate by rollangle
finx = (visx + visy) + mobj->rollingxoffset;
finy = -visz + mobj->rollingyoffset;
finx = (visx + visy);
finy = -visz;
rotcos = FINECOSINE(visrollang >> ANGLETOFINESHIFT);
rotsin = FINESINE(visrollang >> ANGLETOFINESHIFT);
@ -204,6 +205,9 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
yvec.x = FixedMul(finy, rotsin);
yvec.y = FixedMul(finy, -rotcos);
rolloffs->x = (fixed_t)(FixedMul(mobj->rollingxoffset, rotcos) + FixedMul(mobj->rollingyoffset, rotsin));
rolloffs->y = (fixed_t)(FixedMul(mobj->rollingxoffset, -rotsin) - FixedMul(mobj->rollingyoffset, -rotcos));
// set finalized offsets
out->x = (fixed_t)(xvec.x + yvec.x + vxpiv + vypiv);
out->y = (fixed_t)(xvec.y - yvec.y) + (mobj->bakezpiv / FRACUNIT);
@ -213,11 +217,13 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
if (hflip)
{
out->x *= -1;
rolloffs->x *= 1;
}
if (vflip)
{
out->y *= -1;
rolloffs->y *= 1;
}
return out;
}

View file

@ -1741,7 +1741,7 @@ static void R_ProjectSprite(mobj_t *thing)
patch_t *rotsprite = NULL;
INT32 rollangle = 0;
angle_t spriterotangle = 0;
vector2_t visoffs;
vector2_t visoffs, rotoffset;
#endif
// uncapped/interpolation
@ -1932,9 +1932,11 @@ static void R_ProjectSprite(mobj_t *thing)
return;
#ifdef ROTSPRITE
// initialize and rotate pitch/roll vector
// initialize and rotate pitch/roll vectors
visoffs.x = 0;
visoffs.y = 0;
rotoffset.x = 0;
rotoffset.y = 0;
const fixed_t visoffymul = (vflip ? -FRACUNIT : FRACUNIT);
@ -1944,7 +1946,10 @@ static void R_ProjectSprite(mobj_t *thing)
vflip,
hflip,
&interp,
&visoffs);
&visoffs,
&rotoffset);
rotoffset.x *= FRACUNIT;
}
#endif
@ -1952,8 +1957,7 @@ static void R_ProjectSprite(mobj_t *thing)
{
spr_offset = interp.spritexoffset;
#ifdef ROTSPRITE
spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul),
mapobjectscale));
spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), mapobjectscale) + (rotoffset.y * visoffymul));
#else
spr_topoffset = interp.spriteyoffset;
#endif
@ -1967,9 +1971,7 @@ static void R_ProjectSprite(mobj_t *thing)
spr_offset += (interp.spritexoffset) * flipoffset;
#ifdef ROTSPRITE
spr_topoffset += (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul),
mapobjectscale))
* flipoffset;
spr_topoffset += (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), mapobjectscale) + (rotoffset.y * visoffymul)) * flipoffset;
#else
spr_topoffset += interp.spriteyoffset * flipoffset;
#endif
@ -1985,6 +1987,11 @@ static void R_ProjectSprite(mobj_t *thing)
{
offset -= FixedDiv((visoffs.x * FRACUNIT), mapobjectscale);
}
if (rotoffset.x)
{
offset -= rotoffset.x;
}
#endif
offset = FixedMul(offset, FixedMul(spritexscale, this_scale));