diff --git a/xs/src/slic3r/GUI/GLGizmo.cpp b/xs/src/slic3r/GUI/GLGizmo.cpp index b461e6657..e23958c1d 100644 --- a/xs/src/slic3r/GUI/GLGizmo.cpp +++ b/xs/src/slic3r/GUI/GLGizmo.cpp @@ -1032,6 +1032,7 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent) , m_position(Vec3d::Zero()) , m_starting_drag_position(Vec3d::Zero()) , m_starting_box_center(Vec3d::Zero()) + , m_starting_box_bottom_center(Vec3d::Zero()) { } @@ -1065,17 +1066,19 @@ void GLGizmoMove3D::on_start_dragging(const BoundingBoxf3& box) { m_starting_drag_position = m_grabbers[m_hover_id].center; m_starting_box_center = box.center(); + m_starting_box_bottom_center = box.center(); + m_starting_box_bottom_center(2) = box.min(2); } } void GLGizmoMove3D::on_update(const Linef3& mouse_ray) { if (m_hover_id == 0) - m_position(0) = 2.0 * m_starting_box_center(0) + calc_displacement(1, mouse_ray) - m_starting_drag_position(0); + m_position(0) = 2.0 * m_starting_box_center(0) + calc_projection(X, 1, mouse_ray) - m_starting_drag_position(0); else if (m_hover_id == 1) - m_position(1) = 2.0 * m_starting_box_center(1) + calc_displacement(2, mouse_ray) - m_starting_drag_position(1); + m_position(1) = 2.0 * m_starting_box_center(1) + calc_projection(Y, 2, mouse_ray) - m_starting_drag_position(1); else if (m_hover_id == 2) - m_position(2) = 2.0 * m_starting_box_center(2) + calc_displacement(1, mouse_ray) - m_starting_drag_position(2); + m_position(2) = 2.0 * m_starting_box_bottom_center(2) + calc_projection(Z, 1, mouse_ray) - m_starting_drag_position(2); } void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const @@ -1144,40 +1147,40 @@ void GLGizmoMove3D::on_render_for_picking(const BoundingBoxf3& box) const render_grabbers_for_picking(box); } -double GLGizmoMove3D::calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const +double GLGizmoMove3D::calc_projection(Axis axis, unsigned int preferred_plane_id, const Linef3& mouse_ray) const { - double displacement = 0.0; + double projection = 0.0; - Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; + Vec3d starting_vec = (axis == Z) ? m_starting_drag_position - m_starting_box_bottom_center : m_starting_drag_position - m_starting_box_center; double len_starting_vec = starting_vec.norm(); if (len_starting_vec == 0.0) - return displacement; + return projection; Vec3d starting_vec_dir = starting_vec.normalized(); Vec3d mouse_dir = mouse_ray.unit_vector(); unsigned int plane_id = select_best_plane(mouse_dir, preferred_plane_id); - switch (plane_id) + switch (plane_id) { case 0: { - displacement = starting_vec_dir.dot(intersection_on_plane_xy(mouse_ray, m_starting_box_center)); + projection = starting_vec_dir.dot(intersection_on_plane_xy(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center)); break; } case 1: { - displacement = starting_vec_dir.dot(intersection_on_plane_xz(mouse_ray, m_starting_box_center)); + projection = starting_vec_dir.dot(intersection_on_plane_xz(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center)); break; } case 2: { - displacement = starting_vec_dir.dot(intersection_on_plane_yz(mouse_ray, m_starting_box_center)); + projection = starting_vec_dir.dot(intersection_on_plane_yz(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center)); break; } } - return displacement; + return projection; } GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) diff --git a/xs/src/slic3r/GUI/GLGizmo.hpp b/xs/src/slic3r/GUI/GLGizmo.hpp index e51dca5b2..2430b5af5 100644 --- a/xs/src/slic3r/GUI/GLGizmo.hpp +++ b/xs/src/slic3r/GUI/GLGizmo.hpp @@ -287,6 +287,7 @@ class GLGizmoMove3D : public GLGizmoBase Vec3d m_position; Vec3d m_starting_drag_position; Vec3d m_starting_box_center; + Vec3d m_starting_box_bottom_center; public: explicit GLGizmoMove3D(GLCanvas3D& parent); @@ -302,7 +303,7 @@ protected: virtual void on_render_for_picking(const BoundingBoxf3& box) const; private: - double calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const; + double calc_projection(Axis axis, unsigned int preferred_plane_id, const Linef3& mouse_ray) const; }; class GLGizmoFlatten : public GLGizmoBase