From 48b3c0745b4c10ee8c6896bd2321cc791dc3e10a Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Sat, 25 Jan 2025 22:15:14 +0100 Subject: [PATCH] Improve input time scale handling --- openVulkanoCpp/Controller/ArcballCameraController.cpp | 2 +- openVulkanoCpp/Controller/FreeCamCameraController.cpp | 2 +- openVulkanoCpp/Host/GraphicsAppManager.cpp | 2 +- openVulkanoCpp/Input/InputManager.cpp | 3 ++- openVulkanoCpp/Input/InputManager.hpp | 7 ++++++- openVulkanoCpp/Math/Range.hpp | 3 +++ openVulkanoCpp/Scene/MorphableCameraController.cpp | 2 +- openVulkanoCpp/Scene/PlaneCameraController.cpp | 2 +- 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/openVulkanoCpp/Controller/ArcballCameraController.cpp b/openVulkanoCpp/Controller/ArcballCameraController.cpp index d19c66b..19af69b 100644 --- a/openVulkanoCpp/Controller/ArcballCameraController.cpp +++ b/openVulkanoCpp/Controller/ArcballCameraController.cpp @@ -61,7 +61,7 @@ namespace OpenVulkano Math::Vector3f_SIMD vec(input->GetAxis(m_actionSide), input->GetAxis(m_actionUp), -input->GetAxis(m_actionForward)); if (vec != Math::Vector3f_SIMD (0)) { - const float timeScale = CURRENT_FRAME.frameTime; //TODO + const float timeScale = input->GetTimeScale(); //TODO vec = vec * timeScale * m_movementSpeedModifier; // scale vector vec = GetCamera()->GetRotationMatrix() * Math::Vector3f(vec); const Math::Vector4f_SIMD movement(vec, 0); diff --git a/openVulkanoCpp/Controller/FreeCamCameraController.cpp b/openVulkanoCpp/Controller/FreeCamCameraController.cpp index 8f94d3e..20f95c1 100644 --- a/openVulkanoCpp/Controller/FreeCamCameraController.cpp +++ b/openVulkanoCpp/Controller/FreeCamCameraController.cpp @@ -32,7 +32,7 @@ namespace OpenVulkano vec = Math::Utils::normalize(vec); } - float timeScale = 3 * CURRENT_FRAME.frameTime; //TODO + float timeScale = 3 * input->GetTimeScale(); //TODO vec = vec * timeScale * 3.0f; // scale vector if (input->GetButton(m_actionBoost)) { diff --git a/openVulkanoCpp/Host/GraphicsAppManager.cpp b/openVulkanoCpp/Host/GraphicsAppManager.cpp index 9044561..d811c65 100644 --- a/openVulkanoCpp/Host/GraphicsAppManager.cpp +++ b/openVulkanoCpp/Host/GraphicsAppManager.cpp @@ -193,7 +193,7 @@ namespace OpenVulkano else { auto start = clock::now(); - inputManager->Tick(); + inputManager->Tick(CURRENT_FRAME.frameTime); mainThreadTaskPool.Tick(); app->Tick(); if (CURRENT_FRAME.needsRedraw) diff --git a/openVulkanoCpp/Input/InputManager.cpp b/openVulkanoCpp/Input/InputManager.cpp index b93efbd..2c8ca5f 100644 --- a/openVulkanoCpp/Input/InputManager.cpp +++ b/openVulkanoCpp/Input/InputManager.cpp @@ -136,8 +136,9 @@ namespace OpenVulkano::Input return devices; } - void InputManager::Tick() + void InputManager::Tick(double time) { + timescale = inputTimeRange.Clamp(time); for(InputDevice* device : devices) { device->Tick(); diff --git a/openVulkanoCpp/Input/InputManager.hpp b/openVulkanoCpp/Input/InputManager.hpp index 116effb..85a1673 100644 --- a/openVulkanoCpp/Input/InputManager.hpp +++ b/openVulkanoCpp/Input/InputManager.hpp @@ -9,6 +9,7 @@ #include "InputDevice.hpp" #include "InputAction.hpp" #include "InputShortcut.hpp" +#include "Math/Range.hpp" #include #include @@ -22,7 +23,7 @@ namespace OpenVulkano::Input public: static InputManager* GetInstance(); - void Tick(); + void Tick(double time); void RegisterInputDevice(InputDevice* device) { @@ -53,9 +54,13 @@ namespace OpenVulkano::Input return lastActiveDevice; } + [[nodiscard]] float GetTimeScale() const { return timescale; } + private: std::unordered_map> actionNameMapping; std::vector devices; InputDevice* lastActiveDevice = nullptr; + const Math::Range inputTimeRange = { 1.0f / 10000, 1.0f / 30 }; // Limit input time range from 1/10k FPS to 1/30fps + float timescale = 1.0f / 60; }; } diff --git a/openVulkanoCpp/Math/Range.hpp b/openVulkanoCpp/Math/Range.hpp index 723978b..9f25a42 100644 --- a/openVulkanoCpp/Math/Range.hpp +++ b/openVulkanoCpp/Math/Range.hpp @@ -6,6 +6,7 @@ #pragma once +#include "Math.hpp" #ifdef _MSC_VER #undef min #undef max @@ -32,5 +33,7 @@ namespace OpenVulkano::Math [[nodiscard]] T& GetMax() { return max; } [[nodiscard]] T GetSize() const { return max - min; } + + [[nodiscard]] T Clamp(const T& value) const { return Math::Utils::clamp(value, min, max); } }; } diff --git a/openVulkanoCpp/Scene/MorphableCameraController.cpp b/openVulkanoCpp/Scene/MorphableCameraController.cpp index daa172d..7c1d1c0 100644 --- a/openVulkanoCpp/Scene/MorphableCameraController.cpp +++ b/openVulkanoCpp/Scene/MorphableCameraController.cpp @@ -44,7 +44,7 @@ namespace OpenVulkano::Scene if (m_isMorphing) { - m_currentTime += CURRENT_FRAME.frameTime; + m_currentTime += input->GetTimeScale(); if (m_currentTime > m_animationDuration) m_currentTime = m_animationDuration; float t = m_currentTime / m_animationDuration; if (t >= 1.0f) diff --git a/openVulkanoCpp/Scene/PlaneCameraController.cpp b/openVulkanoCpp/Scene/PlaneCameraController.cpp index 59a08d9..15bc9c4 100644 --- a/openVulkanoCpp/Scene/PlaneCameraController.cpp +++ b/openVulkanoCpp/Scene/PlaneCameraController.cpp @@ -55,7 +55,7 @@ namespace OpenVulkano::Scene if (Math::Utils::length2(direction) > 0.0f) { direction = Math::Utils::normalize(direction); } - float timeScale = CURRENT_FRAME.frameTime; + float timeScale = input->GetTimeScale(); float speed = 3.0f; direction *= timeScale * speed; direction = direction - Math::Utils::dot(direction, m_planeNormal) * m_planeNormal;