Fix some more portal hole cutting bugs

This commit is contained in:
James Lambert 2022-07-03 21:06:34 -06:00
parent 2b22d12a0e
commit 5dcef6b458
2 changed files with 15 additions and 15 deletions

View file

@ -54,6 +54,12 @@ struct PortalSurface* portalSurfaceGetOriginalSurface(int portalSurfaceIndex, in
void portalSurfaceReplace(int portalSurfaceIndex, int roomIndex, int portalIndex, struct PortalSurface* with) { void portalSurfaceReplace(int portalSurfaceIndex, int roomIndex, int portalIndex, struct PortalSurface* with) {
int staticIndex = -1; int staticIndex = -1;
struct PortalSurfaceReplacement* replacement = &gPortalSurfaceReplacements[portalIndex];
if (replacement->flags & PortalSurfaceReplacementFlagsIsEnabled) {
portalSurfaceReplacementRevert(replacement);
}
struct Rangeu16 range = gCurrentLevel->roomStaticMapping[roomIndex]; struct Rangeu16 range = gCurrentLevel->roomStaticMapping[roomIndex];
struct PortalSurface* existing = &gCurrentLevel->portalSurfaces[portalSurfaceIndex]; struct PortalSurface* existing = &gCurrentLevel->portalSurfaces[portalSurfaceIndex];
@ -69,12 +75,6 @@ void portalSurfaceReplace(int portalSurfaceIndex, int roomIndex, int portalIndex
return; return;
} }
struct PortalSurfaceReplacement* replacement = &gPortalSurfaceReplacements[portalIndex];
if (replacement->flags & PortalSurfaceReplacementFlagsIsEnabled) {
portalSurfaceReplacementRevert(replacement);
}
replacement->previousSurface = *existing; replacement->previousSurface = *existing;
replacement->flags = PortalSurfaceReplacementFlagsIsEnabled; replacement->flags = PortalSurfaceReplacementFlagsIsEnabled;
replacement->staticIndex = staticIndex; replacement->staticIndex = staticIndex;

View file

@ -300,7 +300,7 @@ enum IntersectionType portalSurfaceIntersect(struct Vector2s16* pointA, struct V
} }
int portalSurfaceNewVertex(struct PortalSurfaceBuilder* surfaceBuilder, struct Vector2s16* point) { 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; return -1;
} }
@ -312,7 +312,7 @@ int portalSurfaceNewVertex(struct PortalSurfaceBuilder* surfaceBuilder, struct V
} }
int portalSurfaceNewEdge(struct PortalSurfaceBuilder* surfaceBuilder, int isLoopEdge, struct OriginalEdgeMapping* originalEdge) { 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; return -1;
} }
@ -897,18 +897,18 @@ int portalSurfaceTriangulate(struct PortalSurfaceBuilder* surfaceBuilder) {
int portalSurfacePokeHole(struct PortalSurface* surface, struct Vector2s16* loop, struct PortalSurface* result) { int portalSurfacePokeHole(struct PortalSurface* surface, struct Vector2s16* loop, struct PortalSurface* result) {
struct PortalSurfaceBuilder surfaceBuilder; struct PortalSurfaceBuilder surfaceBuilder;
int edgeCount = surface->edgeCount + ADDITIONAL_EDGE_CAPACITY; int edgeCapacity = surface->edgeCount + ADDITIONAL_EDGE_CAPACITY;
surfaceBuilder.original = surface; surfaceBuilder.original = surface;
surfaceBuilder.vertices = stackMalloc(sizeof(struct Vector2s16) * (surface->vertexCount + ADDITIONAL_VERTEX_CAPACITY)); surfaceBuilder.vertices = stackMalloc(sizeof(struct Vector2s16) * (surface->vertexCount + ADDITIONAL_VERTEX_CAPACITY));
memCopy(surfaceBuilder.vertices, surface->vertices, sizeof(struct Vector2s16) * surface->vertexCount); memCopy(surfaceBuilder.vertices, surface->vertices, sizeof(struct Vector2s16) * surface->vertexCount);
surfaceBuilder.currentVertex = 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); 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.currentEdge = surface->edgeCount;
surfaceBuilder.edgeFlags = stackMalloc(sizeof(u8) * edgeCount); surfaceBuilder.edgeFlags = stackMalloc(sizeof(u8) * edgeCapacity);
surfaceBuilder.originalEdgeIndex = stackMalloc(sizeof(u8) * edgeCount); surfaceBuilder.originalEdgeIndex = stackMalloc(sizeof(struct OriginalEdgeMapping) * edgeCapacity);
for (int i = 0; i < surface->edgeCount; ++i) { for (int i = 0; i < surface->edgeCount; ++i) {
surfaceBuilder.originalEdgeIndex[i].originalEdge = 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)); surfaceBuilder.gfxVertices = stackMalloc(sizeof(Vtx) * (surface->vertexCount + ADDITIONAL_EDGE_CAPACITY));
zeroMemory(surfaceBuilder.edgeFlags, surface->edgeCount + edgeCount); zeroMemory(surfaceBuilder.edgeFlags, surface->edgeCount + edgeCapacity);
zeroMemory(surfaceBuilder.isLoopEdge, surface->edgeCount + edgeCount); zeroMemory(surfaceBuilder.isLoopEdge, surface->edgeCount + edgeCapacity);
memCopy(surfaceBuilder.gfxVertices, surface->gfxVertices, sizeof(Vtx) * surface->vertexCount); memCopy(surfaceBuilder.gfxVertices, surface->gfxVertices, sizeof(Vtx) * surface->vertexCount);
struct Vector2s16* prev = &loop[0]; struct Vector2s16* prev = &loop[0];