Keyboard camera navigation works now

This commit is contained in:
2026-03-31 22:47:03 +03:00
parent 3ebb41647e
commit e5f4bbfb90
3 changed files with 169 additions and 60 deletions

View File

@@ -61,61 +61,67 @@ EditorApp::~EditorApp()
void EditorApp::setup()
{
// Base setup
OgreBites::ApplicationContext::setup();
try {
// Base setup
OgreBites::ApplicationContext::setup();
// Create scene manager
Ogre::Root *root = getRoot();
m_sceneMgr = root->createSceneManager();
m_sceneMgr->setAmbientLight(Ogre::ColourValue(0.3f, 0.3f, 0.3f));
// Get root and create scene manager
Ogre::Root *root = getRoot();
m_sceneMgr = root->createSceneManager();
m_sceneMgr->setAmbientLight(Ogre::ColourValue(0.3f, 0.3f, 0.3f));
// Add scene manager to RTShader generator
Ogre::RTShader::ShaderGenerator *shadergen =
Ogre::RTShader::ShaderGenerator::getSingletonPtr();
if (shadergen) {
shadergen->addSceneManager(m_sceneMgr);
// Add scene manager to RTShader generator
Ogre::RTShader::ShaderGenerator *shadergen =
Ogre::RTShader::ShaderGenerator::getSingletonPtr();
if (shadergen) {
shadergen->addSceneManager(m_sceneMgr);
}
// Setup overlay system - get from ApplicationContext
m_overlaySystem = getOverlaySystem();
OgreAssert(m_overlaySystem, "OverlaySystem not available");
m_sceneMgr->addRenderQueueListener(m_overlaySystem);
// Setup ImGui overlay
m_imguiOverlay = initialiseImGui();
if (m_imguiOverlay) {
m_imguiOverlay->setZOrder(300);
m_imguiOverlay->show();
ImGui::StyleColorsDark();
}
// Setup camera
m_camera =
std::make_unique<EditorCamera>(m_sceneMgr, getRenderWindow());
// Setup ECS and scene
setupECS();
setupLights();
createGrid();
createAxes();
createDefaultEntities();
// Setup UI system
m_uiSystem = std::make_unique<EditorUISystem>(m_world, m_sceneMgr);
// Add default entities to UI cache
for (auto &e : m_defaultEntities) {
m_uiSystem->addEntity(e);
}
// Create and register ImGui render listener
m_imguiListener = std::make_unique<ImGuiRenderListener>(
m_imguiOverlay, m_uiSystem.get());
getRenderWindow()->addListener(m_imguiListener.get());
// Register input listeners
addInputListener(this);
addInputListener(getImGuiInputListener());
} catch (const std::exception& e) {
Ogre::LogManager::getSingleton().logMessage("Setup failed: " + Ogre::String(e.what()));
throw;
}
// Setup overlay system - get from ApplicationContext
m_overlaySystem = getOverlaySystem();
OgreAssert(m_overlaySystem, "OverlaySystem not available");
m_sceneMgr->addRenderQueueListener(m_overlaySystem);
// Setup ImGui overlay
m_imguiOverlay = initialiseImGui();
if (m_imguiOverlay) {
m_imguiOverlay->setZOrder(300);
m_imguiOverlay->show();
ImGui::StyleColorsDark();
}
// Setup camera
m_camera =
std::make_unique<EditorCamera>(m_sceneMgr, getRenderWindow());
// Setup ECS and scene
setupECS();
setupLights();
createGrid();
createAxes();
createDefaultEntities();
// Setup UI system
m_uiSystem = std::make_unique<EditorUISystem>(m_world, m_sceneMgr);
// Add default entities to UI cache
for (auto &e : m_defaultEntities) {
m_uiSystem->addEntity(e);
}
// Create and register ImGui render listener
m_imguiListener = std::make_unique<ImGuiRenderListener>(
m_imguiOverlay, m_uiSystem.get());
getRenderWindow()->addListener(m_imguiListener.get());
// Register input listeners
addInputListener(this);
addInputListener(getImGuiInputListener());
}
void EditorApp::setupECS()
@@ -166,7 +172,7 @@ void EditorApp::createGrid()
grid->begin("Ogre/AxisGizmo",
Ogre::RenderOperation::OT_LINE_LIST);
// Draw grid lines - grey color set once
// Draw grid lines
float size = 10.0f;
int divisions = 20;
float step = size * 2.0f / divisions;
@@ -321,6 +327,11 @@ bool EditorApp::keyPressed(const OgreBites::KeyboardEvent &evt)
{
m_currentModifiers = evt.keysym.mod;
// Forward to camera for FPS movement
if (m_camera) {
m_camera->handleKeyboard(evt);
}
// Delete key to delete selected entity
if (evt.keysym.sym == 127) { // Delete key
// Handled in UI
@@ -345,6 +356,12 @@ bool EditorApp::keyPressed(const OgreBites::KeyboardEvent &evt)
bool EditorApp::keyReleased(const OgreBites::KeyboardEvent &evt)
{
m_currentModifiers = evt.keysym.mod;
// Forward to camera for FPS movement
if (m_camera) {
m_camera->handleKeyboard(evt);
}
return true;
}

View File

@@ -15,8 +15,15 @@ EditorCamera::EditorCamera(Ogre::SceneManager *sceneMgr,
, m_rotating(false)
, m_panning(false)
, m_zooming(false)
, m_fpsMode(false)
, m_lastMouseX(0)
, m_lastMouseY(0)
, m_keyW(false)
, m_keyS(false)
, m_keyA(false)
, m_keyD(false)
, m_keyQ(false)
, m_keyE(false)
{
// Create camera
m_camera = sceneMgr->createCamera("EditorCamera");
@@ -44,7 +51,9 @@ EditorCamera::~EditorCamera() = default;
void EditorCamera::update(float deltaTime)
{
(void)deltaTime;
if (m_fpsMode) {
updateFPSMovement(deltaTime);
}
updateCameraPosition();
}
@@ -68,7 +77,8 @@ void EditorCamera::handleMouseMove(const OgreBites::MouseMotionEvent &evt)
if (m_panning) {
// Get right and up vectors from camera's orientation
Ogre::Quaternion orientation = m_camera->getDerivedOrientation();
Ogre::Quaternion orientation =
m_camera->getDerivedOrientation();
Ogre::Vector3 right = orientation * Ogre::Vector3::UNIT_X;
Ogre::Vector3 up = orientation * Ogre::Vector3::UNIT_Y;
@@ -86,6 +96,7 @@ void EditorCamera::handleMousePress(const OgreBites::MouseButtonEvent &evt)
if (evt.button == OgreBites::BUTTON_RIGHT) {
m_rotating = true;
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) {
@@ -97,6 +108,10 @@ void EditorCamera::handleMouseRelease(const OgreBites::MouseButtonEvent &evt)
{
if (evt.button == OgreBites::BUTTON_RIGHT) {
m_rotating = false;
m_fpsMode =
false; // Disable FPS mode when right mouse is released
// Reset key states
m_keyW = m_keyS = m_keyA = m_keyD = m_keyQ = m_keyE = false;
} else if (evt.button == OgreBites::BUTTON_MIDDLE) {
m_panning = false;
}
@@ -104,9 +119,75 @@ void EditorCamera::handleMouseRelease(const OgreBites::MouseButtonEvent &evt)
void EditorCamera::handleKeyboard(const OgreBites::KeyboardEvent &evt)
{
// Camera keyboard controls can be added here
// For now, mouse controls are sufficient
(void)evt;
// Track key states for FPS movement
bool pressed = (evt.type == OgreBites::KEYDOWN);
switch (evt.keysym.sym) {
case 'w':
case 'W':
m_keyW = pressed;
break;
case 's':
case 'S':
m_keyS = pressed;
break;
case 'a':
case 'A':
m_keyA = pressed;
break;
case 'd':
case 'D':
m_keyD = pressed;
break;
case 'q':
case 'Q':
m_keyQ = pressed;
break;
case 'e':
case 'E':
m_keyE = pressed;
break;
}
}
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)
@@ -127,10 +208,10 @@ Ogre::Ray EditorCamera::getMouseRay(float screenX, float screenY) const
Ogre::Viewport *viewport = m_camera->getViewport();
if (!viewport)
return Ogre::Ray();
float normX = screenX / viewport->getActualWidth();
float normY = screenY / viewport->getActualHeight();
return m_camera->getCameraToViewportRay(normX, normY);
}

View File

@@ -52,6 +52,7 @@ public:
private:
void updateCameraPosition();
void updateFPSMovement(float deltaTime);
Ogre::SceneManager *m_sceneMgr;
Ogre::Camera *m_camera;
@@ -69,13 +70,23 @@ private:
bool m_rotating;
bool m_panning;
bool m_zooming;
bool m_fpsMode;
int m_lastMouseX;
int m_lastMouseY;
// Keyboard state for FPS movement
bool m_keyW;
bool m_keyS;
bool m_keyA;
bool m_keyD;
bool m_keyQ;
bool m_keyE;
// 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;
};