From e230d38aad68eac9ce69e5dac211fa747e5d7751 Mon Sep 17 00:00:00 2001 From: Lactozilla <jp6781615@gmail.com> Date: Wed, 23 Aug 2023 15:46:48 -0300 Subject: [PATCH] Ensure sector portals are rendered when they would otherwise be missed --- src/p_spec.c | 11 ++++++++++- src/p_spec.h | 1 + src/r_bsp.c | 8 +++++++- src/r_plane.c | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index af1a044340..734bada682 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 63ae8b504c..0c4ce4f329 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 f902f2a830..6f115a923e 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 d9051ae05e..4695034bdb 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; } -- GitLab