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 f2382dbcf45057d7d7d3be5aa7370a7cabc66611
parent 8d5a26d2b313200478b1fce1cbf5d2bf3963f85b
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 14 Feb 2018 10:37:28 +0100

Add enclosure dump to obj in tests.

Diffstat:
Msrc/test_senc_cube_on_cube.c | 14+++++++++++---
Msrc/test_senc_utils.h | 35+++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/src/test_senc_cube_on_cube.c b/src/test_senc_cube_on_cube.c @@ -22,8 +22,8 @@ Z ^ 4 | +-----------------------+ - | | | -3 | | +-----+ 3 + | | 3 +3 | | +-----+ | | m2 | m1 | m0 2 | | | | | | 2 | | +-----+ | @@ -36,6 +36,7 @@ |--------------------------> X / Y 0 1 2 3 4 */ + int main(int argc, char** argv) { @@ -44,7 +45,7 @@ main(int argc, char** argv) struct senc_device* dev = NULL; struct senc_scene* scn = NULL; struct context ctx; - unsigned count; + unsigned count, i; (void)argc, (void)argv; CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); @@ -106,6 +107,13 @@ main(int argc, char** argv) CHK(senc_descriptor_get_global_triangle_count(desc, &count) == RES_OK); CHK(count == 34); + CHK(senc_descriptor_get_enclosure_count(desc, &count) == RES_OK); + FOR_EACH(i, 0, count) { + char name[128]; + snprintf(name, sizeof(name), "test_cube_on_cube_%u.obj", i); + dump_enclosure(desc, i, name); + } + CHK(senc_scene_ref_put(scn) == RES_OK); CHK(senc_device_ref_put(dev) == RES_OK); if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK); diff --git a/src/test_senc_utils.h b/src/test_senc_utils.h @@ -127,6 +127,41 @@ dump_mesh } } +static void +dump_enclosure + (struct senc_descriptor* desc, + const unsigned enc, + const char* name) +{ + struct senc_enclosure* enclosure; + const struct enclosure_header* header; + FILE* stream; + unsigned count, i; + + ASSERT(desc && name); + + CHK(senc_descriptor_get_enclosure_count(desc, &count) == RES_OK); + ASSERT(enc < count); + CHK(senc_descriptor_get_enclosure(desc, enc, &enclosure) == RES_OK); + CHK(senc_enclosure_get_header(enclosure, &header) == RES_OK); + + stream = fopen(name, "w"); + CHK(stream); + FOR_EACH(i, 0, header->vertices_count) { + double tmp[3]; + CHK(senc_enclosure_get_vertices(enclosure, i, tmp) == RES_OK); + fprintf(stream, "v %g %g %g\n", SPLIT3(tmp)); + } + FOR_EACH(i, 0, header->unique_triangle_count) { + unsigned indices[3]; + CHK(senc_enclosure_get_indices(enclosure, i, indices) == RES_OK); + fprintf(stream, "f %lu %lu %lu\n", + 1+indices[0], 1+indices[1], 1+indices[2]); + } + CHK(senc_enclosure_ref_put(enclosure) == RES_OK); + fclose(stream); +} + static INLINE void check_memory_allocator(struct mem_allocator* allocator) {