mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 23:02:08 +00:00
Renderer floatification: Use floating point for decals
This commit is contained in:
parent
cb0fe38dfe
commit
1f97488945
2 changed files with 14 additions and 21 deletions
|
@ -3032,8 +3032,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
{
|
||||
DVector2 decal_left, decal_right, decal_pos;
|
||||
int x1, x2;
|
||||
fixed_t xscale, yscale;
|
||||
fixed_t topoff;
|
||||
double yscale;
|
||||
BYTE flipx;
|
||||
double zpos;
|
||||
int needrepeat = 0;
|
||||
|
@ -3085,9 +3084,6 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
}
|
||||
}
|
||||
|
||||
xscale = FLOAT2FIXED(decal->ScaleX);
|
||||
yscale = FLOAT2FIXED(decal->ScaleY);
|
||||
|
||||
WallSpriteTile = TexMan(decal->PicNum, true);
|
||||
flipx = (BYTE)(decal->RenderFlags & RF_XFLIP);
|
||||
|
||||
|
@ -3102,12 +3098,10 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
|
||||
FWallCoords savecoord = WallC;
|
||||
|
||||
x2 = WallSpriteTile->GetWidth();
|
||||
x1 = WallSpriteTile->LeftOffset;
|
||||
x2 = x2 - x1;
|
||||
|
||||
x1 *= xscale;
|
||||
x2 *= xscale;
|
||||
double edge_right = WallSpriteTile->GetWidth();
|
||||
double edge_left = WallSpriteTile->LeftOffset;
|
||||
edge_right = (edge_right - edge_left) * decal->ScaleX;
|
||||
edge_left *= decal->ScaleX;
|
||||
|
||||
double dcx, dcy;
|
||||
decal->GetXY(wall, dcx, dcy);
|
||||
|
@ -3115,8 +3109,8 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
|
||||
DVector2 angvec = (curline->v2->fPos() - curline->v1->fPos()).Unit();
|
||||
|
||||
decal_left = decal_pos - x1 * angvec - ViewPos;
|
||||
decal_right = decal_pos + x2 * angvec - ViewPos;
|
||||
decal_left = decal_pos - edge_left * angvec - ViewPos;
|
||||
decal_right = decal_pos + edge_right * angvec - ViewPos;
|
||||
|
||||
if (WallC.Init(decal_left, decal_right, TOO_CLOSE_Z))
|
||||
goto done;
|
||||
|
@ -3183,8 +3177,8 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
break;
|
||||
}
|
||||
|
||||
topoff = WallSpriteTile->TopOffset << FRACBITS;
|
||||
dc_texturemid = topoff + (zpos - ViewPos.Z) / yscale;
|
||||
yscale = decal->ScaleY;
|
||||
dc_texturemid = WallSpriteTile->TopOffset + (zpos - ViewPos.Z) / yscale;
|
||||
|
||||
// Clip sprite to drawseg
|
||||
x1 = MAX<int>(clipper->x1, x1);
|
||||
|
@ -3194,7 +3188,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
goto done;
|
||||
}
|
||||
|
||||
PrepWall (swall, lwall, WallSpriteTile->GetWidth() << FRACBITS, x1, x2);
|
||||
PrepWall (swall, lwall, WallSpriteTile->GetWidth(), x1, x2);
|
||||
|
||||
if (flipx)
|
||||
{
|
||||
|
@ -3242,7 +3236,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
|
|||
}
|
||||
|
||||
// rw_offset is used as the texture's vertical scale
|
||||
rw_offset = SafeDivScale30(1, yscale);
|
||||
rw_offset = FLOAT2FIXED(1 / yscale);
|
||||
|
||||
do
|
||||
{
|
||||
|
|
|
@ -632,9 +632,8 @@ void R_DrawWallSprite(vissprite_t *spr)
|
|||
|
||||
void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans))
|
||||
{
|
||||
unsigned int texturecolumn = lwall[dc_x] >> FRACBITS;
|
||||
dc_iscale = MulScale16 (swall[dc_x], rw_offset);
|
||||
spryscale = SafeDivScale32 (1, dc_iscale);
|
||||
dc_iscale = MulScale16 (swall[dc_x], rw_offset/4);
|
||||
spryscale = 65536.0 / dc_iscale;
|
||||
if (sprflipvert)
|
||||
sprtopscreen = CenterY + dc_texturemid * spryscale;
|
||||
else
|
||||
|
@ -642,7 +641,7 @@ void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Sp
|
|||
|
||||
const BYTE *column;
|
||||
const FTexture::Span *spans;
|
||||
column = WallSpriteTile->GetColumn (texturecolumn, &spans);
|
||||
column = WallSpriteTile->GetColumn (lwall[dc_x] >> FRACBITS, &spans);
|
||||
dc_texturefrac = 0;
|
||||
drawfunc (column, spans);
|
||||
rw_light += rw_lightstep;
|
||||
|
|
Loading…
Reference in a new issue