From 44f9b1f57045e906b10d9439761d8aa72e6bad64 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Thu, 6 Aug 2020 20:15:04 +0300 Subject: [PATCH] Add some cursor checks and a reset --- applications/gui2/src/modules/camera.cpp | 47 +++++++++++++++++++++++- applications/gui2/src/modules/camera.hpp | 1 + 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp index 7049f0b44..f527a4cc1 100644 --- a/applications/gui2/src/modules/camera.cpp +++ b/applications/gui2/src/modules/camera.cpp @@ -428,7 +428,11 @@ bool Camera::hasFrame() { } Eigen::Matrix4d Camera::cursor() const { - return nanogui::lookAt(cursor_pos_, cursor_target_, cursor_normal_).cast<double>(); + if (cursor_normal_.norm() > 0.0f) return nanogui::lookAt(cursor_pos_, cursor_target_, cursor_normal_).cast<double>(); + + Eigen::Matrix4d ident; + ident.setIdentity(); + return ident; } void Camera::drawOverlay(NVGcontext *ctx, const nanogui::Vector2f &s, const nanogui::Vector2f &is, const Eigen::Vector2f &offset) { @@ -573,6 +577,14 @@ void Camera::setCursor(int x, int y) { void Camera::setOriginToCursor() { using ftl::calibration::transform::inverse; + + // Check for valid cursor + if (cursor_normal_.norm() == 0.0f) return; + float cursor_length = (cursor_target_ - cursor_pos_).norm(); + float cursor_dist = cursor_pos_.norm(); + if (cursor_length < 0.01f || cursor_length > 5.0f) return; + if (cursor_dist > 10.0f) return; + if (movable_) { auto *rend = io->feed()->getRenderer(frame_id_); if (rend) { @@ -596,4 +608,37 @@ void Camera::setOriginToCursor() { } } } + + cursor_target_ = Eigen::Vector3f(0.0f,0.0f,0.0f); + cursor_pos_ = Eigen::Vector3f(0.0f,0.0f,0.0f); + cursor_normal_ = Eigen::Vector3f(0.0f,0.0f,0.0f); +} + +void Camera::resetOrigin() { + cursor_target_ = Eigen::Vector3f(0.0f,0.0f,0.0f); + cursor_pos_ = Eigen::Vector3f(0.0f,0.0f,0.0f); + cursor_normal_ = Eigen::Vector3f(0.0f,0.0f,0.0f); + + if (movable_) { + auto *rend = io->feed()->getRenderer(frame_id_); + if (rend) { + auto *filter = rend->filter(); + if (filter) { + cv::Mat cur; + cv::eigen2cv(cursor(), cur); + auto fss = filter->getLatestFrameSets(); + for (auto &fs : fss) { + if (fs->frameset() == frame_id_.frameset()) continue; + + for (auto &f : fs->frames) { + auto response = f.response(); + auto &rgbdf = response.cast<ftl::rgbd::Frame>(); + auto &calib = rgbdf.setCalibration(); + calib = f.cast<ftl::rgbd::Frame>().getCalibration(); + calib.origin = cur; + } + }; + } + } + } } diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp index ec1ae47dc..d314f0a7a 100644 --- a/applications/gui2/src/modules/camera.hpp +++ b/applications/gui2/src/modules/camera.hpp @@ -81,6 +81,7 @@ public: const Eigen::Vector3f getCursorPosition() const { return cursor_pos_; } void setOriginToCursor(); + void resetOrigin(); private: int frame_idx = -1; -- GitLab