From a02fc6cb3e444f9f337b40eecab3b977b22f088f Mon Sep 17 00:00:00 2001
From: enricoturri1966 <enricoturri@seznam.cz>
Date: Fri, 2 Dec 2022 09:16:37 +0100
Subject: [PATCH] Tech ENABLE_WORLD_COORDINATE - Fix of Selection::mirror()

---
 src/slic3r/GUI/GLCanvas3D.cpp | 13 +++++++++++++
 src/slic3r/GUI/Selection.cpp  |  8 ++++++++
 src/slic3r/GUI/Selection.hpp  |  5 +++--
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index aeb0b7d4a..4175e5438 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1755,7 +1755,20 @@ std::vector<int> GLCanvas3D::load_object(const Model& model, int obj_idx)
 
 void GLCanvas3D::mirror_selection(Axis axis)
 {
+#if ENABLE_WORLD_COORDINATE
+    TransformationType transformation_type;
+    if (wxGetApp().obj_manipul()->is_local_coordinates())
+        transformation_type.set_local();
+    else if (wxGetApp().obj_manipul()->is_instance_coordinates())
+        transformation_type.set_instance();
+
+    transformation_type.set_relative();
+
+    m_selection.setup_cache();
+    m_selection.mirror(axis, transformation_type);
+#else
     m_selection.mirror(axis);
+#endif // ENABLE_WORLD_COORDINATE
     do_mirror(L("Mirror Object"));
     wxGetApp().obj_manipul()->set_dirty();
 }
diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp
index e242b6e6f..cdc653b5b 100644
--- a/src/slic3r/GUI/Selection.cpp
+++ b/src/slic3r/GUI/Selection.cpp
@@ -1283,6 +1283,13 @@ void Selection::scale_to_fit_print_volume(const BuildVolume& volume)
     }
 }
 
+#if ENABLE_WORLD_COORDINATE
+void Selection::mirror(Axis axis, TransformationType transformation_type)
+{
+  const Vec3d mirror((axis == X) ? -1.0 : 1.0, (axis == Y) ? -1.0 : 1.0, (axis == Z) ? -1.0 : 1.0);
+  scale_and_translate(mirror, Vec3d::Zero(), transformation_type);
+}
+#else
 void Selection::mirror(Axis axis)
 {
     if (!m_valid)
@@ -1305,6 +1312,7 @@ void Selection::mirror(Axis axis)
 
     set_bounding_boxes_dirty();
 }
+#endif // ENABLE_WORLD_COORDINATE
 
 #if ENABLE_WORLD_COORDINATE
 void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& translation, TransformationType transformation_type)
diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp
index 107e56f41..a9479d5a9 100644
--- a/src/slic3r/GUI/Selection.hpp
+++ b/src/slic3r/GUI/Selection.hpp
@@ -300,7 +300,7 @@ public:
     void set_deserialized(EMode mode, const std::vector<std::pair<size_t, size_t>> &volumes_and_instances);
 
     // Update the selection based on the new instance IDs.
-	void instances_changed(const std::vector<size_t> &instance_ids_selected);
+    void instances_changed(const std::vector<size_t> &instance_ids_selected);
     // Update the selection based on the map from old indices to new indices after m_volumes changed.
     // If the current selection is by instance, this call may select newly added volumes, if they belong to already selected instances.
     void volumes_changed(const std::vector<size_t> &map_volume_old_to_new);
@@ -402,11 +402,12 @@ public:
     void flattening_rotate(const Vec3d& normal);
     void scale(const Vec3d& scale, TransformationType transformation_type);
     void scale_to_fit_print_volume(const BuildVolume& volume);
-    void mirror(Axis axis);
 #if ENABLE_WORLD_COORDINATE
     void scale_and_translate(const Vec3d& scale, const Vec3d& translation, TransformationType transformation_type);
+    void mirror(Axis axis, TransformationType transformation_type);
     void reset_skew();
 #else
+    void mirror(Axis axis);
     void translate(unsigned int object_idx, const Vec3d& displacement);
 #endif // ENABLE_WORLD_COORDINATE
     void translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement);