From a0bd1522438847bca3302c238d6ba00dec288e32 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 4 Aug 2013 21:23:27 +0200 Subject: [PATCH] Remove ->ToPerl and add ->vertices and ->facets --- xs/src/TriangleMesh.cpp | 37 --------------------------------- xs/src/TriangleMesh.hpp | 1 - xs/t/01_trianglemesh.t | 3 ++- xs/xsp/TriangleMesh.xsp | 45 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 40 deletions(-) diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 901bdfa47..34dc0943c 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -102,41 +102,4 @@ TriangleMesh::WriteOBJFile(char* output_file) { stl_write_obj(&stl, output_file); } -AV* -TriangleMesh::ToPerl() { - int i; - - stl_generate_shared_vertices(&stl); - - // vertices - AV* vertices = newAV(); - av_extend(vertices, stl.stats.shared_vertices); - for (i = 0; i < stl.stats.shared_vertices; i++) { - AV* vertex = newAV(); - av_store(vertices, i, newRV_noinc((SV*)vertex)); - av_extend(vertex, 2); - av_store(vertex, 0, newSVnv(stl.v_shared[i].x)); - av_store(vertex, 1, newSVnv(stl.v_shared[i].y)); - av_store(vertex, 2, newSVnv(stl.v_shared[i].z)); - } - - // facets - AV* facets = newAV(); - av_extend(facets, stl.stats.number_of_facets); - for (i = 0; i < stl.stats.number_of_facets; i++) { - AV* facet = newAV(); - av_store(facets, i, newRV_noinc((SV*)facet)); - av_extend(facet, 2); - av_store(facet, 0, newSVnv(stl.v_indices[i].vertex[0])); - av_store(facet, 1, newSVnv(stl.v_indices[i].vertex[1])); - av_store(facet, 2, newSVnv(stl.v_indices[i].vertex[2])); - } - - AV* result = newAV(); - av_extend(result, 1); - av_store(result, 0, newRV_noinc((SV*)vertices)); - av_store(result, 1, newRV_noinc((SV*)facets)); - return result; -} - } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index 40421ce5a..27aca770b 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -15,7 +15,6 @@ class TriangleMesh void ReadFromPerl(SV* vertices, SV* facets); void Repair(); void WriteOBJFile(char* output_file); - AV* ToPerl(); stl_file stl; }; diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t index 42ed11145..cc08f6216 100644 --- a/xs/t/01_trianglemesh.t +++ b/xs/t/01_trianglemesh.t @@ -18,7 +18,8 @@ my $cube = { my $m = Slic3r::TriangleMesh::XS->new; $m->ReadFromPerl($cube->{vertices}, $cube->{facets}); $m->Repair; - my ($vertices, $facets) = @{$m->ToPerl}; + my ($vertices, $facets) = ($m->vertices, $m->facets); + is_deeply $vertices, $cube->{vertices}, 'vertices arrayref roundtrip'; is_deeply $facets, $cube->{facets}, 'facets arrayref roundtrip'; diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index cf4ae8d64..3eb40eea8 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -12,7 +12,6 @@ void ReadFromPerl(SV* vertices, SV* facets); void Repair(); void WriteOBJFile(char* output_file); - AV* ToPerl(); %{ SV* @@ -33,6 +32,50 @@ TriangleMesh::stats() OUTPUT: RETVAL +SV* +TriangleMesh::vertices() + CODE: + if (THIS->stl.stats.shared_vertices == 0) + stl_generate_shared_vertices(&(THIS->stl)); + + // vertices + AV* vertices = newAV(); + av_extend(vertices, THIS->stl.stats.shared_vertices); + for (int i = 0; i < THIS->stl.stats.shared_vertices; i++) { + AV* vertex = newAV(); + av_store(vertices, i, newRV_noinc((SV*)vertex)); + av_extend(vertex, 2); + av_store(vertex, 0, newSVnv(THIS->stl.v_shared[i].x)); + av_store(vertex, 1, newSVnv(THIS->stl.v_shared[i].y)); + av_store(vertex, 2, newSVnv(THIS->stl.v_shared[i].z)); + } + + RETVAL = newRV_noinc((SV*)vertices); + OUTPUT: + RETVAL + +SV* +TriangleMesh::facets() + CODE: + if (THIS->stl.stats.shared_vertices == 0) + stl_generate_shared_vertices(&(THIS->stl)); + + // facets + AV* facets = newAV(); + av_extend(facets, THIS->stl.stats.number_of_facets); + for (int i = 0; i < THIS->stl.stats.number_of_facets; i++) { + AV* facet = newAV(); + av_store(facets, i, newRV_noinc((SV*)facet)); + av_extend(facet, 2); + av_store(facet, 0, newSVnv(THIS->stl.v_indices[i].vertex[0])); + av_store(facet, 1, newSVnv(THIS->stl.v_indices[i].vertex[1])); + av_store(facet, 2, newSVnv(THIS->stl.v_indices[i].vertex[2])); + } + + RETVAL = newRV_noinc((SV*)facets); + OUTPUT: + RETVAL + %} };