diff --git a/applications/gui/src/screen.cpp b/applications/gui/src/screen.cpp index 3b2aae1aaff8d00daa6c80c3d03d8ffb47423783..c359e227d9be39ab98df2cd8e816323b6a0ecbef 100644 --- a/applications/gui/src/screen.cpp +++ b/applications/gui/src/screen.cpp @@ -72,6 +72,20 @@ ftl::gui::Screen::Screen(ftl::Configurable *proot, ftl::net::Universe *pnet, ftl has_vr_ = vr::VR_IsHmdPresent(); #endif + zoom_ = root_->value("zoom", 1.0f); + root_->on("zoom", [this](const ftl::config::Event &e) { + zoom_ = root_->value("zoom", 1.0f); + }); + + pos_x_ = root_->value("position_x", 0.0f); + root_->on("position_x", [this](const ftl::config::Event &e) { + pos_x_ = root_->value("position_x", 0.0f); + }); + pos_y_ = root_->value("position_y", 0.0f); + root_->on("position_y", [this](const ftl::config::Event &e) { + pos_y_ = root_->value("position_y", 0.0f); + }); + setSize(Vector2i(1280,720)); toolbuttheme = new Theme(*theme()); @@ -354,11 +368,27 @@ void ftl::gui::Screen::setActiveCamera(ftl::gui::Camera *cam) { } } +bool ftl::gui::Screen::scrollEvent(const Eigen::Vector2i &p, const Eigen::Vector2f &rel) { + if (nanogui::Screen::scrollEvent(p, rel)) { + return true; + } else { + zoom_ += zoom_ * 0.1f * rel[1]; + return true; + } +} + bool ftl::gui::Screen::mouseMotionEvent(const Eigen::Vector2i &p, const Eigen::Vector2i &rel, int button, int modifiers) { if (nanogui::Screen::mouseMotionEvent(p, rel, button, modifiers)) { return true; } else { - if (camera_) camera_->mouseMovement(rel[0], rel[1], button); + if (camera_) { + if (button == 1) { + camera_->mouseMovement(rel[0], rel[1], button); + } else if (button == 2) { + pos_x_ += rel[0]; + pos_y_ += -rel[1]; + } + } } return true; // TODO: return statement was missing; is true correct? } @@ -367,7 +397,10 @@ bool ftl::gui::Screen::mouseButtonEvent(const nanogui::Vector2i &p, int button, if (nanogui::Screen::mouseButtonEvent(p, button, down, modifiers)) { return true; } else { - if (camera_ && down) { + if (!camera_) return false; + + //ol movable = camera_->source()->hasCapabilities(ftl::rgbd::kCapMovable); + if (button == 0 && down) { Eigen::Vector2f screenSize = size().cast<float>(); auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()); Eigen::Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize); @@ -391,8 +424,10 @@ bool ftl::gui::Screen::mouseButtonEvent(const nanogui::Vector2i &p, int button, //lookPoint_ = Eigen::Vector3f(worldPos[0],worldPos[1],worldPos[2]); //LOG(INFO) << "Depth at click = " << -camPos[2]; return true; + } else { + } - return false; + return false; } } @@ -446,9 +481,9 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) { #endif if (mImageID < std::numeric_limits<unsigned int>::max() && imageSize[0] > 0) { - auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()); + auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()) * zoom_; Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize); - Vector2f positionInScreen(0.0f, 0.0f); + Vector2f positionInScreen(pos_x_, pos_y_); auto mOffset = (screenSize - (screenSize.cwiseProduct(scaleFactor))) / 2; Vector2f positionAfterOffset = positionInScreen + mOffset; Vector2f imagePosition = positionAfterOffset.cwiseQuotient(screenSize); diff --git a/applications/gui/src/screen.hpp b/applications/gui/src/screen.hpp index a0ac39d064875bdc5be81e526a95ac9269617c25..a195f4ccdd45500c534039709ba6762fdd640b22 100644 --- a/applications/gui/src/screen.hpp +++ b/applications/gui/src/screen.hpp @@ -29,6 +29,7 @@ class Screen : public nanogui::Screen { ~Screen(); bool mouseMotionEvent(const Eigen::Vector2i &p, const Eigen::Vector2i &rel, int button, int modifiers); + bool scrollEvent(const Eigen::Vector2i &p, const Eigen::Vector2f &rel); bool mouseButtonEvent(const nanogui::Vector2i &p, int button, bool down, int modifiers); bool keyboardEvent(int key, int scancode, int action, int modifiers); @@ -92,6 +93,9 @@ class Screen : public nanogui::Screen { ftl::Configurable *root_; std::string status_; ftl::gui::Camera *camera_; + float zoom_; + float pos_x_; + float pos_y_; GLuint leftEye_; GLuint rightEye_;