From 54e7b6de331351156d7d70c558273282cc66c433 Mon Sep 17 00:00:00 2001 From: MegaMech <7255464+MegaMech@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:24:26 -0700 Subject: [PATCH] More freecam fixes --- src/enhancements/freecam/freecam.cpp | 53 +++++++++++++---------- src/enhancements/freecam/freecam_engine.c | 15 +++++-- src/enhancements/freecam/freecam_engine.h | 4 +- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/enhancements/freecam/freecam.cpp b/src/enhancements/freecam/freecam.cpp index 66a5040af..83c33a666 100644 --- a/src/enhancements/freecam/freecam.cpp +++ b/src/enhancements/freecam/freecam.cpp @@ -35,8 +35,8 @@ typedef struct { freecamSaveState fState; -u32 fRankIndex = -1; -u32 fTargetPlayer = false; +u32 fRankIndex = 0; +u32 fTargetPlayer = true; u32 fMode; // freecam mode should probably be an enum u32 fModeInit = false; @@ -49,7 +49,7 @@ u32 gFreecamControllerType = 0; // void freecam_calculate_forward_vector(Camera* camera, Vec3f forwardVector); // void freecam_move_camera_forward(Camera* camera, f32 distance); -// void freecam_update(Camera* camera, struct Controller *controller); +// void freecam_tick(Camera* camera, struct Controller *controller); // void freecam_n64_controller_manager(Camera *camera, struct Controller *controller, Player *player); // void freecam_target_player(Camera *camera, u32 playerIndex); // void freecam_move_camera_up(Camera* camera, struct Controller *controller, f32 distance); @@ -135,9 +135,9 @@ void freecam(Camera* camera, Player* player, s8 index) { freecam_keyboard_manager(camera, freeCam.forwardVector); if (fTargetPlayer) { - freecam_target_player(camera, get_player_index_for_player(player)); + freecam_target_player(camera, D_800DC5EC->player); } else { - freecam_update(camera, freeCam.forwardVector); + freecam_tick(camera, freeCam.forwardVector); } } @@ -236,8 +236,8 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { // if (keystate[SDL_SCANCODE_G]) { // fTargetPlayer = false; // } - - bool TargetNextPlayer = false, TargetPreviousPlayer = false; + static bool prevPrev; + bool TargetNextPlayer = false, TargetPreviousPlayer = false; bool prevNext; bool Forward = false, PanLeft = false, Backward = false, PanRight = false; bool Up = false, Down = false; bool FastMove = false; @@ -250,15 +250,15 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { // fMode = !fMode; // } // Target a player - // if (controller->buttonPressed & R_TRIG) { - // fTargetPlayer = !fTargetPlayer; - // } + if (controller->buttonPressed & R_TRIG) { + fTargetPlayer = !fTargetPlayer; + } if (controller->buttonPressed & L_CBUTTONS) { - TargetNextPlayer = true; + TargetPreviousPlayer = true; } if (controller->buttonPressed & R_CBUTTONS) { - TargetPreviousPlayer = true; + TargetNextPlayer = true; } if (controller->button & A_BUTTON) { Forward = true; @@ -283,11 +283,17 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { // } // Keyboard and mouse DX } else if (wnd->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { + if (GetKeyState('F') & 0x8000) { + fTargetPlayer = !fTargetPlayer; + } if (GetKeyState('N') & 0x8000) { - TargetNextPlayer = true; + if (!prevPrev) { + prevPrev = true; + TargetPreviousPlayer = true; + } } if (GetKeyState('M') & 0x8000) { - TargetPreviousPlayer = true; + TargetNextPlayer = true; } if (GetKeyState('W') & 0x8000) { Forward = true; @@ -314,11 +320,14 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { // Keyboard/mouse OpenGL/SDL } else if (wnd->GetWindowBackend() == Ship::WindowBackend::FAST3D_SDL_OPENGL) { const uint8_t* keystate = SDL_GetKeyboardState(NULL); + if (keystate[SDL_SCANCODE_F]) { + fTargetPlayer != fTargetPlayer; + } if (keystate[SDL_SCANCODE_N]) { - TargetNextPlayer = true; + TargetPreviousPlayer = true; } if (keystate[SDL_SCANCODE_M]) { - TargetPreviousPlayer = true; + TargetNextPlayer = true; } if (keystate[SDL_SCANCODE_W]) { Forward = true; @@ -343,8 +352,8 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { } } - // Target next player - if (TargetNextPlayer) { + // Target previous player + if (TargetPreviousPlayer) { if (fRankIndex > 0) { fRankIndex--; camera->playerId = fRankIndex; @@ -352,8 +361,8 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { } } - // Target previous player - if (TargetPreviousPlayer) { + // Target next player + if (TargetNextPlayer) { if (fRankIndex < 7) { fRankIndex++; camera->playerId = fRankIndex; @@ -363,9 +372,9 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { // Target camera at chosen player if (fRankIndex != -1) { - freecam_target_player(camera, gGPCurrentRacePlayerIdByRank[fRankIndex]); + //freecam_target_player(camera, gGPCurrentRacePlayerIdByRank[fRankIndex]); // Don't run the other camera code. - return; + //return; } if (FastMove) { diff --git a/src/enhancements/freecam/freecam_engine.c b/src/enhancements/freecam/freecam_engine.c index bcef5380b..8a78917fd 100644 --- a/src/enhancements/freecam/freecam_engine.c +++ b/src/enhancements/freecam/freecam_engine.c @@ -17,7 +17,7 @@ FreeCam freeCam; f32 gDampValue = 0.99f; -void freecam_update(Camera* camera, Vec3f forwardVector) { +void freecam_tick(Camera* camera, Vec3f forwardVector) { // Update FreeCam state camera->pos[0] += freeCam.velocity[0] * gDeltaTime; camera->pos[1] += freeCam.velocity[1] * gDeltaTime; @@ -119,9 +119,18 @@ void freecam_move_camera_down(Camera* camera, f32 distance) { camera->lookAt[1] += distance; } -void freecam_target_player(Camera* camera, u32 playerIndex) { +void freecam_target_player(Camera* camera, Player* player) { Vec3f forwardVector; // = 2.0f; - Player* player = &gPlayers[playerIndex]; + + // Update position + camera->pos[0] += freeCam.velocity[0] * gDeltaTime; + camera->pos[1] += freeCam.velocity[1] * gDeltaTime; + camera->pos[2] += freeCam.velocity[2] * gDeltaTime; + + // Apply damping to velocity + freeCam.velocity[0] *= gDampValue; + freeCam.velocity[1] *= gDampValue; + freeCam.velocity[2] *= gDampValue; // Calculate the direction from the player to the camera f32 dirX = player->pos[0] - camera->pos[0]; diff --git a/src/enhancements/freecam/freecam_engine.h b/src/enhancements/freecam/freecam_engine.h index 18e6d258c..49e79d0ea 100644 --- a/src/enhancements/freecam/freecam_engine.h +++ b/src/enhancements/freecam/freecam_engine.h @@ -25,8 +25,8 @@ void freecam_pan_camera(Camera* camera, f32 moveSpeed); void freecam_calculate_forward_vector_allow_rotation(Camera* camera, Vec3f forwardVector); void freecam_calculate_forward_vector(Camera* camera, Vec3f forwardVector); void freecam_move_camera_forward(Camera* camera, f32 distance, Vec3f forwardVector); -void freecam_target_player(Camera* camera, u32 playerIndex); -void freecam_update(Camera* camera, Vec3f forwardVector); +void freecam_target_player(Camera* camera, Player* player); +void freecam_tick(Camera* camera, Vec3f forwardVector); void freecam_move_camera_up(Camera* camera, f32); void freecam_move_camera_down(Camera* camera, f32);