From 3919ba83d86b8001ad4159180f1d16aa81ad0dd4 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 9 Sep 2013 22:45:22 +0200 Subject: [PATCH] Implemented TriangleMesh->merge --- xs/src/TriangleMesh.cpp | 19 +++++++++++++++++++ xs/src/TriangleMesh.hpp | 1 + xs/src/admesh/stl.h | 2 +- xs/src/admesh/stlinit.c | 2 +- xs/t/01_trianglemesh.t | 7 ++++++- xs/xsp/TriangleMesh.xsp | 1 + 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 2c5c7a52df..b1abae55b9 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -525,4 +525,23 @@ TriangleMesh::split() const return meshes; } +void +TriangleMesh::merge(const TriangleMesh* mesh) +{ + // reset stats and metadata + int number_of_facets = this->stl.stats.number_of_facets; + stl_initialize(&this->stl); + stl_invalidate_shared_vertices(&this->stl); + + // update facet count and allocate more memory + this->stl.stats.number_of_facets = number_of_facets + mesh->stl.stats.number_of_facets; + this->stl.stats.original_num_facets = this->stl.stats.number_of_facets; + stl_reallocate(&this->stl); + + // copy facets + for (int i = 0; i < mesh->stl.stats.number_of_facets; i++) { + this->stl.facet_start[number_of_facets + i] = mesh->stl.facet_start[i]; + } +} + } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index 2506160f1c..77ef6a4d48 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -28,6 +28,7 @@ class TriangleMesh void rotate(double angle, Point* center); std::vector* slice(const std::vector &z); TriangleMeshPtrs split() const; + void merge(const TriangleMesh* mesh); stl_file stl; }; diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h index c7a9a7e565..d5a1286aae 100644 --- a/xs/src/admesh/stl.h +++ b/xs/src/admesh/stl.h @@ -178,7 +178,7 @@ static void stl_count_facets(stl_file *stl, char *file); extern void stl_allocate(stl_file *stl); static void stl_read(stl_file *stl, int first_facet, int first); static void stl_facet_stats(stl_file *stl, stl_facet facet, int first); -static void stl_reallocate(stl_file *stl); +extern void stl_reallocate(stl_file *stl); static int stl_get_little_int(FILE *fp); static float stl_get_little_float(FILE *fp); extern void stl_get_size(stl_file *stl); diff --git a/xs/src/admesh/stlinit.c b/xs/src/admesh/stlinit.c index 7d8b9e65a1..7b25a1603d 100644 --- a/xs/src/admesh/stlinit.c +++ b/xs/src/admesh/stlinit.c @@ -213,7 +213,7 @@ stl_open_merge(stl_file *stl, char *file) stl_read(stl, first_facet, 0); } -static void +extern void stl_reallocate(stl_file *stl) { /* Reallocate more memory for the .STL file(s) */ diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t index d8b5cb5e86..6c4b062e15 100644 --- a/xs/t/01_trianglemesh.t +++ b/xs/t/01_trianglemesh.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 45; +use Test::More tests => 46; is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!', 'hello world'; @@ -46,6 +46,11 @@ my $cube = { my $result = $m->split; is scalar(@$result), 1, 'split'; isa_ok $result->[0], 'Slic3r::TriangleMesh::XS', 'split'; + + my $m2 = Slic3r::TriangleMesh::XS->new; + $m2->ReadFromPerl($cube->{vertices}, $cube->{facets}); + $m->merge($m2); + is $m->stats->{number_of_facets}, 2 * $m2->stats->{number_of_facets}, 'merge'; } { diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index e97da15dce..02f2f637df 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -17,6 +17,7 @@ void align_to_origin(); void rotate(double angle, Point* center); TriangleMeshPtrs split(); + void merge(TriangleMesh* mesh); %{ SV*