diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index bcfff43db6..8b70d99497 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6345,30 +6345,36 @@ void GLCanvas3D::_on_rotate() if (m_model == nullptr) return; - std::set> done; // prevent rotating instances twice + std::set> done; // keeps track of moved instances + Selection::EMode selection_mode = m_selection.get_mode(); + for (const GLVolume* v : m_volumes.volumes) { int object_idx = v->object_idx(); - if (object_idx >= 1000) + if ((object_idx < 0) || ((int)m_model->objects.size() <= object_idx)) continue; int instance_idx = v->instance_idx(); + int volume_idx = v->volume_idx(); - // prevent rotating instances twice - std::pair done_id(object_idx, instance_idx); - if (done.find(done_id) != done.end()) - continue; + done.insert(std::pair(object_idx, instance_idx)); - done.insert(done_id); - - // Rotate instances. + // Rotate instances/volumes. ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { #if ENABLE_MODELVOLUME_TRANSFORM - model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); + if (selection_mode == Selection::Instance) + { + model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation()); + model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); + } + else if (selection_mode == Selection::Volume) + { + model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation()); + model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); + } #else model_object->instances[instance_idx]->set_rotation(v->get_rotation()); model_object->instances[instance_idx]->set_offset(v->get_offset()); @@ -6377,6 +6383,7 @@ void GLCanvas3D::_on_rotate() } } + // Fixes sinking/flying instances for (const std::pair& i : done) { ModelObject* m = m_model->objects[i.first];