From e516ba0dd0ea0c598d8ee8b912b2e4c3782bf6da Mon Sep 17 00:00:00 2001 From: PavelMikus Date: Thu, 7 Apr 2022 13:52:59 +0200 Subject: [PATCH] Moved TriangleSelectorWrapper methods to cpp file, added comment describing problems with FacetsAnnotations/TriangleSelector structure --- src/libslic3r/PrintObject.cpp | 1 + src/libslic3r/SupportableIssuesSearch.cpp | 2 +- src/libslic3r/TriangleSelectorWrapper.cpp | 29 +++++++++++++++++++++++ src/libslic3r/TriangleSelectorWrapper.hpp | 29 +++++++---------------- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index cf6f168dff..5c1d918aea 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -17,6 +17,7 @@ #include "Fill/FillLightning.hpp" #include "Format/STL.hpp" #include "SupportableIssuesSearch.hpp" +#include "TriangleSelectorWrapper.hpp" #include #include diff --git a/src/libslic3r/SupportableIssuesSearch.cpp b/src/libslic3r/SupportableIssuesSearch.cpp index cdd3130a0a..51a425a7ed 100644 --- a/src/libslic3r/SupportableIssuesSearch.cpp +++ b/src/libslic3r/SupportableIssuesSearch.cpp @@ -172,7 +172,7 @@ Issues check_extrusion_entity_stability(const ExtrusionEntity *entity, size_t la curvature = 0; } - if (unsupported_distance > params.bridge_distance / (1 + int(max_curvature * 9 / PI))) { + if (unsupported_distance > params.bridge_distance / (1 + int(max_curvature * 7 / PI))) { issues.supports_nedded.push_back(u_point); unsupported_distance = 0; curvature = 0; diff --git a/src/libslic3r/TriangleSelectorWrapper.cpp b/src/libslic3r/TriangleSelectorWrapper.cpp index 8b13789179..98d00bc985 100644 --- a/src/libslic3r/TriangleSelectorWrapper.cpp +++ b/src/libslic3r/TriangleSelectorWrapper.cpp @@ -1 +1,30 @@ +#include "Model.hpp" +#include "TriangleSelectorWrapper.hpp" +#include +namespace Slic3r { + +TriangleSelectorWrapper::TriangleSelectorWrapper(const TriangleMesh &mesh) : + mesh(mesh), selector(mesh), triangles_tree( + AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices)) { + +} + +void TriangleSelectorWrapper::enforce_spot(const Vec3f &point, float radius) { + size_t hit_face_index; + Vec3f hit_point; + auto dist = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(mesh.its.vertices, mesh.its.indices, + triangles_tree, + point, hit_face_index, hit_point); + if (dist < 0 || dist > radius) + return; + + std::unique_ptr cursor = std::make_unique(point, point, + radius, Transform3d::Identity(), TriangleSelector::ClippingPlane { }); + + selector.select_patch(hit_face_index, std::move(cursor), EnforcerBlockerType::ENFORCER, Transform3d::Identity(), + true, + 0.0f); +} + +} diff --git a/src/libslic3r/TriangleSelectorWrapper.hpp b/src/libslic3r/TriangleSelectorWrapper.hpp index f818d8be2b..f3b56205fa 100644 --- a/src/libslic3r/TriangleSelectorWrapper.hpp +++ b/src/libslic3r/TriangleSelectorWrapper.hpp @@ -1,39 +1,26 @@ #ifndef SRC_LIBSLIC3R_TRIANGLESELECTORWRAPPER_HPP_ #define SRC_LIBSLIC3R_TRIANGLESELECTORWRAPPER_HPP_ -#include - #include "TriangleSelector.hpp" #include "AABBTreeIndirect.hpp" namespace Slic3r { +//NOTE: We need to replace the FacetsAnnotation struct for support storage (or extend/add another) +// Problems: Does not support negative volumes, strange usage for supports computed from extrusion - +// expensively converted back to triangles and then sliced again. +// Another problem is weird and very limited interface when painting supports via algorithms + + class TriangleSelectorWrapper { public: const TriangleMesh &mesh; TriangleSelector selector; AABBTreeIndirect::Tree<3, float> triangles_tree; - TriangleSelectorWrapper(const TriangleMesh &mesh) : - mesh(mesh), selector(mesh), triangles_tree(AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices)) { + TriangleSelectorWrapper(const TriangleMesh &mesh); - } - - void enforce_spot(const Vec3f &point, float radius) { - size_t hit_face_index; - Vec3f hit_point; - auto dist = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(mesh.its.vertices, mesh.its.indices, - triangles_tree, - point, hit_face_index, hit_point); - if (dist < 0 || dist > radius) - return; - - std::unique_ptr cursor = std::make_unique(point, point, - radius, Transform3d::Identity(), TriangleSelector::ClippingPlane { }); - - selector.select_patch(hit_face_index, std::move(cursor), EnforcerBlockerType::ENFORCER, Transform3d::Identity(), true, - 0.0f); - } + void enforce_spot(const Vec3f &point, float radius); };