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:
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(¤t_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;
}