diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index d7e322d066..37a831b344 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -31,7 +31,8 @@ public: SupportPointGenerator(const EigenMesh3D& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); - const std::vector& output() { return m_output; } + const std::vector& output() const { return m_output; } + std::vector& output() { return m_output; } struct MyLayer; diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 4fefeb6bbd..8f69b84342 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -85,6 +85,53 @@ TEST_CASE("Pillar pairhash should be unique", "[SLASupportGeneration]") { test_pairhash(); } +TEST_CASE("Support point generator should be deterministic if seeded", + "[SLASupportGeneration], [SLAPointGen]") { + TriangleMesh mesh = load_model("A_upsidedown.obj"); + + sla::EigenMesh3D emesh{mesh}; + + sla::SupportConfig supportcfg; + sla::SupportPointGenerator::Config autogencfg; + autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); + sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}}; + + TriangleMeshSlicer slicer{&mesh}; + + auto bb = mesh.bounding_box(); + double zmin = bb.min.z(); + double zmax = bb.max.z(); + double gnd = zmin - supportcfg.object_elevation_mm; + auto layer_h = 0.05f; + + auto slicegrid = grid(float(gnd), float(zmax), layer_h); + std::vector slices; + slicer.slice(slicegrid, CLOSING_RADIUS, &slices, []{}); + + point_gen.execute(slices, slicegrid, 0); + + auto get_chksum = [](const std::vector &pts){ + long long chksum = 0; + for (auto &pt : pts) { + auto p = scaled(pt.pos); + chksum += p.x() + p.y() + p.z(); + } + + return chksum; + }; + + long long checksum = get_chksum(point_gen.output()); + size_t ptnum = point_gen.output().size(); + REQUIRE(point_gen.output().size() > 0); + + for (int i = 0; i < 20; ++i) { + point_gen.output().clear(); + point_gen.execute(slices, slicegrid, 0); + REQUIRE(point_gen.output().size() == ptnum); + REQUIRE(checksum == get_chksum(point_gen.output())); + } +} + TEST_CASE("Flat pad geometry is valid", "[SLASupportGeneration]") { sla::PadConfig padcfg;