diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 382227bef..9c21c6cea 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -70,3 +70,40 @@ TriangleMesh::WriteOBJFile(char* output_file) { stl_generate_shared_vertices(&stl); 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 4b1d8949b..e8cb5d3b6 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -1,5 +1,12 @@ #include +extern "C" { +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include "ppport.h" +} + class TriangleMesh { public: @@ -8,6 +15,7 @@ class TriangleMesh void ReadSTLFile(char* input_file); void Repair(); void WriteOBJFile(char* output_file); + AV* ToPerl(); private: stl_file stl; }; diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index 6e6702b2b..82aa55024 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -10,6 +10,7 @@ void ReadSTLFile(char* input_file); void Repair(); void WriteOBJFile(char* output_file); + AV* ToPerl(); }; %package{Slic3r::TriangleMesh::XS}; diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt index fde63fa93..fd018878b 100644 --- a/xs/xsp/typemap.xspt +++ b/xs/xsp/typemap.xspt @@ -1,2 +1,4 @@ %typemap{std::string}; -%typemap{std::vector*}; \ No newline at end of file +%typemap{std::vector*}; +%typemap{SV*}; +%typemap{AV*};