From fb57d97594e0a312b299433e6fda856d4d442cff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Wed, 25 Oct 2023 20:47:11 +0200
Subject: [PATCH] added zoom using SDL_BUTTON_X1,SDL_BUTTON_X2 in run.cpp

---
 src/controls/include/controls/cam_control.hpp |  2 +-
 src/controls/src/cam_control.cpp              | 23 +++++++++++--------
 src/controls/src/control_hub.cpp              |  2 +-
 src/edit/src/scene.cpp                        |  2 +-
 src/osi/src/run.cpp                           | 14 +++++++++--
 src/studio/src/simulator.cpp                  | 21 ++++++++++++++---
 6 files changed, 46 insertions(+), 18 deletions(-)

diff --git a/src/controls/include/controls/cam_control.hpp b/src/controls/include/controls/cam_control.hpp
index c6bca11..faa5f23 100644
--- a/src/controls/include/controls/cam_control.hpp
+++ b/src/controls/include/controls/cam_control.hpp
@@ -35,7 +35,7 @@ public:
 class OrbitCameraController : public CameraController
 {
     glm::vec3 target = glm::vec3(0.0f, 0.0f, 0.0f);
-    float distance = 5.0f;
+    float zoom = 5.0f;
 
 public:
     using CameraController::CameraController;
diff --git a/src/controls/src/cam_control.cpp b/src/controls/src/cam_control.cpp
index 66e7a7e..7afb1c6 100644
--- a/src/controls/src/cam_control.cpp
+++ b/src/controls/src/cam_control.cpp
@@ -77,14 +77,17 @@ void OrbitCameraController::keyboardMove(const std::unordered_set<std::string> &
 }
 void OrbitCameraController::mouseMove(const osi::Mouse &mouse, const osi::Window &window, bool &editor_running)
 {
-    if (window.is_minimized())
+    if (window.is_minimized()
+        || !window.is_mouse_in_window())
         return;
+        
+    if (mouse.just_pressed().contains("MouseWheelUp"))
+        zoom = (zoom - 0.5f) < 1.0f ? 1.0f : zoom - 0.5f; 
 
-    float theta = 0.0f; // azimuthal angle
-    float phi = 0.0f;   // polar angle
+    if (mouse.just_pressed().contains("MouseWheelDown"))
+        zoom = (zoom + 0.5f) > 20.0f ? 20.0f : zoom + 0.5f; 
 
-    if (mouse.down().contains("MouseRight")
-        && window.is_mouse_in_window())
+    if (mouse.down().contains("MouseRight"))
     {
         if (!editor_running || (editor_running && window.is_resized()))
         {
@@ -94,12 +97,12 @@ void OrbitCameraController::mouseMove(const osi::Mouse &mouse, const osi::Window
         }
 
         glm::i32vec2 offset = mouse.pos_delta();
-        
-        theta = -static_cast<float>(offset.x) * getSens().x; 
-        phi = -static_cast<float>(-offset.y) * getSens().y;
+        float theta = -static_cast<float>(offset.x) * getSens().x; //azimuth angle
+        float phi = static_cast<float>(offset.y) * getSens().y; // polar angle
 
         turn(theta, phi);
-        auto ahead = -bound_frame->getRotationAxisZ();
-        bound_frame->setPosVec(target - (distance * ahead));
     }
+    
+    auto front_vector = -bound_frame->getRotationAxisZ();
+    bound_frame->setPosVec(target - (zoom * front_vector));
 }
\ No newline at end of file
diff --git a/src/controls/src/control_hub.cpp b/src/controls/src/control_hub.cpp
index a0ff669..36e44df 100644
--- a/src/controls/src/control_hub.cpp
+++ b/src/controls/src/control_hub.cpp
@@ -5,7 +5,7 @@ ControlHub::ControlHub()
     auto orbit_cam = std::make_shared<OrbitCameraController>();
     auto free_cam = std::make_shared<FreeFlyCameraController>();
 
-    cam_controls.emplace_back(orbit_cam); // BROKEN
+    cam_controls.emplace_back(orbit_cam);
     cam_controls.emplace_back(free_cam);
 
     obj_controls.emplace_back(std::make_shared<ObjectController>());
diff --git a/src/edit/src/scene.cpp b/src/edit/src/scene.cpp
index 7685e1a..5dcac8a 100644
--- a/src/edit/src/scene.cpp
+++ b/src/edit/src/scene.cpp
@@ -87,7 +87,7 @@ void Scene::createScene()
     // addMeshNode("./data/models/final_giraffe.obj", glm::vec3(-5, 1, 3));
 
     /* ADD CAMERA */
-    addCameraNode(60.0f, glm::vec3(0.0f, 1.0f, -6.0f), glm::vec3(0.0f, 180.0f, 0.0f));
+    addCameraNode(60.0f, glm::vec3(0.0f, 0.0f, -5.0f), glm::vec3(0.0f, 180.0f, 0.0f));
 }
 
 void Scene::removeActiveCamera(camera_ptr camera) // TO DO: fix
diff --git a/src/osi/src/run.cpp b/src/osi/src/run.cpp
index cd6907b..830e8da 100644
--- a/src/osi/src/run.cpp
+++ b/src/osi/src/run.cpp
@@ -37,8 +37,8 @@ static std::string to_button_name(std::uint8_t const button_index)
         case SDL_BUTTON_LEFT: return "MouseLeft";
         case SDL_BUTTON_RIGHT: return "MouseRight";
         case SDL_BUTTON_MIDDLE: return "MouseMiddle";
-        case SDL_BUTTON_X1: return "MouseX1";
-        case SDL_BUTTON_X2: return "MouseX2";
+        case SDL_BUTTON_X1: return "MouseWheelUp";
+        case SDL_BUTTON_X2: return "MouseWheelDown";
         default: return "MouseUNKNOWN";
     }
 }
@@ -261,6 +261,16 @@ void run(Config const& cfg)
                 if (!ImGui::GetIO().WantCaptureMouse)
                 {
                     // TODO!
+                    if(event.wheel.y > 0) // scroll up
+                    {
+                        std::string const name = to_button_name(SDL_BUTTON_X1);
+                        mouse->m_just_pressed.insert(name);
+                    }
+                    else if(event.wheel.y < 0) // scroll down
+                    {
+                        std::string const name = to_button_name(SDL_BUTTON_X2);
+                        mouse->m_just_pressed.insert(name);
+                    }
                 }
                 break;
             default: break;
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index 36abbe3..e89c246 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -41,11 +41,26 @@ void Simulator::update()
     editor->changeOrthoCamAxes(scene, controls);
     // editor->changeLevel(scene, controls);
 
-    auto cam_frame = scene->getActiveCameras()[0].lock()->getFrame()->getPosition();
-    auto cam_front_vec = controls->getActiveCamCtrl()->getFrontVec();
+    // auto cam_frame = scene->getActiveCameras()[0].lock()->getFrame()->getPosition();
+    // auto cam_front_vec = controls->getActiveCamCtrl()->getFrontVec();
     // std::cout << "Camera coords: X " << cam_frame.x << " | Y " << cam_frame.y << " | Z " << cam_frame.z << std::endl;
     // std::cout << "Camera frontVec: X " << cam_front_vec.x << " | Y " << cam_front_vec.y << " | Z " << cam_front_vec.z << std::endl;
-
+    auto m_pressed = mouse().just_pressed();
+    if (!m_pressed.empty())
+    {
+        std::cout << "pressed: ";
+        for (auto button : m_pressed)
+            std::cout << button << ", ";
+        std::cout << std::endl << "held: ";
+    }
+    auto m_held = mouse().down();
+    if (!m_held.empty())
+    {
+        for (auto button : m_held)
+        std::cout << button << ", ";
+        std::cout << std::endl;
+    }
+    
     /* Rotation around x-axis demo */
     // controls->rotate_obj(glm::vec3(1.0f, 0.0f, 0.0f));
 }
-- 
GitLab