From 51df6be94ad47b35ff600b3268d771c37cff4770 Mon Sep 17 00:00:00 2001
From: Josh Morgenstern <josh@morgenstern.dev>
Date: Wed, 23 Jun 2021 10:40:08 +0200
Subject: [PATCH] [#60] add normalized panView when using controller

---
 modules/camera/include/vkcv/camera/CameraController.hpp   | 2 +-
 modules/camera/include/vkcv/camera/CameraManager.hpp      | 1 +
 .../camera/include/vkcv/camera/PilotCameraController.hpp  | 2 +-
 .../include/vkcv/camera/TrackballCameraController.hpp     | 2 +-
 modules/camera/src/vkcv/camera/CameraManager.cpp          | 3 ++-
 modules/camera/src/vkcv/camera/PilotCameraController.cpp  | 8 ++++----
 .../camera/src/vkcv/camera/TrackballCameraController.cpp  | 6 +++---
 7 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/modules/camera/include/vkcv/camera/CameraController.hpp b/modules/camera/include/vkcv/camera/CameraController.hpp
index 28dd8436..620aae69 100644
--- a/modules/camera/include/vkcv/camera/CameraController.hpp
+++ b/modules/camera/include/vkcv/camera/CameraController.hpp
@@ -65,7 +65,7 @@ namespace vkcv::camera {
          * @param gamepadIndex The gamepad index.
          * @param camera The camera object.
          */
-        virtual void gamepadCallback(int gamepadIndex, Camera &camera) = 0;
+        virtual void gamepadCallback(int gamepadIndex, Camera &camera, double frametime) = 0;
     };
 
 }
\ No newline at end of file
diff --git a/modules/camera/include/vkcv/camera/CameraManager.hpp b/modules/camera/include/vkcv/camera/CameraManager.hpp
index b0597da4..409f9196 100644
--- a/modules/camera/include/vkcv/camera/CameraManager.hpp
+++ b/modules/camera/include/vkcv/camera/CameraManager.hpp
@@ -44,6 +44,7 @@ namespace vkcv::camera {
         double m_lastY;
 
         double m_inputDelayTimer;
+        double m_frameTime;
 
         /**
          * @brief Binds the camera object to the window event handles.
diff --git a/modules/camera/include/vkcv/camera/PilotCameraController.hpp b/modules/camera/include/vkcv/camera/PilotCameraController.hpp
index 2ba35854..ab1470c6 100644
--- a/modules/camera/include/vkcv/camera/PilotCameraController.hpp
+++ b/modules/camera/include/vkcv/camera/PilotCameraController.hpp
@@ -143,7 +143,7 @@ namespace vkcv::camera {
          * @param gamepadIndex The gamepad index.
          * @param camera The camera object.
          */
-        void gamepadCallback(int gamepadIndex, Camera &camera);
+        void gamepadCallback(int gamepadIndex, Camera &camera, double frametime);
     };
 
 }
\ No newline at end of file
diff --git a/modules/camera/include/vkcv/camera/TrackballCameraController.hpp b/modules/camera/include/vkcv/camera/TrackballCameraController.hpp
index 1fbf59e5..97839bf1 100644
--- a/modules/camera/include/vkcv/camera/TrackballCameraController.hpp
+++ b/modules/camera/include/vkcv/camera/TrackballCameraController.hpp
@@ -100,7 +100,7 @@ namespace vkcv::camera {
          * @param gamepadIndex The gamepad index.
          * @param camera The camera object.
          */
-        void gamepadCallback(int gamepadIndex, Camera &camera);
+        void gamepadCallback(int gamepadIndex, Camera &camera, double frametime);
     };
 
 }
\ No newline at end of file
diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp
index 40b88528..44db9d0e 100644
--- a/modules/camera/src/vkcv/camera/CameraManager.cpp
+++ b/modules/camera/src/vkcv/camera/CameraManager.cpp
@@ -105,7 +105,7 @@ namespace vkcv::camera {
             m_inputDelayTimer = (1-triggered)*m_inputDelayTimer + triggered * time; // Only reset timer, if dpad was pressed - is this cheaper than if-clause?
         }
 
-        getActiveController().gamepadCallback(gamepadIndex, getActiveCamera());     // handle camera rotation, translation
+        getActiveController().gamepadCallback(gamepadIndex, getActiveCamera(), m_frameTime);     // handle camera rotation, translation
     }
 
     CameraController& CameraManager::getActiveController() {
@@ -184,6 +184,7 @@ namespace vkcv::camera {
     }
 
     void CameraManager::update(double deltaTime) {
+        m_frameTime = deltaTime;
         if (glfwGetWindowAttrib(m_window.getWindow(), GLFW_FOCUSED) == GLFW_TRUE) {
             getActiveController().updateCamera(deltaTime, getActiveCamera());
         }
diff --git a/modules/camera/src/vkcv/camera/PilotCameraController.cpp b/modules/camera/src/vkcv/camera/PilotCameraController.cpp
index 39796f02..c2086cf0 100644
--- a/modules/camera/src/vkcv/camera/PilotCameraController.cpp
+++ b/modules/camera/src/vkcv/camera/PilotCameraController.cpp
@@ -130,11 +130,11 @@ namespace vkcv::camera {
         }
     }
 
-    void PilotCameraController::gamepadCallback(int gamepadIndex, Camera &camera) {
+    void PilotCameraController::gamepadCallback(int gamepadIndex, Camera &camera, double frametime) {
         GLFWgamepadstate gamepadState;
         glfwGetGamepadState(gamepadIndex, &gamepadState);
 
-        float sensitivity = 0.05f;
+        float sensitivity = 100.0f;
         double threshold = 0.1;    // todo: needs further investigation!
 
         // handle rotations
@@ -142,9 +142,9 @@ namespace vkcv::camera {
         double stickRightY = static_cast<double>(gamepadState.axes[GLFW_GAMEPAD_AXIS_RIGHT_Y]);
 
         double rightXVal = glm::clamp(std::abs(stickRightX) - threshold, 0.0, 1.0)
-                * copysign(1.0, stickRightX) * sensitivity;
+                * copysign(1.0, stickRightX) * sensitivity * frametime;
         double rightYVal = glm::clamp(std::abs(stickRightY) - threshold, 0.0, 1.0)
-                * copysign(1.0, stickRightY) * sensitivity;
+                * copysign(1.0, stickRightY) * sensitivity * frametime;
         panView(rightXVal, rightYVal, camera);
 
         // handle zooming
diff --git a/modules/camera/src/vkcv/camera/TrackballCameraController.cpp b/modules/camera/src/vkcv/camera/TrackballCameraController.cpp
index 278feb76..a1500d93 100644
--- a/modules/camera/src/vkcv/camera/TrackballCameraController.cpp
+++ b/modules/camera/src/vkcv/camera/TrackballCameraController.cpp
@@ -98,11 +98,11 @@ namespace vkcv::camera {
         }
     }
 
-    void TrackballCameraController::gamepadCallback(int gamepadIndex, Camera &camera) {
+    void TrackballCameraController::gamepadCallback(int gamepadIndex, Camera &camera, double frametime) {
         GLFWgamepadstate gamepadState;
         glfwGetGamepadState(gamepadIndex, &gamepadState);
 
-        float sensitivity = 0.025f;
+        float sensitivity = 100.0f;
         double threshold = 0.1;    // todo: needs further investigation!
 
         // handle rotations
@@ -111,7 +111,7 @@ namespace vkcv::camera {
         
         double rightXVal = glm::clamp((abs(stickRightX)-threshold), 0.0, 1.0) * std::copysign(1.0, stickRightX);
         double rightYVal = glm::clamp((abs(stickRightY)-threshold), 0.0, 1.0) * std::copysign(1.0, stickRightY);
-        panView(rightXVal * sensitivity, rightYVal * sensitivity, camera);
+        panView(rightXVal * sensitivity, rightYVal * sensitivity * frametime, camera);
 
         // handle translation
         double stickLeftY = static_cast<double>(gamepadState.axes[GLFW_GAMEPAD_AXIS_LEFT_Y]);
-- 
GitLab