From 07998cb006ac79f822c873e8464b0527349bcfb5 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Wed, 9 Jul 2025 14:59:39 -0400 Subject: [PATCH] Moved core1 overlay load into boot___osInitialize_common and reset inverse view matrix for ortho view matrices --- banjo.us.rev0.toml | 1 - patches/overlay_loading.c | 39 +++++-------------------------------- patches/transform_tagging.c | 25 ++++++++++++++++++++++++ src/game/recomp_api.cpp | 2 -- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/banjo.us.rev0.toml b/banjo.us.rev0.toml index 7d92012..5467751 100644 --- a/banjo.us.rev0.toml +++ b/banjo.us.rev0.toml @@ -32,7 +32,6 @@ ignored = [ "boot___ull_divremi", "boot___ull_rem", "boot___ull_rshift", - "boot___osInitialize_common", "boot_osPiRawStartDma", "boot_osPiGetStatus", "boot___osSetSR", diff --git a/patches/overlay_loading.c b/patches/overlay_loading.c index f4b1843..5f7f1ac 100644 --- a/patches/overlay_loading.c +++ b/patches/overlay_loading.c @@ -54,37 +54,8 @@ MAKE_OVERLAYS() #define OVERLAY_END(ovl) boot_##ovl##_rzip_ROM_END // @recomp Patched to load overlays, prefixed with boot_ to account for the decomp build system. -RECOMP_PATCH void boot_overlay_table_init(void) { - gOverlayTable[ 0].start = OVERLAY_START(core2); - gOverlayTable[ 0].end = OVERLAY_END(core2); - gOverlayTable[ 1].start = OVERLAY_START(emptyLvl); - gOverlayTable[ 1].end = OVERLAY_END(emptyLvl); - gOverlayTable[ 2].start = OVERLAY_START(CC); - gOverlayTable[ 2].end = OVERLAY_END(CC); - gOverlayTable[ 3].start = OVERLAY_START(MMM); - gOverlayTable[ 3].end = OVERLAY_END(MMM); - gOverlayTable[ 4].start = OVERLAY_START(GV); - gOverlayTable[ 4].end = OVERLAY_END(GV); - gOverlayTable[ 5].start = OVERLAY_START(TTC); - gOverlayTable[ 5].end = OVERLAY_END(TTC); - gOverlayTable[ 6].start = OVERLAY_START(MM); - gOverlayTable[ 6].end = OVERLAY_END(MM); - gOverlayTable[ 7].start = OVERLAY_START(BGS); - gOverlayTable[ 7].end = OVERLAY_END(BGS); - gOverlayTable[ 8].start = OVERLAY_START(RBB); - gOverlayTable[ 8].end = OVERLAY_END(RBB); - gOverlayTable[ 9].start = OVERLAY_START(FP); - gOverlayTable[ 9].end = OVERLAY_END(FP); - gOverlayTable[10].start = OVERLAY_START(CCW); - gOverlayTable[10].end = OVERLAY_END(CCW); - gOverlayTable[11].start = OVERLAY_START(SM); - gOverlayTable[11].end = OVERLAY_END(SM); - gOverlayTable[12].start = OVERLAY_START(cutscenes); - gOverlayTable[12].end = OVERLAY_END(cutscenes); - gOverlayTable[13].start = OVERLAY_START(lair); - gOverlayTable[13].end = OVERLAY_END(lair); - gOverlayTable[14].start = OVERLAY_START(fight); - gOverlayTable[14].end = OVERLAY_END(fight); +RECOMP_PATCH void boot___osInitialize_common(void) { + // Nothing of the original function needs to happen, so the body can be empty besides the overlay load. // @recomp Load core1. recomp_load_overlays_by_rom((u32)core1_ROM_START, core1_VRAM, core1_ROM_END - core1_ROM_START); @@ -113,7 +84,7 @@ RECOMP_PATCH void overlay_load( u32 uncompressed_rom_start = rom_start; u32 uncompressed_rom_size = rom_end - rom_start; u32 overlay_vram_start = ram_start; - void* sp34; + u8* sp34; u32 sp30; u32 sp2C; u32 *tmp; @@ -137,10 +108,10 @@ RECOMP_PATCH void overlay_load( sp34 = &D_8002D500; } piMgr_read(sp34, rom_start, rom_end - rom_start); - rarezip_uncompress(&sp34, &ram_start); + rarezip_uncompress(&sp34, (u8**)&ram_start); sp2C = D_8027BF2C; sp30 = D_8027BF30; - rarezip_uncompress(&sp34, &ram_start); + rarezip_uncompress(&sp34, (u8**)&ram_start); if(bss_start){ bzero((void*)bss_start, bss_end - bss_start); diff --git a/patches/transform_tagging.c b/patches/transform_tagging.c index 8cb92ce..d2c6b62 100644 --- a/patches/transform_tagging.c +++ b/patches/transform_tagging.c @@ -71,6 +71,10 @@ void ml_vec3f_copy(f32 dst[3], f32 src[3]); // sViewportPosition[2] = z; // } +extern Vp sViewportStack[]; +extern s32 sViewportStackIndex; + +// @recomp Patched to set up an inverse view matrix for better transform interpolation. RECOMP_PATCH void viewport_setRenderPerspectiveMatrix(Gfx **gfx, Mtx **mtx, f32 near, f32 far) { u16 perspNorm; @@ -105,6 +109,27 @@ RECOMP_PATCH void viewport_setRenderPerspectiveMatrix(Gfx **gfx, Mtx **mtx, f32 gEXSetInvViewMatrixFloat((*gfx)++, invView->m); } +float identity_matrix[4][4] = { + { 1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f, 1.0f } +}; + +// @recomp Patched to set up an identity inverse view matrix to prevent bleeding the perspective projection's inverse view matrix. +RECOMP_PATCH void viewport_setRenderViewportAndOrthoMatrix(Gfx **gfx, Mtx **mtx) { + gSPViewport((*gfx)++, &sViewportStack[sViewportStackIndex]); + + guOrtho(*mtx, -(2*(f32)gFramebufferWidth), (2*(f32)gFramebufferWidth), -(2*(f32)gFramebufferHeight), (2*(f32)gFramebufferHeight), 1.0f, 20.0f, 1.0f); + gSPMatrix((*gfx)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + + guTranslate(*mtx, 0.0f, 0.0f, 0.0f); + gSPMatrix((*gfx)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + // @recomp Set an identity inverse view matrix. + gEXSetInvViewMatrixFloat((*gfx)++, identity_matrix); +} + typedef void (*GeoListFunc)(Gfx **, Mtx **, void *); typedef struct { diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index 45b151b..0469127 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -215,8 +215,6 @@ extern "C" void osPiReadIo_recomp(RDRAM_ARG recomp_context * ctx) { ctx->r2 = 0; } -extern "C" void boot___osInitialize_common(uint8_t* rdram, recomp_context* ctx) {} - extern "C" void boot_osPiGetStatus(uint8_t* rdram, recomp_context* ctx) { // PI not busy ctx->r2 = 0;