commit 5a6be30faf321766ced4d2e12a89d979b707b324
parent dd7e9ca85edbec1087cb81e8f609b5f4d12e5211
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 10 Jun 2020 15:47:08 +0200
BugFix: some degenerated triangles where not detected
Diffstat:
2 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/src/sg3d_geometry.c b/src/sg3d_geometry.c
@@ -432,7 +432,7 @@ sg3d_geometry_add
/* Get triangles and deduplicate */
trg = darray_triangle_data_get(&geom->unique_triangles);
FOR_EACH(nt, 0, ntris) {
- int j, reversed;
+ int j, reversed, dg;
struct vrtx_id3 trg_key;
struct triangle tmp = TRG_UNDEF__;
trg_id_t* p_trg;
@@ -449,16 +449,25 @@ sg3d_geometry_add
tmp.vertex_ids[j]
= darray_vertice_ids_cdata_get(&unique_vertice_ids)[tmp.vertex_ids[j]];
}
- if(tmp.vertex_ids[0] == tmp.vertex_ids[1]
+ dg = (tmp.vertex_ids[0] == tmp.vertex_ids[1]
|| tmp.vertex_ids[0] == tmp.vertex_ids[2]
- || tmp.vertex_ids[1] == tmp.vertex_ids[2])
- {
+ || tmp.vertex_ids[1] == tmp.vertex_ids[2]);
+ if(!dg) {
+ double edge1[3], edge2[3], n[3];
+ const struct vertex* vertices = darray_vertex_cdata_get(&geom->unique_vertices);
+ d3_sub(edge1, vertices[tmp.vertex_ids[1]].coord, vertices[tmp.vertex_ids[0]].coord);
+ d3_sub(edge2, vertices[tmp.vertex_ids[2]].coord, vertices[tmp.vertex_ids[0]].coord);
+ d3_cross(n, edge1, edge2);
+ dg = d3_len(n) == 0;
+ }
+ if(dg) {
int abort = 0;
if(dege_trg) {
/* Let the client app rule. */
ERR(dege_trg(nt, ctx, &abort));
} else {
- log_warn(geom->dev, "%s: triangle "PRTF_TRG" is degenerated.\n",
+ log_warn(geom->dev,
+ "%s: triangle "PRTF_TRG" is degenerated (removed).\n",
FUNC_NAME, nt);
}
if(abort) {
diff --git a/src/test_sg3d_geometry.c b/src/test_sg3d_geometry.c
@@ -68,7 +68,10 @@ main(int argc, char** argv)
struct sg3d_geometry* geom;
double coord[3];
unsigned indices[3];
- const unsigned degenerated[3] = { 0 , 0, 0 };
+ const unsigned degenerated1[3] = { 0, 0, 0 };
+ const unsigned degenerated2[3] = { 0, 1, 2 };
+ const double degenerated_vertices[3/*#vertices*/ * 3/*#coords per vertex*/]
+ = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 0.0 };
unsigned properties[SG3D_PROP_TYPES_COUNT__];
struct sg3d_geometry_add_callbacks callbacks = SG3D_ADD_CALLBACKS_NULL__;
unsigned user_id;
@@ -270,8 +273,8 @@ main(int argc, char** argv)
/* BA because of conflicts */
BA(sg3d_geometry_dump_as_c_code(geom, stdout, "test", SG3D_C_DUMP_CONST));
- /* Degenerated triangles */
- ctx.indices = degenerated;
+ /* Degenerated triangles: duplicated vertex */
+ ctx.indices = degenerated1;
/* Without callback : OK */
OK(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
/* With callback : OK */
@@ -280,7 +283,22 @@ main(int argc, char** argv)
i = 0;
OK(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
/* With callback : KO */
- i= 1;
+ i = 1;
+ BA(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
+
+ /* Degenerated triangles: flat triangle */
+ ctx.indices = degenerated2;
+ ctx.positions = degenerated_vertices;
+ callbacks.degenerated_triangle = NULL;
+ /* Without callback : OK */
+ OK(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
+ /* With callback : OK */
+ callbacks.degenerated_triangle = degenerated_triangle;
+ ctx.custom = &i;
+ i = 0;
+ OK(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
+ /* With callback : KO */
+ i = 1;
BA(sg3d_geometry_add(geom, nvertices, 1, &callbacks, &ctx));
OK(sg3d_geometry_ref_put(geom));