star-stl

Load STereo Lithography (StL) file format
git clone git://git.meso-star.fr/star-stl.git
Log | Files | Refs | README | LICENSE

commit 2e7ff039d493bca515f48fa09805b9c736380249
parent 6a2254ad0fc93a79e3c8ee4ff48d416203aad0be
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  6 Jan 2016 17:27:01 +0100

Push further the test of the load functions

Fix an issue on the registration of a new vertex.

Diffstat:
Msrc/sstl.c | 5++---
Msrc/sstl.h | 2+-
Msrc/test_sstl_load.c | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/src/sstl.c b/src/sstl.c @@ -277,14 +277,13 @@ parse_solid_vertex *index = *found_id; } else { /* Add a new vertex */ - *index = (unsigned)sa_size(solid->indices); + *index = (unsigned)sa_size(solid->vertices) / 3; res = htable_vertex_set(&sstl->vertex2id, &vertex, index); if(res != RES_OK) { print_log(sstl, LOG_ERROR, "%s:%lu: couldn't register a vertex position.\n", filename, (unsigned long)iline); } - f3_set(sa_add(solid->vertices, 3), vertex.xyz); } sa_push(solid->indices, *index); @@ -567,7 +566,7 @@ sstl_get_desc(const struct sstl* sstl, struct sstl_desc* desc) if(!sstl || !desc) return RES_BAD_ARG; desc->solid_name = sstl->solid.name; desc->vertices_count = sa_size(sstl->solid.vertices); - ASSERT(desc->triangles_count % 3 == 0); + ASSERT(desc->vertices_count % 3 == 0); desc->vertices_count /= 3/* # coords per vertex */; desc->triangles_count = sa_size(sstl->solid.indices); ASSERT(desc->triangles_count % 3 == 0); diff --git a/src/sstl.h b/src/sstl.h @@ -55,7 +55,7 @@ struct sstl_desc { const float* vertices; /* triangles_count * 3 coordinates */ const unsigned* indices; /* triangles_count * 3 indices */ - const float* normals; /* Per triangle normal */ + const float* normals; /* Per triangle normalized normal */ size_t triangles_count; size_t vertices_count; diff --git a/src/test_sstl_load.c b/src/test_sstl_load.c @@ -223,6 +223,82 @@ test_basic(struct sstl* sstl) } } +static void +test_tetrahedron(struct sstl* sstl) +{ + static const char* tetrahedron[] = { + "solid cube_corner\n", + " facet normal 0.0 -1.0 0.0\n", + " outer loop\n", + " vertex 0.0 0.0 0.0\n", + " vertex 1.0 0.0 0.0\n", + " vertex 0.0 0.0 1.0\n", + " endloop\n", + " endfacet\n", + " facet normal 0.0 0.0 -1.0\n", + " outer loop\n", + " vertex 0.0 0.0 0.0\n", + " vertex 0.0 1.0 0.0\n", + " vertex 1.0 0.0 0.0\n", + " endloop\n", + " endfacet\n", + " facet normal -1.0 0.0 0.0\n", + " outer loop\n", + " vertex 0.0 0.0 0.0\n", + " vertex 0.0 0.0 1.0\n", + " vertex 0.0 1.0 0.0\n", + " endloop\n", + " endfacet\n", + " facet normal 0.577 0.577 0.577\n", + " outer loop\n", + " vertex 1.0 0.0 0.0\n", + " vertex 0.0 1.0 0.0\n", + " vertex 0.0 0.0 1.0\n", + " endloop\n", + " endfacet\n", + "endsolid\n" + }; + FILE* file; + const size_t nlines = sizeof(tetrahedron)/sizeof(const char*); + struct sstl_desc desc; + float tmp[3]; + size_t i; + + NCHECK(sstl, NULL); + + file = tmpfile(); + NCHECK(file, NULL); + FOR_EACH(i, 0, nlines) + fwrite(tetrahedron[i], sizeof(char), strlen(tetrahedron[i]), file); + rewind(file); + + CHECK(sstl_load_stream(sstl, file), RES_OK); + + CHECK(sstl_get_desc(sstl, &desc), RES_OK); + CHECK(strcmp(desc.solid_name, "cube_corner"), 0); + CHECK(desc.vertices_count, 4); + CHECK(desc.triangles_count, 4); + + CHECK(f3_eq(desc.vertices + desc.indices[0]*3, f3(tmp, 0.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[1]*3, f3(tmp, 1.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[2]*3, f3(tmp, 0.f, 0.f, 1.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[3]*3, f3(tmp, 0.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[4]*3, f3(tmp, 0.f, 1.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[5]*3, f3(tmp, 1.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[6]*3, f3(tmp, 0.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[7]*3, f3(tmp, 0.f, 0.f, 1.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[8]*3, f3(tmp, 0.f, 1.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[9]*3, f3(tmp, 1.f, 0.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[10]*3, f3(tmp, 0.f, 1.f, 0.f)), 1); + CHECK(f3_eq(desc.vertices + desc.indices[11]*3, f3(tmp, 0.f, 0.f, 1.f)), 1); + + CHECK(f3_eq(desc.normals + 0*3, f3(tmp, 0.f,-1.f, 0.f)), 1); + CHECK(f3_eq(desc.normals + 1*3, f3(tmp, 0.f, 0.f,-1.f)), 1); + CHECK(f3_eq(desc.normals + 2*3, f3(tmp,-1.f, 0.f, 0.f)), 1); + f3_normalize(tmp, f3(tmp, 1.f, 1.f, 1.f)); + CHECK(f3_eq_eps(desc.normals + 3*3, tmp, 1.e-6f), 1); +} + int main(int argc, char** argv) { @@ -235,6 +311,7 @@ main(int argc, char** argv) CHECK(sstl_create(NULL, &allocator, 1, &sstl), RES_OK); test_basic(sstl); + test_tetrahedron(sstl); CHECK(sstl_ref_put(sstl), RES_OK);