From f0ba8a234025ecdb37d236b5b495a59b4cee4999 Mon Sep 17 00:00:00 2001 From: Joseph Lenox Date: Thu, 12 Jul 2018 23:26:07 -0500 Subject: [PATCH] Replaced iterator-based constructor with one that takes either vector or array. Refactored TriangleMesh constructor to use raw pointer (C-style semantics) and pointer vector/array. --- src/test/libslic3r/test_trianglemesh.cpp | 2 +- xs/src/libslic3r/TriangleMesh.cpp | 5 +++-- xs/src/libslic3r/TriangleMesh.hpp | 8 +++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/libslic3r/test_trianglemesh.cpp b/src/test/libslic3r/test_trianglemesh.cpp index b8139da38..35dced1fb 100644 --- a/src/test/libslic3r/test_trianglemesh.cpp +++ b/src/test/libslic3r/test_trianglemesh.cpp @@ -12,7 +12,7 @@ SCENARIO( "TriangleMesh: Basic mesh statistics") { GIVEN( "A 20mm cube, built from constexpr std::array" ) { constexpr std::array vertices { Pointf3(20,20,0), Pointf3(20,0,0), Pointf3(0,0,0), Pointf3(0,20,0), Pointf3(20,20,20), Pointf3(0,20,20), Pointf3(0,0,20), Pointf3(20,0,20) }; constexpr std::array facets { Point3(0,1,2), Point3(0,2,3), Point3(4,5,6), Point3(4,6,7), Point3(0,4,7), Point3(0,7,1), Point3(1,7,6), Point3(1,6,2), Point3(2,6,5), Point3(2,5,3), Point3(4,0,3), Point3(4,3,5) }; - auto cube {TriangleMesh(vertices.cbegin(), vertices.cend(), facets.cbegin(), facets.cend())}; + auto cube {TriangleMesh(vertices, facets)}; cube.repair(); THEN( "Volume is appropriate for 20mm square cube.") { diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index 0878046cc..a4b90610e 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -28,7 +28,8 @@ TriangleMesh::TriangleMesh() stl_initialize(&this->stl); } -TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector& facets ) +TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector& facets ) : TriangleMesh(points.data(), facets.data(), facets.size()) {} +TriangleMesh::TriangleMesh(const Pointf3* points, const Point3* facets, size_t n_facets) : repaired(false) { stl_initialize(&this->stl); @@ -37,7 +38,7 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector& fa stl.stats.type = inmemory; // count facets and allocate memory - stl.stats.number_of_facets = facets.size(); + stl.stats.number_of_facets = n_facets; stl.stats.original_num_facets = stl.stats.number_of_facets; stl_allocate(&stl); diff --git a/xs/src/libslic3r/TriangleMesh.hpp b/xs/src/libslic3r/TriangleMesh.hpp index 87d842d00..e8a518a6e 100644 --- a/xs/src/libslic3r/TriangleMesh.hpp +++ b/xs/src/libslic3r/TriangleMesh.hpp @@ -36,11 +36,13 @@ class TriangleMesh { public: TriangleMesh(); + TriangleMesh(const Pointf3* points, const Point3* facets, size_t n_facets); TriangleMesh(const Pointf3s &points, const std::vector &facets); - /// Templated constructor that takes a pair of iterators to build a TriangleMesh. - template - TriangleMesh(Iter_vert p_begin, Iter_vert p_end, Iter_fac f_begin, Iter_fac f_end) : TriangleMesh(Pointf3s(p_begin, p_end), Point3s(f_begin, f_end)) {} + /// Templated constructor to adapt containers that offer .data() and .size() + template + TriangleMesh(const Vertex_Cont& vertices, const Facet_Cont& facets) : TriangleMesh(vertices.data(), facets.data(), facets.size()) {} + TriangleMesh(const TriangleMesh &other); TriangleMesh& operator= (TriangleMesh other); void swap(TriangleMesh &other);