diff --git a/src/gl/data/gl_data.h b/src/gl/data/gl_data.h index c8067b3ba..1e93f9a28 100644 --- a/src/gl/data/gl_data.h +++ b/src/gl/data/gl_data.h @@ -51,7 +51,7 @@ struct FPortal int plane; GLSectorStackPortal *glportal; // for quick access to the render data. This is only valid during BSP traversal! - GLSectorStackPortal *GetGLPortal(); + GLSectorStackPortal *GetRenderState(); }; struct FGLLinePortal @@ -68,7 +68,7 @@ extern TArray linePortalToGL; extern TArray currentmapsection; void gl_InitPortals(); -void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, FPortal *portal); +void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, const DVector2 &displacement); void gl_InitData(); extern long gl_frameMS; diff --git a/src/gl/data/gl_portaldata.cpp b/src/gl/data/gl_portaldata.cpp index 98e19c80e..413c85dc6 100644 --- a/src/gl/data/gl_portaldata.cpp +++ b/src/gl/data/gl_portaldata.cpp @@ -94,7 +94,7 @@ TArray glLinePortals; // //========================================================================== -GLSectorStackPortal *FPortal::GetGLPortal() +GLSectorStackPortal *FPortal::GetRenderState() { if (glportal == NULL) glportal = new GLSectorStackPortal(this); return glportal; @@ -125,7 +125,6 @@ struct FCoverageLine struct FCoverageBuilder { subsector_t *target; - FPortal *portal; TArray collect; FCoverageVertex center; @@ -135,10 +134,9 @@ struct FCoverageBuilder // //========================================================================== - FCoverageBuilder(subsector_t *sub, FPortal *port) + FCoverageBuilder(subsector_t *sub) { target = sub; - portal = port; } //========================================================================== @@ -322,7 +320,7 @@ struct FCoverageBuilder // //========================================================================== -void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, FPortal *portal) +void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, const DVector2 &displacement) { TArray shape; double centerx=0, centery=0; @@ -330,11 +328,11 @@ void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, F shape.Resize(subsector->numlines); for(unsigned i=0; inumlines; i++) { - centerx += (shape[i].x = FLOAT2FIXED(subsector->firstline[i].v1->fX() + portal->mDisplacement.X)); - centery += (shape[i].y = FLOAT2FIXED(subsector->firstline[i].v1->fY() + portal->mDisplacement.Y)); + centerx += (shape[i].x = FLOAT2FIXED(subsector->firstline[i].v1->fX() + displacement.X)); + centery += (shape[i].y = FLOAT2FIXED(subsector->firstline[i].v1->fY() + displacement.Y)); } - FCoverageBuilder build(subsector, portal); + FCoverageBuilder build(subsector); build.center.x = xs_CRoundToInt(centerx / subsector->numlines); build.center.y = xs_CRoundToInt(centery / subsector->numlines); @@ -357,10 +355,10 @@ static void CollectPortalSectors(FPortalMap &collection) sector_t *sec = §ors[i]; for (int j = 0; j < 2; j++) { - ASkyViewpoint *SkyBox = barrier_cast(sec->SkyBoxes[j]); - if (SkyBox != NULL && SkyBox->bAlways && SkyBox->Mate != NULL) + int ptype = sec->GetPortalType(j); + if (ptype== SKYBOX_STACKEDSECTORTHING || ptype == SKYBOX_PORTAL || ptype == SKYBOX_LINKEDPORTAL) // only offset-displacing portal types { - FPortalID id = { {SkyBox->X() - SkyBox->Mate->X(), SkyBox->Y() - SkyBox->Mate->Y()} }; + FPortalID id = { sec->GetPortalDisplacement(j) }; FPortalSectors &sss = collection[id]; FPortalSector ss = { sec, j }; @@ -401,8 +399,7 @@ void gl_InitPortals() } for (int i=1;i<=2;i<<=1) { - // For now, add separate portals for floor and ceiling. They can be merged once - // proper plane clipping is in. + // add separate portals for floor and ceiling. if (planeflags & i) { FPortal *portal = new FPortal; @@ -419,7 +416,7 @@ void gl_InitPortals() for(int k=0;ksubsectorcount; k++) { subsector_t *sub = sec->subsectors[k]; - gl_BuildPortalCoverage(&sub->portalcoverage[plane], sub, portal); + gl_BuildPortalCoverage(&sub->portalcoverage[plane], sub, pair->Key.mDisplacement); } sec->portals[plane] = portal; } @@ -511,13 +508,13 @@ CCMD(dumpportals) for(int j=0;jrender_sector->portals[portals[i]->plane]; + FPortal *port = sub->render_sector->GetGLPortal(portals[i]->plane); if (port == portals[i]) { Printf(PRINT_LOG, "\tSubsector %d (%d):\n\t\t", j, sub->render_sector->sectornum); for(unsigned k = 0;k< sub->numlines; k++) { - Printf(PRINT_LOG, "(%.3f,%.3f), ", sub->firstline[k].v1->fixX()/65536. + xdisp, sub->firstline[k].v1->fixY()/65536. + ydisp); + Printf(PRINT_LOG, "(%.3f,%.3f), ", sub->firstline[k].v1->fX() + xdisp, sub->firstline[k].v1->fY() + ydisp); } Printf(PRINT_LOG, "\n\t\tCovered by subsectors:\n"); FPortalCoverage *cov = &sub->portalcoverage[portals[i]->plane]; @@ -527,7 +524,7 @@ CCMD(dumpportals) Printf(PRINT_LOG, "\t\t\t%5d (%4d): ", cov->subsectors[l], csub->render_sector->sectornum); for(unsigned m = 0;m< csub->numlines; m++) { - Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fixX()/65536., csub->firstline[m].v1->fixY()/65536.); + Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fX(), csub->firstline[m].v1->fY()); } Printf(PRINT_LOG, "\n"); } diff --git a/src/gl/dynlights/a_dynlight.cpp b/src/gl/dynlights/a_dynlight.cpp index 032551e4f..36382ce36 100644 --- a/src/gl/dynlights/a_dynlight.cpp +++ b/src/gl/dynlights/a_dynlight.cpp @@ -591,24 +591,23 @@ void ADynamicLight::CollectWithinRadius(const DVector3 &pos, subsector_t *subSec } } } - if (!subSec->sector->PortalBlocksSight(sector_t::ceiling)) + sector_t *sec = subSec->sector; + if (!sec->PortalBlocksSight(sector_t::ceiling)) { line_t *other = subSec->firstline->linedef; - AActor *sb = subSec->sector->SkyBoxes[sector_t::ceiling]; - if (sb->specialf1 < Z() + radius) + if (sec->GetPortalPlaneZ(sector_t::ceiling) < Z() + radius) { - DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sb->Scale; + DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sec->GetPortalDisplacement(sector_t::ceiling); subsector_t *othersub = R_PointInSubsector(refpos); if (othersub->validcount != ::validcount) CollectWithinRadius(PosRelative(othersub->sector), othersub, radius); } } - if (!subSec->sector->PortalBlocksSight(sector_t::floor)) + if (!sec->PortalBlocksSight(sector_t::floor)) { line_t *other = subSec->firstline->linedef; - AActor *sb = subSec->sector->SkyBoxes[sector_t::floor]; - if (sb->specialf1 > Z() - radius) + if (sec->GetPortalPlaneZ(sector_t::floor) > Z() - radius) { - DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sb->Scale; + DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sec->GetPortalDisplacement(sector_t::floor); subsector_t *othersub = R_PointInSubsector(refpos); if (othersub->validcount != ::validcount) CollectWithinRadius(PosRelative(othersub->sector), othersub, radius); } diff --git a/src/gl/scene/gl_bsp.cpp b/src/gl/scene/gl_bsp.cpp index ca7eaf849..4377f68f1 100644 --- a/src/gl/scene/gl_bsp.cpp +++ b/src/gl/scene/gl_bsp.cpp @@ -494,7 +494,7 @@ static void DoSubsector(subsector_t * sub) if (gl_render_flats) { - // Subsectors with only 2 lines cannot have any area! + // Subsectors with only 2 lines cannot have any area if (sub->numlines>2 || (sub->hacked&1)) { // Exclude the case when it tries to render a sector with a heightsec @@ -527,17 +527,17 @@ static void DoSubsector(subsector_t * sub) FPortal *portal; - portal = fakesector->portals[sector_t::ceiling]; + portal = fakesector->GetGLPortal(sector_t::ceiling); if (portal != NULL) { - GLSectorStackPortal *glportal = portal->GetGLPortal(); + GLSectorStackPortal *glportal = portal->GetRenderState(); glportal->AddSubsector(sub); } - portal = fakesector->portals[sector_t::floor]; + portal = fakesector->GetGLPortal(sector_t::floor); if (portal != NULL) { - GLSectorStackPortal *glportal = portal->GetGLPortal(); + GLSectorStackPortal *glportal = portal->GetRenderState(); glportal->AddSubsector(sub); } } diff --git a/src/gl/scene/gl_fakeflat.cpp b/src/gl/scene/gl_fakeflat.cpp index 29f2f52a3..70ac86ec7 100644 --- a/src/gl/scene/gl_fakeflat.cpp +++ b/src/gl/scene/gl_fakeflat.cpp @@ -212,8 +212,8 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->ceilingplane=sec->floorplane; dest->ceilingplane.FlipVert(); dest->planes[sector_t::ceiling].TexZ = dest->planes[sector_t::floor].TexZ; - dest->portals[sector_t::ceiling] = NULL; - dest->portals[sector_t::floor] = NULL; + dest->ClearPortal(sector_t::ceiling); + dest->ClearPortal(sector_t::floor); return dest; } } @@ -314,7 +314,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::vbo_fakefloor]; dest->vboheight[sector_t::ceiling] = s->vboheight[sector_t::floor]; - dest->portals[sector_t::ceiling] = NULL; + dest->ClearPortal(sector_t::ceiling); if (!(s->MoreFlags & SECF_NOFAKELIGHT)) { @@ -367,7 +367,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac dest->vboindex[sector_t::ceiling] = sec->vboindex[sector_t::ceiling]; dest->vboheight[sector_t::ceiling] = sec->vboheight[sector_t::ceiling]; - dest->portals[sector_t::floor] = NULL; + dest->ClearPortal(sector_t::floor); if (!(s->MoreFlags & SECF_NOFAKELIGHT)) { diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 50b7fc9bb..3c2c661be 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -1180,20 +1180,21 @@ void GLHorizonPortal::DrawContents() void GLEEHorizonPortal::DrawContents() { PortalAll.Clock(); - if (origin->Sector->GetTexture(sector_t::floor) == skyflatnum || - origin->Sector->GetTexture(sector_t::ceiling) == skyflatnum) + sector_t *sector = origin->Sector; + if (sector->GetTexture(sector_t::floor) == skyflatnum || + sector->GetTexture(sector_t::ceiling) == skyflatnum) { GLSkyInfo skyinfo; - skyinfo.init(origin->Sector->sky, 0); + skyinfo.init(sector->sky, 0); GLSkyPortal sky(&skyinfo, true); sky.DrawContents(); } - if (origin->Sector->GetTexture(sector_t::ceiling) != skyflatnum) + if (sector->GetTexture(sector_t::ceiling) != skyflatnum) { GLHorizonInfo horz; - horz.plane.GetFromSector(origin->Sector, true); - horz.lightlevel = gl_ClampLight(origin->Sector->GetCeilingLight()); - horz.colormap = origin->Sector->ColorMap; + horz.plane.GetFromSector(sector, true); + horz.lightlevel = gl_ClampLight(sector->GetCeilingLight()); + horz.colormap = sector->ColorMap; if (origin->special1 == SKYBOX_PLANE) { horz.plane.Texheight = ViewPos.Z + fabs(horz.plane.Texheight); @@ -1201,12 +1202,12 @@ void GLEEHorizonPortal::DrawContents() GLHorizonPortal ceil(&horz, true); ceil.DrawContents(); } - if (origin->Sector->GetTexture(sector_t::floor) != skyflatnum) + if (sector->GetTexture(sector_t::floor) != skyflatnum) { GLHorizonInfo horz; - horz.plane.GetFromSector(origin->Sector, false); - horz.lightlevel = gl_ClampLight(origin->Sector->GetFloorLight()); - horz.colormap = origin->Sector->ColorMap; + horz.plane.GetFromSector(sector, false); + horz.lightlevel = gl_ClampLight(sector->GetFloorLight()); + horz.colormap = sector->ColorMap; if (origin->special1 == SKYBOX_PLANE) { horz.plane.Texheight = ViewPos.Z - fabs(horz.plane.Texheight); diff --git a/src/gl/scene/gl_renderhacks.cpp b/src/gl/scene/gl_renderhacks.cpp index 80f64d02e..30de38eb7 100644 --- a/src/gl/scene/gl_renderhacks.cpp +++ b/src/gl/scene/gl_renderhacks.cpp @@ -669,7 +669,6 @@ void FDrawInfo::DrawUnhandledMissingTextures() if (seg->linedef->validcount == validcount) continue; // already done seg->linedef->validcount = validcount; if (seg->frontsector->GetPlaneTexZF(sector_t::ceiling) < ViewPos.Z) continue; // out of sight - //if (seg->frontsector->ceilingpic==skyflatnum) continue; // FIXME: The check for degenerate subsectors should be more precise if (seg->PartnerSeg && (seg->PartnerSeg->Subsector->flags & SSECF_DEGENERATE)) continue; @@ -688,7 +687,6 @@ void FDrawInfo::DrawUnhandledMissingTextures() seg_t * seg = MissingLowerSegs[i].seg; - // already done! if (seg->linedef->validcount == validcount) continue; // already done seg->linedef->validcount = validcount; if (!(sectorrenderflags[seg->backsector->sectornum] & SSRF_RENDERFLOOR)) continue; @@ -1049,7 +1047,7 @@ void FDrawInfo::CollectSectorStacksCeiling(subsector_t * sub, sector_t * anchor) sub->validcount=validcount; // Has a sector stack or skybox itself! - if (sub->render_sector->portals[sector_t::ceiling] != NULL) return; + if (sub->render_sector->GetGLPortal(sector_t::ceiling) != nullptr) return; // Don't bother processing unrendered subsectors if (sub->numlines>2 && !(ss_renderflags[DWORD(sub-subsectors)]&SSRF_PROCESSED)) return; @@ -1096,7 +1094,7 @@ void FDrawInfo::CollectSectorStacksFloor(subsector_t * sub, sector_t * anchor) sub->validcount=validcount; // Has a sector stack or skybox itself! - if (sub->render_sector->portals[sector_t::floor] != NULL) return; + if (sub->render_sector->GetGLPortal(sector_t::floor) != nullptr) return; // Don't bother processing unrendered subsectors if (sub->numlines>2 && !(ss_renderflags[DWORD(sub-subsectors)]&SSRF_PROCESSED)) return; @@ -1146,7 +1144,7 @@ void FDrawInfo::ProcessSectorStacks() for (i=0;iportals[sector_t::ceiling]; + FPortal *portal = sec->GetGLPortal(sector_t::ceiling); if (portal != NULL) for(int k=0;ksubsectorcount;k++) { subsector_t * sub = sec->subsectors[k]; @@ -1170,10 +1168,10 @@ void FDrawInfo::ProcessSectorStacks() if (sub->portalcoverage[sector_t::ceiling].subsectors == NULL) { - gl_BuildPortalCoverage(&sub->portalcoverage[sector_t::ceiling], sub, portal); + gl_BuildPortalCoverage(&sub->portalcoverage[sector_t::ceiling], sub, portal->mDisplacement); } - portal->GetGLPortal()->AddSubsector(sub); + portal->GetRenderState()->AddSubsector(sub); if (sec->GetAlpha(sector_t::ceiling) != 0 && sec->GetTexture(sector_t::ceiling) != skyflatnum) { @@ -1190,7 +1188,7 @@ void FDrawInfo::ProcessSectorStacks() for (i=0;iportals[sector_t::floor]; + FPortal *portal = sec->GetGLPortal(sector_t::floor); if (portal != NULL) for(int k=0;ksubsectorcount;k++) { subsector_t * sub = sec->subsectors[k]; @@ -1215,10 +1213,10 @@ void FDrawInfo::ProcessSectorStacks() if (sub->portalcoverage[sector_t::floor].subsectors == NULL) { - gl_BuildPortalCoverage(&sub->portalcoverage[sector_t::floor], sub, portal); + gl_BuildPortalCoverage(&sub->portalcoverage[sector_t::floor], sub, portal->mDisplacement); } - GLSectorStackPortal *glportal = portal->GetGLPortal(); + GLSectorStackPortal *glportal = portal->GetRenderState(); glportal->AddSubsector(sub); if (sec->GetAlpha(sector_t::floor) != 0 && sec->GetTexture(sector_t::floor) != skyflatnum) diff --git a/src/gl/scene/gl_sky.cpp b/src/gl/scene/gl_sky.cpp index 6f6039c00..ab16f57ab 100644 --- a/src/gl/scene/gl_sky.cpp +++ b/src/gl/scene/gl_sky.cpp @@ -311,10 +311,14 @@ void GLWall::SkyTop(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,vertex } else { - FPortal *pfront = fs->portals[sector_t::ceiling]; - FPortal *pback = bs->portals[sector_t::ceiling]; - if (pfront == NULL || fs->PortalBlocksView(sector_t::ceiling)) return; - if (pfront == pback && !bs->PortalBlocksView(sector_t::ceiling)) return; + int type = fs->GetPortalType(sector_t::ceiling); + if (type == SKYBOX_STACKEDSECTORTHING || type == SKYBOX_PORTAL || type == SKYBOX_LINKEDPORTAL) + { + FPortal *pfront = fs->GetGLPortal(sector_t::ceiling); + FPortal *pback = bs->GetGLPortal(sector_t::ceiling); + if (pfront == NULL || fs->PortalBlocksView(sector_t::ceiling)) return; + if (pfront == pback && !bs->PortalBlocksView(sector_t::ceiling)) return; + } } // stacked sectors @@ -386,10 +390,14 @@ void GLWall::SkyBottom(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,ver } else { - FPortal *pfront = fs->portals[sector_t::floor]; - FPortal *pback = bs->portals[sector_t::floor]; - if (pfront == NULL || fs->PortalBlocksView(sector_t::floor)) return; - if (pfront == pback && !bs->PortalBlocksView(sector_t::floor)) return; + int type = fs->GetPortalType(sector_t::floor); + if (type == SKYBOX_STACKEDSECTORTHING || type == SKYBOX_PORTAL || type == SKYBOX_LINKEDPORTAL) + { + FPortal *pfront = fs->GetGLPortal(sector_t::floor); + FPortal *pback = bs->GetGLPortal(sector_t::floor); + if (pfront == NULL || fs->PortalBlocksView(sector_t::floor)) return; + if (pfront == pback && !bs->PortalBlocksView(sector_t::floor)) return; + } } // stacked sectors diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 4b797f71f..48c20fad4 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -554,8 +554,8 @@ void GLSprite::Process(AActor* thing, sector_t * sector, bool thruportal) { rendersector = sector; } - topclip = rendersector->PortalBlocksMovement(sector_t::ceiling) ? LARGE_VALUE : rendersector->SkyBoxes[sector_t::ceiling]->specialf1; - bottomclip = rendersector->PortalBlocksMovement(sector_t::floor) ? -LARGE_VALUE : rendersector->SkyBoxes[sector_t::floor]->specialf1; + topclip = rendersector->PortalBlocksMovement(sector_t::ceiling) ? LARGE_VALUE : rendersector->GetPortalPlaneZ(sector_t::ceiling); + bottomclip = rendersector->PortalBlocksMovement(sector_t::floor) ? -LARGE_VALUE : rendersector->GetPortalPlaneZ(sector_t::floor); x = thingpos.X; diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index 8f91b59cd..b9dfc9ef4 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -185,7 +185,7 @@ void GLWall::PutPortal(int ptype) break; case PORTALTYPE_SECTORSTACK: - portal = this->portal->GetGLPortal(); + portal = this->portal->GetRenderState(); portal->AddLine(this); break; diff --git a/src/r_defs.h b/src/r_defs.h index 6a3894f0e..1f2f35621 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -38,6 +38,7 @@ #include "actor.h" struct FLightNode; struct FGLSection; +struct FPortal; struct seg_t; #include "dthinker.h" @@ -499,7 +500,6 @@ struct subsector_t; struct sector_t; struct side_t; extern bool gl_plane_reflection_i; -struct FPortal; // Ceiling/floor flags enum @@ -1159,6 +1159,8 @@ public: float GetReflect(int pos) { return gl_plane_reflection_i? reflect[pos] : 0; } bool VBOHeightcheck(int pos) const { return vboheight[pos] == GetPlaneTexZ(pos); } + FPortal *GetGLPortal(int plane) { return portals[plane]; } + void ClearPortal(int plane) { portals[plane] = nullptr; SkyBoxes[plane] = nullptr; } enum {