From c7a54975122ba8a2aec0da0b02cdb6cc4415fdd0 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sun, 3 Jul 2022 13:06:47 -0600 Subject: [PATCH] Fix a hole cutting bug --- src/scene/portal_surface_generator.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/scene/portal_surface_generator.c b/src/scene/portal_surface_generator.c index d608c8a..0172490 100644 --- a/src/scene/portal_surface_generator.c +++ b/src/scene/portal_surface_generator.c @@ -421,10 +421,15 @@ int portalSurfaceSplitEdge(struct PortalSurfaceBuilder* surfaceBuilder, struct S struct SurfaceEdgeWithSide nextEdge; struct SurfaceEdgeWithSide prevReverseEdge; + int hasReverseEdge = existingEdge->nextEdgeReverse != NO_EDGE_CONNECTION; + portalSurfaceNextEdge(surfaceBuilder, edge, &nextEdge); - prevReverseEdge = *edge; - prevReverseEdge.isReverse = !prevReverseEdge.isReverse; - portalSurfacePrevEdge(surfaceBuilder, &prevReverseEdge, &prevReverseEdge); + + if (hasReverseEdge) { + prevReverseEdge = *edge; + prevReverseEdge.isReverse = !prevReverseEdge.isReverse; + portalSurfacePrevEdge(surfaceBuilder, &prevReverseEdge, &prevReverseEdge); + } int newEdgeIndex = portalSurfaceNewEdge(surfaceBuilder, 0, &surfaceBuilder->originalEdgeIndex[edge->edgeIndex]); @@ -441,21 +446,24 @@ int portalSurfaceSplitEdge(struct PortalSurfaceBuilder* surfaceBuilder, struct S SB_SET_NEXT_EDGE(newEdge, edge->isReverse, SB_GET_NEXT_EDGE(existingEdge, edge->isReverse)); SB_SET_PREV_EDGE(newEdge, edge->isReverse, edge->edgeIndex); - SB_SET_NEXT_EDGE(newEdge, !edge->isReverse, edge->edgeIndex); - SB_SET_PREV_EDGE(newEdge, !edge->isReverse, SB_GET_PREV_EDGE(existingEdge, !edge->isReverse)); + SB_SET_NEXT_EDGE(newEdge, !edge->isReverse, hasReverseEdge ? edge->edgeIndex : NO_EDGE_CONNECTION); + SB_SET_PREV_EDGE(newEdge, !edge->isReverse, hasReverseEdge ? SB_GET_PREV_EDGE(existingEdge, !edge->isReverse) : NO_EDGE_CONNECTION); SB_SET_NEXT_POINT(existingEdge, edge->isReverse, newVertexIndex); SB_SET_NEXT_EDGE(existingEdge, edge->isReverse, newEdgeIndex); - SB_SET_PREV_EDGE(existingEdge, !edge->isReverse, newEdgeIndex); + if (hasReverseEdge) { + SB_SET_PREV_EDGE(existingEdge, !edge->isReverse, newEdgeIndex); + } struct SurfaceEdge* nextEdgePtr = portalSurfaceGetEdge(surfaceBuilder, nextEdge.edgeIndex); SB_SET_PREV_EDGE(nextEdgePtr, nextEdge.isReverse, newEdgeIndex); - struct SurfaceEdge* prevEdgePtr = portalSurfaceGetEdge(surfaceBuilder, prevReverseEdge.edgeIndex); - - SB_SET_NEXT_EDGE(prevEdgePtr, prevReverseEdge.isReverse, newEdgeIndex); + if (hasReverseEdge) { + struct SurfaceEdge* prevEdgePtr = portalSurfaceGetEdge(surfaceBuilder, prevReverseEdge.edgeIndex); + SB_SET_NEXT_EDGE(prevEdgePtr, prevReverseEdge.isReverse, newEdgeIndex); + } #if VERIFY_INTEGRITY if (!portalSurfaceIsWellFormed(surfaceBuilder)) {