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