commit 24e08b336e5bd03513834799ea6a5d28829c11d6
parent 25148f771757ead6edb1b3da6815c2ba30b8acd8
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 16 Jun 2020 10:12:49 +0200
Fix model dump with some ill-formed models
Diffstat:
4 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/src/stardis-app.c b/src/stardis-app.c
@@ -613,7 +613,7 @@ stardis_init
/* Create enclosures */
tmp_res = init_enclosures(stardis);
- if(res != RES_OK && is_for_compute) {
+ if(tmp_res != RES_OK && is_for_compute) {
res = tmp_res;
goto error;
}
@@ -630,14 +630,17 @@ stardis_init
/* Create media and property holders for those found in descriptions */
for(i = 0; i < darray_descriptions_size_get(&stardis->descriptions); i++) {
- ERR(create_holder(stardis, &dummies, i,
- stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)));
+ tmp_res = create_holder(stardis, &dummies, i,
+ stardis->mode & (MODE_BIN_GREEN | MODE_GREEN));
+ if(tmp_res != RES_OK && is_for_compute) {
+ res = tmp_res;
+ goto error;
+ }
str_clear(&str);
ERR(str_printf(&str, "Description %d: ", i));
ERR(str_print_description(&str,
darray_descriptions_cdata_get(&stardis->descriptions) + i));
- ERR(str_printf(&str, "\n"));
- logger_print(stardis->logger, LOG_OUTPUT, "%s", str_cget(&str));
+ logger_print(stardis->logger, LOG_OUTPUT, "%s\n", str_cget(&str));
}
if(is_for_compute) {
@@ -708,8 +711,10 @@ stardis_release
darray_size_t_release(&stardis->compute_surface.primitives);
darray_sides_release(&stardis->compute_surface.sides);
darray_uint_release(&stardis->compute_surface.err_triangles);
- FOR_EACH(i, 0, darray_media_ptr_size_get(&stardis->media))
- SDIS(medium_ref_put(darray_media_ptr_data_get(&stardis->media)[i]));
+ FOR_EACH(i, 0, darray_media_ptr_size_get(&stardis->media)) {
+ if(darray_media_ptr_data_get(&stardis->media)[i])
+ SDIS(medium_ref_put(darray_media_ptr_data_get(&stardis->media)[i]));
+ }
darray_media_ptr_release(&stardis->media);
}
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -78,8 +78,18 @@ struct dummies {
NULL, UINT_MAX, NULL, UINT_MAX\
}
+static FINLINE void
+init_media_ptr
+ (struct mem_allocator* alloc,
+ struct sdis_medium** data)
+{
+ ASSERT(data); (void)alloc;
+ *data = NULL;
+}
+
#define DARRAY_NAME media_ptr
#define DARRAY_DATA struct sdis_medium*
+#define DARRAY_FUNCTOR_INIT init_media_ptr
#include <rsys/dynamic_array.h>
struct geometry {
diff --git a/src/stardis-main.c b/src/stardis-main.c
@@ -84,11 +84,7 @@ main
if(mode & REGION_COMPUTE_MODES) {
ERR(dump_compute_region_at_the_end_of_vtk(&stardis, stdout));
}
- /* Dump enclosures and related information
- * If enclosures creation failed, just skip it */
- if(stardis.senc3d_scn) {
- ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout));
- }
+ ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout));
/* If dump flag set exit after dump done */
goto exit;
diff --git a/src/stardis-output.c b/src/stardis-output.c
@@ -833,6 +833,21 @@ dump_enclosure_related_stuff_at_the_end_of_vtk
goto error;
}
+ /* If enclosure where not extracted, dump only errors */
+ ERR(senc3d_scene_get_overlapping_triangles_count(stardis->senc3d_scn, &ocount));
+ if(ocount) {
+ FOR_EACH(t, 0, tsz) trgs[t] = 0;
+ FOR_EACH(t, 0, ocount) {
+ unsigned trid;
+ ERR(senc3d_scene_get_overlapping_triangle(stardis->senc3d_scn, t, &trid));
+ trgs[trid] = 1;
+ }
+ fprintf(stream, "SCALARS Overlapping_triangles unsigned_int 1\n");
+ fprintf(stream, "LOOKUP_TABLE default\n");
+ FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]);
+ goto exit;
+ }
+
/* Keep the segments involved in holes (not the vertices) */
ERR(senc3d_scene_get_frontier_segments_count(stardis->senc3d_scn, &scount));
if(scount) {
@@ -848,20 +863,6 @@ dump_enclosure_related_stuff_at_the_end_of_vtk
FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]);
}
- /* Dump overlapping triangles information */
- ERR(senc3d_scene_get_overlapping_triangles_count(stardis->senc3d_scn, &ocount));
- if(ocount) {
- FOR_EACH(t, 0, tsz) trgs[t] = 0;
- FOR_EACH(t, 0, ocount) {
- unsigned trid;
- ERR(senc3d_scene_get_overlapping_triangle(stardis->senc3d_scn, t, &trid));
- trgs[trid] = 1;
- }
- fprintf(stream, "SCALARS Overlapping_triangles unsigned_int 1\n");
- fprintf(stream, "LOOKUP_TABLE default\n");
- FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]);
- }
-
/* Dump enclosure information */
ERR(senc3d_scene_get_enclosure_count(stardis->senc3d_scn, &ecount));
enc_status = MEM_CALLOC(stardis->allocator, ecount, sizeof(*enc_status));