diff --git a/src/libslic3r/QuadricEdgeCollapse.cpp b/src/libslic3r/QuadricEdgeCollapse.cpp index e17fbe9c8..94375ec9d 100644 --- a/src/libslic3r/QuadricEdgeCollapse.cpp +++ b/src/libslic3r/QuadricEdgeCollapse.cpp @@ -15,15 +15,12 @@ namespace QuadricEdgeCollapse { // smallest error caused by edges, identify smallest edge in triangle struct Error { - float value = -1.; - // range(0 .. 2), + float value = -1.; // identifying of smallest edge is stored inside of TriangleInfo uint32_t triangle_index = 0; Error(float value, uint32_t triangle_index) : value(value) , triangle_index(triangle_index) - { - assert(min_index < 3); - } + {} Error() = default; }; using Errors = std::vector; @@ -31,6 +28,7 @@ namespace QuadricEdgeCollapse { // merge information together - faster access during processing struct TriangleInfo { Vec3f n; // normalized normal - speed up calcualtion of q and check flip + // range(0 .. 2), unsigned char min_index = 0; // identify edge for minimal Error -> lightweight Error structure TriangleInfo() = default; bool is_deleted() const { return n.x() > 2.f; } @@ -141,6 +139,8 @@ void Slic3r::its_quadric_edge_collapse( if (triangle_count >= its.indices.size()) return; float maximal_error = (max_error == nullptr)? std::numeric_limits::max() : *max_error; if (maximal_error <= 0.f) return; + if (throw_on_cancel == nullptr) throw_on_cancel = []() {}; + if (statusfn == nullptr) statusfn = [](int) {}; TriangleInfos t_infos; // only normals with information about deleted triangle VertexInfos v_infos; diff --git a/tests/libslic3r/test_indexed_triangle_set.cpp b/tests/libslic3r/test_indexed_triangle_set.cpp index 087636edf..e079cb302 100644 --- a/tests/libslic3r/test_indexed_triangle_set.cpp +++ b/tests/libslic3r/test_indexed_triangle_set.cpp @@ -233,18 +233,17 @@ TEST_CASE("Reduce one edge by Quadric Edge Collapse", "[its]") #include "test_utils.hpp" TEST_CASE("Symplify mesh by Quadric edge collapse to 5%", "[its]") { - TriangleMesh mesh = load_model("frog_legs.obj"); + TriangleMesh mesh = load_model("frog_legs.obj"); double original_volume = its_volume(mesh.its); uint32_t wanted_count = mesh.its.indices.size() * 0.05; REQUIRE_FALSE(mesh.empty()); indexed_triangle_set its = mesh.its; // copy - // its_write_obj(its, "frog_legs_qec.obj"); float max_error = std::numeric_limits::max(); its_quadric_edge_collapse(its, wanted_count, &max_error); + //its_write_obj(its, "frog_legs_qec.obj"); CHECK(its.indices.size() <= wanted_count); double volume = its_volume(its); - CHECK(fabs(original_volume - volume) < 30.); - + CHECK(fabs(original_volume - volume) < 33.); float avg_distance = compare(mesh.its, its, 10); - CHECK(avg_distance < 0.021f); // 0.02022 | 0.0199614074 + CHECK(avg_distance < 0.022f); // 0.02022 | 0.0199614074 } \ No newline at end of file