From d824c42317aab375d0074eb1b075c2ce8c5e6482 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Mon, 14 Nov 2022 08:30:14 -0700 Subject: [PATCH] finally unbork the new render plan --- src/scene/portal.c | 4 +++- src/scene/portal.h | 1 + src/scene/render_plan.c | 48 ++++++++++++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/scene/portal.c b/src/scene/portal.c index 898aa4f..9dc80b7 100644 --- a/src/scene/portal.c +++ b/src/scene/portal.c @@ -54,7 +54,7 @@ void renderPropsInit(struct RenderProps* props, struct Camera* camera, float asp props->camera = *camera; props->aspectRatio = aspectRatio; cameraSetupMatrices(camera, renderState, aspectRatio, &fullscreenViewport, &props->cameraMatrixInfo); - + props->viewport = &fullscreenViewport; props->currentDepth = STARTING_RENDER_DEPTH; props->exitPortalIndex = NO_PORTAL; @@ -100,6 +100,8 @@ void renderPropsInit(struct RenderProps* props, struct Camera* camera, float asp props->maxY = SCREEN_HT; props->previousProperties = NULL; + props->nextProperites[0] = NULL; + props->nextProperites[1] = NULL; props->portalRenderType = 0; } diff --git a/src/scene/portal.h b/src/scene/portal.h index f27210b..e395544 100644 --- a/src/scene/portal.h +++ b/src/scene/portal.h @@ -68,6 +68,7 @@ struct RenderProps { u64 visiblerooms; struct RenderProps* previousProperties; + struct RenderProps* nextProperites[2]; struct ScreenClipper clipper; }; diff --git a/src/scene/render_plan.c b/src/scene/render_plan.c index 3052fef..137f28d 100644 --- a/src/scene/render_plan.c +++ b/src/scene/render_plan.c @@ -21,7 +21,7 @@ extern struct Vector3 gPortalOutline[PORTAL_LOOP_SIZE]; #define CALC_SCREEN_SPACE(clip_space, screen_size) ((clip_space + 1.0f) * ((screen_size) / 2)) -int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct RenderProps* current, int portalIndex, struct RenderState* renderState) { +int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct RenderProps* current, int portalIndex, struct RenderProps** prevSiblingPtr, struct RenderState* renderState) { int exitPortalIndex = 1 - portalIndex; struct Portal* portal = &scene->portals[portalIndex]; @@ -74,6 +74,16 @@ int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct next->maxY = MIN(next->maxY, current->maxY); } + struct RenderProps* prevSibling = prevSiblingPtr ? *prevSiblingPtr : NULL; + + if (prevSibling) { + if (next->minX < prevSibling->minX) { + next->maxX = MIN(next->maxX, prevSibling->minX); + } else { + next->minX = MAX(next->minX, prevSibling->maxX); + } + } + if (next->minX >= next->maxX || next->minY >= next->maxY) { return 0; } @@ -133,9 +143,14 @@ int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct ++renderPlan->stageCount; next->previousProperties = current; + current->nextProperites[portalIndex] = next; + next->nextProperites[0] = NULL; + next->nextProperites[1] = NULL; next->portalRenderType = 0; + *prevSiblingPtr = next; + renderPlanFinishView(renderPlan, scene, next, renderState); return flags | PORTAL_RENDER_TYPE_ENABLED(portalIndex); @@ -145,27 +160,32 @@ void renderPlanFinishView(struct RenderPlan* renderPlan, struct Scene* scene, st staticRenderDetermineVisibleRooms(&properties->cameraMatrixInfo.cullingInformation, properties->fromRoom, &properties->visiblerooms); - int furtherPortal = vector3DistSqrd(&properties->camera.transform.position, &scene->portals[0].transform.position) > vector3DistSqrd(&properties->camera.transform.position, &scene->portals[1].transform.position) ? 0 : 1; - int otherPortal = 1 - furtherPortal; + int closerPortal = vector3DistSqrd(&properties->camera.transform.position, &scene->portals[0].transform.position) < vector3DistSqrd(&properties->camera.transform.position, &scene->portals[1].transform.position) ? 0 : 1; + int otherPortal = 1 - closerPortal; - if (!furtherPortal) { + if (closerPortal) { properties->portalRenderType |= PORTAL_RENDER_TYPE_SECOND_CLOSER; } + struct RenderProps* prevSibling = NULL; + for (int i = 0; i < 2; ++i) { - if (gCollisionScene.portalTransforms[furtherPortal] && - properties->exitPortalIndex != furtherPortal && - staticRenderIsRoomVisible(properties->visiblerooms, gCollisionScene.portalRooms[furtherPortal])) { - properties->portalRenderType |= renderPlanPortal( + if (gCollisionScene.portalTransforms[closerPortal] && + properties->exitPortalIndex != closerPortal && + staticRenderIsRoomVisible(properties->visiblerooms, gCollisionScene.portalRooms[closerPortal])) { + int planResult = renderPlanPortal( renderPlan, scene, properties, - furtherPortal, + closerPortal, + &prevSibling, renderState ); + + properties->portalRenderType |= planResult; } - furtherPortal = 1 - furtherPortal; + closerPortal = 1 - closerPortal; otherPortal = 1 - otherPortal; } } @@ -196,7 +216,9 @@ void renderPlanExecute(struct RenderPlan* renderPlan, struct Scene* scene, struc struct Portal* portal = &scene->portals[portalIndex]; portalDetermineTransform(portal, portalTransform); - if (current->portalRenderType & PORTAL_RENDER_TYPE_ENABLED(portalIndex)) { + struct RenderProps* portalProps = current->nextProperites[portalIndex]; + + if (portalProps && current->portalRenderType & PORTAL_RENDER_TYPE_ENABLED(portalIndex)) { // render the front portal cover Mtx* matrix = renderStateRequestMatrices(renderState, 1); @@ -211,13 +233,13 @@ void renderPlanExecute(struct RenderPlan* renderPlan, struct Scene* scene, struc if (portal->flags & PortalFlagsOddParity) { gSPDisplayList(renderState->dl++, portal_portal_blue_face_model_gfx); - portalRenderScreenCover(current->clipper.nearPolygon, current->clipper.nearPolygonCount, current, renderState); + portalRenderScreenCover(portalProps->clipper.nearPolygon, portalProps->clipper.nearPolygonCount, current, renderState); gDPPipeSync(renderState->dl++); gSPDisplayList(renderState->dl++, portal_portal_blue_model_gfx); } else { gSPDisplayList(renderState->dl++, portal_portal_orange_face_model_gfx); - portalRenderScreenCover(current->clipper.nearPolygon, current->clipper.nearPolygonCount, current, renderState); + portalRenderScreenCover(portalProps->clipper.nearPolygon, portalProps->clipper.nearPolygonCount, current, renderState); gDPPipeSync(renderState->dl++); gSPDisplayList(renderState->dl++, portal_portal_orange_model_gfx);