From 5eebd805ba478168205c35a9c98ae73df220ec17 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 7 Feb 2026 20:05:07 -0800 Subject: [PATCH] Fix mounted first-person camera pivot --- include/rendering/camera_controller.hpp | 2 ++ src/rendering/camera_controller.cpp | 6 ++++-- src/rendering/renderer.cpp | 10 ++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/rendering/camera_controller.hpp b/include/rendering/camera_controller.hpp index 9c834ebb..01e09c60 100644 --- a/include/rendering/camera_controller.hpp +++ b/include/rendering/camera_controller.hpp @@ -74,6 +74,7 @@ public: void setUseWoWSpeed(bool use) { useWoWSpeed = use; } void setRunSpeedOverride(float speed) { runSpeedOverride_ = speed; } void setMounted(bool m) { mounted_ = m; } + void setMountHeightOffset(float offset) { mountHeightOffset_ = offset; } // For first-person player hiding void setCharacterRenderer(class CharacterRenderer* cr, uint32_t playerId) { @@ -193,6 +194,7 @@ private: // Server-driven run speed override (0 = use default WOW_RUN_SPEED) float runSpeedOverride_ = 0.0f; bool mounted_ = false; + float mountHeightOffset_ = 0.0f; // Online mode: trust server position, don't prefer outdoors over WMO floors bool onlineMode = false; diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index ad745260..0a2b65c2 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -643,7 +643,8 @@ void CameraController::update(float deltaTime) { // ===== WoW-style orbit camera ===== // Pivot point at upper chest/neck - glm::vec3 pivot = targetPos + glm::vec3(0.0f, 0.0f, PIVOT_HEIGHT); + float mountedOffset = mounted_ ? mountHeightOffset_ : 0.0f; + glm::vec3 pivot = targetPos + glm::vec3(0.0f, 0.0f, PIVOT_HEIGHT + mountedOffset); // Camera direction from yaw/pitch (already computed as forward3D) glm::vec3 camDir = -forward3D; // Camera looks at pivot, so it's behind @@ -1219,7 +1220,8 @@ void CameraController::reset() { currentDistance = userTargetDistance; collisionDistance = currentDistance; - glm::vec3 pivot = spawnPos + glm::vec3(0.0f, 0.0f, PIVOT_HEIGHT); + float mountedOffset = mounted_ ? mountHeightOffset_ : 0.0f; + glm::vec3 pivot = spawnPos + glm::vec3(0.0f, 0.0f, PIVOT_HEIGHT + mountedOffset); glm::vec3 camDir = -forward3D; glm::vec3 camPos = pivot + camDir * currentDistance; smoothedCamPos = camPos; diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 6d44ca1a..f601100c 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -499,14 +499,20 @@ void Renderer::setMounted(uint32_t mountInstId, float heightOffset) { mountInstanceId_ = mountInstId; mountHeightOffset_ = heightOffset; charAnimState = CharAnimState::MOUNT; - if (cameraController) cameraController->setMounted(true); + if (cameraController) { + cameraController->setMounted(true); + cameraController->setMountHeightOffset(heightOffset); + } } void Renderer::clearMount() { mountInstanceId_ = 0; mountHeightOffset_ = 0.0f; charAnimState = CharAnimState::IDLE; - if (cameraController) cameraController->setMounted(false); + if (cameraController) { + cameraController->setMounted(false); + cameraController->setMountHeightOffset(0.0f); + } } uint32_t Renderer::resolveMeleeAnimId() {