Move fog boundary drawing to r_fogboundary
This commit is contained in:
parent
f354cc8c67
commit
2f96dcc1a8
6 changed files with 158 additions and 102 deletions
|
|
@ -115,109 +115,9 @@ short spanend[MAXHEIGHT];
|
|||
|
||||
void R_DrawSinglePlane (visplane_t *, fixed_t alpha, bool additive, bool masked);
|
||||
|
||||
void R_DrawFogBoundarySection(int y, int y2, int x1)
|
||||
{
|
||||
for (; y < y2; ++y)
|
||||
{
|
||||
R_Drawers()->DrawFogBoundaryLine(y, x1, spanend[y]);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
||||
void R_DrawFogBoundary(int x1, int x2, short *uclip, short *dclip)
|
||||
{
|
||||
// This is essentially the same as R_MapVisPlane but with an extra step
|
||||
// to create new horizontal spans whenever the light changes enough that
|
||||
// we need to use a new colormap.
|
||||
|
||||
double lightstep = rw_lightstep;
|
||||
double light = rw_light + rw_lightstep*(x2 - x1 - 1);
|
||||
int x = x2 - 1;
|
||||
int t2 = uclip[x];
|
||||
int b2 = dclip[x];
|
||||
int rcolormap = GETPALOOKUP(light, wallshade);
|
||||
int lcolormap;
|
||||
uint8_t *basecolormapdata = basecolormap->Maps;
|
||||
|
||||
if (b2 > t2)
|
||||
{
|
||||
fillshort(spanend + t2, b2 - t2, x);
|
||||
}
|
||||
|
||||
R_SetColorMapLight(basecolormap, (float)light, wallshade);
|
||||
|
||||
uint8_t *fake_dc_colormap = basecolormap->Maps + (GETPALOOKUP(light, wallshade) << COLORMAPSHIFT);
|
||||
|
||||
for (--x; x >= x1; --x)
|
||||
{
|
||||
int t1 = uclip[x];
|
||||
int b1 = dclip[x];
|
||||
const int xr = x + 1;
|
||||
int stop;
|
||||
|
||||
light -= rw_lightstep;
|
||||
lcolormap = GETPALOOKUP(light, wallshade);
|
||||
if (lcolormap != rcolormap)
|
||||
{
|
||||
if (t2 < b2 && rcolormap != 0)
|
||||
{ // Colormap 0 is always the identity map, so rendering it is
|
||||
// just a waste of time.
|
||||
R_DrawFogBoundarySection(t2, b2, xr);
|
||||
}
|
||||
if (t1 < t2) t2 = t1;
|
||||
if (b1 > b2) b2 = b1;
|
||||
if (t2 < b2)
|
||||
{
|
||||
fillshort(spanend + t2, b2 - t2, x);
|
||||
}
|
||||
rcolormap = lcolormap;
|
||||
R_SetColorMapLight(basecolormap, (float)light, wallshade);
|
||||
fake_dc_colormap = basecolormap->Maps + (GETPALOOKUP(light, wallshade) << COLORMAPSHIFT);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fake_dc_colormap != basecolormapdata)
|
||||
{
|
||||
stop = MIN(t1, b2);
|
||||
while (t2 < stop)
|
||||
{
|
||||
int y = t2++;
|
||||
R_Drawers()->DrawFogBoundaryLine(y, xr, spanend[y]);
|
||||
}
|
||||
stop = MAX(b1, t2);
|
||||
while (b2 > stop)
|
||||
{
|
||||
int y = --b2;
|
||||
R_Drawers()->DrawFogBoundaryLine(y, xr, spanend[y]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
t2 = MAX(t2, MIN(t1, b2));
|
||||
b2 = MIN(b2, MAX(b1, t2));
|
||||
}
|
||||
|
||||
stop = MIN(t2, b1);
|
||||
while (t1 < stop)
|
||||
{
|
||||
spanend[t1++] = x;
|
||||
}
|
||||
stop = MAX(b2, t2);
|
||||
while (b1 > stop)
|
||||
{
|
||||
spanend[--b1] = x;
|
||||
}
|
||||
}
|
||||
|
||||
t2 = uclip[x];
|
||||
b2 = dclip[x];
|
||||
}
|
||||
if (t2 < b2 && rcolormap != 0)
|
||||
{
|
||||
R_DrawFogBoundarySection(t2, b2, x1);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue