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:
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 */