Convert r_skyplane into a class

This commit is contained in:
Magnus Norddahl 2017-01-11 22:09:06 +01:00
parent 0885ff44a0
commit 9f8ac7e498
3 changed files with 78 additions and 50 deletions

View file

@ -47,31 +47,7 @@ EXTERN_CVAR(Int, r_skymode)
namespace swrenderer namespace swrenderer
{ {
namespace void RenderSkyPlane::Render(visplane_t *pl)
{
FTexture *frontskytex, *backskytex;
angle_t skyflip;
int frontpos, backpos;
double frontyScale;
fixed_t frontcyl, backcyl;
double skymid;
angle_t skyangle;
double frontiScale;
// Allow for layer skies up to 512 pixels tall. This is overkill,
// since the most anyone can ever see of the sky is 500 pixels.
// We need 4 skybufs because R_DrawSkySegment can draw up to 4 columns at a time.
// Need two versions - one for true color and one for palette
#define MAXSKYBUF 3072
uint8_t skybuf[4][512];
uint32_t skybuf_bgra[MAXSKYBUF][512];
uint32_t lastskycol[4];
uint32_t lastskycol_bgra[MAXSKYBUF];
int skycolplace;
int skycolplace_bgra;
}
void R_DrawSkyPlane(visplane_t *pl)
{ {
FTextureID sky1tex, sky2tex; FTextureID sky1tex, sky2tex;
double frontdpos = 0, backdpos = 0; double frontdpos = 0, backdpos = 0;
@ -181,7 +157,7 @@ namespace swrenderer
R_SetColorMapLight(fixedcolormap, 0, 0); R_SetColorMapLight(fixedcolormap, 0, 0);
} }
R_DrawSky(pl); DrawSky(pl);
if (fakefixed) if (fakefixed)
fixedcolormap = NULL; fixedcolormap = NULL;
@ -189,7 +165,7 @@ namespace swrenderer
// Get a column of sky when there is only one sky texture. // Get a column of sky when there is only one sky texture.
const uint8_t *R_GetOneSkyColumn(FTexture *fronttex, int x) const uint8_t *RenderSkyPlane::GetOneSkyColumn(FTexture *fronttex, int x)
{ {
int tx; int tx;
if (r_linearsky) if (r_linearsky)
@ -213,7 +189,7 @@ namespace swrenderer
} }
// Get a column of sky when there are two overlapping sky textures // Get a column of sky when there are two overlapping sky textures
const uint8_t *R_GetTwoSkyColumns(FTexture *fronttex, int x) const uint8_t *RenderSkyPlane::GetTwoSkyColumns(FTexture *fronttex, int x)
{ {
uint32_t ang, angle1, angle2; uint32_t ang, angle1, angle2;
@ -271,7 +247,7 @@ namespace swrenderer
} }
else else
{ {
//return R_GetOneSkyColumn(fronttex, x); //return GetOneSkyColumn(fronttex, x);
for (i = skycolplace_bgra - 4; i < skycolplace_bgra; ++i) for (i = skycolplace_bgra - 4; i < skycolplace_bgra; ++i)
{ {
int ic = (i % MAXSKYBUF); // i "checker" - can wrap around the ends of the array int ic = (i % MAXSKYBUF); // i "checker" - can wrap around the ends of the array
@ -311,7 +287,7 @@ namespace swrenderer
} }
} }
void R_DrawSkyColumnStripe(int start_x, int y1, int y2, int columns, double scale, double texturemid, double yrepeat) void RenderSkyPlane::DrawSkyColumnStripe(int start_x, int y1, int y2, int columns, double scale, double texturemid, double yrepeat)
{ {
using namespace drawerargs; using namespace drawerargs;
@ -376,12 +352,12 @@ namespace swrenderer
R_Drawers()->DrawDoubleSkyColumn(solid_top, solid_bottom); R_Drawers()->DrawDoubleSkyColumn(solid_top, solid_bottom);
} }
void R_DrawSkyColumn(int start_x, int y1, int y2, int columns) void RenderSkyPlane::DrawSkyColumn(int start_x, int y1, int y2, int columns)
{ {
if (1 << frontskytex->HeightBits == frontskytex->GetHeight()) if (1 << frontskytex->HeightBits == frontskytex->GetHeight())
{ {
double texturemid = skymid * frontskytex->Scale.Y + frontskytex->GetHeight(); double texturemid = skymid * frontskytex->Scale.Y + frontskytex->GetHeight();
R_DrawSkyColumnStripe(start_x, y1, y2, columns, frontskytex->Scale.Y, texturemid, frontskytex->Scale.Y); DrawSkyColumnStripe(start_x, y1, y2, columns, frontskytex->Scale.Y, texturemid, frontskytex->Scale.Y);
} }
else else
{ {
@ -392,11 +368,11 @@ namespace swrenderer
double topfrac = fmod(skymid + iscale * (1 - CenterY), frontskytex->GetHeight()); double topfrac = fmod(skymid + iscale * (1 - CenterY), frontskytex->GetHeight());
if (topfrac < 0) topfrac += frontskytex->GetHeight(); if (topfrac < 0) topfrac += frontskytex->GetHeight();
double texturemid = topfrac - iscale * (1 - CenterY); double texturemid = topfrac - iscale * (1 - CenterY);
R_DrawSkyColumnStripe(start_x, y1, y2, columns, scale, texturemid, yrepeat); DrawSkyColumnStripe(start_x, y1, y2, columns, scale, texturemid, yrepeat);
} }
} }
void R_DrawCapSky(visplane_t *pl) void RenderSkyPlane::DrawCapSky(visplane_t *pl)
{ {
int x1 = pl->left; int x1 = pl->left;
int x2 = pl->right; int x2 = pl->right;
@ -410,15 +386,15 @@ namespace swrenderer
if (y2 <= y1) if (y2 <= y1)
continue; continue;
R_DrawSkyColumn(x, y1, y2, 1); DrawSkyColumn(x, y1, y2, 1);
} }
} }
void R_DrawSky(visplane_t *pl) void RenderSkyPlane::DrawSky(visplane_t *pl)
{ {
if (r_skymode == 2) if (r_skymode == 2)
{ {
R_DrawCapSky(pl); DrawCapSky(pl);
return; return;
} }
@ -468,17 +444,17 @@ namespace swrenderer
lastskycol_bgra[x] = 0xffffffff; lastskycol_bgra[x] = 0xffffffff;
} }
R_DrawSkySegment(frontskytex, pl->left, pl->right, (short *)pl->top, (short *)pl->bottom, swall, lwall, R_DrawSkySegment(frontskytex, pl->left, pl->right, (short *)pl->top, (short *)pl->bottom, swall, lwall,
frontyScale, 0, 0, 0.0f, 0.0f, backskytex == NULL ? R_GetOneSkyColumn : R_GetTwoSkyColumns); frontyScale, 0, 0, 0.0f, 0.0f, backskytex == NULL ? RenderSkyPlane::GetOneSkyColumn : RenderSkyPlane::GetTwoSkyColumns);
} }
else else
{ // The texture does not tile nicely { // The texture does not tile nicely
frontyScale *= skyscale; frontyScale *= skyscale;
frontiScale = 1 / frontyScale; frontiScale = 1 / frontyScale;
R_DrawSkyStriped(pl); DrawSkyStriped(pl);
} }
} }
void R_DrawSkyStriped(visplane_t *pl) void RenderSkyPlane::DrawSkyStriped(visplane_t *pl)
{ {
short drawheight = short(frontskytex->GetHeight() * frontyScale); short drawheight = short(frontskytex->GetHeight() * frontyScale);
double topfrac; double topfrac;
@ -505,10 +481,33 @@ namespace swrenderer
lastskycol[x] = 0xffffffff; lastskycol[x] = 0xffffffff;
lastskycol_bgra[x] = 0xffffffff; lastskycol_bgra[x] = 0xffffffff;
} }
R_DrawSkySegment(frontskytex, pl->left, pl->right, top, bot, swall, lwall, frontskytex->Scale.Y, 0, 0, 0.0f, 0.0f, backskytex == NULL ? R_GetOneSkyColumn : R_GetTwoSkyColumns); R_DrawSkySegment(frontskytex, pl->left, pl->right, top, bot, swall, lwall, frontskytex->Scale.Y, 0, 0, 0.0f, 0.0f, backskytex == NULL ? RenderSkyPlane::GetOneSkyColumn : RenderSkyPlane::GetTwoSkyColumns);
yl = yh; yl = yh;
yh += drawheight; yh += drawheight;
dc_texturemid = iscale * (centery - yl - 1); dc_texturemid = iscale * (centery - yl - 1);
} }
} }
FTexture *RenderSkyPlane::frontskytex;
FTexture *RenderSkyPlane::backskytex;
angle_t RenderSkyPlane::skyflip;
int RenderSkyPlane::frontpos;
int RenderSkyPlane::backpos;
double RenderSkyPlane::frontyScale;
fixed_t RenderSkyPlane::frontcyl;
fixed_t RenderSkyPlane::backcyl;
double RenderSkyPlane::skymid;
angle_t RenderSkyPlane::skyangle;
double RenderSkyPlane::frontiScale;
// Allow for layer skies up to 512 pixels tall. This is overkill,
// since the most anyone can ever see of the sky is 500 pixels.
// We need 4 skybufs because DrawSkySegment can draw up to 4 columns at a time.
// Need two versions - one for true color and one for palette
uint8_t RenderSkyPlane::skybuf[4][512];
uint32_t RenderSkyPlane::skybuf_bgra[MAXSKYBUF][512];
uint32_t RenderSkyPlane::lastskycol[4];
uint32_t RenderSkyPlane::lastskycol_bgra[MAXSKYBUF];
int RenderSkyPlane::skycolplace;
int RenderSkyPlane::skycolplace_bgra;
} }

View file

@ -17,14 +17,43 @@
namespace swrenderer namespace swrenderer
{ {
void R_DrawSkyPlane(visplane_t *pl); class RenderSkyPlane
{
public:
static void Render(visplane_t *pl);
void R_DrawSky(visplane_t *pl); private:
void R_DrawSkyStriped(visplane_t *pl); static void DrawSky(visplane_t *pl);
void R_DrawCapSky(visplane_t *pl); static void DrawSkyStriped(visplane_t *pl);
void R_DrawSkyColumnStripe(int start_x, int y1, int y2, int columns, double scale, double texturemid, double yrepeat); static void DrawCapSky(visplane_t *pl);
void R_DrawSkyColumn(int start_x, int y1, int y2, int columns); static void DrawSkyColumnStripe(int start_x, int y1, int y2, int columns, double scale, double texturemid, double yrepeat);
static void DrawSkyColumn(int start_x, int y1, int y2, int columns);
const uint8_t *R_GetOneSkyColumn(FTexture *fronttex, int x); static const uint8_t *GetOneSkyColumn(FTexture *fronttex, int x);
const uint8_t *R_GetTwoSkyColumns(FTexture *fronttex, int x); static const uint8_t *GetTwoSkyColumns(FTexture *fronttex, int x);
static FTexture *frontskytex;
static FTexture *backskytex;
static angle_t skyflip;
static int frontpos;
static int backpos;
static double frontyScale;
static fixed_t frontcyl;
static fixed_t backcyl;
static double skymid;
static angle_t skyangle;
static double frontiScale;
// Allow for layer skies up to 512 pixels tall. This is overkill,
// since the most anyone can ever see of the sky is 500 pixels.
// We need 4 skybufs because R_DrawSkySegment can draw up to 4 columns at a time.
// Need two versions - one for true color and one for palette
enum { MAXSKYBUF = 3072 };
static uint8_t skybuf[4][512];
static uint32_t skybuf_bgra[MAXSKYBUF][512];
static uint32_t lastskycol[4];
static uint32_t lastskycol_bgra[MAXSKYBUF];
static int skycolplace;
static int skycolplace_bgra;
};
} }

View file

@ -480,7 +480,7 @@ namespace swrenderer
if (pl->picnum == skyflatnum) // sky flat if (pl->picnum == skyflatnum) // sky flat
{ {
R_DrawSkyPlane(pl); RenderSkyPlane::Render(pl);
} }
else // regular flat else // regular flat
{ {