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 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:
Msrc/test_senc_many_enclosures.c | 55+++++++++++++++++++++++++++++++++++++------------------
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); }