Skip to content
Snippets Groups Projects
Commit 5040c08a authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Zoom and pan in GUI

parent 9ba605f7
No related branches found
No related tags found
No related merge requests found
...@@ -72,6 +72,20 @@ ftl::gui::Screen::Screen(ftl::Configurable *proot, ftl::net::Universe *pnet, ftl ...@@ -72,6 +72,20 @@ ftl::gui::Screen::Screen(ftl::Configurable *proot, ftl::net::Universe *pnet, ftl
has_vr_ = vr::VR_IsHmdPresent(); has_vr_ = vr::VR_IsHmdPresent();
#endif #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)); setSize(Vector2i(1280,720));
toolbuttheme = new Theme(*theme()); toolbuttheme = new Theme(*theme());
...@@ -354,11 +368,27 @@ void ftl::gui::Screen::setActiveCamera(ftl::gui::Camera *cam) { ...@@ -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) { 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)) { if (nanogui::Screen::mouseMotionEvent(p, rel, button, modifiers)) {
return true; return true;
} else { } 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? 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, ...@@ -367,7 +397,10 @@ bool ftl::gui::Screen::mouseButtonEvent(const nanogui::Vector2i &p, int button,
if (nanogui::Screen::mouseButtonEvent(p, button, down, modifiers)) { if (nanogui::Screen::mouseButtonEvent(p, button, down, modifiers)) {
return true; return true;
} else { } 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>(); Eigen::Vector2f screenSize = size().cast<float>();
auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff()); auto mScale = (screenSize.cwiseQuotient(imageSize).minCoeff());
Eigen::Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize); Eigen::Vector2f scaleFactor = mScale * imageSize.cwiseQuotient(screenSize);
...@@ -391,6 +424,8 @@ bool ftl::gui::Screen::mouseButtonEvent(const nanogui::Vector2i &p, int button, ...@@ -391,6 +424,8 @@ bool ftl::gui::Screen::mouseButtonEvent(const nanogui::Vector2i &p, int button,
//lookPoint_ = Eigen::Vector3f(worldPos[0],worldPos[1],worldPos[2]); //lookPoint_ = Eigen::Vector3f(worldPos[0],worldPos[1],worldPos[2]);
//LOG(INFO) << "Depth at click = " << -camPos[2]; //LOG(INFO) << "Depth at click = " << -camPos[2];
return true; return true;
} else {
} }
return false; return false;
} }
...@@ -446,9 +481,9 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) { ...@@ -446,9 +481,9 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) {
#endif #endif
if (mImageID < std::numeric_limits<unsigned int>::max() && imageSize[0] > 0) { 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 scaleFactor = mScale * imageSize.cwiseQuotient(screenSize);
Vector2f positionInScreen(0.0f, 0.0f); Vector2f positionInScreen(pos_x_, pos_y_);
auto mOffset = (screenSize - (screenSize.cwiseProduct(scaleFactor))) / 2; auto mOffset = (screenSize - (screenSize.cwiseProduct(scaleFactor))) / 2;
Vector2f positionAfterOffset = positionInScreen + mOffset; Vector2f positionAfterOffset = positionInScreen + mOffset;
Vector2f imagePosition = positionAfterOffset.cwiseQuotient(screenSize); Vector2f imagePosition = positionAfterOffset.cwiseQuotient(screenSize);
......
...@@ -29,6 +29,7 @@ class Screen : public nanogui::Screen { ...@@ -29,6 +29,7 @@ class Screen : public nanogui::Screen {
~Screen(); ~Screen();
bool mouseMotionEvent(const Eigen::Vector2i &p, const Eigen::Vector2i &rel, int button, int modifiers); 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 mouseButtonEvent(const nanogui::Vector2i &p, int button, bool down, int modifiers);
bool keyboardEvent(int key, int scancode, int action, int modifiers); bool keyboardEvent(int key, int scancode, int action, int modifiers);
...@@ -92,6 +93,9 @@ class Screen : public nanogui::Screen { ...@@ -92,6 +93,9 @@ class Screen : public nanogui::Screen {
ftl::Configurable *root_; ftl::Configurable *root_;
std::string status_; std::string status_;
ftl::gui::Camera *camera_; ftl::gui::Camera *camera_;
float zoom_;
float pos_x_;
float pos_y_;
GLuint leftEye_; GLuint leftEye_;
GLuint rightEye_; GLuint rightEye_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment