diff --git a/include/qbsp/solidbsp.hh b/include/qbsp/solidbsp.hh index c60b4182..0b87c19e 100644 --- a/include/qbsp/solidbsp.hh +++ b/include/qbsp/solidbsp.hh @@ -21,6 +21,7 @@ #pragma once +#include #include #include @@ -37,5 +38,6 @@ class mapentity_t; void DetailToSolid(node_t *node); void PruneNodes(node_t *node); +bool WindingIsTiny(const winding_t &w); twosided> SplitBrush(std::unique_ptr brush, const qplane3d &split); node_t *SolidBSP(mapentity_t *entity, bool midsplit); diff --git a/qbsp/portals.cc b/qbsp/portals.cc index 920e146c..da1dc0f2 100644 --- a/qbsp/portals.cc +++ b/qbsp/portals.cc @@ -544,6 +544,9 @@ static void CutNodePortals_r(node_t *node, portal_state_t *state) FError("Mislinked portal"); winding = winding->clip(clipplane, ON_EPSILON, true)[SIDE_FRONT]; + if (winding && WindingIsTiny(*winding)) { + winding = std::nullopt; + } if (!winding) { logging::funcprint("WARNING: New portal was clipped away near ({:.3} {:.3} {:.3})\n", portal->winding->at(0)[0], portal->winding->at(0)[1], portal->winding->at(0)[2]); @@ -574,6 +577,13 @@ static void CutNodePortals_r(node_t *node, portal_state_t *state) /* cut the portal into two portals, one on each side of the cut plane */ auto windings = portal->winding->clip(plane, ON_EPSILON); + if (windings[SIDE_BACK] && WindingIsTiny(*windings[SIDE_BACK])) { + windings[SIDE_BACK] = std::nullopt; + } + if (windings[SIDE_FRONT] && WindingIsTiny(*windings[SIDE_FRONT])) { + windings[SIDE_FRONT] = std::nullopt; + } + if (!windings[SIDE_FRONT]) { if (side == SIDE_FRONT) AddPortalToNodes(portal, back, other_node);