diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index c1cb3d6a..278c60e0 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -964,8 +964,8 @@ void CameraController::update(float deltaTime) { float fallCatch = 3.0f; float dz = *groundH - feetZ; - if (dz <= stepUp && dz >= -fallCatch && - (verticalVelocity <= 0.0f || *groundH > feetZ)) { + // Only snap to ground when falling/landing (not when jumping up) + if (dz <= stepUp && dz >= -fallCatch && verticalVelocity <= 0.0f) { newPos.z = *groundH + eyeHeight; verticalVelocity = 0.0f; grounded = true; diff --git a/src/rendering/terrain_manager.cpp b/src/rendering/terrain_manager.cpp index df9d4d61..cc4134d4 100644 --- a/src/rendering/terrain_manager.cpp +++ b/src/rendering/terrain_manager.cpp @@ -451,9 +451,12 @@ std::shared_ptr TerrainManager::prepareTile(int x, int y) { // Build doodad's local transform (WoW coordinates) // WMO doodads use quaternion rotation + // Fix: WoW quaternions need X/Y swap for correct orientation + glm::quat fixedRotation(doodad.rotation.w, doodad.rotation.y, doodad.rotation.x, doodad.rotation.z); + glm::mat4 doodadLocal(1.0f); doodadLocal = glm::translate(doodadLocal, doodad.position); - doodadLocal *= glm::mat4_cast(doodad.rotation); + doodadLocal *= glm::mat4_cast(fixedRotation); doodadLocal = glm::scale(doodadLocal, glm::vec3(doodad.scale)); // Full world transform = WMO world transform * doodad local transform