From 873725d905e0ce3cdf7e7a0d973a8166d9b92057 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Jan 2023 13:13:09 +0100 Subject: [PATCH] Fixing sla support point and drillhole transformations May brake compatibility with 3mf files storing these objects from from previous Slic3r versions --- src/libslic3r/SLAPrintSteps.cpp | 2 -- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 13 +++++++++++-- src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp | 13 ++++++++++++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 15 ++++++++++++--- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index f2496091d4..8a71f2da78 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -292,8 +292,6 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st m = generate_preview_vdb(po, step); } - assert(!po.m_preview_meshes[step]); - if (!m.empty()) po.m_preview_meshes[step] = std::make_shared(std::move(m)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 31252d319e..fc54622e84 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -463,7 +463,16 @@ void GLGizmoHollow::update_hole_raycasters_for_picking_transform() assert(!m_hole_raycasters.empty()); const GLVolume* vol = m_parent.get_selection().get_first_volume(); - const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_scaling_factor_matrix().inverse(); + Geometry::Transformation transformation(vol->get_instance_transformation()); + + auto *inst = m_c->selection_info()->model_instance(); + if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + auto trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + transformation.set_matrix(trafo); + } + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); for (size_t i = 0; i < drain_holes.size(); ++i) { const sla::DrainHole& drain_hole = drain_holes[i]; @@ -471,7 +480,7 @@ void GLGizmoHollow::update_hole_raycasters_for_picking_transform() Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); const Eigen::AngleAxisd aa(q); - const Transform3d matrix = vol->world_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * + const Transform3d matrix = transformation.get_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); m_hole_raycasters[i]->set_transform(matrix); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp index a9876bed1c..444e3bf466 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaBase.cpp @@ -148,12 +148,23 @@ bool GLGizmoSlaBase::unproject_on_mesh(const Vec2d& mouse_pos, std::pairselection_info()->model_instance(); + if (!inst) + return false; + + Transform3d trafo = m_volumes.volumes.front()->world_matrix(); + if (m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + } + // The raycaster query Vec3f hit; Vec3f normal; if (m_c->raycaster()->raycaster()->unproject_on_mesh( mouse_pos, - m_volumes.volumes.front()->world_matrix(), + trafo/*m_volumes.volumes.front()->world_matrix()*/, wxGetApp().plater()->get_camera(), hit, normal, diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 301bbcdbe1..e7ea945e36 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1184,7 +1184,16 @@ void GLGizmoSlaSupports::update_point_raycasters_for_picking_transform() assert(!m_point_raycasters.empty()); const GLVolume* vol = m_parent.get_selection().get_first_volume(); - const Geometry::Transformation transformation(vol->world_matrix()); + Geometry::Transformation transformation(vol->world_matrix()); + + auto *inst = m_c->selection_info()->model_instance(); + if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) { + double shift_z = m_c->selection_info()->print_object()->get_current_elevation(); + auto trafo = inst->get_transformation().get_matrix(); + trafo.translation()(2) += shift_z; + transformation.set_matrix(trafo); + } + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); for (size_t i = 0; i < m_editing_cache.size(); ++i) { const Transform3d support_matrix = Geometry::translation_transform(m_editing_cache[i].support_point.pos.cast()) * instance_scaling_matrix_inverse; @@ -1195,13 +1204,13 @@ void GLGizmoSlaSupports::update_point_raycasters_for_picking_transform() Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); const Eigen::AngleAxisd aa(q); - const Transform3d cone_matrix = vol->world_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * + const Transform3d cone_matrix = transformation.get_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform((CONE_HEIGHT + m_editing_cache[i].support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT)); m_point_raycasters[i].second->set_transform(cone_matrix); const double radius = (double)m_editing_cache[i].support_point.head_front_radius * RenderPointScale; - const Transform3d sphere_matrix = vol->world_matrix() * support_matrix * Geometry::scale_transform(radius); + const Transform3d sphere_matrix = transformation.get_matrix() * support_matrix * Geometry::scale_transform(radius); m_point_raycasters[i].first->set_transform(sphere_matrix); } }