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:
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);