diff --git a/lib/rt64 b/lib/rt64 index 8cced1f..7880705 160000 --- a/lib/rt64 +++ b/lib/rt64 @@ -1 +1 @@ -Subproject commit 8cced1f560a5513595b0d32335ac36244b82a411 +Subproject commit 788070540da4254be6b242108528ba3789139d46 diff --git a/patches/actor_transform_tagging.c b/patches/actor_transform_tagging.c index 88532b2..003bddd 100644 --- a/patches/actor_transform_tagging.c +++ b/patches/actor_transform_tagging.c @@ -83,7 +83,7 @@ void Actor_Init(Actor* actor, PlayState* play) { Gfx* push_limb_matrix_group(Gfx* dlist, Actor* actor, u32 limb_index) { if (actor != NULL) { u32 cur_transform_id = actor_transform_id(actor); - gEXMatrixGroupDecomposed(dlist++, cur_transform_id + limb_index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(dlist++, cur_transform_id + limb_index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } return dlist; } @@ -92,7 +92,7 @@ Gfx* push_limb_matrix_group(Gfx* dlist, Actor* actor, u32 limb_index) { Gfx* push_post_limb_matrix_group(Gfx* dlist, Actor* actor, u32 limb_index) { if (actor != NULL) { u32 cur_transform_id = actor_transform_id(actor); - gEXMatrixGroupDecomposed(dlist++, cur_transform_id + limb_index + ACTOR_TRANSFORM_LIMB_COUNT, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(dlist++, cur_transform_id + limb_index + ACTOR_TRANSFORM_LIMB_COUNT, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } return dlist; } @@ -101,21 +101,21 @@ Gfx* push_post_limb_matrix_group(Gfx* dlist, Actor* actor, u32 limb_index) { Gfx* push_skin_limb_matrix_group(Gfx* dlist, Actor* actor, u32 limb_index) { if (actor != NULL) { u32 cur_transform_id = actor_transform_id(actor); - gEXMatrixGroupDecomposed(dlist++, cur_transform_id + limb_index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(dlist++, cur_transform_id + limb_index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } return dlist; } Gfx* pop_limb_matrix_group(Gfx* dlist, Actor* actor) { if (actor != NULL) { - gEXPopMatrixGroup(dlist++); + gEXPopMatrixGroup(dlist++, G_MTX_MODELVIEW); } return dlist; } Gfx* pop_post_limb_matrix_group(Gfx* dlist, Actor* actor) { if (actor != NULL) { - gEXPopMatrixGroup(dlist++); + gEXPopMatrixGroup(dlist++, G_MTX_MODELVIEW); } return dlist; } @@ -1159,18 +1159,18 @@ void tag_actor_displaylists(Actor* actor, PlayState* play, Gfx* opa_start, Gfx* if (opa_matrices == 1) { // Fill in the slot that was reserved for a transform id. - gEXMatrixGroupDecomposed(opa_start, cur_transform_id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(opa_start, cur_transform_id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); // Pop the matrix group. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } if (xlu_matrices == 1) { // Fill in the slot that was reserved for a transform id. - gEXMatrixGroupDecomposed(xlu_start, cur_transform_id + 1, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(xlu_start, cur_transform_id + 1, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); // Pop the matrix groups. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } diff --git a/patches/camera_transform_tagging.c b/patches/camera_transform_tagging.c index d93b5a0..0a94734 100644 --- a/patches/camera_transform_tagging.c +++ b/patches/camera_transform_tagging.c @@ -194,16 +194,16 @@ void View_Apply(View* view, s32 mask) { if (interpolate_camera) { // Simple interpolation works much better for cameras because they orbit around a focus. gEXMatrixGroupSimple(POLY_OPA_DISP++, CAMERA_TRANSFORM_ID, G_EX_NOPUSH, G_MTX_PROJECTION, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gEXMatrixGroupSimple(POLY_XLU_DISP++, CAMERA_TRANSFORM_ID, G_EX_NOPUSH, G_MTX_PROJECTION, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); } else { // Skip interpolation for this frame. gEXMatrixGroupSimple(POLY_OPA_DISP++, CAMERA_TRANSFORM_ID, G_EX_NOPUSH, G_MTX_PROJECTION, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gEXMatrixGroupSimple(POLY_XLU_DISP++, CAMERA_TRANSFORM_ID, G_EX_NOPUSH, G_MTX_PROJECTION, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); } // Record whether the camera was skipped for later use. diff --git a/patches/effect_patches.c b/patches/effect_patches.c index 7538708..cefac47 100644 --- a/patches/effect_patches.c +++ b/patches/effect_patches.c @@ -1,6 +1,8 @@ #include "patches.h" #include "graphics.h" #include "sys_cfb.h" +#include "z64view.h" +#include "transform_ids.h" extern TransitionOverlay gTransitionOverlayTable[]; extern Gfx sTransWipe3DL[]; @@ -132,7 +134,7 @@ void Actor_DrawLensOverlay(Gfx** gfxP, s32 lensMaskSize) { } -// @recomp Patched to prevent the telescope and lens effects from getting stretched wide. +// @recomp Patched to use ortho tris for interpolation and to prevent the telescope and lens effects from getting stretched wide. void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, s32 arg3, s32 masks, s32 maskt, f32 arg6) { Gfx* gfx = *gfxp; @@ -147,8 +149,7 @@ void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, gDPLoadTextureBlock_4b(gfx++, texture, fmt, width, height, 0, G_TX_MIRROR | G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); - gDPSetTileSize(gfx++, G_TX_RENDERTILE, ((SCREEN_WIDTH / 2) - width) << 2, ((SCREEN_HEIGHT / 2) - height) << 2, - ((SCREEN_WIDTH / 2) + (width - 1)) << 2, ((SCREEN_HEIGHT / 2) + (height - 1)) << 2); + gDPSetTileSize(gfx++, G_TX_RENDERTILE, 0, 0, ((width * 2) - 1) << 2, ((height * 2) - 1) << 2); s = ((1.0f - (1.0f / arg6)) * (SCREEN_WIDTH / 2)) + 70.0f; t = ((1.0f - (1.0f / arg6)) * (SCREEN_HEIGHT / 2)) + 50.0f; @@ -168,26 +169,77 @@ void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, dtdy = ((SCREEN_HEIGHT - (2.0f * t)) / gScreenHeight) * (1 << 10); } - // @recomp Calculate a new width for the rect to cover the entire widescreen contents. - // Add a little extra to prevent RT64 misalignment adjustment from making the rect smaller than the screen. - const u32 rt64_margin = 16; - s32 full_width = (s32)(recomp_get_aspect_ratio((float)xh / yh) * yh + rt64_margin); + // Push the old RDP/RSP params. + gEXPushProjectionMatrix(gfx++); + gEXPushGeometryMode(gfx++); + gEXMatrixGroupSimple(gfx++, CIRCLE_OVERLAY_TRANSFORM_PROJECTION_ID, G_EX_PUSH, G_MTX_PROJECTION, + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); + gEXMatrixGroupSimple(gfx++, CIRCLE_OVERLAY_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); - // @recomp Adjust the S-coordinate to account for the extra screen size on the left edge. - s32 extra_pixels = (full_width - SCREEN_WIDTH) / 2; - f32 extra_texcoords = (float)extra_pixels * dsdx / (1 << 10); - s -= (s32)extra_texcoords; + // Allocate a matrix and vertices in the displaylist because there's no handle to the GfxContext here. + Mtx* ortho_matrix = (Mtx*)(gfx + 1); + Mtx* model_matrix = ortho_matrix + 1; + Gfx* after_matrix = (Gfx*)(model_matrix + 4); + gSPBranchList(gfx++, after_matrix); + gfx = after_matrix; - // @recomp Patch the original rectangle to use the center as the origin to avoid getting stretched wide. - gEXSetScissorAlign(gfx++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_RIGHT, 0, 0, -gCfbWidth, 0, 0, 0, gCfbWidth, gCfbHeight); - gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, gCfbWidth, gCfbHeight); - gEXTextureRectangle(gfx++, G_EX_ORIGIN_LEFT, G_EX_ORIGIN_LEFT, - -rt64_margin / 2 * 4, 0, - full_width * 4, yh * 4, - G_TX_RENDERTILE, (s32)(s * (1 << 5)), (s32)(t * (1 << 5)), dsdx, dtdy); - // @recomp Reset scissor. - gEXSetScissorAlign(gfx++, G_EX_ORIGIN_NONE, G_EX_ORIGIN_NONE, 0, 0, 0, 0, 0, 0, gCfbWidth, gCfbHeight); - gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, gCfbWidth, gCfbHeight); + // Set up an ortho projection matrix. + guOrtho(ortho_matrix, -SCREEN_WIDTH / 2, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, -SCREEN_HEIGHT / 2, -1.0f, 1.0f, 1.0f); + gSPMatrix(gfx++, ortho_matrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + + // Set up a scale model matrix, using the original texcoord scaling to calculate the matrix's scale. + guScale(model_matrix, 1024.0f / dsdx, 1024.0f / dtdy, 1.0f); + gSPMatrix(gfx++, model_matrix, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + // Enable texturing and set geometry mode. + gSPTexture(gfx++, 0x8000 * width / 64, 0x8000 * height / 64, 0, G_TX_RENDERTILE, G_ON); + gSPLoadGeometryMode(gfx++, 0); + + static Vtx overlay_verts[] = { + // The quad that holds the lens itself. + {{{ -64, -64, 0}, 0, { 0, 0}, {0, 0, 0, 255}}}, + {{{ 64, -64, 0}, 0, {512 << 5, 0}, {0, 0, 0, 255}}}, + {{{ -64, 64, 0}, 0, { 0, 512 << 5}, {0, 0, 0, 255}}}, + {{{ 64, 64, 0}, 0, {512 << 5, 512 << 5}, {0, 0, 0, 255}}}, + // The top verts of the quad above the lens. + {{{ -64, -1000, 0}, 0, { 0, 0}, {0, 0, 0, 255}}}, + {{{ 64, -1000, 0}, 0, {512 << 5, 0}, {0, 0, 0, 255}}}, + // The bottom verts of the quad below the lens. + {{{ -64, 1000, 0}, 0, { 0, 512 << 5}, {0, 0, 0, 255}}}, + {{{ 64, 1000, 0}, 0, {512 << 5, 512 << 5}, {0, 0, 0, 255}}}, + // The left verts of the quad to the left of the lens. + {{{-4000, -1000, 0}, 0, { 0, 0}, {0, 0, 0, 255}}}, + {{{-4000, 1000, 0}, 0, { 0, 512 << 5}, {0, 0, 0, 255}}}, + // The right verts of the quad to the right of the lens. + {{{ 4000, -1000, 0}, 0, {512 << 5, 0}, {0, 0, 0, 255}}}, + {{{ 4000, 1000, 0}, 0, {512 << 5, 512 << 5}, {0, 0, 0, 255}}}, + }; + + // 8 4 5 10 + // 0 1 + // 2 3 + // 9 6 7 11 + + // Load the verts. + gSPVertex(gfx++, overlay_verts, ARRAY_COUNT(overlay_verts), 0); + // Draw the quad containing the lens overlay. + gSP2Triangles(gfx++, 0, 1, 3, 0x0, 0, 3, 2, 0x0); + // Draw the quad above the lens overlay. + gSP2Triangles(gfx++, 4, 5, 1, 0x0, 4, 1, 0, 0x0); + // Draw the quad below the lens overlay. + gSP2Triangles(gfx++, 2, 3, 7, 0x0, 2, 7, 6, 0x0); + // Draw the quad to the left of the lens overlay. + gSP2Triangles(gfx++, 8, 4, 6, 0x0, 8, 6, 9, 0x0); + // Draw the quad to the right of the lens overlay. + gSP2Triangles(gfx++, 5, 10, 11, 0x0, 5, 11, 7, 0x0); + + // Restore the old RDP/RSP params. + gEXPopProjectionMatrix(gfx++); + gEXPopGeometryMode(gfx++); + gSPPopMatrix(gfx++, G_MTX_MODELVIEW); + gEXPopMatrixGroup(gfx++, G_MTX_MODELVIEW); + gEXPopMatrixGroup(gfx++, G_MTX_PROJECTION); gDPPipeSync(gfx++); diff --git a/patches/effect_transform_tagging.c b/patches/effect_transform_tagging.c index f62deb0..3fc8b84 100644 --- a/patches/effect_transform_tagging.c +++ b/patches/effect_transform_tagging.c @@ -35,20 +35,18 @@ void EnTest7_Draw(Actor* thisx, PlayState* play) { OverrideKeyframeDrawScaled func_80AF31D0_relocated = (OverrideKeyframeDrawScaled)actor_relocate(thisx, func_80AF31D0); // @recomp Push the matrix group for the song of soaring's wings. - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, SOARING_WINGS_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, SOARING_WINGS_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); func_8018450C(play, &this->skeletonInfo, mtx, func_80AF31D0_relocated, NULL, &this->actor); // @recomp Pop the wings matrix group. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } // Draw windCapsule encasing that surrounds player after wings if (this->flags & OWL_WARP_FLAGS_DRAW_WIND_CAPSULE) { // @recomp Push the matrix group for the song of soaring's capsule. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, SOARING_CAPSULE_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, SOARING_CAPSULE_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); Matrix_Push(); Matrix_Translate(0.0f, 4000.0f, 0.0f, MTXMODE_APPLY); @@ -60,7 +58,7 @@ void EnTest7_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListXlu(play, gSoaringWarpCsWindCapsuleDL); // @recomp Pop the capsule matrix group. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); Matrix_Pop(); } @@ -306,18 +304,17 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) { // @recomp Check if the particle's interpolation should be skipped this frame. if (particle_skipped(this->unk_14C[i])) { // @recomp Tag the particle's transform to skip interpolation. - gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_MTX_MODELVIEW); + gEXMatrixGroupDecomposedSkip(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { // @recomp Tag the particle's matrix to interpolate normally. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } gSPDisplayList(POLY_XLU_DISP++, gEffDustDL); // @recomp Pop the particle transform tag. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } // @recomp Reset the particle's skip flag. @@ -374,13 +371,9 @@ extern EffectInfo sEffectInfoTable[]; static inline void tag_interpolate_effect(GraphicsContext* gfxCtx, u32 id) { OPEN_DISPS(gfxCtx); - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, id, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, id + EFFECT_TRANSFORM_ID_COUNT, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, id + EFFECT_TRANSFORM_ID_COUNT, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); CLOSE_DISPS(); } @@ -390,11 +383,11 @@ static inline void tag_skip_effect(GraphicsContext* gfxCtx, u32 id) { gEXMatrixGroupSimple(POLY_OPA_DISP++, id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gEXMatrixGroupSimple(POLY_XLU_DISP++, id + EFFECT_TRANSFORM_ID_COUNT, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); CLOSE_DISPS(); } @@ -402,8 +395,8 @@ static inline void tag_skip_effect(GraphicsContext* gfxCtx, u32 id) { static inline void pop_effect_tag(GraphicsContext* gfxCtx) { OPEN_DISPS(gfxCtx); - gEXPopMatrixGroup(POLY_OPA_DISP++); - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); CLOSE_DISPS(); } diff --git a/patches/item_transform_tagging.c b/patches/item_transform_tagging.c index d520eb3..c6f34d1 100644 --- a/patches/item_transform_tagging.c +++ b/patches/item_transform_tagging.c @@ -51,7 +51,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) { // @recomp Tag the matrices for the hookshot tip and chain. u32 cur_transform_id = actor_transform_id(thisx); gEXMatrixGroupSimple(POLY_OPA_DISP++, cur_transform_id, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, object_link_child_DL_01D960); @@ -68,7 +68,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) { func_801229A0(play, player); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); CLOSE_DISPS(play->state.gfxCtx); } @@ -110,7 +110,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* player, f32 hookshotDis // @recomp Tag the reticle's transform. gEXMatrixGroupSimple(OVERLAY_DISP++, HOOKSHOT_RETICLE_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); @@ -118,7 +118,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* player, f32 hookshotDis gSPDisplayList(OVERLAY_DISP++, gHookshotReticleDL); // @recomp Pop the reticle's transform tag. - gEXPopMatrixGroup(OVERLAY_DISP); + gEXPopMatrixGroup(OVERLAY_DISP, G_MTX_MODELVIEW); CLOSE_DISPS(play->state.gfxCtx); } @@ -176,9 +176,9 @@ void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList, gSPBranchList(enddl_command, bowstring_end_hook_dl); // Write the transform tag command. Use simple interpolation to avoid issues from decomposition failure due to a scale of zero. gEXMatrixGroupSimple(&bowstring_start_hook_dl[1], BOWSTRING_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); // Write the pop group command. - gEXPopMatrixGroup(&bowstring_end_hook_dl[0]); + gEXPopMatrixGroup(&bowstring_end_hook_dl[0], G_MTX_MODELVIEW); } } diff --git a/patches/particle_transform_tagging.c b/patches/particle_transform_tagging.c index 165ebc4..a0cbb3f 100644 --- a/patches/particle_transform_tagging.c +++ b/patches/particle_transform_tagging.c @@ -70,12 +70,12 @@ void EffectSS_DrawParticle(PlayState* play, s32 index) { // @recomp If this particle was just reset then skip interpolation. if (particle_reset_list[index]) { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR); - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedSkip(POLY_OPA_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); + gEXMatrixGroupDecomposedSkip(POLY_XLU_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, PARTICLE_TRANSFORM_ID_START + index, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } // @recomp Clear this particle's reset state. @@ -85,8 +85,8 @@ void EffectSS_DrawParticle(PlayState* play, s32 index) { entry->draw(play, index, entry); } - gEXPopMatrixGroup(POLY_OPA_DISP++); - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/patches/patches.h b/patches/patches.h index 93d4523..2c05139 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -11,8 +11,17 @@ #include "global.h" #include "rt64_extended_gbi.h" -#define gEXMatrixGroupInterpolateOnlyTiles(cmd, push, proj) \ - gEXMatrixGroup(cmd, G_EX_ID_IGNORE, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR) +#define gEXMatrixGroupInterpolateOnlyTiles(cmd, push, proj, edit) \ + gEXMatrixGroup(cmd, G_EX_ID_IGNORE, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) + +#define gEXMatrixGroupDecomposedNormal(cmd, id, push, proj, edit) \ + gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) + +#define gEXMatrixGroupDecomposedSkip(cmd, id, push, proj, edit) \ + gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) + +#define gEXMatrixGroupDecomposedVerts(cmd, id, push, proj, edit) \ + gEXMatrixGroupDecomposed(cmd, id, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) int recomp_printf(const char* fmt, ...); diff --git a/patches/sky_transform_tagging.c b/patches/sky_transform_tagging.c index a33a375..0a9c889 100644 --- a/patches/sky_transform_tagging.c +++ b/patches/sky_transform_tagging.c @@ -32,12 +32,10 @@ void Skybox_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId // @recomp Tag the skybox's matrix, skipping interpolation if the camera's interpolation was also skipped. if (camera_was_skipped()) { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, SKYBOX_TRANSFORM_ID_START, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedSkip(POLY_OPA_DISP++, SKYBOX_TRANSFORM_ID_START, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, SKYBOX_TRANSFORM_ID_START, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, SKYBOX_TRANSFORM_ID_START, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } gDPSetColorDither(POLY_OPA_DISP++, G_CD_MAGICSQ); @@ -63,7 +61,7 @@ void Skybox_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyboxId gDPPipeSync(POLY_OPA_DISP++); // @recomp Pop the skybox's matrix tag. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); CLOSE_DISPS(gfxCtx); } @@ -251,13 +249,13 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { if (imgWidth >= 2) { // @recomp Tag the star. gEXMatrixGroupSimple(gfx++, STAR_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); // @recomp Draw the star in 3D with a billboarded matrix. Environment_DrawSkyboxStarBillboard(play->state.gfxCtx, &billboard_mtx, &gfx, pos.x, pos.y, pos.z, imgWidth, imgWidth); // @recomp Pop the star's transform group. - gEXPopMatrixGroup(gfx++); + gEXPopMatrixGroup(gfx++, G_MTX_MODELVIEW); } } diff --git a/patches/specific_actor_transform_tagging.c b/patches/specific_actor_transform_tagging.c index 0c9fc8e..a91dfa5 100644 --- a/patches/specific_actor_transform_tagging.c +++ b/patches/specific_actor_transform_tagging.c @@ -76,13 +76,13 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) { gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(&D_80BB8458_relocated[i]->actor) + 0, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, gWartBubbleModelDL); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } @@ -104,13 +104,13 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) { gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(tanron2) + 1, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, gWartShadowModelDL); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } tanron2 = tanron2->next; } @@ -137,13 +137,13 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) { gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(tanron2) + 2, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, gEffWaterRippleDL); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } tanron2 = tanron2->next; } @@ -289,10 +289,10 @@ void Boss03_DrawEffects(PlayState* play) { // @recomp Tag this effect and clear its reset state. if (special_effect_reset_states[i]) { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedSkip(POLY_OPA_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } special_effect_reset_states[i] = false; @@ -300,7 +300,7 @@ void Boss03_DrawEffects(PlayState* play) { gSPDisplayList(POLY_OPA_DISP++, gGyorgBubbleModelDL); // @recomp Pop the effect's matrix group. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } } @@ -338,10 +338,10 @@ void Boss03_DrawEffects(PlayState* play) { // @recomp Tag this effect and clear its reset state. if (special_effect_reset_states[i]) { - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedSkip(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } special_effect_reset_states[i] = false; @@ -349,7 +349,7 @@ void Boss03_DrawEffects(PlayState* play) { gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_0042B0); // @recomp Pop the effect's matrix group. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } @@ -379,10 +379,10 @@ void Boss03_DrawEffects(PlayState* play) { // @recomp Tag this effect and clear its reset state. if (special_effect_reset_states[i]) { - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedSkip(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } else { - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, SPECIAL_EFFECTS_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); } special_effect_reset_states[i] = false; @@ -390,7 +390,7 @@ void Boss03_DrawEffects(PlayState* play) { gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_0042F8); // @recomp Pop the effect's matrix group. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } @@ -440,17 +440,14 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) { Matrix_Scale(this->unk_DC8[1].y, this->unk_DC8[1].z, this->unk_DC8[1].y, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + 0, - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + 0, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->unk_E2C); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_000420); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } Matrix_Pop(); @@ -461,17 +458,14 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) { Matrix_Scale(this->unk_DC8[2].y, this->unk_DC8[2].z, this->unk_DC8[2].y, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + 1, - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + 1, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->unk_E30); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_000730); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } Matrix_Pop(); } else { @@ -485,17 +479,14 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) { Matrix_Scale(this->unk_DC8[3].y, this->unk_DC8[3].z, this->unk_DC8[3].y, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + 2, - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + 2, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->unk_E34); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_000A48); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } Matrix_Pop(); @@ -507,17 +498,14 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) { Matrix_Scale(this->unk_DC8[4].y, this->unk_DC8[4].z, this->unk_DC8[4].y, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + 3, - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + 3, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->unk_E38); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_000CD8); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } if (this->actor.params == ENWATEREFFECT_TYPE_GYORG_RIPPLES) { @@ -542,17 +530,14 @@ void func_80A5A6B8(Actor* thisx, PlayState* play2) { Matrix_RotateYF(ptr->unk_2C.z, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + 4 + i, - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + 4 + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_0042F8); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } } @@ -603,16 +588,13 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) { Matrix_RotateZF(ptr->unk_2C.z, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + i + 0 * (ARRAY_COUNT(this->unk_144) / 2), - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + i + 0 * (ARRAY_COUNT(this->unk_144) / 2), G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_0042B0); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } @@ -638,16 +620,13 @@ void EnWaterEffect_Draw(Actor* thisx, PlayState* play2) { Matrix_RotateYF(ptr->unk_2C.z, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_XLU_DISP++, actor_id + i + 1 * (ARRAY_COUNT(this->unk_144) / 2), - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_XLU_DISP++, actor_id + i + 1 * (ARRAY_COUNT(this->unk_144) / 2), G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, object_water_effect_DL_0042F8); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } } @@ -675,16 +654,13 @@ void func_80B0C398(BossHakugin* this, PlayState* play) { Matrix_Scale(effect->unk_24, effect->unk_24, effect->unk_24, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, GOHT_ROCKS_TRANSFORM_ID_START + i + 0 * ARRAY_COUNT(this->unk_9F8), - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, GOHT_ROCKS_TRANSFORM_ID_START + i + 0 * ARRAY_COUNT(this->unk_9F8), G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gGohtRockModelDL); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } } @@ -696,16 +672,13 @@ void func_80B0C398(BossHakugin* this, PlayState* play) { Matrix_Scale(effect->unk_24, effect->unk_24, effect->unk_24, MTXMODE_APPLY); // @recomp Tag the transform. - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, GOHT_ROCKS_TRANSFORM_ID_START + i + 1 * ARRAY_COUNT(this->unk_9F8), - G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, GOHT_ROCKS_TRANSFORM_ID_START + i + 1 * ARRAY_COUNT(this->unk_9F8), G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gGohtStalactiteModelDL); // @recomp Pop the transform id. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } } diff --git a/patches/terrain_transform_tagging.c b/patches/terrain_transform_tagging.c index 39745f7..bc83b13 100644 --- a/patches/terrain_transform_tagging.c +++ b/patches/terrain_transform_tagging.c @@ -14,10 +14,10 @@ void Room_Draw(PlayState* play, Room* room, u32 flags) { // @recomp Tag the room's matrices if applicable. // Tag terrain as being ignored for interpolation, which prevents interpolation glitches where some pieces of terrain swap places when one comes into view. if (flags & ROOM_DRAW_OPA) { - gEXMatrixGroupInterpolateOnlyTiles(POLY_OPA_DISP++, G_EX_PUSH, G_MTX_MODELVIEW); + gEXMatrixGroupInterpolateOnlyTiles(POLY_OPA_DISP++, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } if (flags & ROOM_DRAW_XLU) { - gEXMatrixGroupInterpolateOnlyTiles(POLY_XLU_DISP++, G_EX_PUSH, G_MTX_MODELVIEW); + gEXMatrixGroupInterpolateOnlyTiles(POLY_XLU_DISP++, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } CLOSE_DISPS(play->state.gfxCtx); @@ -28,10 +28,10 @@ void Room_Draw(PlayState* play, Room* room, u32 flags) { // @recomp Pop the room's matrix tags if applicable. if (flags & ROOM_DRAW_OPA) { - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); } if (flags & ROOM_DRAW_XLU) { - gEXPopMatrixGroup(POLY_XLU_DISP++); + gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW); } CLOSE_DISPS(play->state.gfxCtx); diff --git a/patches/transform_ids.h b/patches/transform_ids.h index 2990615..867e0f6 100644 --- a/patches/transform_ids.h +++ b/patches/transform_ids.h @@ -2,7 +2,8 @@ #define __TRANSFORM_IDS_H__ #define CAMERA_TRANSFORM_ID 0x10U -#define STAR_PROJECTION_TRANSFORM_ID 0x11U +#define CIRCLE_OVERLAY_TRANSFORM_ID 0x11U +#define CIRCLE_OVERLAY_TRANSFORM_PROJECTION_ID 0x12U #define SKYBOX_TRANSFORM_ID_START 0x100U diff --git a/patches/ui_transform_tagging.c b/patches/ui_transform_tagging.c index 538a0c7..e4e47da 100644 --- a/patches/ui_transform_tagging.c +++ b/patches/ui_transform_tagging.c @@ -49,8 +49,7 @@ void KaleidoScope_DrawCursor(PlayState* play) { Matrix_Translate(kaleido_f32(&sCursorCirclesX[i]), kaleido_f32(&sCursorCirclesY[i]), -50.0f, MTXMODE_APPLY); // @recomp Tag the current pause cursor segment. - gEXMatrixGroupDecomposed(POLY_OPA_DISP++, PAUSE_CURSOR_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, - G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR); + gEXMatrixGroupDecomposedVerts(POLY_OPA_DISP++, PAUSE_CURSOR_TRANSFORM_ID_START + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPPipeSync(POLY_OPA_DISP++); @@ -61,7 +60,7 @@ void KaleidoScope_DrawCursor(PlayState* play) { gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); // @recomp Pop the pause cursor segment's transform id. - gEXPopMatrixGroup(POLY_OPA_DISP++); + gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW); Matrix_Pop(); }