From a42f8d154cae0a0356e6a69de98ee6e8854b07be Mon Sep 17 00:00:00 2001 From: James Lambert Date: Mon, 4 Dec 2023 19:49:30 -0700 Subject: [PATCH] Fix portal being placed outside of surfaces --- src/main.c | 2 +- src/scene/portal_surface.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index cd94749..36ec706 100644 --- a/src/main.c +++ b/src/main.c @@ -247,7 +247,7 @@ static void gameProc(void* arg) { savefileLoad(); - levelLoadWithCallbacks(INTRO_MENU); + levelLoadWithCallbacks(1); gCurrentTestSubject = 0; cutsceneRunnerReset(); controllersInit(); diff --git a/src/scene/portal_surface.c b/src/scene/portal_surface.c index 6018e14..cf43bdc 100644 --- a/src/scene/portal_surface.c +++ b/src/scene/portal_surface.c @@ -272,7 +272,8 @@ int portalSurfaceAdjustPosition(struct PortalSurface* surface, struct Transform* for (iteration = 0; iteration < MAX_POS_ADJUST_ITERATIONS; ++iteration) { int minOverlap = PORTAL_SURFACE_OVERLAP; - struct Vector2s16 minOverlapOffset; + int minIsOutside = 0; + struct Vector2s16 minOverlapOffset = {{{0, 0}}}; struct Vector2s16 portalMin; portalMin.x = output->x - halfSize.x; @@ -310,40 +311,49 @@ int portalSurfaceAdjustPosition(struct PortalSurface* surface, struct Transform* vector2s16Sub(&b, &a, &edgeDir); struct Vector2s16 offset; - int distance = edgeDir.y >= 0 ? portalMax.x - edgeMin.x : PORTAL_SURFACE_OVERLAP; + int distance = portalMax.x - edgeMin.x; + int isOutside = edgeDir.y < 0; offset.x = -distance; offset.y = 0; int distanceCheck = edgeMax.x - portalMin.x; - if (distanceCheck < distance && edgeDir.y <= 0) { + if (distanceCheck < distance) { distance = distanceCheck; offset.x = distance; offset.y = 0; + isOutside = edgeDir.y > 0; } distanceCheck = portalMax.y - edgeMin.y; - if (distanceCheck < distance && edgeDir.x <= 0) { + if (distanceCheck < distance) { distance = distanceCheck; offset.x = 0; offset.y = -distance; + isOutside = edgeDir.x > 0; } distanceCheck = edgeMax.y - portalMin.y; - if (distanceCheck < distance && edgeDir.x >= 0) { + if (distanceCheck < distance) { distance = distanceCheck; offset.x = 0; offset.y = distance; + isOutside = edgeDir.x < 0; } if (distance < minOverlap) { minOverlap = distance; + minIsOutside = isOutside; minOverlapOffset = offset; } } + if (minIsOutside) { + return 0; + } + if (minOverlap == PORTAL_SURFACE_OVERLAP) { break; }