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>());