commit da4b64dc969778124ad10baf3b08b060f0038032
parent 9eeb638438df54945bcf6eb8105e611e7c61a2f5
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 15 Dec 2020 11:52:24 +0100
Test the suvm_primitive_setup_polyhedron function
Diffstat:
1 file changed, 71 insertions(+), 1 deletion(-)
diff --git a/src/test_suvm_volume.c b/src/test_suvm_volume.c
@@ -19,6 +19,7 @@
#include <rsys/dynamic_array.h>
#include <rsys/double3.h>
+#include <rsys/float3.h>
#define DARRAY_NAME prim
#define DARRAY_DATA struct suvm_primitive
@@ -138,12 +139,74 @@ cmp_prim(const void* a, const void* b)
}
static void
+check_volume_polyhedra(const struct suvm_volume* vol, struct mesh* msh)
+{
+ size_t iprim;
+ size_t nprims;
+
+ CHK(suvm_volume_get_primitives_count(vol, &nprims) == RES_OK);
+ CHK(nprims == msh->ntetrahedra);
+
+ FOR_EACH(iprim, 0, nprims) {
+ struct suvm_primitive prim = SUVM_PRIMITIVE_NULL;
+ struct suvm_polyhedron poly;
+ double v[4][3];
+ double E0[3];
+ double E1[3];
+ double N[3];
+ size_t ids[4];
+ float f[3];
+ CHK(suvm_volume_get_primitive(vol, iprim, &prim) == RES_OK);
+ CHK(!SUVM_PRIMITIVE_NONE(&prim));
+ CHK(prim.iprim == iprim);
+ CHK(prim.nvertices == 4);
+ CHK(suvm_primitive_setup_polyhedron(&prim, &poly) == RES_OK);
+
+ get_indices(iprim, ids, msh);
+ get_position(ids[0], v[0], msh);
+ get_position(ids[1], v[1], msh);
+ get_position(ids[2], v[2], msh);
+ get_position(ids[3], v[3], msh);
+
+ CHK(f3_eq(poly.v[0], f3_set_d3(f, v[0])));
+ CHK(f3_eq(poly.v[1], f3_set_d3(f, v[1])));
+ CHK(f3_eq(poly.v[2], f3_set_d3(f, v[2])));
+ CHK(f3_eq(poly.v[3], f3_set_d3(f, v[3])));
+
+ d3_sub(E0, v[1], v[0]);
+ d3_sub(E1, v[2], v[0]);
+ d3_cross(N, E0, E1);
+ f3_normalize(f, f3_set_d3(f, N));
+ CHK(f3_eq_eps(poly.N[0], f, 1.e-4f));
+
+ d3_sub(E0, v[3], v[0]);
+ d3_sub(E1, v[1], v[0]);
+ d3_cross(N, E0, E1);
+ f3_normalize(f, f3_set_d3(f, N));
+ CHK(f3_eq_eps(poly.N[1], f, 1.e-4f));
+
+ d3_sub(E0, v[3], v[1]);
+ d3_sub(E1, v[2], v[1]);
+ d3_cross(N, E0, E1);
+ f3_normalize(f, f3_set_d3(f, N));
+ CHK(f3_eq_eps(poly.N[2], f, 1.e-4f));
+
+ d3_sub(E0, v[3], v[2]);
+ d3_sub(E1, v[0], v[2]);
+ d3_cross(N, E0, E1);
+ f3_normalize(f, f3_set_d3(f, N));
+ CHK(f3_eq_eps(poly.N[3], f, 1.e-4f));
+ }
+}
+
+static void
test_tetrahedral_mesh_creation(struct suvm_device* dev)
{
struct mesh msh = MESH_NULL;
struct suvm_tetrahedral_mesh_args args = SUVM_TETRAHEDRAL_MESH_ARGS_NULL;
struct suvm_volume* vol = NULL;
struct suvm_primitive prim = SUVM_PRIMITIVE_NULL;
+ struct suvm_polyhedron poly;
size_t nprims;
args.ntetrahedra = box_ntetras;
@@ -233,7 +296,12 @@ test_tetrahedral_mesh_creation(struct suvm_device* dev)
CHK(suvm_volume_get_primitive(vol, nprims, &prim) == RES_BAD_ARG);
CHK(suvm_volume_get_primitive(vol, 0, NULL) == RES_BAD_ARG);
CHK(suvm_volume_get_primitive(vol, 0, &prim) == RES_OK);
- CHK(!SUVM_PRIMITIVE_NONE(&prim));
+
+ CHK(suvm_primitive_setup_polyhedron(NULL, &poly) == RES_BAD_ARG);
+ CHK(suvm_primitive_setup_polyhedron(&prim, NULL) == RES_BAD_ARG);
+ CHK(suvm_primitive_setup_polyhedron(&prim, &poly) == RES_OK);
+
+ check_volume_polyhedra(vol, &msh);
CHK(suvm_volume_ref_put(vol) == RES_OK);
}
@@ -630,6 +698,8 @@ test_volume_at_ball(struct suvm_device* dev)
CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_OK);
+ check_volume_polyhedra(vol, &msh);
+
/* Check volume AABB */
CHK(suvm_volume_get_aabb(vol, low, upp) == RES_OK);
CHK(d3_eq_eps(aabb_low, low, aabb_sz*1.e-6));