Fix mis-scaling of rolling offsets
This commit is contained in:
parent
462d18186c
commit
93a4824549
5 changed files with 40 additions and 19 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in a new issue