diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h index 89fd73a55..033e3f5eb 100644 --- a/xs/src/admesh/stl.h +++ b/xs/src/admesh/stl.h @@ -201,6 +201,7 @@ extern void stl_rotate_z(stl_file *stl, float angle); 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_transform(stl_file *stl, float const *trafo3x4); extern void stl_transform(stl_file const *stl_src, stl_file *stl_dst, float const *trafo3x4); extern void stl_open_merge(stl_file *stl, ADMESH_CHAR *file); extern void stl_invalidate_shared_vertices(stl_file *stl); diff --git a/xs/src/admesh/util.c b/xs/src/admesh/util.c index 44e23cc03..3330ca5b6 100644 --- a/xs/src/admesh/util.c +++ b/xs/src/admesh/util.c @@ -185,6 +185,24 @@ void calculate_normals(stl_file *stl) { } } +void stl_transform(stl_file *stl, float const *trafo3x4) { + int i_face, i_vertex, i, j; + if (stl->error) + return; + for (i_face = 0; i_face < stl->stats.number_of_facets; ++ i_face) { + stl_vertex *vertices = stl->facet_start[i_face].vertex; + for (i_vertex = 0; i_vertex < 3; ++ i_vertex) { + stl_vertex* v_dst = &vertices[i_vertex]; + stl_vertex v_src = *v_dst; + v_dst->x = trafo3x4[0] * v_src.x + trafo3x4[1] * v_src.y + trafo3x4[2] * v_src.z + trafo3x4[3]; + v_dst->y = trafo3x4[4] * v_src.x + trafo3x4[5] * v_src.y + trafo3x4[6] * v_src.z + trafo3x4[7]; + v_dst->z = trafo3x4[8] * v_src.x + trafo3x4[9] * v_src.y + trafo3x4[10] * v_src.z + trafo3x4[11]; + } + } + stl_get_size(stl); + calculate_normals(stl); +} + void stl_transform(stl_file const *stl_src, stl_file *stl_dst, float const *trafo3x4) { int i_face, i_vertex, i, j; if (stl_src->error || stl_dst->error)