From 6a5feb818f6003a3ad9228f095730cb50b97d480 Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Fri, 24 Sep 2021 13:01:16 +0200
Subject: [PATCH] Revert "Fixed volume transformations in SLA:": The fix is not
 complete, it is better not to break it more than it was.

This reverts commit 6b25a9c8367fc3f16536248f9dd308b6cbe14265.
---
 src/libslic3r/SLA/ReprojectPointsOnMesh.hpp  | 21 +++---------
 src/libslic3r/SLAPrint.cpp                   |  8 ++---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp      | 35 +++++++-------------
 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 35 +++++++-------------
 4 files changed, 31 insertions(+), 68 deletions(-)

diff --git a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp
index 3ac3ff045..3ad7d62b1 100644
--- a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp
+++ b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp
@@ -35,24 +35,11 @@ inline void reproject_points_and_holes(ModelObject *object)
     TriangleMesh rmsh = object->raw_mesh();
     IndexedMesh emesh{rmsh};
 
-    const Transform3f& tr = object->volumes.front()->get_matrix().cast<float>();
+    if (has_sppoints)
+        reproject_support_points(emesh, object->sla_support_points);
 
-    if (has_sppoints) {
-        SupportPoints transformed_points = object->sla_support_points;
-        for (SupportPoint& pt : transformed_points)
-            pt.pos = tr * pt.pos;
-        reproject_support_points(emesh, transformed_points);
-    }
-
-    if (has_holes) {
-        DrainHoles transformed_holes = object->sla_drain_holes;
-        for (DrainHole& hole : transformed_holes) {
-            // Hole normals are not transformed here, but the reprojection
-            // does not use them.
-            hole.pos = tr * hole.pos;
-        }
-        reproject_support_points(emesh, transformed_holes);
-    }
+    if (has_holes)
+        reproject_support_points(emesh, object->sla_drain_holes);
 }
 
 }}
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index f2ca174d7..a09f5ea98 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -1167,9 +1167,7 @@ sla::SupportPoints SLAPrintObject::transformed_support_points() const
 {
     assert(m_model_object != nullptr);
     auto spts = m_model_object->sla_support_points;
-
-    auto tr = (trafo() * m_model_object->volumes.front()->get_transformation().get_matrix()).cast<float>();
-
+    auto tr = trafo().cast<float>();
     for (sla::SupportPoint& suppt : spts) {
         suppt.pos = tr * suppt.pos;
     }
@@ -1181,8 +1179,8 @@ sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const
 {
     assert(m_model_object != nullptr);
     auto pts = m_model_object->sla_drain_holes;
-    Transform3f tr = (trafo() * m_model_object->volumes.front()->get_matrix()).cast<float>();
-    Vec3f sc = Geometry::Transformation(tr.cast<double>()).get_scaling_factor().cast<float>();
+    auto tr = trafo().cast<float>();
+    auto sc = m_model_object->instances.front()->get_scaling_factor().cast<float>();
     for (sla::DrainHole &hl : pts) {
         hl.pos = tr * hl.pos;
         hl.normal = tr * hl.normal - tr.translation();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 84a12c7a4..17630e5c6 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -106,13 +106,9 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
         shader->start_using();
     ScopeGuard guard([shader]() { if (shader) shader->stop_using(); });
 
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[m_c->selection_info()->get_active_instance()];
-    const ModelVolume* mv = mo->volumes.front();
-    Geometry::Transformation transformation(mi->get_transformation() * mv->get_transformation());
-
-    const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse();
-    const Transform3d& instance_matrix = transformation.get_matrix();
+    const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
+    const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
+    const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix();
 
     glsafe(::glPushMatrix());
     glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift()));
@@ -121,7 +117,6 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
     std::array<float, 4> render_color;
     const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
     size_t cache_size = drain_holes.size();
-    const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
 
     for (size_t i = 0; i < cache_size; ++i) {
         const sla::DrainHole& drain_hole = drain_holes[i];
@@ -189,13 +184,13 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const
     if (m_c->object_clipper()->get_position() == 0.)
         return false;
 
+    auto sel_info = m_c->selection_info();
     int active_inst = m_c->selection_info()->get_active_instance();
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[active_inst];
-    const Transform3d trafo = (mi->get_transformation() * mo->volumes.front()->get_transformation()).get_matrix();
+    const ModelInstance* mi = sel_info->model_object()->instances[active_inst];
+    const Transform3d& trafo = mi->get_transformation().get_matrix();
 
     Vec3d transformed_point =  trafo * point;
-    transformed_point(2) += m_c->selection_info()->get_sla_shift();
+    transformed_point(2) += sel_info->get_sla_shift();
     return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
 }
 
@@ -210,12 +205,9 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, V
 
     const Camera& camera = wxGetApp().plater()->get_camera();
     const Selection& selection = m_parent.get_selection();
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
-    const ModelVolume* mv = mo->volumes.front();
-
-    Transform3d trafo = mi->get_transformation().get_matrix() * mv->get_matrix();
-    trafo.pretranslate(Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
+    const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
+    Geometry::Transformation trafo = volume->get_instance_transformation();
+    trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
 
     double clp_dist = m_c->object_clipper()->get_position();
     const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane();
@@ -225,7 +217,7 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, V
     Vec3f normal;
     if (m_c->raycaster()->raycaster()->unproject_on_mesh(
             mouse_pos,
-            trafo,
+            trafo.get_matrix(),
             camera,
             hit,
             normal,
@@ -315,11 +307,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
         GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state();
 
         // First collect positions of all the points in world coordinates.
-        const ModelInstance* mi = mo->instances[active_inst];
-        const ModelVolume* mv = mo->volumes.front();
-        Geometry::Transformation trafo(mi->get_transformation() * mv->get_transformation());
+        Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation();
         trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
-
         std::vector<Vec3d> points;
         for (unsigned int i=0; i<mo->sla_drain_holes.size(); ++i)
             points.push_back(trafo.get_matrix() * mo->sla_drain_holes[i].pos.cast<double>());
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 01fa162e1..a50c503b9 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -127,13 +127,9 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
             shader->stop_using();
     });
 
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[m_c->selection_info()->get_active_instance()];
-    const ModelVolume* mv = mo->volumes.front();
-    Geometry::Transformation transformation(mi->get_transformation() * mv->get_transformation());
-
-    const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse();
-    const Transform3d& instance_matrix = transformation.get_matrix();
+    const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
+    const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
+    const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix();
     float z_shift = m_c->selection_info()->get_sla_shift();
 
     glsafe(::glPushMatrix());
@@ -141,7 +137,6 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
     glsafe(::glMultMatrixd(instance_matrix.data()));
 
     std::array<float, 4> render_color;
-    const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
     for (size_t i = 0; i < cache_size; ++i) {
         const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i];
         const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false;
@@ -270,13 +265,13 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const
     if (m_c->object_clipper()->get_position() == 0.)
         return false;
 
+    auto sel_info = m_c->selection_info();
     int active_inst = m_c->selection_info()->get_active_instance();
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[active_inst];
-    const Transform3d trafo = (mi->get_transformation() * mo->volumes.front()->get_transformation()).get_matrix();
+    const ModelInstance* mi = sel_info->model_object()->instances[active_inst];
+    const Transform3d& trafo = mi->get_transformation().get_matrix();
 
     Vec3d transformed_point =  trafo * point;
-    transformed_point(2) += m_c->selection_info()->get_sla_shift();
+    transformed_point(2) += sel_info->get_sla_shift();
     return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
 }
 
@@ -291,12 +286,9 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec
 
     const Camera& camera = wxGetApp().plater()->get_camera();
     const Selection& selection = m_parent.get_selection();
-    const ModelObject* mo = m_c->selection_info()->model_object();
-    const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
-    const ModelVolume* mv = mo->volumes.front();
-
-    Transform3d trafo = mi->get_transformation().get_matrix() * mv->get_matrix();
-    trafo.pretranslate(Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
+    const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
+    Geometry::Transformation trafo = volume->get_instance_transformation();
+    trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
 
     double clp_dist = m_c->object_clipper()->get_position();
     const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane();
@@ -306,7 +298,7 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec
     Vec3f normal;
     if (m_c->raycaster()->raycaster()->unproject_on_mesh(
             mouse_pos,
-            trafo,
+            trafo.get_matrix(),
             camera,
             hit,
             normal,
@@ -396,11 +388,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
             GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state();
 
             // First collect positions of all the points in world coordinates.
-            const ModelInstance* mi = mo->instances[active_inst];
-            const ModelVolume* mv = mo->volumes.front();
-            Geometry::Transformation trafo(mi->get_transformation() * mv->get_transformation());
+            Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation();
             trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
-
             std::vector<Vec3d> points;
             for (unsigned int i=0; i<m_editing_cache.size(); ++i)
                 points.push_back(trafo.get_matrix() * m_editing_cache[i].support_point.pos.cast<double>());