From a63d58a1ec556ac3eaefaec6d10e7eacb1fe2a97 Mon Sep 17 00:00:00 2001 From: Adrian Scripca Date: Wed, 3 May 2023 13:39:47 +0300 Subject: [PATCH] Worked on trackball cam interface. --- main.cpp | 86 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/main.cpp b/main.cpp index dfeeafb..1c79aad 100644 --- a/main.cpp +++ b/main.cpp @@ -16,23 +16,10 @@ #include #include #include -#include #include -#include #include -#include #include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -52,11 +39,12 @@ #include "grbl.h" #include #include -#include "grbl_communication.h" #include "grbl_machine.h" #include "string_utils.h" #include "render.h" - +#include "glm/gtx/quaternion.hpp" +#include +#include #include // glm::vec3 #include // glm::vec4 #include // glm::mat4 @@ -68,7 +56,6 @@ using namespace nanogui; grbl::machine cnc{}; - class SenderApp : public Screen, public grbl::machine_listener { public: @@ -87,8 +74,19 @@ public: grbl::program_renderer renderer; glm::vec3 cam_target = glm::vec3(0); - glm::vec3 cam_src = glm::vec3(0); - glm::vec2 cam_rotate = {0, 0}; + float cam_zoom = 0; + glm::quat cam_src_rotation = glm::quat(1.0, 0.0, 0.0, 0.0); // identity quaternion + + void init_program_geometry() { + renderer.update(pgm, cnc); + + auto max_pos = renderer.get_extents_max(); + auto min_pos = renderer.get_extents_min(); + + cam_target = (max_pos - min_pos) / 2.0f; + cam_zoom = (max_pos.x - min_pos.x); + cam_src_rotation = glm::quat(1.0, 0.0, 0.0, 0.0); + } SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") { inc_ref(); @@ -176,16 +174,7 @@ public: if (pgm.load_from_file(path)) { btnCheckProgram->set_enabled(true); // btnRunProgram->set_enabled(true); - renderer.update(pgm, cnc); - - auto max_pos = renderer.get_extents_max(); - auto min_pos = renderer.get_extents_min(); - - cam_target = (max_pos - min_pos) / 2.0f; - cam_src = cam_target; - cam_src.z = (max_pos.x - min_pos.x); - - cam_rotate = {0, 0}; + this->init_program_geometry(); } else { btnCheckProgram->set_enabled(false); btnRunProgram->set_enabled(false); @@ -431,12 +420,19 @@ public: if (window->mouse_focused()) { return result; } else { - std::cout << "Mouse motion p:" << p << ", rel:" << rel << ", button:" << button << ", .modifiers:" << modifiers << std::endl; - if (button == 1) { - cam_rotate += glm::vec2((float) rel.x() / 100.0f, (float) rel.y() / 100.0f); - } else if (button == 2) { - cam_src.x += (float) rel.x() / 10.0f; - cam_src.y += (float) rel.y() / 10.0f; +// std::cout << "Mouse motion p:" << p << ", rel:" << rel << ", button:" << button << ", .modifiers:" << modifiers << std::endl; + bool is_rotating = button == 1; + bool is_panning = button == 2; + if (is_rotating) { + if (abs(rel.x()) > abs(rel.y())) { + cam_src_rotation *= glm::angleAxis(rel.x() / 100.0f, glm::vec3(0, 1, 0)); + } else { + cam_src_rotation *= glm::angleAxis(rel.y() / 100.0f, glm::vec3(1, 0, 0)); + } + + } else if (is_panning) { +// cam_src.x += (float) rel.x() / 10.0f; +// cam_src.y += (float) rel.y() / 10.0f; } return true; } @@ -446,9 +442,9 @@ public: if (window->mouse_focused()) { return Widget::scroll_event(p, rel); } else { - std::cout << "Scroll event: p:" << p << ", rel:" << rel << std::endl; - cam_src.z += rel.y(); - cam_src.z = std::max(cam_src.z, 0.1f); +// std::cout << "Scroll event: p:" << p << ", rel:" << rel << std::endl; + cam_zoom -= rel.y() * cam_zoom/10.0f; + cam_zoom = std::max(cam_zoom, 0.1f); return true; } @@ -469,10 +465,20 @@ public: renderer.update(pgm, cnc); // compute mvp + glm::mat4 projection = glm::perspective(45.0f * glm::pi() / 180.0f, (float) fb_size.x() / (float) fb_size.y(), 0.1f, 1000.f); - glm::mat4 view = glm::lookAt(cam_src, cam_target, glm::vec3{0.0f, 1.0f, 0.0f}); - view = glm::rotate(view, cam_rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); - view = glm::rotate(view, cam_rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); + + glm::vec3 cam_src = cam_target + glm::vec3(glm::vec4(0, 0, cam_zoom, 1) * cam_src_rotation); +// glm::mat4 view = glm::lookAt(cam_src, cam_target, glm::vec3{0.0f, 1.0f, 0.0f}); +// glm::mat4 view = glm::rotate(glm::mat4(1.0f), glm::pi()/2.0f, glm::vec3(1, 0, 0)); +// glm::mat4 view = glm::toMat4(cam_src_rotation) * glm::rotate(glm::mat4(1.0f), glm::pi()/2.0f, glm::vec3(1, 0, 0)) * glm::translate(glm::mat4(1.0f), -cam_target); +// glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -cam_zoom)) * glm::toMat4(cam_src_rotation) * glm::rotate(glm::mat4(1.0f), glm::pi()/2.0f, glm::vec3(1, 0, 0)) * glm::translate(glm::mat4(1.0f), -cam_target); + glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -cam_zoom)) * + glm::toMat4(cam_src_rotation) * + // glm::rotate(glm::mat4(1.0f), glm::pi()/2.0f, glm::vec3(1, 0, 0)) * + glm::translate(glm::mat4(1.0f), -cam_target); +// glm::mat4 view = glm::rotate(glm::mat4(1.0f), -glm::pi()/2.0f, glm::vec3(1, 0, 0)) * glm::translate(glm::mat4(1.0f), -cam_src); + glm::mat4 model = glm::mat4(1.0f); auto mvp = projection * view * model;