Worked on trackball cam interface.
This commit is contained in:
@@ -16,23 +16,10 @@
|
||||
#include <nanogui/window.h>
|
||||
#include <nanogui/layout.h>
|
||||
#include <nanogui/label.h>
|
||||
#include <nanogui/checkbox.h>
|
||||
#include <nanogui/button.h>
|
||||
#include <nanogui/toolbutton.h>
|
||||
#include <nanogui/popupbutton.h>
|
||||
#include <nanogui/combobox.h>
|
||||
#include <nanogui/progressbar.h>
|
||||
#include <nanogui/icons.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/textarea.h>
|
||||
#include <nanogui/shader.h>
|
||||
@@ -52,11 +39,12 @@
|
||||
#include "grbl.h"
|
||||
#include <gtest/gtest.h>
|
||||
#include <regex>
|
||||
#include "grbl_communication.h"
|
||||
#include "grbl_machine.h"
|
||||
#include "string_utils.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/vec4.hpp> // glm::vec4
|
||||
#include <glm/mat4x4.hpp> // 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<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));
|
||||
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<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);
|
||||
auto mvp = projection * view * model;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user