diff --git a/src/features/editScene/camera/EditorCamera.cpp b/src/features/editScene/camera/EditorCamera.cpp index 3e4f56f..c793e54 100644 --- a/src/features/editScene/camera/EditorCamera.cpp +++ b/src/features/editScene/camera/EditorCamera.cpp @@ -14,7 +14,6 @@ EditorCamera::EditorCamera(Ogre::SceneManager *sceneMgr, , m_pitch(-20.0f) , m_rotating(false) , m_panning(false) - , m_zooming(false) , m_fpsMode(false) , m_lastMouseX(0) , m_lastMouseY(0) @@ -44,6 +43,13 @@ EditorCamera::EditorCamera(Ogre::SceneManager *sceneMgr, Ogre::Viewport *vp = window->addViewport(m_camera); vp->setBackgroundColour(Ogre::ColourValue(0.1f, 0.1f, 0.1f)); + // Setup CameraMan for proper camera control (no roll) + m_cameraMan = std::make_unique(m_cameraNode); + m_cameraMan->setStyle(OgreBites::CS_ORBIT); + m_cameraMan->setTarget(m_targetNode); + m_cameraMan->setYawPitchDist(Ogre::Degree(m_yaw), Ogre::Degree(m_pitch), + m_distance); + updateCameraPosition(); } @@ -54,7 +60,52 @@ void EditorCamera::update(float deltaTime) if (m_fpsMode) { updateFPSMovement(deltaTime); } - updateCameraPosition(); + // CameraMan handles the positioning + m_cameraMan->setYawPitchDist(Ogre::Degree(m_yaw), Ogre::Degree(m_pitch), + m_distance); + m_cameraMan->frameRendered(Ogre::FrameEvent{ deltaTime }); +} + +void EditorCamera::updateFPSMovement(float deltaTime) +{ + // Get camera's forward and right vectors from CameraMan's derived orientation + Ogre::Quaternion orientation = m_camera->getDerivedOrientation(); + Ogre::Vector3 forward = orientation * Ogre::Vector3::UNIT_Z; + Ogre::Vector3 right = orientation * Ogre::Vector3::UNIT_X; + Ogre::Vector3 up = Ogre::Vector3::UNIT_Y; // World up for Q/E + + // Flatten forward vector to horizontal plane for WSAD movement + Ogre::Vector3 forwardHorizontal = + Ogre::Vector3(forward.x, 0, forward.z); + if (forwardHorizontal.squaredLength() > 0.0001f) { + forwardHorizontal.normalise(); + } + + Ogre::Vector3 movement = Ogre::Vector3::ZERO; + + // WSAD movement (horizontal plane) + if (m_keyW) + movement -= forwardHorizontal; + if (m_keyS) + movement += forwardHorizontal; + if (m_keyA) + movement -= right; + if (m_keyD) + movement += right; + + // Q/E for vertical movement + if (m_keyQ) + movement -= up; + if (m_keyE) + movement += up; + + // Apply movement + if (movement.squaredLength() > 0.0001f) { + movement.normalise(); + m_target += movement * FPS_SPEED * deltaTime; + m_targetNode->setPosition(m_target); + m_cameraMan->setTarget(m_targetNode); + } } void EditorCamera::handleMouseMove(const OgreBites::MouseMotionEvent &evt) @@ -86,6 +137,8 @@ void EditorCamera::handleMouseMove(const OgreBites::MouseMotionEvent &evt) up * (dy * PAN_SPEED * m_distance); m_target += pan; + m_targetNode->setPosition(m_target); + m_cameraMan->setTarget(m_targetNode); } } @@ -99,8 +152,6 @@ void EditorCamera::handleMousePress(const OgreBites::MouseButtonEvent &evt) m_fpsMode = true; // Enable FPS mode when right mouse is held } else if (evt.button == OgreBites::BUTTON_MIDDLE) { m_panning = true; - } else if (evt.button == OgreBites::BUTTON_LEFT) { - // Left click is for selection, handled by app } } @@ -150,56 +201,18 @@ void EditorCamera::handleKeyboard(const OgreBites::KeyboardEvent &evt) } } -void EditorCamera::updateFPSMovement(float deltaTime) -{ - // Get camera's forward and right vectors - Ogre::Quaternion orientation = m_camera->getDerivedOrientation(); - Ogre::Vector3 forward = orientation * Ogre::Vector3::UNIT_Z; - Ogre::Vector3 right = orientation * Ogre::Vector3::UNIT_X; - Ogre::Vector3 up = Ogre::Vector3::UNIT_Y; // World up for Q/E - - // Flatten forward vector to horizontal plane for WSAD movement - Ogre::Vector3 forwardHorizontal = - Ogre::Vector3(forward.x, 0, forward.z); - if (forwardHorizontal.squaredLength() > 0.0001f) { - forwardHorizontal.normalise(); - } - - Ogre::Vector3 movement = Ogre::Vector3::ZERO; - - // WSAD movement (horizontal plane) - if (m_keyW) - movement -= forwardHorizontal; - if (m_keyS) - movement += forwardHorizontal; - if (m_keyA) - movement -= right; - if (m_keyD) - movement += right; - - // Q/E for vertical movement - if (m_keyQ) - movement -= up; - if (m_keyE) - movement += up; - - // Apply movement - if (movement.squaredLength() > 0.0001f) { - movement.normalise(); - m_target += movement * FPS_SPEED * deltaTime; - } -} - void EditorCamera::focusOn(const Ogre::Vector3 &point) { m_target = point; - updateCameraPosition(); + m_targetNode->setPosition(m_target); + m_cameraMan->setTarget(m_targetNode); } void EditorCamera::setPosition(const Ogre::Vector3 &pos) { m_target = pos; - updateCameraPosition(); + m_targetNode->setPosition(m_target); + m_cameraMan->setTarget(m_targetNode); } Ogre::Ray EditorCamera::getMouseRay(float screenX, float screenY) const @@ -217,20 +230,8 @@ Ogre::Ray EditorCamera::getMouseRay(float screenX, float screenY) const void EditorCamera::updateCameraPosition() { - // Calculate camera position based on spherical coordinates - float yawRad = Ogre::Degree(m_yaw).valueRadians(); - float pitchRad = Ogre::Degree(m_pitch).valueRadians(); - - Ogre::Vector3 offset; - offset.x = m_distance * Ogre::Math::Cos(pitchRad) * - Ogre::Math::Sin(yawRad); - offset.y = m_distance * Ogre::Math::Sin(pitchRad); - offset.z = m_distance * Ogre::Math::Cos(pitchRad) * - Ogre::Math::Cos(yawRad); - - m_position = m_target + offset; - - m_cameraNode->setPosition(m_position); - m_cameraNode->lookAt(m_target, Ogre::Node::TS_WORLD); + // CameraMan handles the positioning m_targetNode->setPosition(m_target); + m_cameraMan->setYawPitchDist(Ogre::Degree(m_yaw), Ogre::Degree(m_pitch), + m_distance); } diff --git a/src/features/editScene/camera/EditorCamera.hpp b/src/features/editScene/camera/EditorCamera.hpp index fa5e703..1bb241e 100644 --- a/src/features/editScene/camera/EditorCamera.hpp +++ b/src/features/editScene/camera/EditorCamera.hpp @@ -1,15 +1,17 @@ #ifndef EDITSCENE_EDITORCAMERA_HPP #define EDITSCENE_EDITORCAMERA_HPP #pragma once +#include #include #include #include #include #include +#include /** - * Simple editor camera controller - * Supports orbit and fly modes + * Editor camera controller using OgreBites::CameraMan + * Supports orbit (default) and FPS modes */ class EditorCamera { public: @@ -18,7 +20,7 @@ public: ~EditorCamera(); /** - * Update camera movement + * Update camera (called each frame) */ void update(float deltaTime); @@ -50,6 +52,11 @@ public: */ Ogre::Ray getMouseRay(float screenX, float screenY) const; + /** + * Check if in FPS mode + */ + bool isFPSMode() const { return m_fpsMode; } + private: void updateCameraPosition(); void updateFPSMovement(float deltaTime); @@ -58,6 +65,9 @@ private: Ogre::Camera *m_camera; Ogre::SceneNode *m_cameraNode; Ogre::SceneNode *m_targetNode; + + // Use OgreBites::CameraMan for proper camera control + std::unique_ptr m_cameraMan; // Camera state Ogre::Vector3 m_position; @@ -69,7 +79,6 @@ private: // Input state bool m_rotating; bool m_panning; - bool m_zooming; bool m_fpsMode; int m_lastMouseX; int m_lastMouseY; @@ -85,10 +94,7 @@ private: // Movement speeds static constexpr float ROTATION_SPEED = 0.3f; static constexpr float PAN_SPEED = 0.01f; - static constexpr float ZOOM_SPEED = 0.5f; static constexpr float FPS_SPEED = 10.0f; - static constexpr float MIN_DISTANCE = 1.0f; - static constexpr float MAX_DISTANCE = 1000.0f; }; #endif // EDITSCENE_EDITORCAMERA_HPP