Fix some more portal hole cutting bugs
This commit is contained in:
parent
2b22d12a0e
commit
5dcef6b458
|
@ -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;
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue