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 c6378977ea910ddbf98ad871937038f49c60294b
parent b6392049c5636c5fd69223396a6ddba8a4920c1f
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 13 Feb 2018 13:56:48 +0100

Improve error reporting.

Diffstat:
Msrc/senc_scene.c | 24++++++++++++++++++++++--
Msrc/senc_scene_analyze.c | 82++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 91 insertions(+), 15 deletions(-)

diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -189,8 +189,14 @@ senc_scene_add_geometry if(tmp.vertice_id[0] == tmp.vertice_id[1] || tmp.vertice_id[0] == tmp.vertice_id[2] || tmp.vertice_id[1] == tmp.vertice_id[2]) { + const union double3* positions + = darray_position_cdata_get(&scn->vertices); log_err(scn->dev, "%s: triangle %lu is degenerate.\n", FUNC_NAME, (unsigned long)i); + log_err(scn->dev, " (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + SPLIT3(positions[trg[i].vertice_id[0]].vec), + SPLIT3(positions[trg[i].vertice_id[1]].vec), + SPLIT3(positions[trg[i].vertice_id[2]].vec)); res = RES_BAD_ARG; goto error; } @@ -199,8 +205,12 @@ senc_scene_add_geometry ASSERT(scn->nmeds <= MEDIUM_MAX__); FOR_EACH(j, 0, 2) { if(med[j] >= scn->nmeds) { - log_err(scn->dev, "%s: triangle %lu references invalid medium.\n", - FUNC_NAME, (unsigned long)i); + log_err(scn->dev, + "%s: triangle %lu %s side references invalid medium: %lu.\n", + FUNC_NAME, + (unsigned long)i, + (j ? "back" : "front"), + (unsigned long)med[j]); res = RES_BAD_ARG; goto error; } @@ -220,8 +230,18 @@ senc_scene_add_geometry if(umed[0] != (same ? med[0] : med[1]) || umed[1] != (same ? med[1] : med[0])) { /* Same triangles with different mediums: invalid! */ + const union double3* positions + = darray_position_cdata_get(&scn->vertices); log_err(scn->dev, "%s: triangle %lu is a duplicate with incoherent mediums.\n", FUNC_NAME, (unsigned long)*p_trg); + log_err(scn->dev, "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)*p_trg, + SPLIT3(positions[trg[*p_trg].vertice_id[0]].vec), + SPLIT3(positions[trg[*p_trg].vertice_id[1]].vec), + SPLIT3(positions[trg[*p_trg].vertice_id[2]].vec)); + log_err(scn->dev, "Mediums: (%lu, %lu) VS (%lu, %lu)\n", + umed[ureversed? 1 : 0], umed[ureversed ? 0 : 1], + med[reversed ? 1 : 0], med[reversed ? 0 : 1]); res = RES_BAD_ARG; goto error; } else { diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -382,13 +382,31 @@ extract_connex_components if(neighbour->medium != crt_side->medium) { /* Found medium discontinuity! * Model topology is broken. */ - /* TODO: clean problem reporting. */ + const struct triangle_in* triangles_in + = darray_triangle_in_cdata_get(&scn->triangles_in); + const union double3* positions + = darray_position_cdata_get(&scn->vertices); log_err(scn->dev, - "Medium mismatch found between triangle %u %s" + "Medium mismatch found between triangle %lu %s" " side and triangle %u %s side.\n", - crt_trg_id, TRGSIDE_IS_FRONT(crt_side_id) ? "front": "back", + (unsigned long)crt_trg_id, + TRGSIDE_IS_FRONT(crt_side_id) ? "front": "back", TRGSIDE_2_TRG(neighbour_id), TRGSIDE_IS_FRONT(neighbour_id) ? "front" : "back"); + log_err(scn->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)crt_trg_id, + SPLIT3(positions[triangles_in[crt_trg_id].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[crt_trg_id].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[crt_trg_id].vertice_id[2]].vec)); + log_err(scn->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)neighbour_id, + SPLIT3(positions[triangles_in[neighbour_id].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[neighbour_id].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[neighbour_id].vertice_id[2]].vec)); + log_err(desc->scene->dev, "Mediums: %lu VS %lu\n", + neighbour->medium, crt_side->medium); res = RES_BAD_ARG; cc_descriptor_release(&current_cc); goto error; @@ -426,7 +444,7 @@ exit: MEM_RM(scn->dev->allocator, component_ids_by_medium); } darray_side_id_release(&stack); - ASSERT(desc->triangle_count + ASSERT(desc->triangle_count == darray_triangle_comp_size_get(&desc->triangles_comp)); /* triangles_enc is still unused: no size to assert */ return res; @@ -555,14 +573,33 @@ group_connex_components if(infinite_medium != cc->medium) { /* Medium mismatch! * Model topology is broken. */ - /* TODO: clean problem reporting. */ + const trg_id_t t1 = TRGSIDE_2_TRG(infinite_medium_first_side); + const trg_id_t t2 = TRGSIDE_2_TRG(cc->max_z_side_id); + const struct triangle_in* triangles_in + = darray_triangle_in_cdata_get(&desc->scene->triangles_in); + const union double3* positions + = darray_position_cdata_get(&desc->scene->vertices); log_err(desc->scene->dev, - "Medium mismatch found between triangle %u %s side and triangle" - " %u %s side, both facing infinite.\n", - TRGSIDE_2_TRG(infinite_medium_first_side), + "Medium mismatch found between triangle %lu %s side and triangle" + " %lu %s side, both facing infinite.\n", + t1, TRGSIDE_IS_FRONT(infinite_medium_first_side) ? "front" : "back", TRGSIDE_2_TRG(cc->max_z_side_id), TRGSIDE_IS_FRONT(cc->max_z_side_id) ? "front" : "back"); + log_err(desc->scene->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)t1, + SPLIT3(positions[triangles_in[t1].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[t1].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[t1].vertice_id[2]].vec)); + log_err(desc->scene->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)t2, + SPLIT3(positions[triangles_in[t2].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[t2].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[t2].vertice_id[2]].vec)); + log_err(desc->scene->dev, "Mediums: %lu VS %lu\n", + infinite_medium, cc->medium); res = RES_BAD_ARG; goto error; } @@ -597,14 +634,33 @@ group_connex_components if(hit_trg_in->medium[hit_side] != cc->medium) { /* Medium mismatch! * Model topology is broken. */ - /* TODO: clean problem reporting. */ + const trg_id_t t1 = TRGSIDE_2_TRG(hit_side_id); + const trg_id_t t2 = TRGSIDE_2_TRG(hit_side); + const struct triangle_in* triangles_in + = darray_triangle_in_cdata_get(&desc->scene->triangles_in); + const union double3* positions + = darray_position_cdata_get(&desc->scene->vertices); log_err(desc->scene->dev, - "Medium mismatch found between triangle %u %s side and triangle" - "%u %s side facing each other.\n", - TRGSIDE_2_TRG(hit_side_id), + "Medium mismatch found between triangle %lu %s side and triangle" + " %u %s side facing each other.\n", + (unsigned long)t1, TRGSIDE_IS_FRONT(hit_side) ? "front" : "back", - TRGSIDE_2_TRG(cc->max_z_side_id), + (unsigned long)t2, TRGSIDE_IS_FRONT(cc->max_z_side_id) ? "front" : "back"); + log_err(desc->scene->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)t1, + SPLIT3(positions[triangles_in[t1].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[t1].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[t1].vertice_id[2]].vec)); + log_err(desc->scene->dev, + "Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n", + (unsigned long)t2, + SPLIT3(positions[triangles_in[t2].vertice_id[0]].vec), + SPLIT3(positions[triangles_in[t2].vertice_id[1]].vec), + SPLIT3(positions[triangles_in[t2].vertice_id[2]].vec)); + log_err(desc->scene->dev, "Mediums: %lu VS %lu\n", + hit_trg_in->medium[hit_side], cc->medium); res = RES_BAD_ARG; goto error; }