Fix freecam camera

This commit is contained in:
MegaMech
2025-05-30 22:30:46 -06:00
parent 388554ca15
commit 066110e88a
5 changed files with 36 additions and 20 deletions
+2 -2
View File
@@ -1134,8 +1134,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
func_8001E45C(camera, player, index);
freecam(camera, player, index); // Runs func_8001E45C when freecam is disabled
//func_8001E45C(camera, player, index);
break;
case 8:
func_8001E0C4(camera, player, index);
+3 -1
View File
@@ -86,7 +86,9 @@ void freecam(Camera* camera, Player* player, s8 index) {
if (enabled && (player == gPlayerOne)) {
freecam_loop(camera, player, index);
} else {
func_8001EE98(gPlayerOneCopy, camera, index);
func_8001E45C(camera, player, index);
// Required if freecam were to use its own camera instead of borrowing the player camera
//func_8001EE98(gPlayerOneCopy, camera, index);
}
}
+17 -5
View File
@@ -637,6 +637,12 @@ void game_init_clear_framebuffer(void) {
clear_framebuffer(0);
}
//! @deprecated
// This function was made to tick the game logic at native 60 fps.
// However, many game objects are not in that special tick loop and run at native 30fps.
// Thus adding `if (gTickVisuals) { // stuff here }` would prevent double speed and allow ticking visuals once every 30 fps.
// This does not however, create extra interpolated frames. Whereas a possible solution, it is not the best solution.
// This function should be cleaned up and removed, since frame interpolation now exists.
void calculate_updaterate(void) {
static u32 prevtime = 0;
static u32 remainder = 0;
@@ -695,6 +701,7 @@ void calculate_updaterate(void) {
visualsAccumulator += total; // Increment for each frame
if (visualsAccumulator >= visualsUpdateInterval) { // Check if it's time to update visuals
visualsAccumulator -= visualsUpdateInterval;
// gTickVisuals <-- Goes here to use the native 60fps system
}
gTickVisuals = 1; // Perform visual update
}
@@ -759,13 +766,18 @@ void process_game_tick(void) {
func_800382DC();
}
// tick camera
// 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);
}
func_8001EE98(gPlayerOneCopy, camera1, 0);
// Required if freecam was to have a new camera
//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) {
+12 -10
View File
@@ -761,10 +761,11 @@ void setup_camera(Camera* camera, s32 playerId, s32 cameraId, struct UnkStruct_8
Mat4 matrix;
u16 perspNorm;
if (CVarGetInteger("gFreecam", 0) == true) {
freecam_render_setup(gFreecamCamera);
return;
}
// This allows freecam to create a new separate camera
// if (CVarGetInteger("gFreecam", 0) == true) {
// freecam_render_setup(gFreecamCamera);
// return;
// }
// Setup perspective (camera movement)
FrameInterpolation_RecordOpenChild("camera",
@@ -848,13 +849,14 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) {
struct UnkStruct_800DC5EC* screen = &D_8015F480[screenId];
Camera* camera;
if (CVarGetInteger("gFreecam", 0) == true) {
camera = &gFreecamCamera;
cameraId = 4;
} else {
// Required for freecam to have its own 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);
}
+2 -2
View File
@@ -1290,8 +1290,8 @@ void func_8003D080(void) {
}
}
// Init free cam
freecam_init(player->pos[0], player->pos[1], player->pos[2], player->rotation[1], 1, 4);
// Init freecam
//freecam_init(player->pos[0], player->pos[1], player->pos[2], player->rotation[1], 1, 4);
switch (gActiveScreenMode) {
case SCREEN_MODE_1P: