diff options
author | Elias Åström <ryvnf@riseup.net> | 2021-03-19 21:43:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-19 21:43:01 +0100 |
commit | 59a1b53d675ee404cb32564262282a3ecf69d94c (patch) | |
tree | aadd055be2db88ef421473a5b818e485d3fa86e4 | |
parent | 96d4df995c1baf364217699cd43e5ab71918c9d8 (diff) | |
download | minetest-59a1b53d675ee404cb32564262282a3ecf69d94c.tar.gz minetest-59a1b53d675ee404cb32564262282a3ecf69d94c.tar.bz2 minetest-59a1b53d675ee404cb32564262282a3ecf69d94c.zip |
Scale mouse/joystick sensitivity depending on FOV (#11007)
-rw-r--r-- | src/client/game.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/client/game.cpp b/src/client/game.cpp index 2575e5406..9cc359843 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -829,6 +829,8 @@ private: const NodeMetadata *meta); static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX]; + f32 getSensitivityScaleFactor() const; + InputHandler *input = nullptr; Client *client = nullptr; @@ -2341,7 +2343,6 @@ void Game::checkZoomEnabled() m_game_ui->showTranslatedStatusText("Zoom currently disabled by game or mod"); } - void Game::updateCameraDirection(CameraOrientation *cam, float dtime) { if ((device->isWindowActive() && device->isWindowFocused() @@ -2377,6 +2378,18 @@ void Game::updateCameraDirection(CameraOrientation *cam, float dtime) } } +// Get the factor to multiply with sensitivity to get the same mouse/joystick +// responsiveness independently of FOV. +f32 Game::getSensitivityScaleFactor() const +{ + f32 fov_y = client->getCamera()->getFovY(); + + // Multiply by a constant such that it becomes 1.0 at 72 degree FOV and + // 16:9 aspect ratio to minimize disruption of existing sensitivity + // settings. + return tan(fov_y / 2.0f) * 1.3763818698f; +} + void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) { #ifdef HAVE_TOUCHSCREENGUI @@ -2392,8 +2405,9 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) dist.Y = -dist.Y; } - cam->camera_yaw -= dist.X * m_cache_mouse_sensitivity; - cam->camera_pitch += dist.Y * m_cache_mouse_sensitivity; + f32 sens_scale = getSensitivityScaleFactor(); + cam->camera_yaw -= dist.X * m_cache_mouse_sensitivity * sens_scale; + cam->camera_pitch += dist.Y * m_cache_mouse_sensitivity * sens_scale; if (dist.X != 0 || dist.Y != 0) input->setMousePos(center.X, center.Y); @@ -2402,7 +2416,8 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) #endif if (m_cache_enable_joysticks) { - f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime; + f32 sens_scale = getSensitivityScaleFactor(); + f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime * sens_scale; cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) * c; cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) * c; } |