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:
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 */