star-geometry-3d

Clean and decorate 3D geometries
git clone git://git.meso-star.fr/star-geometry-3d.git
Log | Files | Refs | README | LICENSE

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:
Msrc/sg3d_geometry.c | 19++++++++++++++-----
Msrc/test_sg3d_geometry.c | 26++++++++++++++++++++++----
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));