From 5dcef6b45804777b6f6f34e355c80b49687f8118 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sun, 3 Jul 2022 21:06:34 -0600 Subject: [PATCH] Fix some more portal hole cutting bugs --- src/scene/portal_surface.c | 12 ++++++------ src/scene/portal_surface_generator.c | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/scene/portal_surface.c b/src/scene/portal_surface.c index f95b4ae..3497427 100644 --- a/src/scene/portal_surface.c +++ b/src/scene/portal_surface.c @@ -54,6 +54,12 @@ struct PortalSurface* portalSurfaceGetOriginalSurface(int portalSurfaceIndex, in void portalSurfaceReplace(int portalSurfaceIndex, int roomIndex, int portalIndex, struct PortalSurface* with) { int staticIndex = -1; + struct PortalSurfaceReplacement* replacement = &gPortalSurfaceReplacements[portalIndex]; + + if (replacement->flags & PortalSurfaceReplacementFlagsIsEnabled) { + portalSurfaceReplacementRevert(replacement); + } + struct Rangeu16 range = gCurrentLevel->roomStaticMapping[roomIndex]; struct PortalSurface* existing = &gCurrentLevel->portalSurfaces[portalSurfaceIndex]; @@ -69,12 +75,6 @@ void portalSurfaceReplace(int portalSurfaceIndex, int roomIndex, int portalIndex return; } - struct PortalSurfaceReplacement* replacement = &gPortalSurfaceReplacements[portalIndex]; - - if (replacement->flags & PortalSurfaceReplacementFlagsIsEnabled) { - portalSurfaceReplacementRevert(replacement); - } - replacement->previousSurface = *existing; replacement->flags = PortalSurfaceReplacementFlagsIsEnabled; replacement->staticIndex = staticIndex; diff --git a/src/scene/portal_surface_generator.c b/src/scene/portal_surface_generator.c index 24148f9..9f5b00c 100644 --- a/src/scene/portal_surface_generator.c +++ b/src/scene/portal_surface_generator.c @@ -300,7 +300,7 @@ enum IntersectionType portalSurfaceIntersect(struct Vector2s16* pointA, struct V } int portalSurfaceNewVertex(struct PortalSurfaceBuilder* surfaceBuilder, struct Vector2s16* point) { - if (surfaceBuilder->currentVertex == ADDITIONAL_VERTEX_CAPACITY) { + if (surfaceBuilder->currentVertex == ADDITIONAL_VERTEX_CAPACITY + surfaceBuilder->original->vertexCount) { return -1; } @@ -312,7 +312,7 @@ int portalSurfaceNewVertex(struct PortalSurfaceBuilder* surfaceBuilder, struct V } int portalSurfaceNewEdge(struct PortalSurfaceBuilder* surfaceBuilder, int isLoopEdge, struct OriginalEdgeMapping* originalEdge) { - if (surfaceBuilder->currentEdge == ADDITIONAL_EDGE_CAPACITY) { + if (surfaceBuilder->currentEdge == ADDITIONAL_EDGE_CAPACITY + surfaceBuilder->original->edgeCount) { return -1; } @@ -897,18 +897,18 @@ int portalSurfaceTriangulate(struct PortalSurfaceBuilder* surfaceBuilder) { int portalSurfacePokeHole(struct PortalSurface* surface, struct Vector2s16* loop, struct PortalSurface* result) { struct PortalSurfaceBuilder surfaceBuilder; - int edgeCount = surface->edgeCount + ADDITIONAL_EDGE_CAPACITY; + int edgeCapacity = surface->edgeCount + ADDITIONAL_EDGE_CAPACITY; surfaceBuilder.original = surface; surfaceBuilder.vertices = stackMalloc(sizeof(struct Vector2s16) * (surface->vertexCount + ADDITIONAL_VERTEX_CAPACITY)); memCopy(surfaceBuilder.vertices, surface->vertices, sizeof(struct Vector2s16) * surface->vertexCount); surfaceBuilder.currentVertex = surface->vertexCount; - surfaceBuilder.edges = stackMalloc(sizeof(struct SurfaceEdge) * edgeCount); + surfaceBuilder.edges = stackMalloc(sizeof(struct SurfaceEdge) * edgeCapacity); memCopy(surfaceBuilder.edges, surface->edges, sizeof(struct SurfaceEdge) * surface->edgeCount); - surfaceBuilder.isLoopEdge = stackMalloc(sizeof(u8) * edgeCount); + surfaceBuilder.isLoopEdge = stackMalloc(sizeof(u8) * edgeCapacity); surfaceBuilder.currentEdge = surface->edgeCount; - surfaceBuilder.edgeFlags = stackMalloc(sizeof(u8) * edgeCount); - surfaceBuilder.originalEdgeIndex = stackMalloc(sizeof(u8) * edgeCount); + surfaceBuilder.edgeFlags = stackMalloc(sizeof(u8) * edgeCapacity); + surfaceBuilder.originalEdgeIndex = stackMalloc(sizeof(struct OriginalEdgeMapping) * edgeCapacity); for (int i = 0; i < surface->edgeCount; ++i) { surfaceBuilder.originalEdgeIndex[i].originalEdge = i; @@ -917,8 +917,8 @@ int portalSurfacePokeHole(struct PortalSurface* surface, struct Vector2s16* loop surfaceBuilder.gfxVertices = stackMalloc(sizeof(Vtx) * (surface->vertexCount + ADDITIONAL_EDGE_CAPACITY)); - zeroMemory(surfaceBuilder.edgeFlags, surface->edgeCount + edgeCount); - zeroMemory(surfaceBuilder.isLoopEdge, surface->edgeCount + edgeCount); + zeroMemory(surfaceBuilder.edgeFlags, surface->edgeCount + edgeCapacity); + zeroMemory(surfaceBuilder.isLoopEdge, surface->edgeCount + edgeCapacity); memCopy(surfaceBuilder.gfxVertices, surface->gfxVertices, sizeof(Vtx) * surface->vertexCount); struct Vector2s16* prev = &loop[0];