diff --git a/assets/models/portal/portal_blue.blend b/assets/models/portal/portal_blue.blend index eb801ed..5c74a4a 100644 Binary files a/assets/models/portal/portal_blue.blend and b/assets/models/portal/portal_blue.blend differ diff --git a/assets/models/portal/portal_blue_filled.blend b/assets/models/portal/portal_blue_filled.blend index 8f7cb48..80b90e1 100644 Binary files a/assets/models/portal/portal_blue_filled.blend and b/assets/models/portal/portal_blue_filled.blend differ diff --git a/assets/models/portal/portal_face.blend b/assets/models/portal/portal_face.blend index 8ea9d01..b1e8ec7 100644 Binary files a/assets/models/portal/portal_face.blend and b/assets/models/portal/portal_face.blend differ diff --git a/assets/models/portal/portal_orange.blend b/assets/models/portal/portal_orange.blend index 54db5dd..071bc5e 100644 Binary files a/assets/models/portal/portal_orange.blend and b/assets/models/portal/portal_orange.blend differ diff --git a/assets/models/portal/portal_orange_filled.blend b/assets/models/portal/portal_orange_filled.blend index 5f3e3d8..2f6014a 100644 Binary files a/assets/models/portal/portal_orange_filled.blend and b/assets/models/portal/portal_orange_filled.blend differ diff --git a/src/scene/portal.c b/src/scene/portal.c index f95ee9b..a6899f0 100644 --- a/src/scene/portal.c +++ b/src/scene/portal.c @@ -291,22 +291,31 @@ void portalRender(struct Portal* portal, struct Portal* otherPortal, struct Rend } struct RenderProps nextProps; + int portalIndex = portal < otherPortal ? 0 : 1; - screenClipperInitWithCamera(&clipper, &props->camera, (float)SCREEN_WD / (float)SCREEN_HT, portalTransform); + if (props->clippingPortalIndex == portalIndex) { + nextProps.minX = 0; + nextProps.maxX = SCREEN_WD; + nextProps.minY = 0; + nextProps.maxY = SCREEN_HT; + } else { - struct Box2D clippingBounds; + screenClipperInitWithCamera(&clipper, &props->camera, (float)SCREEN_WD / (float)SCREEN_HT, portalTransform); - screenClipperBoundingPoints(&clipper, gPortalOutline, sizeof(gPortalOutline) / sizeof(*gPortalOutline), &clippingBounds); + struct Box2D clippingBounds; - nextProps.minX = CALC_SCREEN_SPACE(clippingBounds.min.x, SCREEN_WD); - nextProps.maxX = CALC_SCREEN_SPACE(clippingBounds.max.x, SCREEN_WD); - nextProps.minY = CALC_SCREEN_SPACE(-clippingBounds.max.y, SCREEN_HT); - nextProps.maxY = CALC_SCREEN_SPACE(-clippingBounds.min.y, SCREEN_HT); + screenClipperBoundingPoints(&clipper, gPortalOutline, sizeof(gPortalOutline) / sizeof(*gPortalOutline), &clippingBounds); - nextProps.minX = MAX(nextProps.minX, props->minX); - nextProps.maxX = MIN(nextProps.maxX, props->maxX); - nextProps.minY = MAX(nextProps.minY, props->minY); - nextProps.maxY = MIN(nextProps.maxY, props->maxY); + nextProps.minX = CALC_SCREEN_SPACE(clippingBounds.min.x, SCREEN_WD); + nextProps.maxX = CALC_SCREEN_SPACE(clippingBounds.max.x, SCREEN_WD); + nextProps.minY = CALC_SCREEN_SPACE(-clippingBounds.max.y, SCREEN_HT); + nextProps.maxY = CALC_SCREEN_SPACE(-clippingBounds.min.y, SCREEN_HT); + + nextProps.minX = MAX(nextProps.minX, props->minX); + nextProps.maxX = MIN(nextProps.maxX, props->maxX); + nextProps.minY = MAX(nextProps.minY, props->minY); + nextProps.maxY = MIN(nextProps.maxY, props->maxY); + } if (nextProps.minX < nextProps.maxX && nextProps.minY < nextProps.maxY) { renderPropsNext(props, &nextProps, &portal->transform, &otherPortal->transform, renderState); @@ -323,6 +332,7 @@ void portalRender(struct Portal* portal, struct Portal* otherPortal, struct Rend guMtxF2L(portalTransform, matrix); gSPMatrix(renderState->dl++, matrix, G_MTX_MODELVIEW | G_MTX_PUSH | G_MTX_MUL); + gSPDisplayList(renderState->dl++, portal_portal_face_model_gfx); gDPPipeSync(renderState->dl++); if (portal->flags & PortalFlagsOddParity) {