diff --git a/src/gfx/include/gfx/control.hpp b/src/gfx/include/gfx/control.hpp index 515f0b4e56b2af573ce17ce81071c70c4209ab56..409d78cb339fe6820a9840cc657572a20dd3ae82 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 7b16596bc8c47ac3be29df342ee5bb0a253eedc7..126008b5fb20cdc246438606980b4a817bd60ec8 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 6a4504dac036a61ca0cd334c18d9d33331d7bf53..f6621e0afcd9b7261b960adde8af8dd639159d06 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 278875ac25a758a39f7135696de27ad7deae9454..c0e0d34aaf0869cc39ddeeabb28d8e2dccc0d50b 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 c353219382e2bbb933d5ef9f7c82361c69338b25..081d9f60596a1201460348427e11e5fe7622de8f 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;