BambuStudio/src/libslic3r/FaceDetector.cpp

91 lines
3.4 KiB
C++
Raw Normal View History

#include "FaceDetector.hpp"
#include "TriangleMesh.hpp"
#include "SLA/IndexedMesh.hpp"
#include "Model.hpp"
Fix std::unordered_set declaration [79/471] Building CXX object src/libslic3r/CMakeFiles/libslic3r.dir/FaceDetector.cpp.o FAILED: src/libslic3r/CMakeFiles/libslic3r.dir/FaceDetector.cpp.o /run/ccache/bin/c++ -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_NO_LIB -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_NO_LIB -DBOOST_IOSTREAMS_NO_LIB -DBOOST_LOCALE_NO_LIB -DBOOST_LOG_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB -DBOOST_THREAD_NO_LIB -DHAVE_FREETYPE -DHAVE_OPENGL_EXT -DHAVE_XLIB -DLIBNEST2D_GEOMETRIES_libslic3r -DLIBNEST2D_OPTIMIZER_nlopt -DLIBNEST2D_STATIC -DLIBNEST2D_THREADING_tbb -DOCC_CONVERT_SIGNALS -DOPENVDB_OPENEXR_STATICLIB -DOPENVDB_STATICLIB -DSLIC3R_GUI -DTBB_USE_CAPTURED_EXCEPTION=0 -DUNICODE -DUSE_TBB -DWXINTL_NO_GETTEXT_MACRO -D_UNICODE -DwxNO_UNSAFE_WXSTRING_CONV -DwxUSE_UNICODE -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/run/build/BambuStudio/src -I/run/build/BambuStudio/build/src/platform -I/run/build/BambuStudio/src/libslic3r -I/run/build/BambuStudio/build/src/libslic3r -I/run/build/BambuStudio/deps/build/destdir/usr/local/include/opencascade -I/run/build/BambuStudio/src/libnest2d/include -I/run/build/BambuStudio/src/miniz -I/run/build/BambuStudio/src/glu-libtess/include -I/run/build/BambuStudio/src/clipper2/Clipper2Lib/include -isystem /run/build/BambuStudio/src/eigen -isystem /run/build/BambuStudio/src/libigl -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/boost-1_78 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/OpenEXR -O2 -pipe -g -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -std=gnu++11 -fext-numeric-literals -Wall -Wno-reorder -O3 -DNDEBUG -std=gnu++17 -fPIC -fsigned-char -Werror=return-type -Wno-ignored-attributes -Wno-unknown-pragmas -DOPENVDB_ABI_VERSION_NUMBER=8 -MD -MT src/libslic3r/CMakeFiles/libslic3r.dir/FaceDetector.cpp.o -MF src/libslic3r/CMakeFiles/libslic3r.dir/FaceDetector.cpp.o.d -o src/libslic3r/CMakeFiles/libslic3r.dir/FaceDetector.cpp.o -c /run/build/BambuStudio/src/libslic3r/FaceDetector.cpp /run/build/BambuStudio/src/libslic3r/FaceDetector.cpp:33:10: error: ‘unordered_set’ is not a member of ‘std’ 33 | std::unordered_set<size_t> hit_face_indices; | ^~~~~~~~~~~~~ /run/build/BambuStudio/src/libslic3r/FaceDetector.cpp:5:1: note: ‘std::unordered_set’ is defined in header ‘<unordered_set>’; did you forget to ‘#include <unordered_set>’? 4 | #include "Model.hpp" +++ |+#include <unordered_set> 5 |
2023-12-11 22:09:12 +00:00
#include <unordered_set>
namespace Slic3r {
static const double BBOX_OFFSET = 2.0;
void FaceDetector::detect_exterior_face()
{
struct MeshFacetRange {
MeshFacetRange(TriangleMesh* tm, uint32_t facet_begin, uint32_t facet_end) :
tm(tm), facet_begin(facet_begin), facet_end(facet_end) {}
MeshFacetRange() : tm(nullptr), facet_begin(0), facet_end(0) {}
TriangleMesh* tm;
uint32_t facet_begin;
uint32_t facet_end;
};
TriangleMesh object_mesh;
std::vector<MeshFacetRange> volume_facet_ranges;
for (int i = 0; i < m_meshes.size(); i++) {
TriangleMesh vol_mesh = m_meshes[i];
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);
vol_mesh.transform(m_transfos[i]);
object_mesh.merge(std::move(vol_mesh));
}
sla::IndexedMesh indexed_mesh(object_mesh);
BoundingBoxf3 bbox = object_mesh.bounding_box();
bbox.offset(BBOX_OFFSET);
std::unordered_set<size_t> hit_face_indices;
// x-axis rays
for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) {
for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) {
auto hit_result = indexed_mesh.query_ray_hit({ bbox.min.x(), y, z }, { 1.0, 0.0, 0.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
hit_result = indexed_mesh.query_ray_hit({ bbox.max.x(), y, z }, { -1.0, 0.0, 0.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
}
}
// y-axis rays
for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) {
for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) {
auto hit_result = indexed_mesh.query_ray_hit({ x, bbox.min.y(), z }, { 0.0, 1.0, 0.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
hit_result = indexed_mesh.query_ray_hit({ x, bbox.max.y(), z }, { 0.0, -1.0, 0.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
}
}
// z-axis rays
for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) {
for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) {
auto hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.min.z() }, { 0.0, 0.0, 1.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.max.z() }, { 0.0, 0.0, -1.0 });
if (hit_result.is_hit())
hit_face_indices.insert(hit_result.face());
}
}
for (size_t facet_idx : hit_face_indices) {
TriangleMesh* tm = nullptr;
uint32_t vol_facet_idx = 0;
for (auto range : volume_facet_ranges) {
if (facet_idx >= range.facet_begin && facet_idx < range.facet_end) {
tm = range.tm;
vol_facet_idx = facet_idx - range.facet_begin;
break;
}
}
tm->its.get_property(vol_facet_idx).type = EnumFaceTypes::eExteriorAppearance;
}
}
}