From 9bdb0f2e49b0e47622326232ba697f0a8d688fc0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 1 May 2018 11:29:29 +0200 Subject: [PATCH] - renamed the flag bits for sector_t::MoreFlags, so that they are easier to distinguish from sector_t::Flags. - precalculate if a sector's floor and ceiling plane overlap. This avoids rechecking this for each single call of hw_FakeFlat. - vertices must be marked dirty every time they change after map setup. That means that ChangePlaneTexZ must do this as well, because it cannot rely on interpolation taking care of it. - Having a 'dirty' argument for SetPlaneTexZ's ZScript version makes no sense. If the value changes from the script side the vertices must always be marked to be recalculated. --- src/am_map.cpp | 32 +++++++------- src/gl/scene/gl_bsp.cpp | 12 ++--- src/gl/scene/gl_scene.cpp | 2 +- src/hwrenderer/scene/hw_fakeflat.cpp | 53 +++++++++++------------ src/p_glnodes.cpp | 2 +- src/p_map.cpp | 4 +- src/p_mobj.cpp | 16 +++---- src/p_saveg.cpp | 6 +-- src/p_sectors.cpp | 22 +++++++++- src/p_setup.cpp | 2 +- src/p_spec.cpp | 22 +++++----- src/p_udmf.cpp | 4 +- src/polyrenderer/scene/poly_scene.cpp | 20 ++++----- src/r_defs.h | 32 +++++++++----- src/swrenderer/line/r_line.cpp | 8 ++-- src/swrenderer/scene/r_opaque_pass.cpp | 16 +++---- src/swrenderer/things/r_sprite.cpp | 2 +- src/swrenderer/things/r_visiblesprite.cpp | 2 +- src/swrenderer/things/r_voxel.cpp | 2 +- 19 files changed, 143 insertions(+), 116 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index e112621251..5b717e2851 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -1935,10 +1935,10 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) else { in_area = pos.Z <= viewer->Sector->heightsec->floorplane.ZatPoint(pos) ? -1 : - (pos.Z > viewer->Sector->heightsec->ceilingplane.ZatPoint(pos) && !(viewer->Sector->heightsec->MoreFlags&SECF_FAKEFLOORONLY)) ? 1 : 0; + (pos.Z > viewer->Sector->heightsec->ceilingplane.ZatPoint(pos) && !(viewer->Sector->heightsec->MoreFlags&SECMF_FAKEFLOORONLY)) ? 1 : 0; } - int diffTex = (sec->heightsec->MoreFlags & SECF_CLIPFAKEPLANES); + int diffTex = (sec->heightsec->MoreFlags & SECMF_CLIPFAKEPLANES); sector_t * s = sec->heightsec; memcpy(dest, sec, sizeof(sector_t)); @@ -1950,14 +1950,14 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) if (s->floorplane.CopyPlaneIfValid(&dest->floorplane, &sec->ceilingplane)) { dest->SetTexture(sector_t::floor, s->GetTexture(sector_t::floor), false); - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); } - else if (s->MoreFlags & SECF_FAKEFLOORONLY) + else if (s->MoreFlags & SECMF_FAKEFLOORONLY) { if (in_area == -1) { dest->Colormap = s->Colormap; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); @@ -1970,16 +1970,16 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) } else { - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); dest->floorplane = s->floorplane; } if (in_area == -1) { dest->Colormap = s->Colormap; - dest->SetPlaneTexZ(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor)); dest->floorplane = sec->floorplane; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; } @@ -1987,7 +1987,7 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) dest->SetTexture(sector_t::floor, diffTex ? sec->GetTexture(sector_t::floor) : s->GetTexture(sector_t::floor), false); dest->planes[sector_t::floor].xform = s->planes[sector_t::floor].xform; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); dest->ChangeFlags(sector_t::floor, -1, s->GetFlags(sector_t::floor)); @@ -1996,9 +1996,9 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) else if (in_area == 1) { dest->Colormap = s->Colormap; - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling)); dest->floorplane = s->ceilingplane; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; } @@ -2011,7 +2011,7 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) dest->planes[sector_t::floor].xform = s->planes[sector_t::floor].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); @@ -2048,7 +2048,7 @@ void AM_drawSubsectors() continue; } - if ((!(subsectors[i].flags & SSECF_DRAWN) || (subsectors[i].render_sector->MoreFlags & SECF_HIDDEN)) && am_cheat == 0) + if ((!(subsectors[i].flags & SSECMF_DRAWN) || (subsectors[i].render_sector->MoreFlags & SECMF_HIDDEN)) && am_cheat == 0) { continue; } @@ -2169,7 +2169,7 @@ void AM_drawSubsectors() // If this subsector has not actually been seen yet (because you are cheating // to see it on the map), tint and desaturate it. - if (!(subsectors[i].flags & SSECF_DRAWN)) + if (!(subsectors[i].flags & SSECMF_DRAWN)) { colormap.LightColor = PalEntry( (colormap.LightColor.r + 255) / 2, @@ -3163,8 +3163,8 @@ void AM_drawAuthorMarkers () // Use more correct info if we have GL nodes available if (mark->args[1] == 0 || (mark->args[1] == 1 && (hasglnodes ? - marked->subsector->flags & SSECF_DRAWN : - marked->Sector->MoreFlags & SECF_DRAWN))) + marked->subsector->flags & SSECMF_DRAWN : + marked->Sector->MoreFlags & SECMF_DRAWN))) { DrawMarker (tex, marked->X(), marked->Y(), 0, flip, mark->Scale.X, mark->Scale.Y, mark->Translation, mark->Alpha, mark->fillcolor, mark->RenderStyle); diff --git a/src/gl/scene/gl_bsp.cpp b/src/gl/scene/gl_bsp.cpp index 169b7513ca..2449fce9ec 100644 --- a/src/gl/scene/gl_bsp.cpp +++ b/src/gl/scene/gl_bsp.cpp @@ -99,11 +99,11 @@ void GLSceneDrawer::AddLine (seg_t *seg, bool portalclip) if (seg->sidedef == NULL) { - if (!(currentsubsector->flags & SSECF_DRAWN)) + if (!(currentsubsector->flags & SSECMF_DRAWN)) { if (clipper.SafeCheckRange(startAngle, endAngle)) { - currentsubsector->flags |= SSECF_DRAWN; + currentsubsector->flags |= SSECMF_DRAWN; } } return; @@ -113,7 +113,7 @@ void GLSceneDrawer::AddLine (seg_t *seg, bool portalclip) { return; } - currentsubsector->flags |= SSECF_DRAWN; + currentsubsector->flags |= SSECMF_DRAWN; uint8_t ispoly = uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ); @@ -137,7 +137,7 @@ void GLSceneDrawer::AddLine (seg_t *seg, bool portalclip) } backsector=currentsector; } - else + else { // clipping checks are only needed when the backsector is not the same as the front sector if (in_area == area_default) in_area = hw_CheckViewArea(seg->v1, seg->v2, seg->frontsector, seg->backsector); @@ -289,7 +289,7 @@ void GLSceneDrawer::AddLines(subsector_t * sub, sector_t * sector) { if (seg->linedef == NULL) { - if (!(sub->flags & SSECF_DRAWN)) AddLine (seg, GLRenderer->mClipPortal != NULL); + if (!(sub->flags & SSECMF_DRAWN)) AddLine (seg, GLRenderer->mClipPortal != NULL); } else if (!(seg->sidedef->Flags & WALLF_POLYOBJ)) { @@ -485,7 +485,7 @@ void GLSceneDrawer::DoSubsector(subsector_t * sub) { RenderThings(sub, fakesector); } - sector->MoreFlags |= SECF_DRAWN; + sector->MoreFlags |= SECMF_DRAWN; } if (gl_render_flats) diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index 99cb6e112c..14c5d432fb 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -107,7 +107,7 @@ void GLSceneDrawer::SetViewArea() { in_area = r_viewpoint.Pos.Z <= r_viewpoint.sector->heightsec->floorplane.ZatPoint(r_viewpoint.Pos) ? area_below : (r_viewpoint.Pos.Z > r_viewpoint.sector->heightsec->ceilingplane.ZatPoint(r_viewpoint.Pos) && - !(r_viewpoint.sector->heightsec->MoreFlags&SECF_FAKEFLOORONLY)) ? area_above : area_normal; + !(r_viewpoint.sector->heightsec->MoreFlags&SECMF_FAKEFLOORONLY)) ? area_above : area_normal; } else { diff --git a/src/hwrenderer/scene/hw_fakeflat.cpp b/src/hwrenderer/scene/hw_fakeflat.cpp index 3b0c350429..0e22e276ff 100644 --- a/src/hwrenderer/scene/hw_fakeflat.cpp +++ b/src/hwrenderer/scene/hw_fakeflat.cpp @@ -191,18 +191,15 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac { // check for backsectors with the ceiling lower than the floor. These will create // visual glitches because upper amd lower textures overlap. - if (back && sec->planes[sector_t::floor].TexZ > sec->planes[sector_t::ceiling].TexZ) + if (back && (sec->MoreFlags & SECMF_OVERLAPPING)) { - if (!sec->floorplane.isSlope() && !sec->ceilingplane.isSlope()) - { - *dest = *sec; - dest->ceilingplane=sec->floorplane; - dest->ceilingplane.FlipVert(); - dest->planes[sector_t::ceiling].TexZ = dest->planes[sector_t::floor].TexZ; - dest->ClearPortal(sector_t::ceiling); - dest->ClearPortal(sector_t::floor); - return dest; - } + *dest = *sec; + dest->ceilingplane = sec->floorplane; + dest->ceilingplane.FlipVert(); + dest->planes[sector_t::ceiling].TexZ = dest->planes[sector_t::floor].TexZ; + dest->ClearPortal(sector_t::ceiling); + dest->ClearPortal(sector_t::floor); + return dest; } return sec; } @@ -216,10 +213,10 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac if (in_area==area_above) { - if (sec->heightsec->MoreFlags&SECF_FAKEFLOORONLY /*|| sec->GetTexture(sector_t::ceiling)==skyflatnum*/) in_area=area_normal; + if (sec->heightsec->MoreFlags&SECMF_FAKEFLOORONLY /*|| sec->GetTexture(sector_t::ceiling)==skyflatnum*/) in_area=area_normal; } - int diffTex = (sec->heightsec->MoreFlags & SECF_CLIPFAKEPLANES); + int diffTex = (sec->heightsec->MoreFlags & SECMF_CLIPFAKEPLANES); sector_t * s = sec->heightsec; #if 0 @@ -234,16 +231,16 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac if (s->floorplane.CopyPlaneIfValid (&dest->floorplane, &sec->ceilingplane)) { dest->SetTexture(sector_t::floor, s->GetTexture(sector_t::floor), false); - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); dest->vboindex[sector_t::floor] = sec->vboindex[sector_t::vbo_fakefloor]; dest->vboheight[sector_t::floor] = s->vboheight[sector_t::floor]; } - else if (s->MoreFlags & SECF_FAKEFLOORONLY) + else if (s->MoreFlags & SECMF_FAKEFLOORONLY) { if (in_area==area_below) { dest->CopyColors(s); - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); @@ -258,21 +255,21 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac } else { - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::floor)); dest->floorplane = s->floorplane; dest->vboindex[sector_t::floor] = sec->vboindex[sector_t::vbo_fakefloor]; dest->vboheight[sector_t::floor] = s->vboheight[sector_t::floor]; } - if (!(s->MoreFlags&SECF_FAKEFLOORONLY)) + if (!(s->MoreFlags&SECMF_FAKEFLOORONLY)) { if (diffTex) { if (s->ceilingplane.CopyPlaneIfValid (&dest->ceilingplane, &sec->floorplane)) { dest->SetTexture(sector_t::ceiling, s->GetTexture(sector_t::ceiling), false); - dest->SetPlaneTexZ(sector_t::ceiling, s->GetPlaneTexZ(sector_t::ceiling)); + dest->SetPlaneTexZQuick(sector_t::ceiling, s->GetPlaneTexZ(sector_t::ceiling)); dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::vbo_fakeceiling]; dest->vboheight[sector_t::ceiling] = s->vboheight[sector_t::ceiling]; } @@ -280,7 +277,7 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac else { dest->ceilingplane = s->ceilingplane; - dest->SetPlaneTexZ(sector_t::ceiling, s->GetPlaneTexZ(sector_t::ceiling)); + dest->SetPlaneTexZQuick(sector_t::ceiling, s->GetPlaneTexZ(sector_t::ceiling)); dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::vbo_fakeceiling]; dest->vboheight[sector_t::ceiling] = s->vboheight[sector_t::ceiling]; } @@ -289,8 +286,8 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac if (in_area==area_below) { dest->CopyColors(s); - dest->SetPlaneTexZ(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor)); - dest->SetPlaneTexZ(sector_t::ceiling, s->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::floor, sec->GetPlaneTexZ(sector_t::floor)); + dest->SetPlaneTexZQuick(sector_t::ceiling, s->GetPlaneTexZ(sector_t::floor)); dest->floorplane=sec->floorplane; dest->ceilingplane=s->floorplane; dest->ceilingplane.FlipVert(); @@ -303,7 +300,7 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->ClearPortal(sector_t::ceiling); - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; } @@ -330,7 +327,7 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->planes[sector_t::ceiling].xform = s->planes[sector_t::ceiling].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); dest->SetPlaneLight(sector_t::ceiling, s->GetPlaneLight(sector_t::ceiling)); @@ -342,8 +339,8 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac else if (in_area == area_above) { dest->CopyColors(s); - dest->SetPlaneTexZ(sector_t::ceiling, sec->GetPlaneTexZ(sector_t::ceiling)); - dest->SetPlaneTexZ(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling)); + dest->SetPlaneTexZQuick(sector_t::ceiling, sec->GetPlaneTexZ(sector_t::ceiling)); + dest->SetPlaneTexZQuick(sector_t::floor, s->GetPlaneTexZ(sector_t::ceiling)); dest->ceilingplane = sec->ceilingplane; dest->floorplane = s->ceilingplane; dest->floorplane.FlipVert(); @@ -356,7 +353,7 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->ClearPortal(sector_t::floor); - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; } @@ -373,7 +370,7 @@ sector_t * hw_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->planes[sector_t::floor].xform = s->planes[sector_t::floor].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { dest->lightlevel = s->lightlevel; dest->SetPlaneLight(sector_t::floor, s->GetPlaneLight(sector_t::floor)); diff --git a/src/p_glnodes.cpp b/src/p_glnodes.cpp index 576affe246..0113208a10 100644 --- a/src/p_glnodes.cpp +++ b/src/p_glnodes.cpp @@ -1329,7 +1329,7 @@ void P_SetRenderSector() } for(i = 0; i < numsectors; i++) { - if (hidesec[i]) sectors[i].MoreFlags |= SECF_HIDDEN; + if (hidesec[i]) sectors[i].MoreFlags |= SECMF_HIDDEN; } delete [] hidesec; #endif diff --git a/src/p_map.cpp b/src/p_map.cpp index f01e55dcde..7a503a62bb 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2682,7 +2682,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, newsec->TriggerSectorActions(thing, SECSPAC_EyesDive); } - if (!(hs->MoreFlags & SECF_FAKEFLOORONLY)) + if (!(hs->MoreFlags & SECMF_FAKEFLOORONLY)) { fakez = hs->ceilingplane.ZatPoint(pos); if (!oldAboveFakeCeiling && eyez > fakez) @@ -6872,7 +6872,7 @@ bool P_ChangeSector(sector_t *sector, int crunch, double amt, int floorOrCeil, b if (floorOrCeil != 2) sector->CheckPortalPlane(floorOrCeil); // check for portal obstructions after everything is done. - if (!cpos.nofit && !isreset /* && sector->MoreFlags & (SECF_UNDERWATERMASK)*/) + if (!cpos.nofit && !isreset /* && sector->MoreFlags & (SECMF_UNDERWATERMASK)*/) { // If this is a control sector for a deep water transfer, all actors in affected // sectors need to have their waterlevel information updated and if applicable, diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 25d846e017..a00cb7f10b 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3261,7 +3261,7 @@ void P_CheckFakeFloorTriggers (AActor *mo, double oldz, bool oldz_has_viewheight sec->TriggerSectorActions (mo, SECSPAC_EyesDive); } - if (!(hs->MoreFlags & SECF_FAKEFLOORONLY)) + if (!(hs->MoreFlags & SECMF_FAKEFLOORONLY)) { waterz = hs->ceilingplane.ZatPoint(mo); if (oldz <= waterz && newz > waterz) @@ -4731,7 +4731,7 @@ void AActor::SplashCheck() return; } - if (Sector->MoreFlags & SECF_UNDERWATER) // intentionally not SECF_UNDERWATERMASK + if (Sector->MoreFlags & SECMF_UNDERWATER) // intentionally not SECMF_UNDERWATERMASK { waterlevel = 3; } @@ -4741,7 +4741,7 @@ void AActor::SplashCheck() if (hsec != NULL) { fh = hsec->floorplane.ZatPoint(this); - //if (hsec->MoreFlags & SECF_UNDERWATERMASK) // also check Boom-style non-swimmable sectors + //if (hsec->MoreFlags & SECMF_UNDERWATERMASK) // also check Boom-style non-swimmable sectors { if (Z() < fh) { @@ -4756,7 +4756,7 @@ void AActor::SplashCheck() } } } - else if (!(hsec->MoreFlags & SECF_FAKEFLOORONLY) && (Top() > hsec->ceilingplane.ZatPoint(this))) + else if (!(hsec->MoreFlags & SECMF_FAKEFLOORONLY) && (Top() > hsec->ceilingplane.ZatPoint(this))) { waterlevel = 3; } @@ -4833,7 +4833,7 @@ bool AActor::UpdateWaterLevel(bool dosplash) return false; } - if (Sector->MoreFlags & SECF_UNDERWATER) // intentionally not SECF_UNDERWATERMASK + if (Sector->MoreFlags & SECMF_UNDERWATER) // intentionally not SECMF_UNDERWATERMASK { waterlevel = 3; } @@ -4843,7 +4843,7 @@ bool AActor::UpdateWaterLevel(bool dosplash) if (hsec != NULL) { fh = hsec->floorplane.ZatPoint(this); - if (hsec->MoreFlags & SECF_UNDERWATERMASK) // also check Boom-style non-swimmable sectors + if (hsec->MoreFlags & SECMF_UNDERWATERMASK) // also check Boom-style non-swimmable sectors { if (Z() < fh) { @@ -4858,7 +4858,7 @@ bool AActor::UpdateWaterLevel(bool dosplash) } } } - else if (!(hsec->MoreFlags & SECF_FAKEFLOORONLY) && (Top() > hsec->ceilingplane.ZatPoint(this))) + else if (!(hsec->MoreFlags & SECMF_FAKEFLOORONLY) && (Top() > hsec->ceilingplane.ZatPoint(this))) { waterlevel = 3; } @@ -6562,7 +6562,7 @@ bool P_HitWater (AActor * thing, sector_t * sec, const DVector3 &pos, bool check } } hsec = sec->GetHeightSec(); - if (force || hsec == NULL || !(hsec->MoreFlags & SECF_CLIPFAKEPLANES)) + if (force || hsec == NULL || !(hsec->MoreFlags & SECMF_CLIPFAKEPLANES)) { terrainnum = sec->GetTerrain(sector_t::floor); } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index acf0ac5f25..3eb98b8083 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -327,7 +327,7 @@ void RecalculateDrawnSubsectors() if (sub.firstline[j].linedef != NULL && (sub.firstline[j].linedef->flags & ML_MAPPED)) { - sub.flags |= SSECF_DRAWN; + sub.flags |= SSECMF_DRAWN; } } } @@ -356,7 +356,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) by = 0; for (unsigned j = 0; j < 6; j++) { - if (i + j < numsubsectors && (level.subsectors[i + j].flags & SSECF_DRAWN)) + if (i + j < numsubsectors && (level.subsectors[i + j].flags & SSECMF_DRAWN)) { by |= (1 << j); } @@ -412,7 +412,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) { if (sub + s < (int)numsubsectors && (by & (1 << s))) { - level.subsectors[sub + s].flags |= SSECF_DRAWN; + level.subsectors[sub + s].flags |= SSECMF_DRAWN; } } sub += 6; diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index b5f10b69ee..831062fc03 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -1653,6 +1653,26 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt) ACTION_RETURN_BOOL(self->TriggerSectorActions(thing, activation)); } + //=========================================================================== + // + // checks if the floor is higher than the ceiling and sets a flag + // This condition needs to be tested by the hardware renderer, + // so always having its state available in a flag allows for easier optimization. + // + //=========================================================================== + + void sector_t::CheckOverlap() + { + if (planes[sector_t::floor].TexZ > planes[sector_t::ceiling].TexZ && !floorplane.isSlope() && !ceilingplane.isSlope()) + { + MoreFlags |= SECMF_OVERLAPPING; + } + else + { + MoreFlags &= ~SECMF_OVERLAPPING; + } + } + //=========================================================================== // // @@ -1857,7 +1877,7 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt) PARAM_INT(pos); PARAM_FLOAT(o); PARAM_BOOL_DEF(dirty); - self->SetPlaneTexZ(pos, o, dirty); + self->SetPlaneTexZ(pos, o, true); // not setting 'dirty' here is a guaranteed cause for problems. return 0; } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 50733318ab..56850f6a01 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -4232,7 +4232,7 @@ void P_SetupLevel (const char *lumpname, int position) { if ((ff->flags & (FF_EXISTS | FF_RENDERPLANES)) == (FF_EXISTS | FF_RENDERPLANES)) { - s.MoreFlags |= SECF_IGNOREHEIGHTSEC; // mark the heightsec inactive. + s.MoreFlags |= SECMF_IGNOREHEIGHTSEC; // mark the heightsec inactive. } } } diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 3c140f5f78..5b32b410ad 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -698,15 +698,15 @@ CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO) for (auto &sec : level.sectors) { sector_t *hsec = sec.GetHeightSec(); - if (hsec && !(hsec->MoreFlags & SECF_UNDERWATER)) + if (hsec && !(hsec->MoreFlags & SECMF_UNDERWATER)) { if (self) { - hsec->MoreFlags |= SECF_FORCEDUNDERWATER; + hsec->MoreFlags |= SECMF_FORCEDUNDERWATER; } else { - hsec->MoreFlags &= ~SECF_FORCEDUNDERWATER; + hsec->MoreFlags &= ~SECMF_FORCEDUNDERWATER; } } } @@ -1248,7 +1248,7 @@ void P_InitSectorSpecial(sector_t *sector, int special) break; case Sector_Hidden: - sector->MoreFlags |= SECF_HIDDEN; + sector->MoreFlags |= SECMF_HIDDEN; break; case Sector_Heal: @@ -1346,35 +1346,35 @@ void P_SpawnSpecials (void) if (line.args[1] & 2) { - sec->MoreFlags |= SECF_FAKEFLOORONLY; + sec->MoreFlags |= SECMF_FAKEFLOORONLY; } if (line.args[1] & 4) { - sec->MoreFlags |= SECF_CLIPFAKEPLANES; + sec->MoreFlags |= SECMF_CLIPFAKEPLANES; } if (line.args[1] & 8) { - sec->MoreFlags |= SECF_UNDERWATER; + sec->MoreFlags |= SECMF_UNDERWATER; } else if (forcewater) { - sec->MoreFlags |= SECF_FORCEDUNDERWATER; + sec->MoreFlags |= SECMF_FORCEDUNDERWATER; } if (line.args[1] & 16) { - sec->MoreFlags |= SECF_IGNOREHEIGHTSEC; + sec->MoreFlags |= SECMF_IGNOREHEIGHTSEC; } else level.HasHeightSecs = true; if (line.args[1] & 32) { - sec->MoreFlags |= SECF_NOFAKELIGHT; + sec->MoreFlags |= SECMF_NOFAKELIGHT; } FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { level.sectors[s].heightsec = sec; sec->e->FakeFloor.Sectors.Push(&level.sectors[s]); - level.sectors[s].MoreFlags |= (sec->MoreFlags & SECF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. + level.sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. level.sectors[s].AdjustFloorClip(); } break; diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 21d541bfb5..24a7fd5fd0 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -1578,11 +1578,11 @@ public: continue; case NAME_hidden: - Flag(sec->MoreFlags, SECF_HIDDEN, key); + Flag(sec->MoreFlags, SECMF_HIDDEN, key); break; case NAME_Waterzone: - Flag(sec->MoreFlags, SECF_UNDERWATER, key); + Flag(sec->MoreFlags, SECMF_UNDERWATER, key); break; case NAME_floorplane_a: diff --git a/src/polyrenderer/scene/poly_scene.cpp b/src/polyrenderer/scene/poly_scene.cpp index 100ca13245..a446eba4cc 100644 --- a/src/polyrenderer/scene/poly_scene.cpp +++ b/src/polyrenderer/scene/poly_scene.cpp @@ -131,7 +131,7 @@ void RenderPolyScene::RenderSectors() void RenderPolyScene::RenderSubsector(PolyRenderThread *thread, subsector_t *sub, uint32_t subsectorDepth) { sector_t *frontsector = sub->sector; - frontsector->MoreFlags |= SECF_DRAWN; + frontsector->MoreFlags |= SECMF_DRAWN; bool mainBSP = sub->polys == nullptr; @@ -234,7 +234,7 @@ void RenderPolyScene::RenderPolySubsector(PolyRenderThread *thread, subsector_t if (!PolyRenderer::Instance()->DontMapLines && line->linedef) { line->linedef->flags |= ML_MAPPED; - sub->flags |= SSECF_DRAWN; + sub->flags |= SSECMF_DRAWN; } RenderPolyWall::RenderLine(thread, line, frontsector, subsectorDepth, CurrentViewpoint->StencilValue, thread->TranslucentObjects, thread->LinePortals, CurrentViewpoint->LinePortalsStart, CurrentViewpoint->PortalEnterLine); @@ -302,7 +302,7 @@ void RenderPolyScene::RenderLine(PolyRenderThread *thread, subsector_t *sub, seg if (!PolyRenderer::Instance()->DontMapLines && line->linedef) { line->linedef->flags |= ML_MAPPED; - sub->flags |= SSECF_DRAWN; + sub->flags |= SSECMF_DRAWN; } // Render 3D floor sides @@ -425,7 +425,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) sector_t *heightsec = PolyRenderer::Instance()->Viewpoint.sector->heightsec; bool underwater = (heightsec && heightsec->floorplane.PointOnSide(PolyRenderer::Instance()->Viewpoint.Pos) <= 0); bool doorunderwater = false; - int diffTex = (s->MoreFlags & SECF_CLIPFAKEPLANES); + int diffTex = (s->MoreFlags & SECMF_CLIPFAKEPLANES); // Replace sector being drawn with a copy to be hacked tempsec = *sec; @@ -437,12 +437,12 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) { tempsec.SetTexture(sector_t::floor, s->GetTexture(sector_t::floor), false); } - else if (s->MoreFlags & SECF_FAKEFLOORONLY) + else if (s->MoreFlags & SECMF_FAKEFLOORONLY) { if (underwater) { tempsec.Colormap = s->Colormap; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec.lightlevel = s->lightlevel; @@ -462,7 +462,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) tempsec.floorplane = s->floorplane; } - if (!(s->MoreFlags & SECF_FAKEFLOORONLY)) + if (!(s->MoreFlags & SECMF_FAKEFLOORONLY)) { if (diffTex) { @@ -513,7 +513,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) tempsec.planes[sector_t::ceiling].xform = s->planes[sector_t::ceiling].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec.lightlevel = s->lightlevel; @@ -522,7 +522,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) } FakeSide = PolyWaterFakeSide::BelowFloor; } - else if (heightsec && heightsec->ceilingplane.PointOnSide(PolyRenderer::Instance()->Viewpoint.Pos) <= 0 && orgceilz > refceilz && !(s->MoreFlags & SECF_FAKEFLOORONLY)) + else if (heightsec && heightsec->ceilingplane.PointOnSide(PolyRenderer::Instance()->Viewpoint.Pos) <= 0 && orgceilz > refceilz && !(s->MoreFlags & SECMF_FAKEFLOORONLY)) { // Above-ceiling hack tempsec.ceilingplane = s->ceilingplane; @@ -542,7 +542,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) tempsec.planes[sector_t::floor].xform = s->planes[sector_t::floor].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec.lightlevel = s->lightlevel; diff --git a/src/r_defs.h b/src/r_defs.h index 2ab250d1d0..49a6d244d7 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -469,15 +469,16 @@ enum // Internal sector flags enum { - SECF_FAKEFLOORONLY = 2, // when used as heightsec in R_FakeFlat, only copies floor - SECF_CLIPFAKEPLANES = 4, // as a heightsec, clip planes to target sector's planes - SECF_NOFAKELIGHT = 8, // heightsec does not change lighting - SECF_IGNOREHEIGHTSEC= 16, // heightsec is only for triggering sector actions - SECF_UNDERWATER = 32, // sector is underwater - SECF_FORCEDUNDERWATER= 64, // sector is forced to be underwater - SECF_UNDERWATERMASK = 32+64, - SECF_DRAWN = 128, // sector has been drawn at least once - SECF_HIDDEN = 256, // Do not draw on textured automap + SECMF_FAKEFLOORONLY = 2, // when used as heightsec in R_FakeFlat, only copies floor + SECMF_CLIPFAKEPLANES = 4, // as a heightsec, clip planes to target sector's planes + SECMF_NOFAKELIGHT = 8, // heightsec does not change lighting + SECMF_IGNOREHEIGHTSEC = 16, // heightsec is only for triggering sector actions + SECMF_UNDERWATER = 32, // sector is underwater + SECMF_FORCEDUNDERWATER = 64, // sector is forced to be underwater + SECMF_UNDERWATERMASK = 32+64, + SECMF_DRAWN = 128, // sector has been drawn at least once + SECMF_HIDDEN = 256, // Do not draw on textured automap + SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. }; enum @@ -657,7 +658,7 @@ public: sector_t *GetHeightSec() const { - return (MoreFlags & SECF_IGNOREHEIGHTSEC)? nullptr : heightsec; + return (MoreFlags & SECMF_IGNOREHEIGHTSEC)? nullptr : heightsec; } double GetFriction(int plane = sector_t::floor, double *movefac = NULL) const; @@ -851,15 +852,23 @@ public: return planes[pos].TexZ; } + void SetPlaneTexZQuick(int pos, double val) // For the *FakeFlat functions which do not need to have the overlap checked. + { + planes[pos].TexZ = val; + } + void SetPlaneTexZ(int pos, double val, bool dirtify = false) // This mainly gets used by init code. The only place where it must set the vertex to dirty is the interpolation code. { planes[pos].TexZ = val; if (dirtify) SetAllVerticesDirty(); + CheckOverlap(); } void ChangePlaneTexZ(int pos, double val) { planes[pos].TexZ += val; + SetAllVerticesDirty(); + CheckOverlap(); } static inline short ClampLight(int level) @@ -930,6 +939,7 @@ public: DVector2 GetPortalDisplacement(int plane); int GetPortalType(int plane); int GetOppositePortalGroup(int plane); + void CheckOverlap(); void SetVerticesDirty() { @@ -1416,7 +1426,7 @@ struct seg_t enum { SSECF_DEGENERATE = 1, - SSECF_DRAWN = 2, + SSECMF_DRAWN = 2, SSECF_POLYORG = 4, }; diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 8865199f3a..81e0280e2a 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -101,7 +101,7 @@ namespace swrenderer { if (Thread->ClipSegments->Check(WallC.sx1, WallC.sx2)) { - mSubsector->flags |= SSECF_DRAWN; + mSubsector->flags |= SSECMF_DRAWN; } return; } @@ -171,11 +171,11 @@ namespace swrenderer { // When using GL nodes, do a clipping test for these lines so we can // mark their subsectors as visible for automap texturing. - if (hasglnodes && !(mSubsector->flags & SSECF_DRAWN)) + if (hasglnodes && !(mSubsector->flags & SSECMF_DRAWN)) { if (Thread->ClipSegments->Check(WallC.sx1, WallC.sx2)) { - mSubsector->flags |= SSECF_DRAWN; + mSubsector->flags |= SSECMF_DRAWN; } } return; @@ -187,7 +187,7 @@ namespace swrenderer if (visible) { - mSubsector->flags |= SSECF_DRAWN; + mSubsector->flags |= SSECMF_DRAWN; } } diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index a7ba00c0c1..4b66e89740 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -155,7 +155,7 @@ namespace swrenderer bool underwater = r_fakingunderwater || (heightsec && heightsec->floorplane.PointOnSide(Thread->Viewport->viewpoint.Pos) <= 0); bool doorunderwater = false; - int diffTex = (s->MoreFlags & SECF_CLIPFAKEPLANES); + int diffTex = (s->MoreFlags & SECMF_CLIPFAKEPLANES); // Replace sector being drawn with a copy to be hacked *tempsec = *sec; @@ -167,12 +167,12 @@ namespace swrenderer { tempsec->SetTexture(sector_t::floor, s->GetTexture(sector_t::floor), false); } - else if (s->MoreFlags & SECF_FAKEFLOORONLY) + else if (s->MoreFlags & SECMF_FAKEFLOORONLY) { if (underwater) { tempsec->Colormap = s->Colormap; - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec->lightlevel = s->lightlevel; @@ -197,7 +197,7 @@ namespace swrenderer tempsec->floorplane = s->floorplane; } - if (!(s->MoreFlags & SECF_FAKEFLOORONLY)) + if (!(s->MoreFlags & SECMF_FAKEFLOORONLY)) { if (diffTex) { @@ -271,7 +271,7 @@ namespace swrenderer tempsec->planes[sector_t::ceiling].xform = s->planes[sector_t::ceiling].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec->lightlevel = s->lightlevel; @@ -288,7 +288,7 @@ namespace swrenderer FakeSide = WaterFakeSide::BelowFloor; } else if (heightsec && heightsec->ceilingplane.PointOnSide(Thread->Viewport->viewpoint.Pos) <= 0 && - orgceilz > refceilz && !(s->MoreFlags & SECF_FAKEFLOORONLY)) + orgceilz > refceilz && !(s->MoreFlags & SECMF_FAKEFLOORONLY)) { // Above-ceiling hack tempsec->ceilingplane = s->ceilingplane; tempsec->floorplane = s->ceilingplane; @@ -307,7 +307,7 @@ namespace swrenderer tempsec->planes[sector_t::floor].xform = s->planes[sector_t::floor].xform; } - if (!(s->MoreFlags & SECF_NOFAKELIGHT)) + if (!(s->MoreFlags & SECMF_NOFAKELIGHT)) { tempsec->lightlevel = s->lightlevel; @@ -517,7 +517,7 @@ namespace swrenderer } frontsector = sub->sector; - frontsector->MoreFlags |= SECF_DRAWN; + frontsector->MoreFlags |= SECMF_DRAWN; count = sub->numlines; line = sub->firstline; diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index 8f1a060cd1..36e9ca89f3 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -128,7 +128,7 @@ namespace swrenderer { if (gzt < heightsec->floorplane.ZatPoint(pos)) return; - if (!(heightsec->MoreFlags & SECF_FAKEFLOORONLY) && gzb >= heightsec->ceilingplane.ZatPoint(pos)) + if (!(heightsec->MoreFlags & SECMF_FAKEFLOORONLY) && gzb >= heightsec->ceilingplane.ZatPoint(pos)) return; } } diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index cc9ce8825d..3bbd25a23b 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -197,7 +197,7 @@ namespace swrenderer hzb = MAX(hzb, hz); } } - if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECF_FAKEFLOORONLY)) + if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECMF_FAKEFLOORONLY)) { double hz = spr->heightsec->ceilingplane.ZatPoint(spr->gpos); int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale); diff --git a/src/swrenderer/things/r_voxel.cpp b/src/swrenderer/things/r_voxel.cpp index f10840c09b..faab6e785c 100644 --- a/src/swrenderer/things/r_voxel.cpp +++ b/src/swrenderer/things/r_voxel.cpp @@ -113,7 +113,7 @@ namespace swrenderer { if (gzt < heightsec->floorplane.ZatPoint(pos)) return; - if (!(heightsec->MoreFlags & SECF_FAKEFLOORONLY) && gzb >= heightsec->ceilingplane.ZatPoint(pos)) + if (!(heightsec->MoreFlags & SECMF_FAKEFLOORONLY) && gzb >= heightsec->ceilingplane.ZatPoint(pos)) return; } }