From 04d5d1bb9b824804295ed7c1c942b14ab115754e Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 5 Aug 2013 10:48:38 +0200 Subject: [PATCH] Incomplete work for porting translate() --- xs/src/TriangleMesh.cpp | 5 +++++ xs/src/TriangleMesh.hpp | 1 + xs/src/admesh/shared.c | 11 +++++++++++ xs/src/admesh/stl.h | 1 + xs/src/admesh/util.c | 22 +++++++++++++--------- xs/t/01_trianglemesh.t | 5 ++++- xs/xsp/TriangleMesh.xsp | 1 + 7 files changed, 36 insertions(+), 10 deletions(-) diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index 4ed53f3f..31876f9f 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -107,4 +107,9 @@ void TriangleMesh::scale(float factor) stl_scale(&(this->stl), factor); } +void TriangleMesh::translate(float x, float y, float z) +{ + stl_translate(&(this->stl), x, y, z); +} + } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index ecd59717..b82e8d98 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -16,6 +16,7 @@ class TriangleMesh void Repair(); void WriteOBJFile(char* output_file); void scale(float factor); + void translate(float x, float y, float z); stl_file stl; }; diff --git a/xs/src/admesh/shared.c b/xs/src/admesh/shared.c index 53fbb162..62a1d95c 100644 --- a/xs/src/admesh/shared.c +++ b/xs/src/admesh/shared.c @@ -23,6 +23,14 @@ #include "stl.h" +void +stl_invalidate_shared_vertices(stl_file *stl) +{ + if (stl->v_indices != NULL) + free(stl->v_indices); + if (stl->v_shared != NULL) + free(stl->v_shared); +} void stl_generate_shared_vertices(stl_file *stl) @@ -38,6 +46,9 @@ stl_generate_shared_vertices(stl_file *stl) int next_facet; int reversed; + // make sure this function is idempotent and does not leak memory + stl_invalidate_shared_vertices(stl); + stl->v_indices = (v_indices_struct*) calloc(stl->stats.number_of_facets, sizeof(v_indices_struct)); if(stl->v_indices == NULL) perror("stl_generate_shared_vertices"); diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h index 1cfe5f2b..a5f79fa8 100644 --- a/xs/src/admesh/stl.h +++ b/xs/src/admesh/stl.h @@ -163,6 +163,7 @@ extern void stl_mirror_xy(stl_file *stl); extern void stl_mirror_yz(stl_file *stl); extern void stl_mirror_xz(stl_file *stl); extern void stl_open_merge(stl_file *stl, char *file); +extern void stl_invalidate_shared_vertices(stl_file *stl); extern void stl_generate_shared_vertices(stl_file *stl); extern void stl_write_obj(stl_file *stl, char *file); extern void stl_write_off(stl_file *stl, char *file); diff --git a/xs/src/admesh/util.c b/xs/src/admesh/util.c index 6ff6488e..fc19328e 100644 --- a/xs/src/admesh/util.c +++ b/xs/src/admesh/util.c @@ -87,17 +87,19 @@ stl_translate(stl_file *stl, float x, float y, float z) { for(j = 0; j < 3; j++) { - stl->facet_start[i].vertex[j].x -= (stl->stats.min.x - x); - stl->facet_start[i].vertex[j].y -= (stl->stats.min.y - y); - stl->facet_start[i].vertex[j].z -= (stl->stats.min.z - z); + stl->facet_start[i].vertex[j].x += x; + stl->facet_start[i].vertex[j].y += y; + stl->facet_start[i].vertex[j].z += z; } } - stl->stats.max.x -= (stl->stats.min.x - x); - stl->stats.max.y -= (stl->stats.min.y - y); - stl->stats.max.z -= (stl->stats.min.z - z); - stl->stats.min.x = x; - stl->stats.min.y = y; - stl->stats.min.z = z; + stl->stats.min.x += x; + stl->stats.min.y += y; + stl->stats.min.z += z; + stl->stats.max.x += x; + stl->stats.max.y += y; + stl->stats.max.z += z; + + stl_invalidate_shared_vertices(stl); } void @@ -128,6 +130,8 @@ stl_scale(stl_file *stl, float factor) stl->facet_start[i].vertex[j].z *= factor; } } + + stl_invalidate_shared_vertices(stl); } static void calculate_normals(stl_file *stl) diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t index e766306a..c888ae91 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 => 6; +use Test::More tests => 7; is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!', 'hello world'; @@ -31,6 +31,9 @@ my $cube = { $m->scale(2); ok abs($m->stats->{volume} - 40*40*40) < 1E-2, 'scale'; + + $m->translate(5,10,0); + is_deeply $m->vertices->[0], [45,50,0], 'translate'; } __END__ diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index 75753971..58fc9bb9 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -13,6 +13,7 @@ void Repair(); void WriteOBJFile(char* output_file); void scale(float factor); + void translate(float x, float y, float z); %{ SV*