star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit a58590a29741ba6c370ade689eaeb459eeef20eb
parent db29340653e01a5b64d9e8bb9c60f57dbc3c2ddd
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 26 Sep 2018 18:22:53 +0200

Add some tests.

Diffstat:
Msrc/test_senc_enclosure.c | 65++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/test_senc_inconsistant_cube.c | 50--------------------------------------------------
Msrc/test_senc_utils.h | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 98 insertions(+), 69 deletions(-)

diff --git a/src/test_senc_enclosure.c b/src/test_senc_enclosure.c @@ -21,8 +21,8 @@ #include <star/s3d.h> -int -main(int argc, char** argv) +void +test(enum senc_convention convention) { struct mem_allocator allocator; struct senc_descriptor* desc = NULL; @@ -36,19 +36,24 @@ main(int argc, char** argv) struct s3d_shape* s3d_shp = NULL; struct s3d_vertex_data s3d_attribs; unsigned indices[2][3]; - unsigned medium[2]; + unsigned medium, media[2]; unsigned gid; double vrtx[3]; struct context ctx; unsigned i, n, t, ecount; - (void)argc, (void)argv; + enum senc_convention conv; + int is_front, is_in; CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); CHK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev) == RES_OK); - CHK(senc_scene_create(dev, - SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK); + CHK(senc_scene_create(dev, convention, &scn) == RES_OK); + + CHK(senc_scene_get_convention(scn, &conv) == RES_OK); + CHK(conv == convention); + is_front = (conv & SENC_CONVENTION_NORMAL_FRONT) != 0; + is_in = (conv & SENC_CONVENTION_NORMAL_INSIDE) != 0; s3d_attribs.type = S3D_FLOAT3; s3d_attribs.usage = S3D_POSITION; @@ -107,18 +112,18 @@ main(int argc, char** argv) CHK(senc_enclosure_get_vertex(NULL, nvertices, NULL) == RES_BAD_ARG); CHK(senc_enclosure_get_vertex(enclosure, 0, vrtx) == RES_OK); - CHK(senc_enclosure_get_triangle_media(NULL, 0, medium) == RES_BAD_ARG); - CHK(senc_enclosure_get_triangle_media(enclosure, ntriangles, medium) + CHK(senc_enclosure_get_triangle_media(NULL, 0, media) == RES_BAD_ARG); + CHK(senc_enclosure_get_triangle_media(enclosure, ntriangles, media) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_media(enclosure, 0, NULL) == RES_BAD_ARG); - CHK(senc_enclosure_get_triangle_media(NULL, ntriangles, medium) + CHK(senc_enclosure_get_triangle_media(NULL, ntriangles, media) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_media(NULL, 0, NULL) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_media(enclosure, ntriangles, NULL) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_media(NULL, ntriangles, NULL) == RES_BAD_ARG); - CHK(senc_enclosure_get_triangle_media(enclosure, 0, medium) == RES_OK); + CHK(senc_enclosure_get_triangle_media(enclosure, 0, media) == RES_OK); CHK(senc_enclosure_get_triangle_global_id(NULL, 0, &gid) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, &gid) @@ -134,14 +139,14 @@ main(int argc, char** argv) == RES_BAD_ARG); CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, &gid) == RES_OK); - CHK(senc_enclosure_get_medium(NULL, 0, medium) == RES_BAD_ARG); - CHK(senc_enclosure_get_medium(enclosure, 2, medium) == RES_BAD_ARG); + CHK(senc_enclosure_get_medium(NULL, 0, &medium) == RES_BAD_ARG); + CHK(senc_enclosure_get_medium(enclosure, 2, &medium) == RES_BAD_ARG); CHK(senc_enclosure_get_medium(enclosure, 0, NULL) == RES_BAD_ARG); - CHK(senc_enclosure_get_medium(NULL, 2, medium) == RES_BAD_ARG); + CHK(senc_enclosure_get_medium(NULL, 2, &medium) == RES_BAD_ARG); CHK(senc_enclosure_get_medium(NULL, 0, NULL) == RES_BAD_ARG); CHK(senc_enclosure_get_medium(enclosure, 2, NULL) == RES_BAD_ARG); CHK(senc_enclosure_get_medium(NULL, 2, NULL) == RES_BAD_ARG); - CHK(senc_enclosure_get_medium(enclosure, 0, medium) == RES_OK); + CHK(senc_enclosure_get_medium(enclosure, 0, &medium) == RES_OK); CHK(senc_enclosure_ref_put(enclosure) == RES_OK); @@ -155,6 +160,11 @@ main(int argc, char** argv) CHK(header.enclosure_id == i); CHK(header.enclosed_media_count == 1); + CHK(senc_enclosure_get_medium(enclosure, 0, &medium) == RES_OK); + /* Geometrical normals point outside the cube in input triangles: + * if convention is front, front medium (0) is outside, + * that is medium 0's enclosure is infinite */ + CHK(is_front == ((medium == 0) == header.is_infinite)); CHK(header.triangle_count == ntriangles); CHK(header.unique_triangle_count == ntriangles); CHK(header.vertices_count == nvertices); @@ -171,13 +181,20 @@ main(int argc, char** argv) FOR_EACH(i, 0, 2) CHK(senc_descriptor_get_enclosure(desc, i, enclosures + i) == RES_OK); FOR_EACH(n, 0, ntriangles) { + int same, reversed; /* Read same triangles in both enclosures */ FOR_EACH(i, 0, 2) CHK(senc_enclosure_get_triangle(enclosures[i], n, indices[i]) == RES_OK); - /* Same triangles, opposite sides */ - CHK(indices[0][0] == indices[1][2]); - CHK(indices[0][1] == indices[1][1]); - CHK(indices[0][2] == indices[1][0]); + /* Same triangles and opposite sides for the 2 enclosures */ + FOR_EACH(i, 0, 3) CHK(indices[0][i] == indices[1][2 - i]); + /* Enclosure 0 is outside (and contains medium 0 if convention is front). + * Geometrical normals in output data point in the same direction that those + * of input triangles for enclosure 0 iff convention is inside. + * The opposite holds for enclosure 1. */ + cmp_trg(n, enclosures[0], box_indices + 3 * n, box_vertices, &same, &reversed); + CHK(same && !reversed == is_in); + cmp_trg(n, enclosures[1], box_indices + 3 * n, box_vertices, &same, &reversed); + CHK(same && reversed == is_in); } FOR_EACH(i, 0, 2) CHK(senc_enclosure_ref_put(enclosures[i]) == RES_OK); @@ -253,6 +270,15 @@ main(int argc, char** argv) check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHK(mem_allocated_size() == 0); +} +int +main(int argc, char** argv) +{ + (void) argc, (void) argv; + test(SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE); + test(SENC_CONVENTION_NORMAL_BACK | SENC_CONVENTION_NORMAL_INSIDE); + test(SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_OUTSIDE); + test(SENC_CONVENTION_NORMAL_BACK | SENC_CONVENTION_NORMAL_OUTSIDE); return 0; -} +} +\ No newline at end of file diff --git a/src/test_senc_inconsistant_cube.c b/src/test_senc_inconsistant_cube.c @@ -49,56 +49,6 @@ static const unsigned inconsistant_medium_back[12] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; void -cmp_trg - (const unsigned itri, - const struct senc_enclosure* enclosure, - const unsigned trg2[3], - const double* vertices2, - int* trg_eq, - int* trg_reversed) -{ - unsigned trg1[3]; - double t1[3][3]; - double t2[3][3]; - unsigned trg1_eq[3] = { 3, 3, 3 }; - unsigned i, j, fst_vrtx = 3; - - ASSERT(enclosure && trg2 && vertices2 && trg_eq && trg_reversed); - - CHK(senc_enclosure_get_triangle(enclosure, itri, trg1) == RES_OK); - FOR_EACH(i, 0, 3) { - CHK(senc_enclosure_get_vertex(enclosure, trg1[i], t1[i]) == RES_OK); - d3_set(t2[i], vertices2 + (3 * trg2[i])); - } - FOR_EACH(i, 0, 3) { - FOR_EACH(j, 0, 3) { - if (d3_eq(t1[i], t2[j])) { - trg1_eq[i] = j; - if(i == 0) fst_vrtx = j; - break; - } - } - } - FOR_EACH(i, 0, 3) { - if(trg1_eq[i] == 3) { - *trg_eq = 0; - return; - } - if(trg1_eq[i] == trg1_eq[(i + 1) % 3] - || trg1_eq[i] == trg1_eq[(i + 2) % 3]) { - *trg_eq = 0; - return; - } - } - /* Same 3 vertices */ - ASSERT(fst_vrtx != 3); - *trg_eq = 1; - - *trg_reversed = (trg1_eq[1] != (fst_vrtx + 1) % 3); - ASSERT(*trg_reversed != (trg1_eq[1] != (fst_vrtx + 2) % 3)); -} - -void test(enum senc_convention convention) { struct mem_allocator allocator; diff --git a/src/test_senc_utils.h b/src/test_senc_utils.h @@ -18,6 +18,7 @@ #include <rsys/rsys.h> #include <rsys/mem_allocator.h> +#include <rsys/double3.h> #include <stdio.h> @@ -244,5 +245,56 @@ static INLINE void check_desc(struct senc_descriptor* desc) ASSERT(e_cpt >= ecount); /* Every enc has been visited at least once */ } +/* Compare the itri-th triangle of enclosure with a triangle described by trg2 & vertices2 */ +static void +cmp_trg + (const unsigned itri, + const struct senc_enclosure* enclosure, + const unsigned trg2[3], + const double* vertices2, + int* trg_eq, + int* trg_reversed) +{ + unsigned trg1[3]; + double t1[3][3]; + double t2[3][3]; + unsigned trg1_eq[3] = { 3, 3, 3 }; + unsigned i, j, fst_vrtx = 3; + + ASSERT(enclosure && trg2 && vertices2 && trg_eq && trg_reversed); + + CHK(senc_enclosure_get_triangle(enclosure, itri, trg1) == RES_OK); + FOR_EACH(i, 0, 3) { + CHK(senc_enclosure_get_vertex(enclosure, trg1[i], t1[i]) == RES_OK); + d3_set(t2[i], vertices2 + (3 * trg2[i])); + } + FOR_EACH(i, 0, 3) { + FOR_EACH(j, 0, 3) { + if (d3_eq(t1[i], t2[j])) { + trg1_eq[i] = j; + if (i == 0) fst_vrtx = j; + break; + } + } + } + FOR_EACH(i, 0, 3) { + if (trg1_eq[i] == 3) { + *trg_eq = 0; + return; + } + if (trg1_eq[i] == trg1_eq[(i + 1) % 3] + || trg1_eq[i] == trg1_eq[(i + 2) % 3]) { + *trg_eq = 0; + return; + } + } + /* Same 3 vertices */ + ASSERT(fst_vrtx != 3); + *trg_eq = 1; + + *trg_reversed = (trg1_eq[1] != (fst_vrtx + 1) % 3); + ASSERT(*trg_reversed != (trg1_eq[1] != (fst_vrtx + 2) % 3)); +} + #endif /* TEST_UTILS_H */