From 575d860e5de99b5a529a9ad646c510d990a8fb43 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Thu, 7 Aug 2025 11:27:14 -0600 Subject: [PATCH] Combine Matrix Stacks & use std::deque Instead of std::vector to Prevent Dangling Pointers (#525) * Update Matrix.cpp * Update World.h * Stak * Hopefully done with matrix --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com> --- src/code_80057C60.c | 33 +++++----- src/ending/code_80280000.c | 8 +-- src/ending/code_80281C40.c | 9 +-- src/engine/HM_Intro.cpp | 14 +++-- src/engine/Matrix.cpp | 67 ++++++++++----------- src/engine/Matrix.h | 13 ++-- src/engine/World.h | 23 ++++--- src/engine/objects/Trophy.cpp | 6 +- src/main.c | 1 - src/math_util_2.c | 12 ++-- src/menu_items.c | 27 ++++----- src/player_controller.c | 6 +- src/port/interpolation/FrameInterpolation.h | 3 + src/racing/render_courses.c | 22 ++++--- src/racing/skybox_and_splitscreen.c | 37 +++++++----- src/render_objects.c | 14 ++--- src/render_objects.h | 2 +- src/render_player.c | 49 +++++++-------- 18 files changed, 180 insertions(+), 166 deletions(-) diff --git a/src/code_80057C60.c b/src/code_80057C60.c index 90fc552df..9f56a9fee 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -544,9 +544,10 @@ void render_object(u32 arg0) { void render_object_p1(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), + + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); // if (gGamestate == ENDING) { @@ -562,9 +563,9 @@ void render_object_p1(void) { void render_object_p2(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); // render_bomb_karts_wrap(PLAYER_TWO); render_object_for_player(PLAYER_TWO); @@ -572,9 +573,9 @@ void render_object_p2(void) { void render_object_p3(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[2]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); // render_bomb_karts_wrap(PLAYER_THREE); render_object_for_player(PLAYER_THREE); @@ -583,9 +584,9 @@ void render_object_p3(void) { void render_object_p4(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[3]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); // render_bomb_karts_wrap(PLAYER_FOUR); if ((!gDemoMode) && (gPlayerCountSelection1 == 4)) { @@ -639,9 +640,9 @@ void render_player_snow_effect(u32 arg0) { void render_player_snow_effect_one(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); if (gGamestate != ENDING) { render_snowing_effect(PLAYER_ONE); @@ -650,27 +651,27 @@ void render_player_snow_effect_one(void) { void render_player_snow_effect_two(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[1]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); render_snowing_effect(PLAYER_TWO); } void render_player_snow_effect_three(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[2]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); render_snowing_effect(PLAYER_THREE); } void render_player_snow_effect_four(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[3]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); render_snowing_effect(PLAYER_FOUR); } diff --git a/src/ending/code_80280000.c b/src/ending/code_80280000.c index be1706ed5..afca94f69 100644 --- a/src/ending/code_80280000.c +++ b/src/ending/code_80280000.c @@ -57,13 +57,13 @@ void func_80280038(void) { func_80057FC4(0); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); + guPerspective(GetPerspMatrix(0), &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt(&gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], + guLookAt(GetLookAtMatrix(0), camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); gCurrentCourseId = gCreditsCourseId; SetCourseById(gCreditsCourseId); diff --git a/src/ending/code_80281C40.c b/src/ending/code_80281C40.c index 18507f23b..dff4fd9e6 100644 --- a/src/ending/code_80281C40.c +++ b/src/ending/code_80281C40.c @@ -15,6 +15,7 @@ #include "defines.h" #include "memory.h" +#include "engine/Matrix.h" #include "engine/courses/Course.h" #include "port/Game.h" @@ -72,14 +73,14 @@ void func_80281D00(void) { } func_8028150C(); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, + guPerspective(GetPerspMatrix(0), &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - guLookAt((Mtx*) &gGfxPool->mtxLookAt[0], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], + guLookAt(GetLookAtMatrix(0), camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); mtxf_identity(matrix); render_set_position(matrix, 0); diff --git a/src/engine/HM_Intro.cpp b/src/engine/HM_Intro.cpp index 67e8c4749..51d3d2bbd 100644 --- a/src/engine/HM_Intro.cpp +++ b/src/engine/HM_Intro.cpp @@ -2,6 +2,7 @@ #include #include "HM_Intro.h" +#include "engine/Matrix.h" #include "port/Game.h" #include "port/interpolation/FrameInterpolation.h" @@ -119,8 +120,6 @@ void HarbourMastersIntro::HM_DrawIntro() { //FrameInterpolation_ShouldInterpolateFrame(false); HarbourMastersIntro::Setup(); - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxLookAt[0], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); gDPSetEnvColor(gDisplayListHead++, 0x00, 0x00, 0x00, 0x00); @@ -170,11 +169,18 @@ void HarbourMastersIntro::HM_DrawIntro() { void HarbourMastersIntro::Setup() { u16 perspNorm; + move_segment_table_to_dmem(); gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - guPerspective(&gGfxPool->mtxScreen, &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); + + // Setup camera perspective + guPerspective(GetPerspMatrix(0), &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - guLookAt(&gGfxPool->mtxLookAt[0], _camera.Pos.x, _camera.Pos.y, _camera.Pos.z, _camera.LookAt.x, _camera.LookAt.y, _camera.LookAt.z, 0.0f, 1.0f, 0.0f); + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + + // Setup camera lookAt + guLookAt(GetLookAtMatrix(0), _camera.Pos.x, _camera.Pos.y, _camera.Pos.z, _camera.LookAt.x, _camera.LookAt.y, _camera.LookAt.z, 0.0f, 1.0f, 0.0f); + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); diff --git a/src/engine/Matrix.cpp b/src/engine/Matrix.cpp index 487c34127..954b0fd90 100644 --- a/src/engine/Matrix.cpp +++ b/src/engine/Matrix.cpp @@ -9,7 +9,7 @@ extern "C" { #include "math_util_2.h" } -void AddMatrix(std::vector& stack, Mat4 mtx, s32 flags) { +void AddMatrix(std::deque& stack, Mat4 mtx, s32 flags) { // Push a new matrix to the stack stack.emplace_back(); @@ -21,15 +21,16 @@ void AddMatrix(std::vector& stack, Mat4 mtx, s32 flags) { gSPMatrix(gDisplayListHead++, &stack.back(), flags); } -Mtx* GetMatrix(std::vector& stack) { +Mtx* GetMatrix(std::deque& stack) { stack.emplace_back(); return &stack.back(); } /** - * Use GetMatrix() first + * Push a fixed point matrix to the stack + * Use GetMatrix() before calling this */ -void AddMatrixFixed(std::vector& stack, s32 flags) { +void AddMatrixFixed(std::deque& stack, s32 flags) { // Load the matrix gSPMatrix(gDisplayListHead++, &stack.back(), flags); } @@ -58,14 +59,14 @@ void SetTextMatrix(Mat4 mf, f32 x, f32 y, f32 arg3, f32 arg4) { // AddMatrix but with custom gfx ptr arg and flags are predefined Gfx* AddTextMatrix(Gfx* displayListHead, Mat4 mtx) { // Push a new matrix to the stack - gWorldInstance.Mtx.Effects.emplace_back(); + gWorldInstance.Mtx.Objects.emplace_back(); // Convert to a fixed-point matrix - FrameInterpolation_RecordMatrixMtxFToMtx((MtxF*)mtx, &gWorldInstance.Mtx.Effects.back()); - guMtxF2L(mtx, &gWorldInstance.Mtx.Effects.back()); + FrameInterpolation_RecordMatrixMtxFToMtx((MtxF*)mtx, &gWorldInstance.Mtx.Objects.back()); + guMtxF2L(mtx, &gWorldInstance.Mtx.Objects.back()); // Load the matrix - gSPMatrix(displayListHead++, &gWorldInstance.Mtx.Effects.back(), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(displayListHead++, &gWorldInstance.Mtx.Objects.back(), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); return displayListHead; } @@ -145,39 +146,43 @@ void AddLocalRotation(Mat4 mat, IRotator rot) { extern "C" { void AddHudMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.Hud, mtx, flags); + AddMatrix(gWorldInstance.Mtx.Objects, mtx, flags); } - void AddPerspMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.Persp, mtx, flags); + Mtx* GetScreenMatrix(void) { + return &gWorldInstance.Mtx.Screen2D; } - void AddLookAtMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.LookAt, mtx, flags); + Mtx* GetOrthoMatrix(void) { + return &gWorldInstance.Mtx.Ortho; + } + + Mtx* GetPerspMatrix(size_t cameraId) { + return &gWorldInstance.Mtx.Persp[cameraId]; + } + + Mtx* GetLookAtMatrix(size_t cameraId) { + return &gWorldInstance.Mtx.LookAt[cameraId]; } void AddObjectMatrix(Mat4 mtx, s32 flags) { AddMatrix(gWorldInstance.Mtx.Objects, mtx, flags); } - void AddShadowMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.Shadows, mtx, flags); + Mtx* GetShadowMatrix(size_t playerId) { + return &gWorldInstance.Mtx.Shadows[playerId]; } - void AddKartMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.Karts, mtx, flags); + Mtx* GetKartMatrix(size_t playerId) { + return &gWorldInstance.Mtx.Karts[playerId]; } void AddEffectMatrix(Mat4 mtx, s32 flags) { - AddMatrix(gWorldInstance.Mtx.Effects, mtx, flags); - } - - void AddEffectMatrixFixed(s32 flags) { - AddMatrixFixed(gWorldInstance.Mtx.Effects, flags); + AddMatrix(gWorldInstance.Mtx.Objects, mtx, flags); } void AddEffectMatrixOrtho(void) { - auto& stack = gWorldInstance.Mtx.Effects; + auto& stack = gWorldInstance.Mtx.Objects; stack.emplace_back(); guOrtho(&stack.back(), 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f); @@ -186,7 +191,7 @@ extern "C" { } Mtx* GetEffectMatrix(void) { - return GetMatrix(gWorldInstance.Mtx.Effects); + return GetMatrix(gWorldInstance.Mtx.Objects); } @@ -195,18 +200,10 @@ extern "C" { * We might need to adjust which ones we clear. */ void ClearMatrixPools(void) { - gWorldInstance.Mtx.Hud.clear(); gWorldInstance.Mtx.Objects.clear(); - gWorldInstance.Mtx.Shadows.clear(); - gWorldInstance.Mtx.Karts.clear(); - gWorldInstance.Mtx.Effects.clear(); - } - - void ClearHudMatrixPool(void) { - gWorldInstance.Mtx.Hud.clear(); - } - void ClearEffectsMatrixPool(void) { - gWorldInstance.Mtx.Effects.clear(); + // gWorldInstance.Mtx.Shadows.clear(); + //gWorldInstance.Mtx.Karts.clear(); + // gWorldInstance.Mtx.Effects.clear(); } void ClearObjectsMatrixPool(void) { diff --git a/src/engine/Matrix.h b/src/engine/Matrix.h index a1e943a40..ede94b5b0 100644 --- a/src/engine/Matrix.h +++ b/src/engine/Matrix.h @@ -16,15 +16,20 @@ void AddHudMatrix(Mat4 mtx, s32 flags); void AddObjectMatrix(Mat4 mtx, s32 flags); void AddEffectMatrix(Mat4 mtx, s32 flags); void AddEffectMatrixOrtho(void); -void AddEffectMatrixFixed(s32 flags); + +Mtx* GetScreenMatrix(void); // Orthogonal projection for UI, skybox, etc. +Mtx* GetOrthoMatrix(void); +Mtx* GetPerspMatrix(size_t cameraId); +Mtx* GetLookAtMatrix(size_t cameraId); + +Mtx* GetKartMatrix(size_t playerId); +Mtx* GetShadowMatrix(size_t playerId); + void SetTextMatrix(Mat4 mf, f32 arg1, f32 arg2, f32 arg3, f32 arg4); Gfx* AddTextMatrix(Gfx* displayListHead, Mat4 mtx); Mtx* GetEffectMatrix(void); -void ClearHudMatrixPool(void); -void ClearEffectsMatrixPool(void); void ClearObjectsMatrixPool(void); void AddKartMatrix(Mat4 mtx, s32 flags); -void AddShadowMatrix(Mat4 mtx, s32 flags); #ifdef __cplusplus } diff --git a/src/engine/World.h b/src/engine/World.h index fd56fa031..bd55a5166 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -40,15 +40,20 @@ class OLakitu; class GameObject; // <-- Editor class World { - typedef struct { - std::vector Hud; - std::vector Objects; - std::vector Shadows; - std::vector Karts; - std::vector Effects; - std::vector Persp; - std::vector LookAt; - } Matrix; +typedef struct Matrix { + Mtx Screen2D; // Orthogonal projection for UI, skybox, and such + Mtx Ortho; + std::array Persp; + std::array LookAt; + std::array Karts; // Eight players * four screens + std::array Shadows; // Eight players * four screens + std::deque Hud; + std::deque Objects; + + Matrix() + : Hud(200), Objects(1000) + {} +}; public: explicit World(); diff --git a/src/engine/objects/Trophy.cpp b/src/engine/objects/Trophy.cpp index 778a07213..e3713158d 100644 --- a/src/engine/objects/Trophy.cpp +++ b/src/engine/objects/Trophy.cpp @@ -221,9 +221,9 @@ void OTrophy::Draw(s32 cameraId) { if (*_toggleVisibility == true) { object = &gObjectList[listIndex]; if (object->state >= 2) { - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); mtxf_set_matrix_transformation(someMatrix1, object->pos, object->direction_angle, object->sizeScaling); //convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], someMatrix1); @@ -234,7 +234,7 @@ void OTrophy::Draw(s32 cameraId) { gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D0077A0); gSPDisplayList(gDisplayListHead++, object->model); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); mtxf_identity(someMatrix2); render_set_position(someMatrix2, 0); diff --git a/src/main.c b/src/main.c index 4031da633..8fefa60f3 100644 --- a/src/main.c +++ b/src/main.c @@ -803,7 +803,6 @@ void process_game_tick(void) { void race_logic_loop(void) { ClearMatrixPools(); ClearObjectsMatrixPool(); - ClearEffectsMatrixPool(); Editor_ClearMatrix(); gMatrixObjectCount = 0; gMatrixEffectCount = 0; diff --git a/src/math_util_2.c b/src/math_util_2.c index 7d1bc638e..a12d06d61 100644 --- a/src/math_util_2.c +++ b/src/math_util_2.c @@ -610,27 +610,27 @@ void func_80041D34(void) { guOrtho(&D_80183D60, 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); switch (gActiveScreenMode) { case SCREEN_MODE_1P: - guOrtho(&gGfxPool->mtxOrtho, 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); + guOrtho(GetOrthoMatrix(), 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); break; case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL: - guOrtho(&gGfxPool->mtxOrtho, 0.0f, 160.0f, 120.0f, 0.0f, -1.0f, 1.0f, 1.0f); + guOrtho(GetOrthoMatrix(), 0.0f, 160.0f, 120.0f, 0.0f, -1.0f, 1.0f, 1.0f); break; case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: if (D_801658FE == 0) { - guOrtho(&gGfxPool->mtxOrtho, 0.0f, 320.0f, 120.0f, 0.0f, -1.0f, 1.0f, 1.0f); + guOrtho(GetOrthoMatrix(), 0.0f, 320.0f, 120.0f, 0.0f, -1.0f, 1.0f, 1.0f); } else { - guOrtho(&gGfxPool->mtxOrtho, 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); + guOrtho(GetOrthoMatrix(), 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); } break; case SCREEN_MODE_3P_4P_SPLITSCREEN: - guOrtho(&gGfxPool->mtxOrtho, 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); + guOrtho(GetOrthoMatrix(), 0.0f, 320.0f, 240.0f, 0.0f, -1.0f, 1.0f, 1.0f); break; } } void set_matrix_hud_screen(void) { gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxOrtho), + gSPMatrix(gDisplayListHead++, GetOrthoMatrix(), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); } diff --git a/src/menu_items.c b/src/menu_items.c index 3c42121ce..10aecd04b 100644 --- a/src/menu_items.c +++ b/src/menu_items.c @@ -2438,7 +2438,7 @@ void func_80093C98(s32 arg0) { func_8009CA6C(4); D_80165754 = gMatrixEffectCount; gMatrixEffectCount = 0; - ClearEffectsMatrixPool(); + // ClearEffectsMatrixPool(); } } @@ -2491,7 +2491,7 @@ void func_80093F10(void) { func_8009CA2C(); gSPDisplayList(gDisplayListHead++, D_02007F48); gMatrixEffectCount = 0; - ClearEffectsMatrixPool(); + // ClearEffectsMatrixPool(); } void func_800940EC(s32 arg0) { @@ -2521,8 +2521,8 @@ void func_800942D0(void) { s32 i; s32 alpha; - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, &gGfxPool->mtxLookAt[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); guRotate(mtx, gIntroModelRotX, 1.0f, 0.0f, 0.0f); guRotate(mtx + 1, gIntroModelRotY, 0.0f, 1.0f, 0.0f); guScale(mtx + 2, 1.0f, 1.0f, gIntroModelScale); @@ -2560,9 +2560,9 @@ void func_80094660(struct GfxPool* arg0, UNUSED s32 arg1) { move_segment_table_to_dmem(); gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP); - guPerspective(&arg0->mtxScreen, &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); + guPerspective(GetPerspMatrix(0), &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - guLookAt(&arg0->mtxLookAt[0], 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); + guLookAt(GetLookAtMatrix(0), 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); func_800942D0(); gDPPipeSync(gDisplayListHead++); gDPSetTexturePersp(gDisplayListHead++, G_TP_NONE); @@ -2573,16 +2573,16 @@ void render_checkered_flag(struct GfxPool* arg0, UNUSED s32 arg1) { u16 perspNorm; move_segment_table_to_dmem(); - guPerspective(&arg0->mtxPersp[0], &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); + guPerspective(GetPerspMatrix(0), &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - guLookAt(&arg0->mtxLookAt[1], 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); + guLookAt(GetLookAtMatrix(1), 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); guRotate(&arg0->mtxObject[0], gIntroModelRotX, 1.0f, 0, 0); guRotate(&arg0->mtxObject[1], gIntroModelRotY, 0, 1.0f, 0); guRotate(&arg0->mtxObject[2], gIntroModelRotZ, 0, 0, 1.0f); guScale(&arg0->mtxObject[3], gIntroModelScale, gIntroModelScale, gIntroModelScale); guTranslate(&arg0->mtxObject[4], gIntroModelPosX, gIntroModelPosY, gIntroModelPosZ); - gSPMatrix(gDisplayListHead++, &arg0->mtxPersp[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, &arg0->mtxLookAt[1], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetPerspMatrix(0), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(1), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPMatrix(gDisplayListHead++, &arg0->mtxObject[0], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); gSPMatrix(gDisplayListHead++, &arg0->mtxObject[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); gSPMatrix(gDisplayListHead++, &arg0->mtxObject[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); @@ -2594,14 +2594,13 @@ void render_checkered_flag(struct GfxPool* arg0, UNUSED s32 arg1) { } void func_80094A64(struct GfxPool* pool) { - ClearHudMatrixPool(); - ClearEffectsMatrixPool(); + ClearObjectsMatrixPool(); gMatrixHudCount = 0; gMatrixEffectCount = 0; gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880)); gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - guOrtho(&pool->mtxScreen, 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f); - gSPMatrix(gDisplayListHead++, &pool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); + guOrtho(GetScreenMatrix(), 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f); + gSPMatrix(gDisplayListHead++, GetScreenMatrix(), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPDisplayList(gDisplayListHead++, D_02007650); setup_menus(); func_80092290(4, D_8018E850, D_8018E858); diff --git a/src/player_controller.c b/src/player_controller.c index 422faab9c..86a442056 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -684,7 +684,7 @@ UNUSED void func_80028F5C(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2, UNU } void func_80028F70(void) { - ClearEffectsMatrixPool(); + // ClearEffectsMatrixPool(); gMatrixEffectCount = 0; func_80028E70(gPlayerOne, camera1, 0, 0); func_80028E70(gPlayerTwo, camera1, 1, 0); @@ -697,7 +697,7 @@ void func_80028F70(void) { } void func_80029060(void) { - ClearEffectsMatrixPool(); + // ClearEffectsMatrixPool(); gMatrixEffectCount = 0; func_80028E70(gPlayerOne, camera1, 0, 0); func_80028E70(gPlayerTwo, camera1, 1, 0); @@ -713,7 +713,7 @@ void func_80029150(void) { } void func_80029158(void) { - ClearEffectsMatrixPool(); + // ClearEffectsMatrixPool(); gMatrixEffectCount = 0; func_80028E70(gPlayerOne, camera1, 0, 0); func_80028E70(gPlayerTwo, camera1, 1, 0); diff --git a/src/port/interpolation/FrameInterpolation.h b/src/port/interpolation/FrameInterpolation.h index fbd2ec884..35bf5867d 100644 --- a/src/port/interpolation/FrameInterpolation.h +++ b/src/port/interpolation/FrameInterpolation.h @@ -22,6 +22,9 @@ extern "C" { #define TAG_SMOKE_DUST(x) ((u32) 0x20000000 | (u32) (x)) #define TAG_LETTER(x) ((u32)0x30000000 | (u32) (uintptr_t) (x)) #define TAG_OBJECT(x) ((u32)0x40000000 | (u32) (uintptr_t) (x)) +#define TAG_CLOUDS(x) ((u32)0x50000000 | (u32) (uintptr_t) (x)) +// Mask the bits so that the 7 can't get overridden +#define TAG_TRACK(x) ((u32)0x70000000 | ((u32)(x) & 0x0FFFFFFF)) void FrameInterpolation_ShouldInterpolateFrame(bool shouldInterpolate); diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c index a94369e69..ee1506bc2 100644 --- a/src/racing/render_courses.c +++ b/src/racing/render_courses.c @@ -22,6 +22,7 @@ #include "courses/all_course_packed.h" #include "courses/all_course_offsets.h" #include "port/Game.h" +#include "engine/Matrix.h" #include "engine/courses/Course.h" #include "enhancements/collision_viewer.h" @@ -215,29 +216,34 @@ void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) { pathCounter = (u16) arg0->pathCounter; cameraRot = (u16) arg0->camera->rot[1]; playerDirection = arg0->playerDirection; + + // This pushes the camera matrices to the top of the stack. + // It does not appear to really do anything. + // Perhaps they thought it was necessary to set the camera back to projection mode since rainbow road uses model mode. + // But that issue should be cleared up in render_screens() already. switch (playerId) { case PLAYER_ONE: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_ONE]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_ONE]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_ONE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); break; case PLAYER_TWO: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_TWO]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_TWO]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_TWO), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); break; case PLAYER_THREE: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_THREE]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_THREE]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_THREE), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); break; case PLAYER_FOUR: - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[PLAYER_FOUR]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[PLAYER_FOUR]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(PLAYER_FOUR), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); break; } diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c index aa65f1e75..09a4c733f 100644 --- a/src/racing/skybox_and_splitscreen.c +++ b/src/racing/skybox_and_splitscreen.c @@ -19,6 +19,7 @@ #include "main.h" #include "menus.h" #include "port/Engine.h" +#include "engine/Matrix.h" #include "engine/courses/Course.h" #include "port/Game.h" #include "math_util.h" @@ -758,7 +759,6 @@ void func_802A5760(void) { // Setup the cameras perspective and lookAt (movement/rotation) void setup_camera(Camera* camera, s32 playerId, s32 cameraId, struct UnkStruct_800DC5EC* screen) { - Mat4 matrix; u16 perspNorm; // This allows freecam to create a new separate camera @@ -767,20 +767,23 @@ void setup_camera(Camera* camera, s32 playerId, s32 cameraId, struct UnkStruct_8 // return; // } - // Setup perspective (camera movement) + // Tag the camera for the interpolation engine FrameInterpolation_RecordOpenChild("camera", - (FrameInterpolation_GetCameraEpoch() | (((playerId | cameraId) << 8)))); - guPerspective(&gGfxPool->mtxPersp[cameraId], &perspNorm, gCameraZoom[cameraId], gScreenAspect, + (FrameInterpolation_GetCameraEpoch() | (playerId | (cameraId << 8)))); + + // Calculate camera perspective (camera movement/location) + guPerspective(GetPerspMatrix(cameraId), &perspNorm, gCameraZoom[cameraId], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[cameraId]), + gSPMatrix(gDisplayListHead++, GetPerspMatrix(cameraId), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); - // Setup lookAt (camera rotation) - guLookAt(&gGfxPool->mtxLookAt[cameraId], camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], + // Calculate the camera lookAt (camera rotation) + guLookAt(GetLookAtMatrix(cameraId), camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]); - gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]), + gSPMatrix(gDisplayListHead++, GetLookAtMatrix(cameraId), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); + FrameInterpolation_RecordCloseChild(); } @@ -870,13 +873,16 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) { setup_camera(camera, playerId, cameraId, screen); // Create a matrix for the track and game objects - FrameInterpolation_RecordOpenChild("track", (playerId | cameraId) << 8); + FrameInterpolation_RecordOpenChild("track", TAG_TRACK((cameraId | playerId))); Mat4 trackMatrix; mtxf_identity(trackMatrix); render_set_position(trackMatrix, 0); - // Draw course and game objects + // Draw track geography render_course(screen); + FrameInterpolation_RecordCloseChild(); + + // Draw dynamic game objects render_course_actors(screen); CM_DrawStaticMeshActors(); render_object(mode); @@ -895,9 +901,9 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) { render_players_on_screen_four(); break; } - func_8029122C(screen, playerId); + func_8029122C(screen, playerId); // Track water related - switch (playerId) { + switch (playerId) { // Render player particles or some effect case 0: func_80021B0C(); break; @@ -914,11 +920,11 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) { render_item_boxes(screen); render_player_snow_effect(mode); - func_80058BF4(); + func_80058BF4(); // Setup texture modes if (D_800DC5B8 != 0) { - func_80058C20(mode); + func_80058C20(mode); // Setup hud matrix } - func_80093A5C(mode); + func_80093A5C(mode); // Perhaps pause render? if (D_800DC5B8 != 0) { render_hud(mode); } @@ -927,7 +933,6 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) { if (mode != RENDER_SCREEN_MODE_1P_PLAYER_ONE) { gNumScreens += 1; } - FrameInterpolation_RecordCloseChild(); } void func_802A74BC(void) { diff --git a/src/render_objects.c b/src/render_objects.c index 768b0b73f..3b0758dc9 100644 --- a/src/render_objects.c +++ b/src/render_objects.c @@ -3484,7 +3484,7 @@ struct ObjectInterpData { struct ObjectInterpData prevObject[OBJECT_LIST_SIZE] = { 0 }; -void func_800518F8(s32 objectIndex, s16 x, s16 y) { +void render_clouds(s32 objectIndex, s16 x, s16 y) { // Search all recorded objects for the one we're drawing for (size_t i = 0; i < OBJECT_LIST_SIZE; i++) { @@ -3503,7 +3503,7 @@ void func_800518F8(s32 objectIndex, s16 x, s16 y) { if (gObjectList[objectIndex].status & 0x10) { // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("func_800518F8", (uintptr_t) &gObjectList[objectIndex]); + FrameInterpolation_RecordOpenChild("render_clouds", TAG_CLOUDS(objectIndex)); if (D_8018D228 != gObjectList[objectIndex].unk_0D5) { D_8018D228 = gObjectList[objectIndex].unk_0D5; @@ -3562,13 +3562,7 @@ void func_80051ABC(s16 arg0, s32 arg1) { objectIndex = D_8018CC80[arg1 + var_s0]; object = &gObjectList[objectIndex]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("func_80051ABC", TAG_OBJECT(object)); - - func_800518F8(objectIndex, object->unk_09C, arg0 - object->unk_09E); - - // @port Pop the transform id. - FrameInterpolation_RecordCloseChild(); + render_clouds(objectIndex, object->unk_09C, arg0 - object->unk_09E); } } } @@ -3610,7 +3604,7 @@ void func_80051C60(s16 arg0, s32 arg1) { for (var_s0 = 0; var_s0 < D_8018D1F0; var_s0++) { objectIndex = D_8018CC80[arg1 + var_s0]; object = &gObjectList[objectIndex]; - func_800518F8(objectIndex, object->unk_09C, (var_s5 - object->unk_09E) / 2); + render_clouds(objectIndex, object->unk_09C, (var_s5 - object->unk_09E) / 2); } } } diff --git a/src/render_objects.h b/src/render_objects.h index 1a1604d3d..ff0b91303 100644 --- a/src/render_objects.h +++ b/src/render_objects.h @@ -318,7 +318,7 @@ void func_80050E34(s32, s32); void func_800514BC(void); void render_object_leaf_particle(s32); void render_object_snowflakes_particles(void); -void func_800518F8(s32, s16, s16); +void render_clouds(s32, s16, s16); void func_800519D4(s32, s16, s16); void func_80051ABC(s16, s32); void func_80051C60(s16, s32); diff --git a/src/render_player.c b/src/render_player.c index 16e85356b..76a8b52af 100644 --- a/src/render_player.c +++ b/src/render_player.c @@ -972,6 +972,7 @@ UNUSED void failed_fixed_point_matrix_conversion(Mtx* dest, Mat4 src) { void convert_to_fixed_point_matrix(Mtx* dest, Mat4 src) { #ifdef AVOID_UB // Use os function guMtxF2L instead. This helps little-endian systems. + FrameInterpolation_RecordMatrixMtxFToMtx((MtxF*)src, dest); guMtxF2L(src, dest); #else f32 toFixed = 65536.0f; // 2 ^ 16 @@ -1523,11 +1524,10 @@ void render_player_shadow(Player* player, s8 playerId, s8 screenId) { mtxf_translate_rotate(mtx, spCC, spC4); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); } - // convert_to_fixed_point_matrix(&gGfxPool->mtxShadow[playerId + (screenId * 8)], mtx); + convert_to_fixed_point_matrix(GetShadowMatrix(playerId + (screenId * 8)), mtx); - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxShadow[playerId + (screenId * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - AddShadowMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetShadowMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, D_0D008D58); gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); @@ -1545,7 +1545,7 @@ void render_player_shadow(Player* player, s8 playerId, s8 screenId) { FrameInterpolation_RecordCloseChild(); } -void render_player_shadow_credits(Player* player, s8 playerId, s8 arg2) { +void render_player_shadow_credits(Player* player, s8 playerId, s8 screenId) { Mat4 mtx; UNUSED Mat4 pad; Vec3f spCC; @@ -1558,7 +1558,7 @@ void render_player_shadow_credits(Player* player, s8 playerId, s8 arg2) { UNUSED Vec3f pad3; Vec3f sp94 = { 9.0f, 7.0f, 5.0f }; - temp_t9 = (u16) (player->unk_048[arg2] + player->rotation[1] + player->unk_0C0) / 128; + temp_t9 = (u16) (player->unk_048[screenId] + player->rotation[1] + player->unk_0C0) / 128; spC0 = -player->rotation[1] - player->unk_0C0; spB0 = -coss(temp_t9 << 7) * 3; @@ -1574,12 +1574,10 @@ void render_player_shadow_credits(Player* player, s8 playerId, s8 arg2) { mtxf_translate_rotate(mtx, spCC, spC4); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); - // convert_to_fixed_point_matrix(&gGfxPool->mtxShadow[playerId + (arg2 * 8)], mtx); + convert_to_fixed_point_matrix(GetShadowMatrix(playerId + (screenId * 8)), mtx); - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxShadow[playerId + (arg2 * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - AddShadowMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetShadowMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, D_0D008D58); gDPSetTextureLUT(gDisplayListHead++, G_TT_NONE); @@ -1653,13 +1651,12 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { } mtxf_translate_rotate(mtx, sp154, sp14C); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); - // convert_to_fixed_point_matrix(&gGfxPool->mtxKart[playerId + (screenId * 8)], mtx); - - // @port: Tag the transform. + convert_to_fixed_point_matrix(GetKartMatrix(playerId + (screenId * 8)), mtx); if ((player->effects & BOO_EFFECT) == BOO_EFFECT) { if (screenId == playerId) { - AddKartMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetKartMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, common_setting_render_character); gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); @@ -1672,9 +1669,8 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); } else { - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - AddKartMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetKartMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, common_setting_render_character); gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); @@ -1689,9 +1685,8 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { } } else if (((player->unk_0CA & 4) == 4) || (player->soundEffects & 0x08000000) || (player->soundEffects & 0x04000000)) { - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - AddKartMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetKartMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, common_setting_render_character); gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); @@ -1701,9 +1696,8 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { gDPSetAlphaCompare(gDisplayListHead++, G_AC_DITHER); gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2); } else { - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - AddKartMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetKartMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, common_setting_render_character); gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette); gDPSetTextureLUT(gDisplayListHead++, G_TT_RGBA16); @@ -1768,11 +1762,10 @@ void render_ghost(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { mtxf_translate_rotate(mtx, spDC, spD4); mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size); - // convert_to_fixed_point_matrix(&gGfxPool->mtxKart[playerId + (screenId * 8)], mtx); + convert_to_fixed_point_matrix(GetKartMatrix(playerId + (screenId * 8)), mtx); - // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxKart[playerId + (screenId * 8)]), - // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - AddKartMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(gDisplayListHead++, GetKartMatrix(playerId + (screenId * 8)), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, common_setting_render_character); gDPLoadTLUT_pal256(gDisplayListHead++, gPlayerPalette);