Convert r_flatplane and r_slopeplane into classes

This commit is contained in:
Magnus Norddahl 2017-01-11 21:59:26 +01:00
parent fc29958dc7
commit 0885ff44a0
7 changed files with 92 additions and 65 deletions

View file

@ -41,20 +41,7 @@
namespace swrenderer namespace swrenderer
{ {
namespace void RenderFlatPlane::Render(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked)
{
double planeheight;
bool plane_shade;
int planeshade;
fixed_t pviewx, pviewy;
float yslope[MAXHEIGHT];
fixed_t xscale, yscale;
double xstepscale, ystepscale;
double basexfrac, baseyfrac;
visplane_light *ds_light_list;
}
void R_DrawNormalPlane(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked)
{ {
using namespace drawerargs; using namespace drawerargs;
@ -189,18 +176,12 @@ namespace swrenderer
} }
} }
ds_light_list = pl->lights; light_list = pl->lights;
R_MapVisPlane(pl, R_MapPlane, R_StepPlane); RenderLines(pl);
} }
void R_StepPlane() void RenderFlatPlane::RenderLine(int y, int x1, int x2)
{
basexfrac -= xstepscale;
baseyfrac -= ystepscale;
}
void R_MapPlane(int y, int x1, int x2)
{ {
using namespace drawerargs; using namespace drawerargs;
@ -275,7 +256,7 @@ namespace swrenderer
// Setup lights for row // Setup lights for row
dc_num_lights = 0; dc_num_lights = 0;
dc_lights = lightbuffer + nextlightindex; dc_lights = lightbuffer + nextlightindex;
visplane_light *cur_node = ds_light_list; visplane_light *cur_node = light_list;
while (cur_node && nextlightindex < 64 * 1024) while (cur_node && nextlightindex < 64 * 1024)
{ {
double lightX = cur_node->lightsource->X() - ViewPos.X; double lightX = cur_node->lightsource->X() - ViewPos.X;
@ -326,17 +307,13 @@ namespace swrenderer
(R_Drawers()->*spanfunc)(); (R_Drawers()->*spanfunc)();
} }
void R_DrawColoredPlane(visplane_t *pl) void RenderFlatPlane::StepColumn()
{ {
R_MapVisPlane(pl, R_MapColoredPlane, nullptr); basexfrac -= xstepscale;
baseyfrac -= ystepscale;
} }
void R_MapColoredPlane(int y, int x1, int x2) void RenderFlatPlane::SetupSlope()
{
R_Drawers()->DrawColoredSpan(y, x1, x2);
}
void R_SetupPlaneSlope()
{ {
int e, i; int e, i;
@ -377,4 +354,18 @@ namespace swrenderer
} while (++i < e); } while (++i < e);
} }
} }
float RenderFlatPlane::yslope[MAXHEIGHT];
/////////////////////////////////////////////////////////////////////////
void RenderColoredPlane::Render(visplane_t *pl)
{
RenderLines(pl);
}
void RenderColoredPlane::RenderLine(int y, int x1, int x2)
{
R_Drawers()->DrawColoredSpan(y, x1, x2);
}
} }

View file

@ -17,12 +17,35 @@
namespace swrenderer namespace swrenderer
{ {
void R_SetupPlaneSlope(); class RenderFlatPlane : PlaneRenderer
{
public:
void Render(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked);
void R_DrawNormalPlane(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked); static void SetupSlope();
void R_MapPlane(int y, int x1, int x2);
void R_StepPlane();
void R_DrawColoredPlane(visplane_t *pl); private:
void R_MapColoredPlane(int y, int x1, int x2); void RenderLine(int y, int x1, int x2) override;
void StepColumn() override;
double planeheight;
bool plane_shade;
int planeshade;
fixed_t pviewx, pviewy;
fixed_t xscale, yscale;
double xstepscale, ystepscale;
double basexfrac, baseyfrac;
visplane_light *light_list;
static float yslope[MAXHEIGHT];
};
class RenderColoredPlane : PlaneRenderer
{
public:
void Render(visplane_t *pl);
private:
void RenderLine(int y, int x1, int x2) override;
};
} }

View file

@ -45,17 +45,7 @@
namespace swrenderer namespace swrenderer
{ {
namespace void RenderSlopePlane::Render(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked)
{
FVector3 plane_sz, plane_su, plane_sv;
float planelightfloat;
bool plane_shade;
int planeshade;
fixed_t pviewx, pviewy;
fixed_t xscale, yscale;
}
void R_DrawTiltedPlane(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked)
{ {
using namespace drawerargs; using namespace drawerargs;
@ -182,10 +172,10 @@ namespace swrenderer
plane_su[2] = plane_su[1] = plane_su[0] = 0; plane_su[2] = plane_su[1] = plane_su[0] = 0;
} }
R_MapVisPlane(pl, R_MapTiltedPlane, nullptr); RenderLines(pl);
} }
void R_MapTiltedPlane(int y, int x1, int x2) void RenderSlopePlane::RenderLine(int y, int x1, int x2)
{ {
R_Drawers()->DrawTiltedSpan(y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy); R_Drawers()->DrawTiltedSpan(y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy);
} }

View file

@ -17,6 +17,19 @@
namespace swrenderer namespace swrenderer
{ {
void R_DrawTiltedPlane(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked); class RenderSlopePlane : PlaneRenderer
void R_MapTiltedPlane(int y, int x1, int x2); {
public:
void Render(visplane_t *pl, double _xscale, double _yscale, fixed_t alpha, bool additive, bool masked);
private:
void RenderLine(int y, int x1, int x2) override;
FVector3 plane_sz, plane_su, plane_sv;
float planelightfloat;
bool plane_shade;
int planeshade;
fixed_t pviewx, pviewy;
fixed_t xscale, yscale;
};
} }

View file

@ -52,8 +52,6 @@ namespace swrenderer
enum { max_plane_lights = 32 * 1024 }; enum { max_plane_lights = 32 * 1024 };
visplane_light plane_lights[max_plane_lights]; visplane_light plane_lights[max_plane_lights];
int next_plane_light = 0; int next_plane_light = 0;
short spanend[MAXHEIGHT];
} }
void R_DeinitPlanes() void R_DeinitPlanes()
@ -509,17 +507,19 @@ namespace swrenderer
if (!pl->height.isSlope() && !tilt) if (!pl->height.isSlope() && !tilt)
{ {
R_DrawNormalPlane(pl, xscale, yscale, alpha, additive, masked); RenderFlatPlane renderer;
renderer.Render(pl, xscale, yscale, alpha, additive, masked);
} }
else else
{ {
R_DrawTiltedPlane(pl, xscale, yscale, alpha, additive, masked); RenderSlopePlane renderer;
renderer.Render(pl, xscale, yscale, alpha, additive, masked);
} }
} }
NetUpdate(); NetUpdate();
} }
void R_MapVisPlane(visplane_t *pl, void(*mapfunc)(int y, int x1, int x2), void(*stepfunc)()) void PlaneRenderer::RenderLines(visplane_t *pl)
{ {
// t1/b1 are at x // t1/b1 are at x
// t2/b2 are at x+1 // t2/b2 are at x+1
@ -547,14 +547,14 @@ namespace swrenderer
{ {
int y = t2++; int y = t2++;
int x2 = spanend[y]; int x2 = spanend[y];
mapfunc(y, xr, x2); RenderLine(y, xr, x2);
} }
stop = MAX(b1, t2); stop = MAX(b1, t2);
while (b2 > stop) while (b2 > stop)
{ {
int y = --b2; int y = --b2;
int x2 = spanend[y]; int x2 = spanend[y];
mapfunc(y, xr, x2); RenderLine(y, xr, x2);
} }
// Mark any spans that have just opened // Mark any spans that have just opened
@ -572,15 +572,14 @@ namespace swrenderer
t2 = pl->top[x]; t2 = pl->top[x];
b2 = pl->bottom[x]; b2 = pl->bottom[x];
if (stepfunc) StepColumn();
stepfunc();
} }
// Draw any spans that are still open // Draw any spans that are still open
while (t2 < b2) while (t2 < b2)
{ {
int y = --b2; int y = --b2;
int x2 = spanend[y]; int x2 = spanend[y];
mapfunc(y, pl->left, x2); RenderLine(y, pl->left, x2);
} }
} }
} }

View file

@ -87,5 +87,16 @@ namespace swrenderer
int R_DrawPlanes(); int R_DrawPlanes();
void R_DrawHeightPlanes(double height); void R_DrawHeightPlanes(double height);
void R_DrawSinglePlane(visplane_t *pl, fixed_t alpha, bool additive, bool masked); void R_DrawSinglePlane(visplane_t *pl, fixed_t alpha, bool additive, bool masked);
void R_MapVisPlane(visplane_t *pl, void(*mapfunc)(int y, int x1, int x2), void(*stepfunc)());
class PlaneRenderer
{
public:
void RenderLines(visplane_t *pl);
virtual void RenderLine(int y, int x1, int x2) = 0;
virtual void StepColumn() { }
private:
short spanend[MAXHEIGHT];
};
} }

View file

@ -467,7 +467,7 @@ void R_SetupFreelook()
globaluclip = -CenterY / InvZtoScale; globaluclip = -CenterY / InvZtoScale;
globaldclip = (viewheight - CenterY) / InvZtoScale; globaldclip = (viewheight - CenterY) / InvZtoScale;
R_SetupPlaneSlope(); RenderFlatPlane::SetupSlope();
} }
//========================================================================== //==========================================================================