commit cc1fa56fd0bd641f07b666bdf05f75a0e00ca9d2
parent 3f7451e5466f6d867b003563a003fe87ac1d9fa7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 16 Mar 2018 13:49:46 +0100
Fix many enclosures test and greatly increase enclosures count
Diffstat:
1 file changed, 37 insertions(+), 18 deletions(-)
diff --git a/src/test_senc_many_enclosures.c b/src/test_senc_many_enclosures.c
@@ -74,8 +74,10 @@ main(int argc, char** argv)
struct senc_scene* scn = NULL;
struct s3dut_mesh* cyl = NULL;
struct s3dut_context ctx;
+ unsigned m_in, m_out;
unsigned count;
- unsigned cyl_trg_count, cyl_vrtx_count, i;
+ unsigned cyl_trg_count, cyl_vrtx_count, e;
+ int i, j, k;
char dump[64];
struct time t0, t1;
(void)argc, (void)argv;
@@ -84,31 +86,44 @@ main(int argc, char** argv)
CHK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev)
== RES_OK);
-#define NB_CYL 16384
+#define NB_CYL_1 64
+ /* 64^3 = 262144 cylinders */
+#define NB_CYL (NB_CYL_1 * NB_CYL_1 * NB_CYL_1)
/* Create the scene */
- CHK(senc_scene_create(dev, NB_CYL + 1, &scn) == RES_OK);
+ CHK(senc_scene_create(dev, NB_CYL_1 + 1, &scn) == RES_OK);
ctx.ctx.positions = NULL;
ctx.ctx.indices = NULL;
ctx.ctx.reverse_vrtx = 0;
ctx.ctx.reverse_med = 0;
- /* Create a cylinder (320 K trg, 160 K vrtx). */
- CHK(s3dut_create_cylinder(&allocator, 1, 1, 16, 1, &cyl) == RES_OK);
+ ctx.ctx.front_media = &m_in;
+ ctx.ctx.back_media = &m_out;
+ /* A 20 triangles 12 vertices cylinder template */
+ CHK(s3dut_create_cylinder(&allocator, 1, 1, 5, 1, &cyl) == RES_OK);
S3DUT(mesh_get_data(cyl, &ctx.data));
ASSERT(ctx.data.nprimitives < UINT_MAX);
ASSERT(ctx.data.nvertices < UINT_MAX);
cyl_trg_count = (unsigned)ctx.data.nprimitives;
cyl_vrtx_count = (unsigned)ctx.data.nvertices;
- FOR_EACH(i, 1, 1 + NB_CYL) {
- unsigned m_in = i-1;
- unsigned m_out = i;
- ctx.ctx.front_media = &m_in;
- ctx.ctx.back_media = &m_out;
- ctx.ctx.scale = i;
- d3(ctx.ctx.offset, -0.25 * i, -0.25 * i, -0.25 * i);
- CHK(senc_scene_add_geometry(scn, cyl_trg_count, get_s3dut_indices,
- get_s3dut_media, NULL, cyl_vrtx_count, get_s3dut_position, &ctx)
- == RES_OK);
+ FOR_EACH(i, 0, NB_CYL_1) {
+ double center_x = (2 + NB_CYL_1) * (i - NB_CYL_1 / 2);
+ FOR_EACH(j, 0, NB_CYL_1) {
+ double misalignment = 0.01;
+ FOR_EACH(k, 0, NB_CYL_1) {
+ double center_y = (2 + NB_CYL_1) * (j - NB_CYL_1 / 2);
+ m_in = k;
+ m_out = k + 1;
+ ctx.ctx.scale = k + 1;
+ /* Mitigate Embree issue #181
+ * We cannot keep perfect alignment of cylinders
+ * or some hits are missed */
+ misalignment *= -1;
+ d3(ctx.ctx.offset, center_x + misalignment, center_y + misalignment, 0);
+ CHK(senc_scene_add_geometry(scn, cyl_trg_count, get_s3dut_indices,
+ get_s3dut_media, NULL, cyl_vrtx_count, get_s3dut_position, &ctx)
+ == RES_OK);
+ }
+ }
}
S3DUT(mesh_ref_put(cyl));
@@ -126,13 +141,17 @@ main(int argc, char** argv)
CHK(senc_descriptor_get_enclosure_count(desc, &count) == RES_OK);
CHK(count == 1 + NB_CYL);
- FOR_EACH(i, 0, count) {
+ FOR_EACH(e, 0, count) {
struct senc_enclosure* enclosure;
const struct enclosure_header* header;
- CHK(senc_descriptor_get_enclosure(desc, i, &enclosure) == RES_OK);
+ CHK(senc_descriptor_get_enclosure(desc, e, &enclosure) == RES_OK);
CHK(senc_enclosure_get_header(enclosure, &header) == RES_OK);
CHK(header->triangle_count ==
- i ? cyl_trg_count : NB_CYL * cyl_trg_count);
+ (e == 0 /* Outermost enclosure: NB_CYL_1*NB_CYL_1 cylinders */
+ ? NB_CYL_1 * NB_CYL_1 * cyl_trg_count
+ : (header->enclosed_medium == 0
+ ? cyl_trg_count /* Innermost enclosures: 1 cylinder */
+ : 2 * cyl_trg_count))); /* Other enclosures: 2 cylinders */
CHK(senc_enclosure_ref_put(enclosure) == RES_OK);
}