From d4a39655b0d027180842d6d1d1a7bddc6239ac14 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 18 Feb 2025 16:41:55 +0800 Subject: [PATCH] FIX:Calculating convex hull without reassembling the matrix jira: [none] Change-Id: I6defb793d58762837caeaca58d23ce728461ffd7 --- src/libslic3r/Model.hpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 7d36e97f5..a5064eafe 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1089,7 +1089,7 @@ private: std::shared_ptr m_convex_hull; //BBS: add convex hull 2d related logic mutable Polygon m_convex_hull_2d; //BBS, used for convex_hell_2d acceleration - mutable Transform3d m_cached_trans_matrix; //BBS, used for convex_hell_2d acceleration + mutable Transform3d m_cached_trans_matrix{Transform3d::Identity()}; // BBS, used for convex_hell_2d acceleration mutable Polygon m_cached_2d_polygon; //BBS, used for convex_hell_2d acceleration Geometry::Transformation m_transformation; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4a4cb977c..2a4dc1d18 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5451,8 +5451,9 @@ std::vector GLCanvas3D::get_empty_cells(const Vec2f start_point, const Ve ModelObject* model_object = m_model->objects[i]; auto id = model_object->id().id; ModelInstance* model_instance0 = model_object->instances.front(); - Polygon hull_2d = model_object->convex_hull_2d(Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), - model_instance0->get_scaling_factor(), model_instance0->get_mirror())); + Geometry::Transformation temp(model_instance0->get_transformation()); + temp.set_offset(Vec3d(0.0, 0.0, model_instance0->get_offset().z())); + Polygon hull_2d = model_object->convex_hull_2d(temp.get_matrix()); if (hull_2d.empty()) continue; @@ -5602,8 +5603,9 @@ void GLCanvas3D::update_sequential_clearance() for (size_t i = 0; i < m_model->objects.size(); ++i) { ModelObject* model_object = m_model->objects[i]; ModelInstance* model_instance0 = model_object->instances.front(); - Polygon hull_no_offset = model_object->convex_hull_2d(Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), - model_instance0->get_scaling_factor(), model_instance0->get_mirror())); + Geometry::Transformation temp(model_instance0->get_transformation()); + temp.set_offset(Vec3d(0.0, 0.0, model_instance0->get_offset().z())); + Polygon hull_no_offset = model_object->convex_hull_2d(temp.get_matrix()); auto tmp = offset(hull_no_offset, // Shrink the extruder_clearance_max_radius a tiny bit, so that if the object arrangement algorithm placed the objects // exactly by satisfying the extruder_clearance_max_radius, this test will not trigger collision.