summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMegaMech <7255464+MegaMech@users.noreply.github.com>2025-05-21 21:02:32 -0600
committerMegaMech <7255464+MegaMech@users.noreply.github.com>2025-05-21 21:02:32 -0600
commit756a05ad4d180f63b49f7db57891b8e7569a8328 (patch)
tree5dbd56a79436f31e4110fcf63cf120ddf5eaf048
parentc10361ea799c5e4ad3c00ebfe0c4d5aba2670dc1 (diff)
Fix multiplayer cameras
-rw-r--r--src/main.c23
-rw-r--r--src/racing/skybox_and_splitscreen.c2
-rw-r--r--src/spawn_players.c6
3 files changed, 17 insertions, 14 deletions
diff --git a/src/main.c b/src/main.c
index cd8b4f677..c3f6f27d7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -759,18 +759,21 @@ void process_game_tick(void) {
func_800382DC();
}
+ // This looks like it should be in the switch.
+ // But it needs to be here for player 1 to work in all modes.
+ 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;
+ }
+
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:
diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c
index 820d83ecb..9a31c378a 100644
--- a/src/racing/skybox_and_splitscreen.c
+++ b/src/racing/skybox_and_splitscreen.c
@@ -767,7 +767,7 @@ void setup_camera(Camera* camera, s32 playerId, s32 cameraId, struct UnkStruct_8
}
// Setup perspective (camera movement)
- FrameInterpolation_RecordOpenChild("camera", FrameInterpolation_GetCameraEpoch());
+ FrameInterpolation_RecordOpenChild("camera", (FrameInterpolation_GetCameraEpoch() | (((playerId | cameraId) << 8))));
guPerspective(&gGfxPool->mtxPersp[cameraId], &perspNorm, gCameraZoom[cameraId], gScreenAspect,
CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
diff --git a/src/spawn_players.c b/src/spawn_players.c
index 569042ca6..92185f3d9 100644
--- a/src/spawn_players.c
+++ b/src/spawn_players.c
@@ -1195,9 +1195,6 @@ void func_8003D080(void) {
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:
@@ -1293,6 +1290,9 @@ void func_8003D080(void) {
}
}
+ // Init free cam
+ freecam_init(player->pos[0], player->pos[1], player->pos[2], player->rotation[1], 1, 4);
+
switch (gActiveScreenMode) {
case SCREEN_MODE_1P:
func_8003CD98(gPlayerOneCopy, camera1, 0, 0); // sic