diff --git a/src/p_spec.c b/src/p_spec.c index af1a04434033f9c68603d10ccac2a4d719f34a91..734bada6823cf705d61818ccc31cb9925ced45b4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6203,6 +6203,11 @@ static boolean P_IsSectorPortalValid(sectorportal_t *secportal) } } +boolean P_SectorHasPortal(sector_t *sector) +{ + return P_SectorHasFloorPortal(sector) || P_SectorHasCeilingPortal(sector); +} + boolean P_SectorHasFloorPortal(sector_t *sector) { return P_IsSectorPortalValid(§or->portal_floor); @@ -6215,7 +6220,11 @@ boolean P_SectorHasCeilingPortal(sector_t *sector) boolean P_CompareSectorPortals(sectorportal_t *a, sectorportal_t *b) { - if (a->type != b->type) + if (a == NULL && b == NULL) + return true; + else if (!a || !b) + return false; + else if (a->type != b->type) return false; switch (a->type) diff --git a/src/p_spec.h b/src/p_spec.h index 63ae8b504c1ea207431b20b00d8a04a5742d7a5d..0c4ce4f3296620bd4ed6baf30a25754bb1af73e1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -521,6 +521,7 @@ INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max); void P_SetupSignExit(player_t *player); boolean P_IsFlagAtBase(mobjtype_t flag); +boolean P_SectorHasPortal(sector_t *sector); boolean P_SectorHasFloorPortal(sector_t *sector); boolean P_SectorHasCeilingPortal(sector_t *sector); boolean P_CompareSectorPortals(sectorportal_t *a, sectorportal_t *b); diff --git a/src/r_bsp.c b/src/r_bsp.c index f902f2a83020db53e6b326c4a23f4fa08d5bf01e..6f115a923e0a96bcb6a82d6d7f5cbc20f133f59d 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -357,6 +357,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, boolean R_IsEmptyLine(seg_t *line, sector_t *front, sector_t *back) { + if (P_SectorHasPortal(front) && !P_SectorHasPortal(back)) + return false; + else if (!P_SectorHasPortal(front) && P_SectorHasPortal(back)) + return false; + return ( !line->polyseg && back->ceilingpic == front->ceilingpic @@ -578,7 +583,6 @@ static void R_AddLine(seg_t *line) // Reject empty lines used for triggers and special events. // Identical floor and ceiling on both sides, identical light levels on both sides, // and no middle texture. - if (R_IsEmptyLine(line, frontsector, backsector)) return; @@ -915,6 +919,7 @@ static void R_Subsector(size_t num) if (P_GetSectorFloorZAt(frontsector, viewx, viewy) < viewz || frontsector->floorpic == skyflatnum + || P_SectorHasFloorPortal(frontsector) || (frontsector->heightsec != -1 && sectors[frontsector->heightsec].ceilingpic == skyflatnum)) { floorplane = R_FindPlane(frontsector, frontsector->floorheight, frontsector->floorpic, floorlightlevel, @@ -925,6 +930,7 @@ static void R_Subsector(size_t num) if (P_GetSectorCeilingZAt(frontsector, viewx, viewy) > viewz || frontsector->ceilingpic == skyflatnum + || P_SectorHasCeilingPortal(frontsector) || (frontsector->heightsec != -1 && sectors[frontsector->heightsec].floorpic == skyflatnum)) { ceilingplane = R_FindPlane(frontsector, frontsector->ceilingheight, frontsector->ceilingpic, diff --git a/src/r_plane.c b/src/r_plane.c index d9051ae05e06bf1d1284713ea77607f27c58a91b..4695034bdb4bd99f4595a5b6127c404d6c9c3139 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -451,7 +451,7 @@ visplane_t *R_FindPlane(sector_t *sector, fixed_t height, INT32 picnum, INT32 li && check->plangle == plangle && check->slope == slope && check->polyobj == polyobj - && check->portalsector == portalsector) + && P_CompareSectorPortals(check->portalsector, portalsector)) { return check; }