Move shared code here instead of duplicating it for both dc_numlights and non-dc_numlights rendering code

Also added a few comments, and include the out of range check in the "shared code" above
This commit is contained in:
Monster Iestyn 2018-10-13 15:37:11 +01:00
parent 1b531ddcfe
commit bedfed2f00

View file

@ -1039,16 +1039,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
{ {
if (maskedtexturecol[dc_x] != INT16_MAX) if (maskedtexturecol[dc_x] != INT16_MAX)
{ {
// SoM: New code does not rely on R_DrawColumnShadowed_8 which // Calculate bounds
// will (hopefully) put less strain on the stack. // clamp the values if necessary to avoid overflows and rendering glitches caused by them
if (dc_numlights)
{
lighttable_t **xwalllights;
fixed_t height;
fixed_t bheight = 0;
INT32 solid = 0;
INT32 lighteffect = 0;
#ifdef ESLOPE #ifdef ESLOPE
if (top_frac > (INT64)CLAMPMAX) sprtopscreen = windowtop = CLAMPMAX; if (top_frac > (INT64)CLAMPMAX) sprtopscreen = windowtop = CLAMPMAX;
else if (top_frac > (INT64)CLAMPMIN) sprtopscreen = windowtop = (fixed_t)top_frac; else if (top_frac > (INT64)CLAMPMIN) sprtopscreen = windowtop = (fixed_t)top_frac;
@ -1066,6 +1058,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
// SoM: If column is out of range, why bother with it?? // SoM: If column is out of range, why bother with it??
if (windowbottom < topbounds || windowtop > bottombounds) if (windowbottom < topbounds || windowtop > bottombounds)
{
if (dc_numlights)
{ {
for (i = 0; i < dc_numlights; i++) for (i = 0; i < dc_numlights; i++)
{ {
@ -1074,15 +1068,26 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
if (rlight->flags & FF_CUTLEVEL) if (rlight->flags & FF_CUTLEVEL)
rlight->botheight += rlight->botheightstep; rlight->botheight += rlight->botheightstep;
} }
}
spryscale += rw_scalestep; spryscale += rw_scalestep;
continue; continue;
} }
dc_iscale = 0xffffffffu / (unsigned)spryscale; dc_iscale = 0xffffffffu / (unsigned)spryscale;
// draw the texture // Get data for the column
col = (column_t *)((UINT8 *)R_GetColumn(texnum,maskedtexturecol[dc_x]) - 3); col = (column_t *)((UINT8 *)R_GetColumn(texnum,maskedtexturecol[dc_x]) - 3);
// SoM: New code does not rely on R_DrawColumnShadowed_8 which
// will (hopefully) put less strain on the stack.
if (dc_numlights)
{
lighttable_t **xwalllights;
fixed_t height;
fixed_t bheight = 0;
INT32 solid = 0;
INT32 lighteffect = 0;
for (i = 0; i < dc_numlights; i++) for (i = 0; i < dc_numlights; i++)
{ {
// Check if the current light effects the colormap/lightlevel // Check if the current light effects the colormap/lightlevel
@ -1162,6 +1167,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
if (windowbottom >= sprbotscreen) if (windowbottom >= sprbotscreen)
{ {
windowbottom = sprbotscreen; windowbottom = sprbotscreen;
// draw the texture
colfunc_2s (col); colfunc_2s (col);
for (i++; i < dc_numlights; i++) for (i++; i < dc_numlights; i++)
{ {
@ -1172,6 +1178,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
} }
continue; continue;
} }
// draw the texture
colfunc_2s (col); colfunc_2s (col);
if (solid) if (solid)
windowtop = bheight; windowtop = bheight;
@ -1181,6 +1188,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
dc_colormap = rlight->rcolormap; dc_colormap = rlight->rcolormap;
} }
windowbottom = sprbotscreen; windowbottom = sprbotscreen;
// draw the texture, if there is any space left
if (windowtop < windowbottom) if (windowtop < windowbottom)
colfunc_2s (col); colfunc_2s (col);
@ -1200,26 +1208,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
if (pfloor->flags & FF_FOG && pfloor->master->frontsector->extra_colormap) if (pfloor->flags & FF_FOG && pfloor->master->frontsector->extra_colormap)
dc_colormap = pfloor->master->frontsector->extra_colormap->colormap + (dc_colormap - colormaps); dc_colormap = pfloor->master->frontsector->extra_colormap->colormap + (dc_colormap - colormaps);
#ifdef ESLOPE
if (top_frac > (INT64)CLAMPMAX) sprtopscreen = windowtop = CLAMPMAX;
else if (top_frac > (INT64)CLAMPMIN) sprtopscreen = windowtop = (fixed_t)top_frac;
else sprtopscreen = windowtop = CLAMPMIN;
if (bottom_frac > (INT64)CLAMPMAX) sprbotscreen = windowbottom = CLAMPMAX;
else if (bottom_frac > (INT64)CLAMPMIN) sprbotscreen = windowbottom = (fixed_t)bottom_frac;
else sprbotscreen = windowbottom = CLAMPMIN;
top_frac += top_step;
bottom_frac += bottom_step;
#else
sprtopscreen = windowtop = (centeryfrac - FixedMul((dc_texturemid - offsetvalue), spryscale));
sprbotscreen = windowbottom = FixedMul(*pfloor->topheight - *pfloor->bottomheight, spryscale) + sprtopscreen;
#endif
dc_iscale = 0xffffffffu / (unsigned)spryscale;
// draw the texture // draw the texture
col = (column_t *)((UINT8 *)R_GetColumn(texnum,maskedtexturecol[dc_x]) - 3);
colfunc_2s (col); colfunc_2s (col);
spryscale += rw_scalestep; spryscale += rw_scalestep;
} }