summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMegaMech <inkstudios1@hotmail.com>2025-05-19 16:42:11 -0600
committerMegaMech <inkstudios1@hotmail.com>2025-05-19 16:42:11 -0600
commit1eba8ebc17ba71435f8d91b876c35d05f5735de0 (patch)
treecb650f8c2365f982c2162446d069e3b0a0d9b49d /src
parentc12225592a3aecc5dd3b059ebe222ed97d829cef (diff)
Fix interpolation camera bug
Diffstat (limited to 'src')
-rw-r--r--src/camera.c146
-rw-r--r--src/camera.h2
-rw-r--r--src/code_80057C60.c4
-rw-r--r--src/enhancements/freecam/freecam.cpp41
-rw-r--r--src/enhancements/freecam/freecam.h2
-rw-r--r--src/enhancements/freecam/freecam_engine.c4
-rw-r--r--src/main.c20
-rw-r--r--src/os/guLookAtF.c1
-rw-r--r--src/os/guPerspectiveF.c1
-rw-r--r--src/port/interpolation/FrameInterpolation.cpp14
-rw-r--r--src/racing/render_courses.c7
-rw-r--r--src/racing/skybox_and_splitscreen.c85
-rw-r--r--src/render_objects.c7
-rw-r--r--src/render_player.c9
-rw-r--r--src/spawn_players.c4
15 files changed, 281 insertions, 66 deletions
diff --git a/src/camera.c b/src/camera.c
index 07003f07d..6591dc32e 100644
--- a/src/camera.c
+++ b/src/camera.c
@@ -25,11 +25,12 @@
f32 D_800DDB30[] = { 0.4f, 0.6f, 0.275f, 0.3f };
-Camera cameras[4];
+Camera cameras[5];
Camera* camera1 = &cameras[0];
Camera* camera2 = &cameras[1];
Camera* camera3 = &cameras[2];
Camera* camera4 = &cameras[3];
+Camera* gFreecamCamera = &cameras[4];
UNUSED s32 D_801649D0[2];
@@ -194,6 +195,146 @@ void camera_init(f32 posX, f32 posY, f32 posZ, UNUSED s16 rot, u32 arg4, s32 cam
func_802B7F7C(camera->pos, camera->lookAt, camera->rot);
}
+// Many arrays are hard-coded to 4. Skip those.
+void freecam_init(f32 posX, f32 posY, f32 posZ, UNUSED s16 rot, u32 arg4, s32 cameraId) {
+ Player* player = gPlayerOne;
+ Camera* camera = &cameras[cameraId];
+
+ camera->cameraId = cameraId;
+
+ //D_80152300[cameraId] = arg4;
+ switch (arg4) {
+ case 0:
+ case 1:
+ case 3:
+ case 8:
+ case 9:
+ case 10:
+ D_80164A89 = 0;
+ camera->pos[0] = posX;
+ camera->pos[1] = posY;
+ camera->pos[2] = posZ;
+ camera->someBitFlags = 0;
+ camera->lookAt[0] = 0.0f;
+ camera->lookAt[2] = 150.0f;
+ camera->lookAt[1] = posY - 3.0;
+ camera->up[0] = 0.0f;
+ camera->up[1] = 1.0f;
+ camera->up[2] = 0.0f;
+ camera->playerId = (s16) 0;
+ camera->unk_B0 = 0;
+ camera->unk_A0 = 0.0f;
+
+ // D_801649D8[cameraId] = 20.0f;
+ // D_801649E8[cameraId] = 10.0f;
+ // D_801649F8[cameraId] = 7.0f;
+ // D_80164A2C = 0;
+ // D_80164A30 = 30.0f;
+ // D_80164A38[cameraId] = 0.0f;
+ // D_80164A48[cameraId] = 0.0f;
+
+ // D_80164A90[cameraId] = 0.0f;
+ // D_80164AA0[cameraId] = 0.0f;
+ // D_80164A78[cameraId] = D_800DDB30[gActiveScreenMode];
+ // D_80164A18[cameraId] = 0;
+ // D_80164A08[cameraId] = 0;
+ // D_80164498[cameraId] = 0.0f;
+ camera->unk_94.unk_8 = 0;
+ camera->unk_94.unk_0 = 0.0f;
+
+ player += cameraId;
+ camera->unk_2C = player->rotation[1];
+ camera->unk_AC = player->rotation[1];
+ switch (gActiveScreenMode) {
+ case SCREEN_MODE_1P:
+ case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
+ if (gModeSelection == BATTLE) {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 11.6f;
+ camera->unk_30[2] = -38.5f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 19.2f;
+ D_80164A88 = 0;
+ } else {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 9.5f;
+ camera->unk_30[2] = -50.0f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 70.0f;
+ }
+ break;
+ case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
+ if (gModeSelection == BATTLE) {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 11.6f;
+ camera->unk_30[2] = -38.5f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 19.2f;
+ } else {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 9.6f;
+ camera->unk_30[2] = -35.0f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 30.0f;
+ }
+ break;
+ case SCREEN_MODE_3P_4P_SPLITSCREEN:
+ if (gModeSelection == BATTLE) {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 11.6f;
+ camera->unk_30[2] = -38.5f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 19.2f;
+ } else {
+ camera->unk_30[0] = 0.0f;
+ camera->unk_30[1] = 9.0f;
+ camera->unk_30[2] = -40.0f;
+ camera->unk_3C[0] = 0.0f;
+ camera->unk_3C[1] = 0.0f;
+ camera->unk_3C[2] = 18.0f;
+ }
+ break;
+ }
+
+ //func_80014DE4(cameraId);
+
+ // if (D_80164678[cameraId] == 0) {
+ if (D_80164A28 == 1) {
+ // gCameraZoom[cameraId] = 80.0f;
+ } else {
+ // gCameraZoom[cameraId] = 40.0f;
+ }
+ camera->unk_B4 = gCameraZoom[0];
+ // }
+ // if (D_80164678[cameraId] == 1) {
+ // if (D_80164A28 == 1) {
+ // gCameraZoom[cameraId] = 100.0f;
+ // } else {
+ // gCameraZoom[cameraId] = 60.0f;
+ // }
+ // camera->unk_B4 = gCameraZoom[cameraId];
+ // // }
+ // if (D_80164678[cameraId] == 2) {
+ // if (D_80164A28 == 1) {
+ // gCameraZoom[cameraId] = 100.0f;
+ // } else {
+ // gCameraZoom[cameraId] = 60.0f;
+ // }
+ // camera->unk_B4 = gCameraZoom[cameraId];
+ // D_80164A38[cameraId] = 20.0f;
+ // D_80164A48[cameraId] = 1.5f;
+ // D_80164A78[cameraId] = 1.0f;
+ // }
+ break;
+ }
+ func_802B7F7C(camera->pos, camera->lookAt, camera->rot);
+}
+
// Thwomp related
void func_8001CA10(Camera* camera) {
camera->unk_94.unk_8 = 0;
@@ -994,7 +1135,8 @@ void func_8001EE98(Player* player, Camera* camera, s8 index) {
func_8001E8E8(camera, player, index);
break;
}
- freecam(camera, player, index); // Runs func_8001E45C when freecam is disabled
+ //freecam(camera, player, index); // Runs func_8001E45C when freecam is disabled
+ func_8001E45C(camera, player, index);
break;
case 8:
func_8001E0C4(camera, player, index);
diff --git a/src/camera.h b/src/camera.h
index 6abeb3aad..56cc07a94 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -59,6 +59,7 @@ typedef struct {
} Camera; /* size = 0xB8 */
void camera_init(f32, f32, f32, s16, u32, s32);
+void freecam_init(f32 posX, f32 posY, f32 posZ, s16 rot, u32 arg4, s32 cameraId);
void func_8001CA10(Camera*);
void func_8001CA24(Player*, f32);
void func_8001CA78(Player*, Camera*, Vec3f, f32*, f32*, f32*, s32, s32);
@@ -81,6 +82,7 @@ extern Camera* camera1;
extern Camera* camera2;
extern Camera* camera3;
extern Camera* camera4;
+extern Camera* gFreecamCamera;
// end of camera.c variables
diff --git a/src/code_80057C60.c b/src/code_80057C60.c
index 32b24029b..23293b641 100644
--- a/src/code_80057C60.c
+++ b/src/code_80057C60.c
@@ -4967,9 +4967,10 @@ void func_800651F4(Player* player, UNUSED s8 arg1, UNUSED s8 arg2, s8 arg3) {
}
}
+s32 D_func_800652D4_counter = 0;
void func_800652D4(Vec3f arg0, Vec3s arg1, f32 arg2) {
Mat4 mtx;
-
+ FrameInterpolation_RecordOpenChild("some_thing", D_func_800652D4_counter++ << 8);
mtxf_translate_rotate(mtx, arg0, arg1);
mtxf_scale(mtx, arg2);
// convert_to_fixed_point_matrix(&gGfxPool->mtxEffect[gMatrixEffectCount], mtx);
@@ -4977,6 +4978,7 @@ void func_800652D4(Vec3f arg0, Vec3s arg1, f32 arg2) {
// G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
AddEffectMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ FrameInterpolation_RecordCloseChild();
}
void func_8006538C(Player* player, s8 arg1, s16 arg2, s8 arg3) {
diff --git a/src/enhancements/freecam/freecam.cpp b/src/enhancements/freecam/freecam.cpp
index 86dfef575..4efc5fcfb 100644
--- a/src/enhancements/freecam/freecam.cpp
+++ b/src/enhancements/freecam/freecam.cpp
@@ -4,6 +4,7 @@
#include "port/Game.h"
#include <controller/controldevice/controller/mapping/keyboard/KeyboardScancodes.h>
#include <window/Window.h>
+#include "port/interpolation/FrameInterpolation.h"
extern "C" {
#include <macros.h>
@@ -85,7 +86,7 @@ void freecam(Camera* camera, Player* player, s8 index) {
if (enabled && (player == gPlayerOne)) {
freecam_loop(camera, player, index);
} else {
- func_8001E45C(camera, player, index);
+ func_8001EE98(gPlayerOneCopy, camera, index);
}
}
@@ -104,7 +105,6 @@ void freecam_loop(Camera* camera, Player* player, s8 index) {
// Toggle freecam
CVarSetInteger("gFreecam", !CVarGetInteger("gFreecam", 0));
}
-
// Calculate forward direction
freecam_calculate_forward_vector_allow_rotation(camera, freeCam.forwardVector);
@@ -389,24 +389,33 @@ void freecam_update_controller(void) {
// Note that D Pad as stick code has been removed. So if it's needed, it needs to be put back in.
}
-void freecam_render_setup(void) {
+Mtx fPersp;
+Mtx fLookAt;
+void freecam_render_setup(Camera* camera) {
u16 perspNorm;
Mat4 matrix;
- init_rdp();
- func_802A53A4();
- init_rdp();
- func_80057FC4(0);
+
+ Mat4 persp;
+ Mat4 lookAt;
+
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK | G_CULL_BOTH | G_CULL_FRONT);
- guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect,
+
+ // Perspective (camera movement)
+ FrameInterpolation_RecordOpenChild("freecam_persp", FrameInterpolation_GetCameraEpoch());
+ guPerspective(&fPersp, &perspNorm, gCameraZoom[0], gScreenAspect,
CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
- gSPMatrix(gDisplayListHead++, (&gGfxPool->mtxPersp[0]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
- guLookAt(&gGfxPool->mtxLookAt[0], camera1->pos[0], camera1->pos[1], camera1->pos[2], camera1->lookAt[0],
- camera1->lookAt[1], camera1->lookAt[2], camera1->up[0], camera1->up[1], camera1->up[2]);
- gSPMatrix(gDisplayListHead++, (&gGfxPool->mtxLookAt[0]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
- mtxf_identity(matrix);
- gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
- render_set_position(matrix, 0);
- init_rdp();
+ gSPMatrix(gDisplayListHead++, (&fPersp), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ FrameInterpolation_RecordCloseChild();
+
+ // LookAt (camera rotation)
+ FrameInterpolation_RecordOpenChild("freecam_lookAt", FrameInterpolation_GetCameraEpoch());
+ guLookAt(&fLookAt, 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++, (&fLookAt), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+ FrameInterpolation_RecordCloseChild();
+
+ gDPPipeSync(gDisplayListHead++);
+
}
diff --git a/src/enhancements/freecam/freecam.h b/src/enhancements/freecam/freecam.h
index db55866ed..86c42b0c9 100644
--- a/src/enhancements/freecam/freecam.h
+++ b/src/enhancements/freecam/freecam.h
@@ -13,7 +13,7 @@ void on_freecam(void);
void off_freecam(void);
void freecam_loop(Camera*, Player*, s8);
void freecam_update_controller(void);
-void freecam_render_setup(void);
+void freecam_render_setup(Camera* camera);
void freecam_mouse_manager(Camera*, Vec3f);
void freecam_keyboard_manager(Camera*, Vec3f);
diff --git a/src/enhancements/freecam/freecam_engine.c b/src/enhancements/freecam/freecam_engine.c
index 350ab192b..56585e2f0 100644
--- a/src/enhancements/freecam/freecam_engine.c
+++ b/src/enhancements/freecam/freecam_engine.c
@@ -11,10 +11,10 @@
#include <camera.h>
#include "freecam_engine.h"
-FreeCam freeCam;
-
#include <math.h>
+FreeCam freeCam;
+
f32 gDampValue = 0.99f;
f32 gRotDampValue = 0.96f;
diff --git a/src/main.c b/src/main.c
index 01b09b7ca..1b0b8a716 100644
--- a/src/main.c
+++ b/src/main.c
@@ -758,15 +758,18 @@ void process_game_tick(void) {
func_800382DC();
}
- // Editor requires this for camera movement.
- func_8001EE98(gPlayerOneCopy, camera1, 0);
-
- if (gIsEditorPaused == true) {
- return;
- }
-
switch(gActiveScreenMode) {
case SCREEN_MODE_1P:
+ if (CVarGetInteger("gFreecam", 0) == true) {
+ freecam(gFreecamCamera, gPlayerOneCopy, 0);
+ } else {
+ func_8001EE98(gPlayerOneCopy, camera1, 0);
+ }
+
+ // Editor requires this so the camera keeps moving while the game is paused.
+ if (gIsEditorPaused == true) {
+ return;
+ }
func_80028F70();
break;
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
@@ -930,6 +933,8 @@ void race_logic_loop(void) {
*/
void game_state_handler(void) {
+ FrameInterpolation_StartRecord();
+
#if DVDL
if ((gControllerOne->button & L_TRIG) && (gControllerOne->button & R_TRIG) && (gControllerOne->button & Z_TRIG) &&
(gControllerOne->button & A_BUTTON)) {
@@ -966,6 +971,7 @@ void game_state_handler(void) {
credits_loop();
break;
}
+ FrameInterpolation_StopRecord();
}
void interrupt_gfx_sptask(void) {
diff --git a/src/os/guLookAtF.c b/src/os/guLookAtF.c
index 1e391a37c..4b031d818 100644
--- a/src/os/guLookAtF.c
+++ b/src/os/guLookAtF.c
@@ -76,4 +76,5 @@ void guLookAt(Mtx* m, float xEye, float yEye, float zEye, float xAt, float yAt,
guLookAtF(mf, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp);
guMtxF2L(mf, m);
+ FrameInterpolation_RecordMatrixMtxFToMtx((MtxF*)mf, m);
}
diff --git a/src/os/guPerspectiveF.c b/src/os/guPerspectiveF.c
index 062d42751..d02e33b20 100644
--- a/src/os/guPerspectiveF.c
+++ b/src/os/guPerspectiveF.c
@@ -37,4 +37,5 @@ void guPerspective(Mtx* m, u16* perspNorm, float fovy, float aspect, float near,
float mat[4][4];
guPerspectiveF(mat, perspNorm, fovy, aspect, near, far, scale);
guMtxF2L(mat, m);
+ FrameInterpolation_RecordMatrixMtxFToMtx((MtxF*)mat, m);
}
diff --git a/src/port/interpolation/FrameInterpolation.cpp b/src/port/interpolation/FrameInterpolation.cpp
index 4da081ac1..767b83316 100644
--- a/src/port/interpolation/FrameInterpolation.cpp
+++ b/src/port/interpolation/FrameInterpolation.cpp
@@ -550,7 +550,7 @@ unordered_map<Mtx*, MtxF> FrameInterpolation_Interpolate(float step) {
bool camera_interpolation = true;
void FrameInterpolation_ShouldInterpolateFrame(bool shouldInterpolate) {
- // camera_interpolation = shouldInterpolate;
+ camera_interpolation = shouldInterpolate;
is_recording = shouldInterpolate;
}
@@ -559,12 +559,12 @@ void FrameInterpolation_StartRecord(void) {
current_recording = {};
current_path.clear();
current_path.push_back(&current_recording.root_path);
- // if (!camera_interpolation) {
- // // default to interpolating
- // camera_interpolation = true;
- // is_recording = false;
- // return;
- // }
+ if (!camera_interpolation) {
+ // default to interpolating
+ camera_interpolation = true;
+ is_recording = false;
+ return;
+ }
if (GameEngine::GetInterpolationFPS() != 20) {
is_recording = true;
}
diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c
index 71b182544..1b1e7ec26 100644
--- a/src/racing/render_courses.c
+++ b/src/racing/render_courses.c
@@ -7,6 +7,7 @@
#include <course.h>
#include "../camera.h"
#include "framebuffer_effects.h"
+#include "port/interpolation/FrameInterpolation.h"
#include "render_courses.h"
#include "code_800029B0.h"
@@ -240,9 +241,15 @@ void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) {
G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
break;
}
+
+ FrameInterpolation_RecordOpenChild("track_water", playerId);
+
mtxf_identity(matrix);
render_set_position(matrix, 0);
+ //FrameInterpolation_RecordCloseChild();
+
CM_DrawWater(arg0, pathCounter, cameraRot, playerDirection);
+ FrameInterpolation_RecordCloseChild();
// switch (gCurrentCourseId) {
// case COURSE_BOWSER_CASTLE:
// if (gActiveScreenMode != SCREEN_MODE_1P) {
diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c
index abc7c23aa..b5c2cb305 100644
--- a/src/racing/skybox_and_splitscreen.c
+++ b/src/racing/skybox_and_splitscreen.c
@@ -755,17 +755,45 @@ void func_802A5760(void) {
}
}
-void render_screens(s32 mode, s32 cameraId, s32 playerId) {
- UNUSED s32 pad[4];
+void setup_camera(Camera* camera, s32 playerId, s32 cameraId, struct UnkStruct_800DC5EC* screen) {
+ Mat4 matrix;
u16 perspNorm;
- UNUSED s32 pad2[2];
- UNUSED s32 pad3;
+
+ if (CVarGetInteger("gFreecam", 0) == true) {
+ freecam_render_setup(gFreecamCamera);
+ return;
+ }
+
+ FrameInterpolation_RecordOpenChild("camerapersp", FrameInterpolation_GetCameraEpoch());
+ guPerspective(&gGfxPool->mtxPersp[cameraId], &perspNorm, gCameraZoom[cameraId], gScreenAspect,
+ CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f);
+
+ gSPPerspNormalize(gDisplayListHead++, perspNorm);
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[cameraId]),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+
+ guLookAt(&gGfxPool->mtxLookAt[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]);
+ if (D_800DC5C8 == 0) {
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]),
+ G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+ mtxf_identity(matrix);
+ render_set_position(matrix, 0);
+ } else {
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ }
+ FrameInterpolation_RecordCloseChild();
+}
+
+extern s32 D_func_800652D4_counter;
+void render_screens(s32 mode, s32 cameraId, s32 playerId) {
Mat4 matrix;
s32 screenId = 0;
s32 screenMode = SCREEN_MODE_1P;
-
- FrameInterpolation_StartRecord();
+D_func_800652D4_counter = 0;
switch (mode) {
case RENDER_SCREEN_MODE_1P_PLAYER_ONE:
@@ -824,7 +852,14 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) {
}
struct UnkStruct_800DC5EC* screen = &D_8015F480[screenId];
- Camera* camera = &cameras[cameraId];
+ Camera* camera;
+
+ if (CVarGetInteger("gFreecam", 0) == true) {
+ camera = &gFreecamCamera;
+ cameraId = 4;
+ } else {
+ camera = &cameras[cameraId];
+ }
if (screenMode == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH);
@@ -834,27 +869,28 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) {
func_802A3730(screen);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
+ //FrameInterpolation_RecordOpenChild("SCREENCAMERA", (playerId | cameraId) << 8);
+
+ setup_camera(camera, playerId, cameraId, screen); // Setup camera perspective and lookAt
+// render_course(screen);
+
+//FrameInterpolation_RecordOpenChild("track", 0);
+//Mat4 trackMtx;
+//mtxf_identity(trackMtx);
+//AddObjectMatrix(trackMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+render_course(screen);
+//FrameInterpolation_RecordCloseChild();
+
+
+ //Mat4 projectionF;
+ //Matrix_MtxToMtxF(&gGfxPool->mtxLookAt[cameraId], &projectionF);
+ // SkinMatrix_MtxFMtxFMult(&projectionF, &flipF, &projectionF);
+ // FrameInterpolation_RecordCloseChild();
- guPerspective(&gGfxPool->mtxPersp[cameraId], &perspNorm, gCameraZoom[cameraId], gScreenAspect,
- CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f);
- gSPPerspNormalize(gDisplayListHead++, perspNorm);
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[cameraId]),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
- guLookAt(&gGfxPool->mtxLookAt[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]);
- if (D_800DC5C8 == 0) {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]),
- G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
- mtxf_identity(matrix);
- render_set_position(matrix, 0);
- } else {
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- }
- render_course(screen);
if (D_800DC5C8 == 1) {
+ //PushLookAtMtx(gGfxPool->mtxLookAt[cameraId], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[cameraId]),
G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
mtxf_identity(matrix);
@@ -910,7 +946,6 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) {
gNumScreens += 1;
}
- FrameInterpolation_StopRecord();
}
void func_802A74BC(void) {
diff --git a/src/render_objects.c b/src/render_objects.c
index b2de13f7c..9a8c7400a 100644
--- a/src/render_objects.c
+++ b/src/render_objects.c
@@ -3934,15 +3934,15 @@ void func_80055EF4(s32 objectIndex, UNUSED s32 arg1) {
void render_object_neon(s32 cameraId) {
Camera* camera;
- s32 var_s2;
s32 objectIndex;
Object* object;
camera = &camera1[cameraId];
- for (var_s2 = 0; var_s2 < 10; var_s2++) {
- objectIndex = indexObjectList1[var_s2];
+ for (size_t i = 0; i < 10; i++) {
+ objectIndex = indexObjectList1[i];
if (D_8018E838[cameraId] == 0) {
object = &gObjectList[objectIndex];
+ FrameInterpolation_RecordOpenChild(object, TAG_OBJECT((objectIndex << 8) + i));
if ((object->state >= 2) && (is_obj_index_flag_status_inactive(objectIndex, 0x00080000) != 0) &&
(is_object_visible_on_camera(objectIndex, camera, 0x2AABU) != 0)) {
Vtx* vtx = (Vtx*) LOAD_ASSET(common_vtx_hedgehog);
@@ -3950,6 +3950,7 @@ void render_object_neon(s32 cameraId) {
draw_2d_texture_at(object->pos, object->orientation, object->sizeScaling, (u8*) object->activeTLUT,
object->activeTexture, vtx, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
}
+ FrameInterpolation_RecordCloseChild();
}
}
}
diff --git a/src/render_player.c b/src/render_player.c
index d16c4380c..b101e00b9 100644
--- a/src/render_player.c
+++ b/src/render_player.c
@@ -1611,8 +1611,8 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 arg3) {
f32 sp140;
s16 temp_v1;
s16 thing;
-
- FrameInterpolation_RecordOpenChild("Player", playerId | screenId << 8);
+
+ FrameInterpolation_RecordOpenChild("player_kart", playerId | screenId << 8);
if (player->unk_044 & 0x2000) {
sp14C[0] = 0;
sp14C[1] = player->unk_048[screenId];
@@ -1836,6 +1836,9 @@ void func_80025DE8(Player* player, s8 playerId, s8 screenId, s8 arg3) {
sp94[1] = player->unk_048[screenId];
sp94[2] = player->unk_050[screenId];
+ FrameInterpolation_RecordOpenChild("player_boost", playerId | screenId << 8);
+
+
mtxf_translate_rotate(mtx, sp9C, sp94);
mtxf_scale(mtx, gCharacterSize[player->characterId] * player->size);
// convert_to_fixed_point_matrix(&gGfxPool->mtxEffect[gMatrixEffectCount], mtx);
@@ -1867,6 +1870,8 @@ void func_80025DE8(Player* player, s8 playerId, s8 screenId, s8 arg3) {
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
gMatrixEffectCount += 1;
+
+ FrameInterpolation_RecordCloseChild();
}
void render_player_ice_reflection(Player* player, s8 playerId, s8 screenId, s8 arg3) {
diff --git a/src/spawn_players.c b/src/spawn_players.c
index 5e623577b..569042ca6 100644
--- a/src/spawn_players.c
+++ b/src/spawn_players.c
@@ -1194,6 +1194,10 @@ void func_8003D080(void) {
} else {
func_8003C0F0();
}
+
+ // Init free cam
+ freecam_init(player->pos[0], player->pos[1], player->pos[2], player->rotation[1], 1, 4);
+
if (!gDemoMode) {
switch (gActiveScreenMode) {
case SCREEN_MODE_1P: