- some cleanup of wall processing code.

* removed SplitWall function
 * split PutWall into PutWall and PutPortal because none of the portal cases needs the overhead for normal walls.
This commit is contained in:
Christoph Oelckers 2016-02-01 01:49:49 +01:00
parent 9305cd86a0
commit 67fc35e738
3 changed files with 76 additions and 90 deletions

View file

@ -137,11 +137,12 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor)
void GLWall::SkyPlane(sector_t *sector, int plane, bool allowreflect) void GLWall::SkyPlane(sector_t *sector, int plane, bool allowreflect)
{ {
int ptype = -1;
FPortal *portal = sector->portals[plane]; FPortal *portal = sector->portals[plane];
if (portal != NULL) if (portal != NULL)
{ {
if (GLPortal::instack[1 - plane]) return; if (GLPortal::instack[1 - plane]) return;
type = RENDERWALL_SECTORSTACK; ptype = PORTALTYPE_SECTORSTACK;
this->portal = portal; this->portal = portal;
} }
else else
@ -156,13 +157,13 @@ void GLWall::SkyPlane(sector_t *sector, int plane, bool allowreflect)
if (!gl_noskyboxes && skyboxx && GLRenderer->mViewActor != skyboxx && !(skyboxx->flags&MF_JUSTHIT)) if (!gl_noskyboxes && skyboxx && GLRenderer->mViewActor != skyboxx && !(skyboxx->flags&MF_JUSTHIT))
{ {
type = RENDERWALL_SKYBOX; ptype = PORTALTYPE_SKYBOX;
skybox = skyboxx; skybox = skyboxx;
} }
else else
{ {
skyinfo.init(sector->sky, Colormap.FadeColor); skyinfo.init(sector->sky, Colormap.FadeColor);
type = RENDERWALL_SKY; ptype = PORTALTYPE_SKY;
sky = UniqueSkies.Get(&skyinfo); sky = UniqueSkies.Get(&skyinfo);
} }
} }
@ -170,12 +171,14 @@ void GLWall::SkyPlane(sector_t *sector, int plane, bool allowreflect)
{ {
if ((plane == sector_t::ceiling && viewz > sector->ceilingplane.d) || if ((plane == sector_t::ceiling && viewz > sector->ceilingplane.d) ||
(plane == sector_t::floor && viewz < -sector->floorplane.d)) return; (plane == sector_t::floor && viewz < -sector->floorplane.d)) return;
type = RENDERWALL_PLANEMIRROR; ptype = PORTALTYPE_PLANEMIRROR;
planemirror = plane == sector_t::ceiling ? &sector->ceilingplane : &sector->floorplane; planemirror = plane == sector_t::ceiling ? &sector->ceilingplane : &sector->floorplane;
} }
else return;
} }
PutWall(0); if (ptype != -1)
{
PutPortal(ptype);
}
} }
@ -189,22 +192,23 @@ void GLWall::SkyLine(line_t *line)
{ {
ASkyViewpoint * skyboxx = line->skybox; ASkyViewpoint * skyboxx = line->skybox;
GLSkyInfo skyinfo; GLSkyInfo skyinfo;
int ptype;
// JUSTHIT is used as an indicator that a skybox is in use. // JUSTHIT is used as an indicator that a skybox is in use.
// This is to avoid recursion // This is to avoid recursion
if (!gl_noskyboxes && skyboxx && GLRenderer->mViewActor != skyboxx && !(skyboxx->flags&MF_JUSTHIT)) if (!gl_noskyboxes && skyboxx && GLRenderer->mViewActor != skyboxx && !(skyboxx->flags&MF_JUSTHIT))
{ {
type = RENDERWALL_SKYBOX; ptype = PORTALTYPE_SKYBOX;
skybox = skyboxx; skybox = skyboxx;
} }
else else
{ {
skyinfo.init(line->frontsector->sky, Colormap.FadeColor); skyinfo.init(line->frontsector->sky, Colormap.FadeColor);
type = RENDERWALL_SKY; ptype = PORTALTYPE_SKY;
sky = UniqueSkies.Get(&skyinfo); sky = UniqueSkies.Get(&skyinfo);
} }
PutWall(0); PutPortal(ptype);
} }

View file

@ -30,13 +30,7 @@ enum WallTypes
RENDERWALL_M1S, RENDERWALL_M1S,
RENDERWALL_M2S, RENDERWALL_M2S,
RENDERWALL_BOTTOM, RENDERWALL_BOTTOM,
RENDERWALL_SKY,
RENDERWALL_FOGBOUNDARY, RENDERWALL_FOGBOUNDARY,
RENDERWALL_HORIZON,
RENDERWALL_SKYBOX,
RENDERWALL_SECTORSTACK,
RENDERWALL_PLANEMIRROR,
RENDERWALL_MIRROR,
RENDERWALL_MIRRORSURFACE, RENDERWALL_MIRRORSURFACE,
RENDERWALL_M2SNF, RENDERWALL_M2SNF,
RENDERWALL_COLOR, RENDERWALL_COLOR,
@ -44,6 +38,16 @@ enum WallTypes
// Insert new types at the end! // Insert new types at the end!
}; };
enum PortalTypes
{
PORTALTYPE_SKY,
PORTALTYPE_HORIZON,
PORTALTYPE_SKYBOX,
PORTALTYPE_SECTORSTACK,
PORTALTYPE_PLANEMIRROR,
PORTALTYPE_MIRROR,
};
struct GLSeg struct GLSeg
{ {
float x1,x2; float x1,x2;
@ -159,7 +163,8 @@ public:
private: private:
void CheckGlowing(); void CheckGlowing();
void PutWall(bool translucent); void PutWall(sector_t *sec, bool translucent);
void PutPortal(int ptype);
void CheckTexturePosition(); void CheckTexturePosition();
void SetupLights(); void SetupLights();
@ -175,7 +180,6 @@ private:
void SkyTop(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); void SkyTop(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2);
void SkyBottom(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2); void SkyBottom(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex_t * v2);
void SplitWall(sector_t * frontsector, bool translucent);
void LightPass(); void LightPass();
void SetHorizon(vertex_t * ul, vertex_t * ur, vertex_t * ll, vertex_t * lr); void SetHorizon(vertex_t * ul, vertex_t * ur, vertex_t * ll, vertex_t * lr);
bool DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2); bool DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2);

View file

@ -96,30 +96,24 @@ void GLWall::CheckGlowing()
// //
// //
//========================================================================== //==========================================================================
void GLWall::PutWall(bool translucent) void GLWall::PutWall(sector_t *sec, bool translucent)
{ {
GLPortal * portal;
int list; int list;
static char passflag[]={ static char passflag[] = {
0, //RENDERWALL_NONE, 0, //RENDERWALL_NONE,
1, //RENDERWALL_TOP, // unmasked 1, //RENDERWALL_TOP, // unmasked
1, //RENDERWALL_M1S, // unmasked 1, //RENDERWALL_M1S, // unmasked
2, //RENDERWALL_M2S, // depends on render and texture settings 2, //RENDERWALL_M2S, // depends on render and texture settings
1, //RENDERWALL_BOTTOM, // unmasked 1, //RENDERWALL_BOTTOM, // unmasked
4, //RENDERWALL_SKYDOME, // special
3, //RENDERWALL_FOGBOUNDARY, // translucent 3, //RENDERWALL_FOGBOUNDARY, // translucent
4, //RENDERWALL_HORIZON, // special 1, //RENDERWALL_MIRRORSURFACE, // only created from PORTALTYPE_MIRROR
4, //RENDERWALL_SKYBOX, // special
4, //RENDERWALL_SECTORSTACK, // special
4, //RENDERWALL_PLANEMIRROR, // special
4, //RENDERWALL_MIRROR, // special
1, //RENDERWALL_MIRRORSURFACE, // only created here from RENDERWALL_MIRROR
2, //RENDERWALL_M2SNF, // depends on render and texture settings, no fog, used on mid texture lines with a fog boundary. 2, //RENDERWALL_M2SNF, // depends on render and texture settings, no fog, used on mid texture lines with a fog boundary.
3, //RENDERWALL_COLOR, // translucent 3, //RENDERWALL_COLOR, // translucent
2, //RENDERWALL_FFBLOCK // depends on render and texture settings 2, //RENDERWALL_FFBLOCK // depends on render and texture settings
}; };
if (gltexture && gltexture->GetTransparent() && passflag[type] == 2) if (gltexture && gltexture->GetTransparent() && passflag[type] == 2)
{ {
translucent = true; translucent = true;
@ -128,25 +122,28 @@ void GLWall::PutWall(bool translucent)
if (gl_fixedcolormap) if (gl_fixedcolormap)
{ {
// light planes don't get drawn with fullbright rendering // light planes don't get drawn with fullbright rendering
if (!gltexture && passflag[type]!=4) return; if (gltexture == NULL) return;
Colormap.Clear(); Colormap.Clear();
} }
else if (sec->e->XFloor.lightlist.Size() > 0 && gltexture != NULL)
{
lightlist = &sec->e->XFloor.lightlist;
}
CheckGlowing(); CheckGlowing();
if (translucent) // translucent walls if (translucent) // translucent walls
{ {
viewdistance = P_AproxDistance( ((seg->linedef->v1->x+seg->linedef->v2->x)>>1) - viewx, viewdistance = P_AproxDistance(((seg->linedef->v1->x + seg->linedef->v2->x) >> 1) - viewx,
((seg->linedef->v1->y+seg->linedef->v2->y)>>1) - viewy); ((seg->linedef->v1->y + seg->linedef->v2->y) >> 1) - viewy);
gl_drawinfo->drawlists[GLDL_TRANSLUCENT].AddWall(this); gl_drawinfo->drawlists[GLDL_TRANSLUCENT].AddWall(this);
} }
else if (passflag[type]!=4) // non-translucent walls else
{ {
bool masked; bool masked;
masked = passflag[type]==1? false : (gltexture && gltexture->isMasked()); masked = passflag[type] == 1 ? false : (gltexture && gltexture->isMasked());
if ((flags&GLWF_SKYHACK && type == RENDERWALL_M2S)) if ((flags&GLWF_SKYHACK && type == RENDERWALL_M2S))
{ {
@ -159,18 +156,25 @@ void GLWall::PutWall(bool translucent)
gl_drawinfo->drawlists[list].AddWall(this); gl_drawinfo->drawlists[list].AddWall(this);
} }
else switch (type) lightlist = NULL;
}
void GLWall::PutPortal(int ptype)
{
GLPortal * portal;
switch (ptype)
{ {
// portals don't go into the draw list. // portals don't go into the draw list.
// Instead they are added to the portal manager // Instead they are added to the portal manager
case RENDERWALL_HORIZON: case PORTALTYPE_HORIZON:
horizon=UniqueHorizons.Get(horizon); horizon=UniqueHorizons.Get(horizon);
portal=GLPortal::FindPortal(horizon); portal=GLPortal::FindPortal(horizon);
if (!portal) portal=new GLHorizonPortal(horizon); if (!portal) portal=new GLHorizonPortal(horizon);
portal->AddLine(this); portal->AddLine(this);
break; break;
case RENDERWALL_SKYBOX: case PORTALTYPE_SKYBOX:
portal = GLPortal::FindPortal(skybox); portal = GLPortal::FindPortal(skybox);
if (!portal) if (!portal)
{ {
@ -181,12 +185,12 @@ void GLWall::PutWall(bool translucent)
portal->AddLine(this); portal->AddLine(this);
break; break;
case RENDERWALL_SECTORSTACK: case PORTALTYPE_SECTORSTACK:
portal = this->portal->GetGLPortal(); portal = this->portal->GetGLPortal();
portal->AddLine(this); portal->AddLine(this);
break; break;
case RENDERWALL_PLANEMIRROR: case PORTALTYPE_PLANEMIRROR:
if (GLPortal::PlaneMirrorMode * planemirror->c <=0) if (GLPortal::PlaneMirrorMode * planemirror->c <=0)
{ {
//@sync-portal //@sync-portal
@ -197,7 +201,7 @@ void GLWall::PutWall(bool translucent)
} }
break; break;
case RENDERWALL_MIRROR: case PORTALTYPE_MIRROR:
portal=GLPortal::FindPortal(seg->linedef); portal=GLPortal::FindPortal(seg->linedef);
if (!portal) portal=new GLMirrorPortal(seg->linedef); if (!portal) portal=new GLMirrorPortal(seg->linedef);
portal->AddLine(this); portal->AddLine(this);
@ -209,7 +213,7 @@ void GLWall::PutWall(bool translucent)
} }
break; break;
case RENDERWALL_SKY: case PORTALTYPE_SKY:
portal=GLPortal::FindPortal(sky); portal=GLPortal::FindPortal(sky);
if (!portal) portal=new GLSkyPortal(sky); if (!portal) portal=new GLSkyPortal(sky);
portal->AddLine(this); portal->AddLine(this);
@ -217,26 +221,6 @@ void GLWall::PutWall(bool translucent)
} }
} }
//==========================================================================
//
// Splits a wall vertically if a 3D-floor
// creates different lighting across the wall
//
//==========================================================================
void GLWall::SplitWall(sector_t * frontsector, bool translucent)
{
if (glseg.x1==glseg.x2 && glseg.y1==glseg.y2)
{
return;
}
lightlist=&frontsector->e->XFloor.lightlist;
PutWall(translucent);
lightlist = NULL;
}
//========================================================================== //==========================================================================
// //
// //
@ -262,7 +246,6 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
} }
else else
{ {
type = RENDERWALL_HORIZON;
hi.plane.GetFromSector(fs, true); hi.plane.GetFromSector(fs, true);
hi.lightlevel = gl_ClampLight(fs->GetCeilingLight()); hi.lightlevel = gl_ClampLight(fs->GetCeilingLight());
hi.colormap = fs->ColorMap; hi.colormap = fs->ColorMap;
@ -277,7 +260,7 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
if (gl_fixedcolormap) hi.colormap.Clear(); if (gl_fixedcolormap) hi.colormap.Clear();
horizon = &hi; horizon = &hi;
PutWall(0); PutPortal(PORTALTYPE_HORIZON);
} }
ztop[1] = ztop[0] = zbottom[0]; ztop[1] = ztop[0] = zbottom[0];
} }
@ -291,7 +274,6 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
} }
else else
{ {
type = RENDERWALL_HORIZON;
hi.plane.GetFromSector(fs, false); hi.plane.GetFromSector(fs, false);
hi.lightlevel = gl_ClampLight(fs->GetFloorLight()); hi.lightlevel = gl_ClampLight(fs->GetFloorLight());
hi.colormap = fs->ColorMap; hi.colormap = fs->ColorMap;
@ -306,7 +288,7 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
if (gl_fixedcolormap) hi.colormap.Clear(); if (gl_fixedcolormap) hi.colormap.Clear();
horizon = &hi; horizon = &hi;
PutWall(0); PutPortal(PORTALTYPE_HORIZON);
} }
} }
return true; return true;
@ -516,7 +498,7 @@ void GLWall::DoTexture(int _type,seg_t * seg, int peg,
gltexture->GetTexCoordInfo(&tci, seg->sidedef->GetTextureXScale(texpos), seg->sidedef->GetTextureYScale(texpos)); gltexture->GetTexCoordInfo(&tci, seg->sidedef->GetTextureXScale(texpos), seg->sidedef->GetTextureYScale(texpos));
type = (seg->linedef->special == Line_Mirror && _type == RENDERWALL_M1S && gl_mirrors) ? RENDERWALL_MIRROR : _type; type = _type;
float floatceilingref = FIXED2FLOAT(ceilingrefheight + tci.RowOffset(seg->sidedef->GetTextureYOffset(texpos))); float floatceilingref = FIXED2FLOAT(ceilingrefheight + tci.RowOffset(seg->sidedef->GetTextureYOffset(texpos)));
if (peg) floatceilingref += tci.mRenderHeight - FIXED2FLOAT(lh + v_offset); if (peg) floatceilingref += tci.mRenderHeight - FIXED2FLOAT(lh + v_offset);
@ -524,13 +506,16 @@ void GLWall::DoTexture(int _type,seg_t * seg, int peg,
if (!SetWallCoordinates(seg, &tci, floatceilingref, topleft, topright, bottomleft, bottomright, if (!SetWallCoordinates(seg, &tci, floatceilingref, topleft, topright, bottomleft, bottomright,
seg->sidedef->GetTextureXOffset(texpos))) return; seg->sidedef->GetTextureXOffset(texpos))) return;
if (seg->linedef->special == Line_Mirror && _type == RENDERWALL_M1S && gl_mirrors)
{
PutPortal(PORTALTYPE_MIRROR);
}
else
{
CheckTexturePosition(); CheckTexturePosition();
// Add this wall to the render list // Add this wall to the render list
sector_t * sec = sub? sub->sector : seg->frontsector; PutWall(sub ? sub->sector : seg->frontsector, false);
}
if (sec->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(false);
else SplitWall(sec, false);
glseg=glsave; glseg=glsave;
flags&=~GLT_CLAMPY; flags&=~GLT_CLAMPY;
@ -728,12 +713,15 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
{ {
flags |= GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER; flags |= GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER;
type=RENDERWALL_FOGBOUNDARY; type=RENDERWALL_FOGBOUNDARY;
PutWall(true); FMaterial *savetex = gltexture;
if (!gltexture) gltexture = NULL;
PutWall(seg->frontsector, true);
if (!savetex)
{ {
flags &= ~(GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER); flags &= ~(GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER);
return; return;
} }
gltexture = savetex;
type=RENDERWALL_M2SNF; type=RENDERWALL_M2SNF;
} }
else type=RENDERWALL_M2S; else type=RENDERWALL_M2S;
@ -818,8 +806,7 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
// Draw the stuff // Draw the stuff
// //
// //
if (realfront->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) split.PutWall(translucent); split.PutWall(realfront, translucent);
else split.SplitWall(realfront, translucent);
t=1; t=1;
} }
@ -827,13 +814,7 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
} }
else else
{ {
// PutWall(realfront, translucent);
//
// Draw the stuff without splitting
//
//
if (realfront->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(translucent);
else SplitWall(realfront, translucent);
} }
alpha=1.0f; alpha=1.0f;
} }
@ -942,10 +923,7 @@ void GLWall::BuildFFBlock(seg_t * seg, F3DFloor * rover,
translucent=false; translucent=false;
} }
sector_t * sec = sub? sub->sector : seg->frontsector; PutWall(sub? sub->sector : seg->frontsector, translucent);
if (sec->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(translucent);
else SplitWall(sec, translucent);
alpha=1.0f; alpha=1.0f;
lightlevel = savelight; lightlevel = savelight;
@ -1573,7 +1551,7 @@ void GLWall::ProcessLowerMiniseg(seg_t *seg, sector_t * frontsector, sector_t *
type = RENDERWALL_BOTTOM; type = RENDERWALL_BOTTOM;
gltexture->GetTexCoordInfo(&tci, FRACUNIT, FRACUNIT); gltexture->GetTexCoordInfo(&tci, FRACUNIT, FRACUNIT);
SetWallCoordinates(seg, &tci, FIXED2FLOAT(bfh), bfh, bfh, ffh, ffh, 0); SetWallCoordinates(seg, &tci, FIXED2FLOAT(bfh), bfh, bfh, ffh, ffh, 0);
PutWall(false); PutWall(seg->frontsector, false);
} }
} }
} }