- 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)
{
int ptype = -1;
FPortal *portal = sector->portals[plane];
if (portal != NULL)
{
if (GLPortal::instack[1 - plane]) return;
type = RENDERWALL_SECTORSTACK;
ptype = PORTALTYPE_SECTORSTACK;
this->portal = portal;
}
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))
{
type = RENDERWALL_SKYBOX;
ptype = PORTALTYPE_SKYBOX;
skybox = skyboxx;
}
else
{
skyinfo.init(sector->sky, Colormap.FadeColor);
type = RENDERWALL_SKY;
ptype = PORTALTYPE_SKY;
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) ||
(plane == sector_t::floor && viewz < -sector->floorplane.d)) return;
type = RENDERWALL_PLANEMIRROR;
ptype = PORTALTYPE_PLANEMIRROR;
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;
GLSkyInfo skyinfo;
int ptype;
// JUSTHIT is used as an indicator that a skybox is in use.
// This is to avoid recursion
if (!gl_noskyboxes && skyboxx && GLRenderer->mViewActor != skyboxx && !(skyboxx->flags&MF_JUSTHIT))
{
type = RENDERWALL_SKYBOX;
ptype = PORTALTYPE_SKYBOX;
skybox = skyboxx;
}
else
{
skyinfo.init(line->frontsector->sky, Colormap.FadeColor);
type = RENDERWALL_SKY;
ptype = PORTALTYPE_SKY;
sky = UniqueSkies.Get(&skyinfo);
}
PutWall(0);
PutPortal(ptype);
}

View file

@ -30,13 +30,7 @@ enum WallTypes
RENDERWALL_M1S,
RENDERWALL_M2S,
RENDERWALL_BOTTOM,
RENDERWALL_SKY,
RENDERWALL_FOGBOUNDARY,
RENDERWALL_HORIZON,
RENDERWALL_SKYBOX,
RENDERWALL_SECTORSTACK,
RENDERWALL_PLANEMIRROR,
RENDERWALL_MIRROR,
RENDERWALL_MIRRORSURFACE,
RENDERWALL_M2SNF,
RENDERWALL_COLOR,
@ -44,6 +38,16 @@ enum WallTypes
// Insert new types at the end!
};
enum PortalTypes
{
PORTALTYPE_SKY,
PORTALTYPE_HORIZON,
PORTALTYPE_SKYBOX,
PORTALTYPE_SECTORSTACK,
PORTALTYPE_PLANEMIRROR,
PORTALTYPE_MIRROR,
};
struct GLSeg
{
float x1,x2;
@ -159,7 +163,8 @@ public:
private:
void CheckGlowing();
void PutWall(bool translucent);
void PutWall(sector_t *sec, bool translucent);
void PutPortal(int ptype);
void CheckTexturePosition();
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 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 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);

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;
static char passflag[]={
static char passflag[] = {
0, //RENDERWALL_NONE,
1, //RENDERWALL_TOP, // unmasked
1, //RENDERWALL_M1S, // unmasked
2, //RENDERWALL_M2S, // depends on render and texture settings
1, //RENDERWALL_BOTTOM, // unmasked
4, //RENDERWALL_SKYDOME, // special
3, //RENDERWALL_FOGBOUNDARY, // translucent
4, //RENDERWALL_HORIZON, // special
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
1, //RENDERWALL_MIRRORSURFACE, // only created from PORTALTYPE_MIRROR
2, //RENDERWALL_M2SNF, // depends on render and texture settings, no fog, used on mid texture lines with a fog boundary.
3, //RENDERWALL_COLOR, // translucent
2, //RENDERWALL_FFBLOCK // depends on render and texture settings
};
if (gltexture && gltexture->GetTransparent() && passflag[type] == 2)
{
translucent = true;
@ -128,25 +122,28 @@ void GLWall::PutWall(bool translucent)
if (gl_fixedcolormap)
{
// light planes don't get drawn with fullbright rendering
if (!gltexture && passflag[type]!=4) return;
if (gltexture == NULL) return;
Colormap.Clear();
}
else if (sec->e->XFloor.lightlist.Size() > 0 && gltexture != NULL)
{
lightlist = &sec->e->XFloor.lightlist;
}
CheckGlowing();
if (translucent) // translucent walls
{
viewdistance = P_AproxDistance( ((seg->linedef->v1->x+seg->linedef->v2->x)>>1) - viewx,
((seg->linedef->v1->y+seg->linedef->v2->y)>>1) - viewy);
viewdistance = P_AproxDistance(((seg->linedef->v1->x + seg->linedef->v2->x) >> 1) - viewx,
((seg->linedef->v1->y + seg->linedef->v2->y) >> 1) - viewy);
gl_drawinfo->drawlists[GLDL_TRANSLUCENT].AddWall(this);
}
else if (passflag[type]!=4) // non-translucent walls
else
{
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))
{
@ -159,18 +156,25 @@ void GLWall::PutWall(bool translucent)
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.
// Instead they are added to the portal manager
case RENDERWALL_HORIZON:
case PORTALTYPE_HORIZON:
horizon=UniqueHorizons.Get(horizon);
portal=GLPortal::FindPortal(horizon);
if (!portal) portal=new GLHorizonPortal(horizon);
portal->AddLine(this);
break;
case RENDERWALL_SKYBOX:
case PORTALTYPE_SKYBOX:
portal = GLPortal::FindPortal(skybox);
if (!portal)
{
@ -181,12 +185,12 @@ void GLWall::PutWall(bool translucent)
portal->AddLine(this);
break;
case RENDERWALL_SECTORSTACK:
case PORTALTYPE_SECTORSTACK:
portal = this->portal->GetGLPortal();
portal->AddLine(this);
break;
case RENDERWALL_PLANEMIRROR:
case PORTALTYPE_PLANEMIRROR:
if (GLPortal::PlaneMirrorMode * planemirror->c <=0)
{
//@sync-portal
@ -197,7 +201,7 @@ void GLWall::PutWall(bool translucent)
}
break;
case RENDERWALL_MIRROR:
case PORTALTYPE_MIRROR:
portal=GLPortal::FindPortal(seg->linedef);
if (!portal) portal=new GLMirrorPortal(seg->linedef);
portal->AddLine(this);
@ -209,7 +213,7 @@ void GLWall::PutWall(bool translucent)
}
break;
case RENDERWALL_SKY:
case PORTALTYPE_SKY:
portal=GLPortal::FindPortal(sky);
if (!portal) portal=new GLSkyPortal(sky);
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
{
type = RENDERWALL_HORIZON;
hi.plane.GetFromSector(fs, true);
hi.lightlevel = gl_ClampLight(fs->GetCeilingLight());
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();
horizon = &hi;
PutWall(0);
PutPortal(PORTALTYPE_HORIZON);
}
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
{
type = RENDERWALL_HORIZON;
hi.plane.GetFromSector(fs, false);
hi.lightlevel = gl_ClampLight(fs->GetFloorLight());
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();
horizon = &hi;
PutWall(0);
PutPortal(PORTALTYPE_HORIZON);
}
}
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));
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)));
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,
seg->sidedef->GetTextureXOffset(texpos))) return;
if (seg->linedef->special == Line_Mirror && _type == RENDERWALL_M1S && gl_mirrors)
{
PutPortal(PORTALTYPE_MIRROR);
}
else
{
CheckTexturePosition();
// Add this wall to the render list
sector_t * sec = sub? sub->sector : seg->frontsector;
if (sec->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(false);
else SplitWall(sec, false);
PutWall(sub ? sub->sector : seg->frontsector, false);
}
glseg=glsave;
flags&=~GLT_CLAMPY;
@ -728,12 +713,15 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
{
flags |= GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER;
type=RENDERWALL_FOGBOUNDARY;
PutWall(true);
if (!gltexture)
FMaterial *savetex = gltexture;
gltexture = NULL;
PutWall(seg->frontsector, true);
if (!savetex)
{
flags &= ~(GLWF_NOSPLITUPPER|GLWF_NOSPLITLOWER);
return;
}
gltexture = savetex;
type=RENDERWALL_M2SNF;
}
else type=RENDERWALL_M2S;
@ -818,8 +806,7 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
// Draw the stuff
//
//
if (realfront->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) split.PutWall(translucent);
else split.SplitWall(realfront, translucent);
split.PutWall(realfront, translucent);
t=1;
}
@ -827,13 +814,7 @@ void GLWall::DoMidTexture(seg_t * seg, bool drawfogboundary,
}
else
{
//
//
// Draw the stuff without splitting
//
//
if (realfront->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(translucent);
else SplitWall(realfront, translucent);
PutWall(realfront, translucent);
}
alpha=1.0f;
}
@ -942,10 +923,7 @@ void GLWall::BuildFFBlock(seg_t * seg, F3DFloor * rover,
translucent=false;
}
sector_t * sec = sub? sub->sector : seg->frontsector;
if (sec->e->XFloor.lightlist.Size()==0 || gl_fixedcolormap || !gltexture) PutWall(translucent);
else SplitWall(sec, translucent);
PutWall(sub? sub->sector : seg->frontsector, translucent);
alpha=1.0f;
lightlevel = savelight;
@ -1573,7 +1551,7 @@ void GLWall::ProcessLowerMiniseg(seg_t *seg, sector_t * frontsector, sector_t *
type = RENDERWALL_BOTTOM;
gltexture->GetTexCoordInfo(&tci, FRACUNIT, FRACUNIT);
SetWallCoordinates(seg, &tci, FIXED2FLOAT(bfh), bfh, bfh, ffh, ffh, 0);
PutWall(false);
PutWall(seg->frontsector, false);
}
}
}