diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 65e821a8c..b9e1f5195 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1412,7 +1412,7 @@ void GLCanvas3D::Selection::translate(const Vec3d& displacement) m_bounding_box_dirty = true; } -void GLCanvas3D::Selection::rotate(const Vec3d& rotation) +void GLCanvas3D::Selection::rotate(const Vec3d& rotation, bool local) { if (!m_valid) return; @@ -1437,14 +1437,20 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation) { // extracts rotations from the composed transformation Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_instance_rotation_matrix()); - (*m_volumes)[i]->set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); + if (!local) + (*m_volumes)[i]->set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); + (*m_volumes)[i]->set_instance_rotation(new_rotation); } else if (m_mode == Volume) { // extracts rotations from the composed transformation Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - (*m_volumes)[i]->set_volume_offset(m * m_cache.volumes_data[i].get_volume_position()); + if (!local) + { + Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); + (*m_volumes)[i]->set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); + } (*m_volumes)[i]->set_volume_rotation(new_rotation); } #else @@ -4042,7 +4048,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } case Gizmos::Rotate: { - m_selection.rotate(m_gizmos.get_rotation()); + m_selection.rotate(m_gizmos.get_rotation(), false); _on_rotate(); wxGetApp().obj_manipul()->update_settings_value(m_selection); m_dirty = true; @@ -4252,7 +4258,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) case Gizmos::Rotate: { // Apply new temporary rotations - m_selection.rotate(m_gizmos.get_rotation()); + m_selection.rotate(m_gizmos.get_rotation(), evt.AltDown()); wxGetApp().obj_manipul()->update_settings_value(m_selection); break; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a45ceb846..66747cf1e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -517,7 +517,7 @@ public: void start_dragging(); void translate(const Vec3d& displacement); - void rotate(const Vec3d& rotation); + void rotate(const Vec3d& rotation, bool local); void flattening_rotate(const Vec3d& normal); void scale(const Vec3d& scale); void mirror(Axis axis); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index fb1fbbbe6..6418b2e8b 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -416,7 +416,7 @@ void ObjectManipulation::change_rotation_value(const Vec3d& rotation) rad_rotation(i) = Geometry::deg2rad(rotation(i)); auto canvas = _3DScene::get_canvas(wxGetApp().canvas3D()); canvas->get_selection().start_dragging(); - canvas->get_selection().rotate(rad_rotation); + canvas->get_selection().rotate(rad_rotation, false); canvas->_on_rotate(); }