diff --git a/cpp/open3d/visualization/gui/PickPointsInteractor.cpp b/cpp/open3d/visualization/gui/PickPointsInteractor.cpp index 45ca7c44c1e..9f7c7d7be0f 100644 --- a/cpp/open3d/visualization/gui/PickPointsInteractor.cpp +++ b/cpp/open3d/visualization/gui/PickPointsInteractor.cpp @@ -268,37 +268,41 @@ void PickPointsInteractor::SetOnStartedPolygonPicking( } void PickPointsInteractor::Mouse(const MouseEvent &e) { - if (e.type == MouseEvent::BUTTON_UP) { - if (e.modifiers & int(KeyModifier::ALT)) { - if (pending_.empty() || pending_.back().keymods == 0) { - pending_.push({{gui::Point(e.x, e.y)}, int(KeyModifier::ALT)}); - if (on_ui_changed_) { - on_ui_changed_({}); - } - } else { - pending_.back().polygon.push_back(gui::Point(e.x, e.y)); - if (on_started_poly_pick_) { - on_started_poly_pick_(); - } - if (on_ui_changed_) { - std::vector lines; - auto &polygon = pending_.back().polygon; - for (size_t i = 1; i < polygon.size(); ++i) { - auto &p0 = polygon[i - 1]; - auto &p1 = polygon[i]; - lines.push_back({p0.x, p0.y}); - lines.push_back({p1.x, p1.y}); - } - lines.push_back({polygon.back().x, polygon.back().y}); - lines.push_back({polygon[0].x, polygon[0].y}); - on_ui_changed_(lines); - } + if (e.type != MouseEvent::BUTTON_UP) + return; + + bool polygon_picking_requested = e.modifiers & int(KeyModifier::ALT); + if (!polygon_picking_requested) { + // standard point picking + pending_.push({{gui::Point(e.x, e.y)}, e.modifiers}); + DoPick(); + } else { + // special polygon picking mode + if (pending_.empty() || pending_.back().keymods == 0) { + pending_.push({{gui::Point(e.x, e.y)}, e.modifiers}); + if (on_ui_changed_) { + on_ui_changed_({}); } } else { - pending_.push({{gui::Point(e.x, e.y)}, 0}); - DoPick(); + pending_.back().polygon.push_back(gui::Point(e.x, e.y)); + if (on_started_poly_pick_) { + on_started_poly_pick_(); + } + if (on_ui_changed_) { + std::vector lines; + auto &polygon = pending_.back().polygon; + for (size_t i = 1; i < polygon.size(); ++i) { + auto &p0 = polygon[i - 1]; + auto &p1 = polygon[i]; + lines.push_back({p0.x, p0.y}); + lines.push_back({p1.x, p1.y}); + } + lines.push_back({polygon.back().x, polygon.back().y}); + lines.push_back({polygon[0].x, polygon[0].y}); + on_ui_changed_(lines); + } } - } + } } void PickPointsInteractor::Key(const KeyEvent &e) { diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp index 3ab06cec1b9..652386d4dd4 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp @@ -384,8 +384,8 @@ struct O3DVisualizer::Impl { std::vector>> &indices, int keymods) { - if ((keymods & int(KeyModifier::SHIFT)) || - polygon_selection_unselects_) { + bool unselect_mode_requested = keymods & int(KeyModifier::SHIFT); + if (unselect_mode_requested || polygon_selection_unselects_) { selections_->UnselectIndices(indices); } else { selections_->SelectIndices(indices); @@ -489,10 +489,13 @@ struct O3DVisualizer::Impl { #if __APPLE__ const char *selection_help = - "Cmd-click to select a point\nCmd-ctrl-click to polygon select"; + const char *selection_help = R"(Cmd-click to select a point +Cmd-shift-click to deselect a point +Cmd-alt-click to polygon select)"; #else - const char *selection_help = - "Ctrl-click to select a point\nCmd-alt-click to polygon select"; + const char *selection_help = R"(Ctrl-click to select a point +Ctrl-shift-click to deselect a point +Ctrl-alt-click to polygon select)"; #endif // __APPLE__ h = new Horiz(); h->AddStretch(); @@ -1545,12 +1548,10 @@ struct O3DVisualizer::Impl { OverrideMaterial(o.name, o.material, ui_state_.scene_shader); } - auto bbox = scene_->GetScene()->GetBoundingBox(); - auto xdim = bbox.max_bound_.x() - bbox.min_bound_.x(); - auto ydim = bbox.max_bound_.y() - bbox.min_bound_.z(); - auto zdim = bbox.max_bound_.z() - bbox.min_bound_.y(); + auto bbox_extend = scene_->GetScene()->GetBoundingBox().GetExtent(); auto psize = double(std::max(5, px)) * 0.000666 * - std::max(xdim, std::max(ydim, zdim)); + std::max(bbox_extend.x(), + std::max(bbox_extend.y(), bbox_extend.z())); selections_->SetPointSize(psize); scene_->SetPickablePointSize(px);