From 93a4824549e03e4e87f2d76c0643b452ddf04155 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Fri, 12 Sep 2025 20:21:57 -0400 Subject: [PATCH] Fix mis-scaling of rolling offsets --- src/d_main.cpp | 4 ++-- src/hardware/hw_main.c | 17 ++++++++++++----- src/r_patch.h | 3 ++- src/r_patchrotation.c | 12 +++++++++--- src/r_things.cpp | 23 +++++++++++++++-------- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 75dcc7d30..c4e53b154 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -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 diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 8558a7f93..b165d3ea6 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -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); diff --git a/src/r_patch.h b/src/r_patch.h index 555650c07..50e41b43c 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -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 diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index ec7aeefdf..0b8a08851 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -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; } diff --git a/src/r_things.cpp b/src/r_things.cpp index b79019803..1a0de555f 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -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));