OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::FaceDetector Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/FaceDetector.hpp>

Collaboration diagram for Slic3r::FaceDetector:

Public Member Functions

 FaceDetector (std::vector< TriangleMesh > &tms, std::vector< Transform3d > &transfos, double sample_interval)
void detect_exterior_face ()

Private Attributes

std::vector< TriangleMesh > & m_meshes
std::vector< Transform3d > & m_transfos
double m_sample_interval

Detailed Description

Constructor & Destructor Documentation

◆ FaceDetector()

Slic3r::FaceDetector::FaceDetector ( std::vector< TriangleMesh > & tms,
std::vector< Transform3d > & transfos,
double sample_interval )
inline
14 : m_meshes(tms), m_transfos(transfos), m_sample_interval(sample_interval) {}
std::vector< Transform3d > & m_transfos
Definition FaceDetector.hpp:20
double m_sample_interval
Definition FaceDetector.hpp:21
std::vector< TriangleMesh > & m_meshes
Definition FaceDetector.hpp:19

References m_meshes, m_sample_interval, and m_transfos.

Member Function Documentation

◆ detect_exterior_face()

void Slic3r::FaceDetector::detect_exterior_face ( )
14{
15 struct MeshFacetRange {
16 MeshFacetRange(TriangleMesh* tm, uint32_t facet_begin, uint32_t facet_end) :
17 tm(tm), facet_begin(facet_begin), facet_end(facet_end) {}
18 MeshFacetRange() : tm(nullptr), facet_begin(0), facet_end(0) {}
19 TriangleMesh* tm;
20 uint32_t facet_begin;
21 uint32_t facet_end;
22 };
23
24 TriangleMesh object_mesh;
25 std::vector<MeshFacetRange> volume_facet_ranges;
26 for (int i = 0; i < m_meshes.size(); i++) {
27 TriangleMesh vol_mesh = m_meshes[i];
28 volume_facet_ranges.emplace_back(&m_meshes[i], object_mesh.stats().number_of_facets, object_mesh.stats().number_of_facets + vol_mesh.stats().number_of_facets);
29
30 vol_mesh.transform(m_transfos[i]);
31 object_mesh.merge(std::move(vol_mesh));
32 }
33
34 sla::IndexedMesh indexed_mesh(object_mesh);
35 BoundingBoxf3 bbox = object_mesh.bounding_box();
36 bbox.offset(BBOX_OFFSET);
37
38 std::unordered_set<size_t> hit_face_indices;
39
40 // x-axis rays
41 for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) {
42 for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) {
43 auto hit_result = indexed_mesh.query_ray_hit({ bbox.min.x(), y, z }, { 1.0, 0.0, 0.0 });
44 if (hit_result.is_hit())
45 hit_face_indices.insert(hit_result.face());
46
47 hit_result = indexed_mesh.query_ray_hit({ bbox.max.x(), y, z }, { -1.0, 0.0, 0.0 });
48 if (hit_result.is_hit())
49 hit_face_indices.insert(hit_result.face());
50 }
51 }
52
53 // y-axis rays
54 for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) {
55 for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) {
56 auto hit_result = indexed_mesh.query_ray_hit({ x, bbox.min.y(), z }, { 0.0, 1.0, 0.0 });
57 if (hit_result.is_hit())
58 hit_face_indices.insert(hit_result.face());
59
60 hit_result = indexed_mesh.query_ray_hit({ x, bbox.max.y(), z }, { 0.0, -1.0, 0.0 });
61 if (hit_result.is_hit())
62 hit_face_indices.insert(hit_result.face());
63 }
64 }
65
66 // z-axis rays
67 for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) {
68 for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) {
69 auto hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.min.z() }, { 0.0, 0.0, 1.0 });
70 if (hit_result.is_hit())
71 hit_face_indices.insert(hit_result.face());
72
73 hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.max.z() }, { 0.0, 0.0, -1.0 });
74 if (hit_result.is_hit())
75 hit_face_indices.insert(hit_result.face());
76 }
77 }
78
79 for (size_t facet_idx : hit_face_indices) {
80 TriangleMesh* tm = nullptr;
81 uint32_t vol_facet_idx = 0;
82 for (auto range : volume_facet_ranges) {
83 if (facet_idx >= range.facet_begin && facet_idx < range.facet_end) {
84 tm = range.tm;
85 vol_facet_idx = facet_idx - range.facet_begin;
86 break;
87 }
88 }
89
90 tm->its.get_property(vol_facet_idx).type = EnumFaceTypes::eExteriorAppearance;
91 }
92}
static const double BBOX_OFFSET
Definition FaceDetector.cpp:12
auto range(Cont &&cont)
Definition libslic3r.h:405

References Slic3r::BBOX_OFFSET, Slic3r::TriangleMesh::bounding_box(), Slic3r::TriangleMesh::its, m_meshes, m_sample_interval, m_transfos, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::max, Slic3r::TriangleMesh::merge(), Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::min, Slic3r::TriangleMeshStats::number_of_facets, Slic3r::BoundingBox3Base< PointType >::offset(), Slic3r::sla::IndexedMesh::query_ray_hit(), Slic3r::range(), Slic3r::TriangleMesh::stats(), and Slic3r::TriangleMesh::transform().

Referenced by Slic3r::ModelObject::split().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_meshes

std::vector<TriangleMesh>& Slic3r::FaceDetector::m_meshes
private

◆ m_sample_interval

double Slic3r::FaceDetector::m_sample_interval
private

◆ m_transfos

std::vector<Transform3d>& Slic3r::FaceDetector::m_transfos
private

The documentation for this class was generated from the following files: