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 d063b5ae451cbff2321763b98569a0b467256177
parent 585e0360459e5b068afc5831c9a8f9c06f096832
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 15 Jan 2020 10:33:13 +0100

Fix global_id of triangles

Diffstat:
Msrc/sg3_geometry.c | 37++++++++++++++++---------------------
Msrc/test_sg3_geometry_2.c | 4++--
2 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/src/sg3_geometry.c b/src/sg3_geometry.c @@ -364,10 +364,7 @@ sg3_geometry_add res_T res = RES_OK; struct mem_allocator* alloc; size_t nutris, nuverts; - unsigned actual_nuverts = 0; - unsigned actual_ntris = 0; - unsigned actual_nutris = 0; - unsigned i; + unsigned i, n_new_uverts = 0, n_new_utris = 0; struct triangle* trg; /* Tmp table of IDs to record unique IDs of the currently added vertices */ struct darray_uint unique_vertice_ids; @@ -397,23 +394,23 @@ sg3_geometry_add FOR_EACH(i, 0, nverts) { unsigned* p_vrtx; struct vertex tmp; - unsigned unique_v; + unsigned v_idx; callbacks->get_position(i, tmp.coord, ctx); p_vrtx = htable_vrtx_find(&geom->unique_vertices_ids, &tmp); if(p_vrtx) { /* Duplicate vertex */ - unique_v = *p_vrtx; + v_idx = *p_vrtx; } else { /* New vertex */ - ASSERT(nuverts + actual_nuverts < UINT_MAX); - unique_v = (unsigned)(nuverts + actual_nuverts); - ASSERT(unique_v == htable_vrtx_size_get(&geom->unique_vertices_ids)); + ASSERT(nuverts + n_new_uverts < UINT_MAX); + v_idx = (unsigned)(nuverts + n_new_uverts); + ASSERT(v_idx == htable_vrtx_size_get(&geom->unique_vertices_ids)); ERR(darray_vertex_push_back(&geom->unique_vertices, &tmp)); - ERR(htable_vrtx_set(&geom->unique_vertices_ids, &tmp, &unique_v)); - ++actual_nuverts; + ERR(htable_vrtx_set(&geom->unique_vertices_ids, &tmp, &v_idx)); + ++n_new_uverts; } /* Keep the unique ID for vertex i */ - ERR(darray_uint_push_back(&unique_vertice_ids, &unique_v)); + ERR(darray_uint_push_back(&unique_vertice_ids, &v_idx)); } /* Get triangles and deduplicate */ @@ -426,8 +423,6 @@ sg3_geometry_add struct trg_descriptions* trg_descriptions = NULL; unsigned unique_id; - /* Triangle index in user world regardless of deduplication. */ - tmp.global_id = (geom->triangle_count_including_duplicates + i); callbacks->get_indices(i, tmp.vertex_ids, ctx); FOR_EACH(j, 0, 3) { if(tmp.vertex_ids[j] >= nverts) { @@ -504,8 +499,9 @@ sg3_geometry_add } } else { /* New triangle */ - ASSERT(nutris + actual_nutris < UINT_MAX); - unique_id = (unsigned)(nutris + actual_nutris); + ASSERT(nutris + n_new_utris < UINT_MAX); + unique_id = (unsigned)(nutris + n_new_utris); + tmp.global_id = unique_id; if(callbacks->add_triangle) ERR(callbacks->add_triangle(tmp.global_id, i, ctx)); ERR(geometry_enlarge_trg_descriptions(geom, 1 + unique_id)); @@ -519,23 +515,22 @@ sg3_geometry_add } ASSERT(unique_id == htable_trg_size_get(&geom->unique_triangles_ids)); ERR(htable_trg_set(&geom->unique_triangles_ids, &trg_key, &unique_id)); - ++actual_nutris; + n_new_utris++; } - ++actual_ntris; ERR(geometry_register_triangle(geom, &tmp, unique_id, geom->set_id, trg_descriptions[i].properties_conflict)); if(trg_descriptions[i].properties_conflict) geom->merge_conflict_count++; } - ASSERT(nuverts + actual_nuverts + ASSERT(nuverts + n_new_uverts == htable_vrtx_size_get(&geom->unique_vertices_ids)); - ASSERT(nutris + actual_nutris + ASSERT(nutris + n_new_utris == htable_trg_size_get(&geom->unique_triangles_ids)); exit: if(geom) { geom->set_id++; - geom->triangle_count_including_duplicates += actual_ntris; + geom->triangle_count_including_duplicates += ntris; } if(unique_vertice_ids_initialized) darray_uint_release(&unique_vertice_ids); diff --git a/src/test_sg3_geometry_2.c b/src/test_sg3_geometry_2.c @@ -281,11 +281,11 @@ main(int argc, char** argv) OK(sg3_geometry_get_properties_conflict_count(geom, &count)); CHK(count == 0); OK(sg3_geometry_dump_as_vtk(geom, stdout)); - /* First half of second add was duplicated */ + /* Second add was half duplicated, but numbering is continuous anyway */ FOR_EACH(i, 0, ntriangles) { unsigned id; OK(sg3_geometry_get_unique_triangle_global_id(geom, i, &id)); - ASSERT(i < ntriangles / 2 ? id == i : id == i + ntriangles / 2); + CHK(id == i); } /* Clear geometry */