Renderer floatification: Use floating point for decals

This commit is contained in:
Randy Heit 2016-04-21 20:17:02 -05:00
parent cb0fe38dfe
commit 1f97488945
2 changed files with 14 additions and 21 deletions

View File

@ -3032,8 +3032,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
{ {
DVector2 decal_left, decal_right, decal_pos; DVector2 decal_left, decal_right, decal_pos;
int x1, x2; int x1, x2;
fixed_t xscale, yscale; double yscale;
fixed_t topoff;
BYTE flipx; BYTE flipx;
double zpos; double zpos;
int needrepeat = 0; 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); WallSpriteTile = TexMan(decal->PicNum, true);
flipx = (BYTE)(decal->RenderFlags & RF_XFLIP); 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; FWallCoords savecoord = WallC;
x2 = WallSpriteTile->GetWidth(); double edge_right = WallSpriteTile->GetWidth();
x1 = WallSpriteTile->LeftOffset; double edge_left = WallSpriteTile->LeftOffset;
x2 = x2 - x1; edge_right = (edge_right - edge_left) * decal->ScaleX;
edge_left *= decal->ScaleX;
x1 *= xscale;
x2 *= xscale;
double dcx, dcy; double dcx, dcy;
decal->GetXY(wall, 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(); DVector2 angvec = (curline->v2->fPos() - curline->v1->fPos()).Unit();
decal_left = decal_pos - x1 * angvec - ViewPos; decal_left = decal_pos - edge_left * angvec - ViewPos;
decal_right = decal_pos + x2 * angvec - ViewPos; decal_right = decal_pos + edge_right * angvec - ViewPos;
if (WallC.Init(decal_left, decal_right, TOO_CLOSE_Z)) if (WallC.Init(decal_left, decal_right, TOO_CLOSE_Z))
goto done; goto done;
@ -3183,8 +3177,8 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
break; break;
} }
topoff = WallSpriteTile->TopOffset << FRACBITS; yscale = decal->ScaleY;
dc_texturemid = topoff + (zpos - ViewPos.Z) / yscale; dc_texturemid = WallSpriteTile->TopOffset + (zpos - ViewPos.Z) / yscale;
// Clip sprite to drawseg // Clip sprite to drawseg
x1 = MAX<int>(clipper->x1, x1); x1 = MAX<int>(clipper->x1, x1);
@ -3194,7 +3188,7 @@ static void R_RenderDecal (side_t *wall, DBaseDecal *decal, drawseg_t *clipper,
goto done; goto done;
} }
PrepWall (swall, lwall, WallSpriteTile->GetWidth() << FRACBITS, x1, x2); PrepWall (swall, lwall, WallSpriteTile->GetWidth(), x1, x2);
if (flipx) 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 is used as the texture's vertical scale
rw_offset = SafeDivScale30(1, yscale); rw_offset = FLOAT2FIXED(1 / yscale);
do do
{ {

View File

@ -632,9 +632,8 @@ void R_DrawWallSprite(vissprite_t *spr)
void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Span *spans)) 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/4);
dc_iscale = MulScale16 (swall[dc_x], rw_offset); spryscale = 65536.0 / dc_iscale;
spryscale = SafeDivScale32 (1, dc_iscale);
if (sprflipvert) if (sprflipvert)
sprtopscreen = CenterY + dc_texturemid * spryscale; sprtopscreen = CenterY + dc_texturemid * spryscale;
else else
@ -642,7 +641,7 @@ void R_WallSpriteColumn (void (*drawfunc)(const BYTE *column, const FTexture::Sp
const BYTE *column; const BYTE *column;
const FTexture::Span *spans; const FTexture::Span *spans;
column = WallSpriteTile->GetColumn (texturecolumn, &spans); column = WallSpriteTile->GetColumn (lwall[dc_x] >> FRACBITS, &spans);
dc_texturefrac = 0; dc_texturefrac = 0;
drawfunc (column, spans); drawfunc (column, spans);
rw_light += rw_lightstep; rw_light += rw_lightstep;