diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 490f67a60..da06551b8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -223,12 +223,23 @@ std::string GLGizmoCut3D::get_tooltip() const bool GLGizmoCut3D::on_mouse(const wxMouseEvent &mouse_event) { - if (mouse_event.Moving() && !cut_line_processing()) - return false; - Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); Vec2d mouse_pos = mouse_coord.cast(); + if (mouse_event.ShiftDown() && mouse_event.LeftDown()) + return gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + if (cut_line_processing()) { + if (mouse_event.ShiftDown()) { + if (mouse_event.Moving()|| mouse_event.Dragging()) + return gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + if (mouse_event.LeftUp()) + return gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + } + discard_cut_line_processing(); + } + else if (mouse_event.Moving()) + return false; + if (use_grabbers(mouse_event)) { if (m_hover_id >= m_connectors_group_id && mouse_event.LeftUp() && !mouse_event.ShiftDown()) gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); @@ -281,11 +292,6 @@ bool GLGizmoCut3D::on_mouse(const wxMouseEvent &mouse_event) return true; } } - else if (mouse_event.Moving()) { - // draw cut line - gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); - return true; - } else if (pending_right_up && mouse_event.RightUp()) { pending_right_up = false; return true; @@ -543,7 +549,6 @@ void GLGizmoCut3D::render_cut_plane() if (cut_line_processing()) return; -#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = wxGetApp().get_shader("flat"); if (shader == nullptr) return; @@ -554,7 +559,7 @@ void GLGizmoCut3D::render_cut_plane() glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform( m_plane_center, @@ -564,14 +569,6 @@ void GLGizmoCut3D::render_cut_plane() ); shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - const Vec3d& angles = m_rotation_gizmo.get_rotation(); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_plane_center.x(), m_plane_center.y(), m_plane_center.z())); - glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!m_plane.is_initialized()) { GLModel::Geometry init_data; @@ -580,17 +577,12 @@ void GLGizmoCut3D::render_cut_plane() init_data.reserve_vertices(4); init_data.reserve_indices(6); - const BoundingBoxf3 bb = bounding_box(); - const float min_x = bb.min.x() - Margin - m_plane_center.x(); - const float max_x = bb.max.x() + Margin - m_plane_center.x(); - const float min_y = bb.min.y() - Margin - m_plane_center.y(); - const float max_y = bb.max.y() + Margin - m_plane_center.y(); - // vertices - init_data.add_vertex(Vec3f(min_x, min_y, 0.0)); - init_data.add_vertex(Vec3f(max_x, min_y, 0.0)); - init_data.add_vertex(Vec3f(max_x, max_y, 0.0)); - init_data.add_vertex(Vec3f(min_x, max_y, 0.0)); + float radius = (float)bounding_box().radius(); + init_data.add_vertex(Vec3f(-radius, -radius, 0.0)); + init_data.add_vertex(Vec3f( radius, -radius, 0.0)); + init_data.add_vertex(Vec3f( radius, radius, 0.0)); + init_data.add_vertex(Vec3f(-radius, radius, 0.0)); // indices init_data.add_triangle(0, 1, 2); @@ -600,19 +592,6 @@ void GLGizmoCut3D::render_cut_plane() } m_plane.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif //!ENABLE_GL_SHADERS_ATTRIBUTES -#else - // Draw the cutting plane - ::glBegin(GL_QUADS); - ::glColor4fv(PLANE_COLOR.data()); - ::glVertex3f(min_x, min_y, plane_center.z()); - ::glVertex3f(max_x, min_y, plane_center.z()); - ::glVertex3f(max_x, max_y, plane_center.z()); - ::glVertex3f(min_x, max_y, plane_center.z()); - glsafe(::glEnd()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_CULL_FACE)); glsafe(::glDisable(GL_BLEND)); @@ -1685,6 +1664,11 @@ bool GLGizmoCut3D::cut_line_processing() const return m_line_beg != Vec3d::Zero(); } +void GLGizmoCut3D::discard_cut_line_processing() +{ + m_line_beg = m_line_end = Vec3d::Zero(); +} + bool GLGizmoCut3D::process_cut_line(SLAGizmoEventType action, const Vec2d& mouse_position) { const float sla_shift = m_c->selection_info()->get_sla_shift(); @@ -1710,9 +1694,10 @@ bool GLGizmoCut3D::process_cut_line(SLAGizmoEventType action, const Vec2d& mouse if (cut_line_processing()) { m_line_end = pt; - if (action == SLAGizmoEventType::LeftDown) { - Vec3d point = m_line_end; + if (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::LeftUp) { Vec3d line_dir = m_line_end - m_line_beg; + if (line_dir.norm() < 3.0) + return true; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Cut by line"), UndoRedo::SnapshotType::GizmoAction); Vec3d cross_dir = line_dir.cross(dir).normalized(); @@ -1725,7 +1710,7 @@ bool GLGizmoCut3D::process_cut_line(SLAGizmoEventType action, const Vec2d& mouse set_center(m_plane_center + cross_dir * (cross_dir.dot(pt - m_plane_center))); - m_line_end = m_line_beg = Vec3d::Zero(); + discard_cut_line_processing(); } return true; } @@ -1738,7 +1723,7 @@ bool GLGizmoCut3D::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_posi return false; if ( m_hover_id < 0 && shift_down && ! m_connectors_editing && - (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::Moving) ) + (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::Moving) ) return process_cut_line(action, mouse_position); CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index 170928a07..863461d50 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -190,6 +190,7 @@ private: bool can_perform_cut() const; bool cut_line_processing() const; + void discard_cut_line_processing(); void render_cut_plane(); void render_cut_center_graber(bool picking = false);