Merge branch 'fix-splat-interp' into 'next'

Fix splat interp and sprite angle

See merge request STJr/SRB2!1858
This commit is contained in:
Eidolon 2022-11-12 21:05:44 +00:00
commit 88667400ee
5 changed files with 67 additions and 42 deletions

View file

@ -84,6 +84,8 @@ typedef struct gl_vissprite_s
boolean rotated;
UINT8 translucency; //alpha level 0-255
angle_t angle; // for splats
//Hurdler: 25/04/2000: now support colormap in hardware mode
UINT8 *colormap;
INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing

View file

@ -4173,7 +4173,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
scale *= spr->shadowscale;
if (spr->rotateflags & SRF_3D || renderflags & RF_NOSPLATBILLBOARD)
angle = spr->mobj->angle;
angle = spr->angle;
else
angle = viewangle;
@ -4228,8 +4228,8 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
// Translate
for (i = 0; i < 4; i++)
{
wallVerts[i].x = rotated[i].x + FIXED_TO_FLOAT(spr->mobj->x);
wallVerts[i].z = rotated[i].y + FIXED_TO_FLOAT(spr->mobj->y);
wallVerts[i].x = rotated[i].x + spr->x1;
wallVerts[i].z = rotated[i].y + spr->z1;
}
if (renderflags & (RF_SLOPESPLAT | RF_OBJECTSLOPESPLAT))
@ -4256,7 +4256,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
else
{
for (i = 0; i < 4; i++)
wallVerts[i].y = FIXED_TO_FLOAT(spr->mobj->z) + zoffset;
wallVerts[i].y = FIXED_TO_FLOAT(spr->gz) + zoffset;
}
}
else
@ -5195,9 +5195,16 @@ static void HWR_ProjectSprite(mobj_t *thing)
I_Error("sprframes NULL for sprite %d\n", thing->sprite);
#endif
if (splat)
{
ang = R_PointToAngle2(0, viewz, 0, interp.z);
}
else
{
ang = R_PointToAngle (interp.x, interp.y) - interp.angle;
if (mirrored)
ang = InvAngle(ang);
}
if (sprframe->rotate == SRF_SINGLE)
{
@ -5321,6 +5328,14 @@ static void HWR_ProjectSprite(mobj_t *thing)
this_xscale = spritexscale * this_scale;
this_yscale = spriteyscale * this_scale;
if (splat)
{
z1 = z2 = tr_y;
x1 = x2 = tr_x;
gz = gzt = interp.z;
}
else
{
if (flip)
{
x1 = (FIXED_TO_FLOAT(spr_width - spr_offset) * this_xscale);
@ -5359,6 +5374,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
gzt = FIXED_TO_FLOAT(interp.z) + (FIXED_TO_FLOAT(spr_topoffset) * this_yscale);
gz = gzt - (FIXED_TO_FLOAT(spr_height) * this_yscale);
}
}
if (thing->subsector->sector->cullheight)
{
@ -5514,6 +5530,8 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->vflip = vflip;
vis->precip = false;
vis->angle = interp.angle;
}
#ifdef HWPRECIP

View file

@ -185,7 +185,7 @@ void R_DrawFloorSplat(vissprite_t *spr)
splat.scale = FixedMul(splat.scale, ((skin_t *)mobj->skin)->highresscale);
if (spr->rotateflags & SRF_3D || renderflags & RF_NOSPLATBILLBOARD)
splatangle = mobj->angle;
splatangle = spr->centerangle;
else
splatangle = spr->viewpoint.angle;
@ -209,14 +209,14 @@ void R_DrawFloorSplat(vissprite_t *spr)
xoffset = FixedMul(leftoffset, splat.xscale);
yoffset = FixedMul(topoffset, splat.yscale);
x = mobj->x;
y = mobj->y;
x = spr->gx;
y = spr->gy;
w = (splat.width * splat.xscale);
h = (splat.height * splat.yscale);
splat.x = x;
splat.y = y;
splat.z = mobj->z;
splat.z = spr->pz;
splat.slope = NULL;
// Set positions

View file

@ -1586,7 +1586,11 @@ static void R_ProjectSprite(mobj_t *thing)
I_Error("R_ProjectSprite: sprframes NULL for sprite %d\n", thing->sprite);
#endif
if (sprframe->rotate != SRF_SINGLE || papersprite)
if (splat)
{
ang = R_PointToAngle2(0, viewz, 0, interp.z);
}
else if (sprframe->rotate != SRF_SINGLE || papersprite)
{
ang = R_PointToAngle (interp.x, interp.y) - interp.angle;
if (mirrored)
@ -1863,6 +1867,7 @@ static void R_ProjectSprite(mobj_t *thing)
tr_y = (interp.y - sort_y) - viewy;
sort_z = FixedMul(tr_x, viewcos) + FixedMul(tr_y, viewsin);
sortsplat = FixedDiv(projectiony, sort_z);
centerangle = interp.angle;
}
// PORTAL SPRITE CLIPPING

View file

@ -165,7 +165,7 @@ typedef struct vissprite_s
fixed_t paperoffset, paperdistance; // for paper sprites, offset/dist relative to the angle
fixed_t xiscale; // negative if flipped
angle_t centerangle; // for paper sprites
angle_t centerangle; // for paper sprites / splats
// for floor sprites
struct {