Worked on trackball cam interface.

This commit is contained in:
2023-05-03 13:39:47 +03:00
parent ad0a80eb85
commit a63d58a1ec
+46 -40
View File
@@ -16,23 +16,10 @@
#include <nanogui/window.h> #include <nanogui/window.h>
#include <nanogui/layout.h> #include <nanogui/layout.h>
#include <nanogui/label.h> #include <nanogui/label.h>
#include <nanogui/checkbox.h>
#include <nanogui/button.h> #include <nanogui/button.h>
#include <nanogui/toolbutton.h>
#include <nanogui/popupbutton.h> #include <nanogui/popupbutton.h>
#include <nanogui/combobox.h>
#include <nanogui/progressbar.h> #include <nanogui/progressbar.h>
#include <nanogui/icons.h>
#include <nanogui/messagedialog.h> #include <nanogui/messagedialog.h>
#include <nanogui/textbox.h>
#include <nanogui/slider.h>
#include <nanogui/imagepanel.h>
#include <nanogui/imageview.h>
#include <nanogui/vscrollpanel.h>
#include <nanogui/colorwheel.h>
#include <nanogui/colorpicker.h>
#include <nanogui/graph.h>
#include <nanogui/tabwidget.h>
#include <nanogui/texture.h> #include <nanogui/texture.h>
#include <nanogui/textarea.h> #include <nanogui/textarea.h>
#include <nanogui/shader.h> #include <nanogui/shader.h>
@@ -52,11 +39,12 @@
#include "grbl.h" #include "grbl.h"
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <regex> #include <regex>
#include "grbl_communication.h"
#include "grbl_machine.h" #include "grbl_machine.h"
#include "string_utils.h" #include "string_utils.h"
#include "render.h" #include "render.h"
#include "glm/gtx/quaternion.hpp"
#include <glm/ext/quaternion_float.hpp>
#include <glm/ext/quaternion_trigonometric.hpp>
#include <glm/vec3.hpp> // glm::vec3 #include <glm/vec3.hpp> // glm::vec3
#include <glm/vec4.hpp> // glm::vec4 #include <glm/vec4.hpp> // glm::vec4
#include <glm/mat4x4.hpp> // glm::mat4 #include <glm/mat4x4.hpp> // glm::mat4
@@ -68,7 +56,6 @@ using namespace nanogui;
grbl::machine cnc{}; grbl::machine cnc{};
class SenderApp : public Screen, public grbl::machine_listener { class SenderApp : public Screen, public grbl::machine_listener {
public: public:
@@ -87,8 +74,19 @@ public:
grbl::program_renderer renderer; grbl::program_renderer renderer;
glm::vec3 cam_target = glm::vec3(0); glm::vec3 cam_target = glm::vec3(0);
glm::vec3 cam_src = glm::vec3(0); float cam_zoom = 0;
glm::vec2 cam_rotate = {0, 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") { SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") {
inc_ref(); inc_ref();
@@ -176,16 +174,7 @@ public:
if (pgm.load_from_file(path)) { if (pgm.load_from_file(path)) {
btnCheckProgram->set_enabled(true); btnCheckProgram->set_enabled(true);
// btnRunProgram->set_enabled(true); // btnRunProgram->set_enabled(true);
renderer.update(pgm, cnc); this->init_program_geometry();
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};
} else { } else {
btnCheckProgram->set_enabled(false); btnCheckProgram->set_enabled(false);
btnRunProgram->set_enabled(false); btnRunProgram->set_enabled(false);
@@ -431,12 +420,19 @@ public:
if (window->mouse_focused()) { if (window->mouse_focused()) {
return result; return result;
} else { } else {
std::cout << "Mouse motion p:" << p << ", rel:" << rel << ", button:" << button << ", .modifiers:" << modifiers << std::endl; // std::cout << "Mouse motion p:" << p << ", rel:" << rel << ", button:" << button << ", .modifiers:" << modifiers << std::endl;
if (button == 1) { bool is_rotating = button == 1;
cam_rotate += glm::vec2((float) rel.x() / 100.0f, (float) rel.y() / 100.0f); bool is_panning = button == 2;
} else if (button == 2) { if (is_rotating) {
cam_src.x += (float) rel.x() / 10.0f; if (abs(rel.x()) > abs(rel.y())) {
cam_src.y += (float) rel.y() / 10.0f; 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; return true;
} }
@@ -446,9 +442,9 @@ public:
if (window->mouse_focused()) { if (window->mouse_focused()) {
return Widget::scroll_event(p, rel); return Widget::scroll_event(p, rel);
} else { } else {
std::cout << "Scroll event: p:" << p << ", rel:" << rel << std::endl; // std::cout << "Scroll event: p:" << p << ", rel:" << rel << std::endl;
cam_src.z += rel.y(); cam_zoom -= rel.y() * cam_zoom/10.0f;
cam_src.z = std::max(cam_src.z, 0.1f); cam_zoom = std::max(cam_zoom, 0.1f);
return true; return true;
} }
@@ -469,10 +465,20 @@ public:
renderer.update(pgm, cnc); renderer.update(pgm, cnc);
// compute mvp // compute mvp
glm::mat4 projection = glm::perspective(45.0f * glm::pi<float>() / 180.0f, (float) fb_size.x() / (float) fb_size.y(), 0.1f, 1000.f); glm::mat4 projection = glm::perspective(45.0f * glm::pi<float>() / 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)); glm::vec3 cam_src = cam_target + glm::vec3(glm::vec4(0, 0, cam_zoom, 1) * cam_src_rotation);
view = glm::rotate(view, cam_rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); // 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<float>()/2.0f, glm::vec3(1, 0, 0));
// glm::mat4 view = glm::toMat4(cam_src_rotation) * glm::rotate(glm::mat4(1.0f), glm::pi<float>()/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<float>()/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<float>()/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<float>()/2.0f, glm::vec3(1, 0, 0)) * glm::translate(glm::mat4(1.0f), -cam_src);
glm::mat4 model = glm::mat4(1.0f); glm::mat4 model = glm::mat4(1.0f);
auto mvp = projection * view * model; auto mvp = projection * view * model;