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:
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;