From 2d2c4e1caf74fcf2cffaff680c0c55b0a718c848 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Sun, 4 Jun 2023 11:24:58 +0200
Subject: [PATCH] added object rotation around world y-axis

---
 src/gfx/include/gfx/control.hpp         |  1 +
 src/gfx/include/gfx/obj_control.hpp     |  3 +++
 src/gfx/src/obj_control.cpp             | 14 ++++++++++++++
 src/studio/include/studio/simulator.hpp |  1 +
 src/studio/src/simulator.cpp            | 15 +++++++++++++--
 5 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/gfx/include/gfx/control.hpp b/src/gfx/include/gfx/control.hpp
index 515f0b4..409d78c 100644
--- a/src/gfx/include/gfx/control.hpp
+++ b/src/gfx/include/gfx/control.hpp
@@ -29,6 +29,7 @@ public:
     // virtual void setUpVec();
 
     void setStep(float dt);
+    float getSpeed() const { return speed; }
     void setSpeed(float new_speed);
 
     void teleport(glm::vec3 new_position) { bound_frame->setPosVec(new_position); }
diff --git a/src/gfx/include/gfx/obj_control.hpp b/src/gfx/include/gfx/obj_control.hpp
index 7b16596..126008b 100644
--- a/src/gfx/include/gfx/obj_control.hpp
+++ b/src/gfx/include/gfx/obj_control.hpp
@@ -11,10 +11,13 @@
 #include <unordered_set>
 #include <string>
 
+#include <osi/mouse.hpp>
+
 class ObjectController : public Controller
 {
 public:
     using Controller::Controller;
+    void mouse_rotate(const osi::Mouse &mouse);
 };
 
 
diff --git a/src/gfx/src/obj_control.cpp b/src/gfx/src/obj_control.cpp
index 6a4504d..f6621e0 100644
--- a/src/gfx/src/obj_control.cpp
+++ b/src/gfx/src/obj_control.cpp
@@ -1 +1,15 @@
 #include <gfx/obj_control.hpp>
+
+void ObjectController::mouse_rotate(const osi::Mouse &mouse)
+{
+    // check for start at object
+    if (!mouse.down().contains("MouseLeft"))
+        return;
+
+    glm::i32vec2 offset = mouse.pos_delta();
+    float xoffset = static_cast<float>(offset.x);
+
+    auto inv_rotation = glm::inverse(bound_frame->getRotationMat());
+    glm::vec3 inv_rot_y = glm::column(inv_rotation, 1);
+    bound_frame->rotateRotationQuat(glm::angleAxis(xoffset * step, inv_rot_y));
+}
\ No newline at end of file
diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp
index 278875a..c0e0d34 100644
--- a/src/studio/include/studio/simulator.hpp
+++ b/src/studio/include/studio/simulator.hpp
@@ -63,6 +63,7 @@ struct Simulator : public osi::Simulator
     void manage_selection(node_ptr nearest_node); // Not node tree compatible
 
     void select_object();
+    void rotate_object();
     void process_mouse();
 
 private:    
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index c353219..081d9f6 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -134,7 +134,8 @@ Simulator::Simulator()
 
     /* ROTATE FIRST OBJECT */
     obj_controls[object_ctrl_type]->setFrame(scene[0]->getFrame());
-    obj_controls[object_ctrl_type]->rotate(glm::vec3(0.0f, 50.0f, 0.0f));  
+    obj_controls[object_ctrl_type]->rotate(glm::vec3(0.0f, 50.0f, 0.0f));
+    obj_controls[object_ctrl_type]->rotate(glm::vec3(45.0f, 0.0f, 0.0f));  
 
     /* SET ACTIVE CAMERA AND CONTROLLER TYPE 
      * ADD ACTIVE CAMERAS HERE. */
@@ -476,6 +477,16 @@ void Simulator::select_object()
     manage_selection(nearest_node);
 }
 
+void Simulator::rotate_object()
+{
+    if (!selection)
+        return;
+    auto controller = obj_controls[object_ctrl_type];
+    controller->setFrame(selection->getFrame());
+    controller->setStep(timer().dt());
+    controller->mouse_rotate(mouse());
+}
+
 void Simulator::process_mouse()
 {
     cam_controls[active_camera_type]->process_mouse(mouse(), window(), editor_running);
@@ -488,7 +499,7 @@ void Simulator::process_mouse()
             // happens in obj controller
             break;
         case state::rotate:
-            // happens in obj controller
+            rotate_object();
             break;
         default:
             break;
-- 
GitLab