Skip to content

Commit

Permalink
Fix isl-org#6725: O3DVisualizer: make points removable and fix point …
Browse files Browse the repository at this point in the history
…size calc

Correctly forward keymodifier to enable point removing and fix bounding
box calculation for picked point size selection.
  • Loading branch information
danrauch committed Mar 29, 2024
1 parent 80ae047 commit d905a36
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 38 deletions.
60 changes: 32 additions & 28 deletions cpp/open3d/visualization/gui/PickPointsInteractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Eigen::Vector2i> 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<Eigen::Vector2i> 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) {
Expand Down
21 changes: 11 additions & 10 deletions cpp/open3d/visualization/visualizer/O3DVisualizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,8 +384,8 @@ struct O3DVisualizer::Impl {
std::vector<std::pair<size_t, Eigen::Vector3d>>>
&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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d905a36

Please sign in to comment.