From c522ed8ec0402c303b6c614e98356558c55f45c2 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 1 Aug 2023 16:46:53 +0800 Subject: [PATCH] FIX: calculation error in overhang area bug: There is a part of the overhang area in the model that cannot be applied Change-Id: Ia1045225776ccb0e8730912aae1d4c7509f40c5b (cherry picked from commit daa3e131564690e9e169313d147fd84537b898ca) --- src/libslic3r/TriangleSelector.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 0ac985fdf..31d1b166a 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -254,8 +254,7 @@ void TriangleSelector::select_patch(int facet_start, std::unique_ptr &&c } } - const float highlight_angle_limit = cos(Geometry::deg2rad(highlight_by_angle_deg)); - Vec3f vec_down = (trafo_no_translate.inverse() * -Vec3d::UnitZ()).normalized().cast(); + const float highlight_angle_limit = -cos(Geometry::deg2rad(highlight_by_angle_deg)); // BBS std::vector start_facets; @@ -291,7 +290,8 @@ void TriangleSelector::select_patch(int facet_start, std::unique_ptr &&c while (facet_idx < int(facets_to_check.size())) { int facet = facets_to_check[facet_idx]; const Vec3f& facet_normal = m_face_normals[m_triangles[facet].source_triangle]; - if (!visited[facet] && (highlight_by_angle_deg == 0.f || vec_down.dot(facet_normal) >= highlight_angle_limit)) { + float world_normal_z = (trafo_no_translate.inverse() * facet_normal.cast()).normalized().cast().z(); + if (!visited[facet] && (highlight_by_angle_deg == 0.f || world_normal_z < highlight_angle_limit)) { if (select_triangle(facet, new_state, triangle_splitting)) { // add neighboring facets to list to be processed later for (int neighbor_idx : m_neighbors[facet]) @@ -331,8 +331,7 @@ void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_st facet_queue.push(facet_start); const double facet_angle_limit = cos(Geometry::deg2rad(seed_fill_angle)) - EPSILON; - const float highlight_angle_limit = cos(Geometry::deg2rad(highlight_by_angle_deg)); - Vec3f vec_down = (trafo_no_translate.inverse() * -Vec3d::UnitZ()).normalized().cast(); + const float highlight_angle_limit = -cos(Geometry::deg2rad(highlight_by_angle_deg)); // Depth-first traversal of neighbors of the face hit by the ray thrown from the mouse cursor. while (!facet_queue.empty()) { @@ -340,7 +339,8 @@ void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_st facet_queue.pop(); const Vec3f &facet_normal = m_face_normals[m_triangles[current_facet].source_triangle]; - if (!visited[current_facet] && (highlight_by_angle_deg == 0.f || vec_down.dot(facet_normal) >= highlight_angle_limit)) { + float world_normal_z = (trafo_no_translate.inverse() * facet_normal.cast()).normalized().cast().z(); + if (!visited[current_facet] && (highlight_by_angle_deg == 0.f || world_normal_z < highlight_angle_limit)) { if (m_triangles[current_facet].is_split()) { for (int split_triangle_idx = 0; split_triangle_idx <= m_triangles[current_facet].number_of_split_sides(); ++split_triangle_idx) { assert(split_triangle_idx < int(m_triangles[current_facet].children.size()));