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 1db74b6f5d469c3ac5f4020b5ded37637c1fe393
parent 1abafd3f299066e521a7e141c5e97bc0a6a2c0e1
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri,  5 Jul 2024 15:18:41 +0200

Add an API function to dump an enclosure to an OBJ file

The main use could be debugging

Diffstat:
Msrc/senc3d.h | 7+++++++
Msrc/senc3d_scene.c | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/src/senc3d.h b/src/senc3d.h @@ -333,6 +333,13 @@ senc3d_scene_get_overlapping_triangle const unsigned idx, unsigned* id); +/* Dump a given enclosure in an OBJ file */ +SENC3D_API res_T +senc3d_scene_dump_enclosure_obj + (struct senc3d_scene* scn, + const unsigned enc, + const char* filename); + SENC3D_API res_T senc3d_scene_ref_get (struct senc3d_scene* scene); diff --git a/src/senc3d_scene.c b/src/senc3d_scene.c @@ -319,6 +319,58 @@ senc3d_scene_get_vertex } res_T +senc3d_scene_dump_enclosure_obj + (struct senc3d_scene* scn, + const unsigned enc, + const char* name) +{ + struct senc3d_enclosure* enclosure = NULL; + struct senc3d_enclosure_header header; + FILE* stream = NULL; + unsigned count, i; + res_T res = RES_OK; + + if(!scn || !name) { + res = RES_BAD_ARG; + goto error; + } + + OK(senc3d_scene_get_enclosure_count(scn, &count)); + if(enc >= count) { + res = RES_BAD_ARG; + goto error; + } + + OK(senc3d_scene_get_enclosure(scn, enc, &enclosure)); + OK(senc3d_enclosure_get_header(enclosure, &header)); + + stream = fopen(name, "w"); + if(!stream) { + res = RES_BAD_ARG; + goto error; + } + + FOR_EACH(i, 0, header.vertices_count) { + double tmp[3]; + OK(senc3d_enclosure_get_vertex(enclosure, i, tmp)); + fprintf(stream, "v %g %g %g\n", SPLIT3(tmp)); + } + FOR_EACH(i, 0, header.primitives_count) { + unsigned indices[3]; + OK(senc3d_enclosure_get_triangle(enclosure, i, indices)); + fprintf(stream, "f %u %u %u\n", + 1+indices[0], 1+indices[1], 1+indices[2]); + } + +exit: + if(enclosure) SENC3D(enclosure_ref_put(enclosure)); + if(stream) fclose(stream); + return res; +error: + goto exit; +} + +res_T senc3d_scene_ref_get(struct senc3d_scene* scn) { if(!scn) return RES_BAD_ARG;