star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit b6392049c5636c5fd69223396a6ddba8a4920c1f
parent c983b6ba8fd3370db9a455aa33f9b0fbf9526b7c
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 13 Feb 2018 12:55:15 +0100

Fix count VS unique count mismatches.

Diffstat:
Msrc/senc_descriptor.c | 2+-
Msrc/senc_descriptor_c.h | 3+++
Msrc/senc_scene_analyze.c | 38+++++++++++++++++++++++---------------
3 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -156,7 +156,7 @@ senc_descriptor_get_global_vertices { const union double3* v; if(!vrtx || !desc - || ivert >= darray_triangle_in_size_get(&desc->scene->triangles_in)) + || ivert >= darray_position_size_get(&desc->scene->vertices)) return RES_BAD_ARG; v = darray_position_cdata_get(&desc->scene->vertices) + ivert; diff --git a/src/senc_descriptor_c.h b/src/senc_descriptor_c.h @@ -77,8 +77,11 @@ triangle_enc_init(struct mem_allocator* alloc, struct triangle_enc* trg) { struct senc_descriptor { struct senc_scene* scene; enclosure_id_t enclosures_count; + /* Store by-triangle components */ struct darray_triangle_comp triangles_comp; + /* Store by-triangle enclosures */ struct darray_triangle_enc triangles_enc; + /* Store enclosures */ struct darray_enclosure enclosures; trg_id_t triangle_count; vrtx_id_t vertices_count; diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -130,7 +130,11 @@ find_component_Zmax side_membership = darray_char_cdata_get(&cc->side_membership); /* Build the sorted list of side ids */ - FOR_EACH(trid, 0, scn->ntris) { + ASSERT(darray_triangle_tmp_size_get(triangles_tmp_array) + == darray_triangle_in_size_get(&scn->triangles_in)); + ASSERT(scn->nutris + == darray_triangle_in_size_get(&scn->triangles_in)); + FOR_EACH(trid, 0, scn->nutris) { const char member = side_membership[trid]; struct triangle_in* const trg_in = triangles_in + trid; struct triangle_tmp* const trg_tmp = triangles_tmp + trid; @@ -201,7 +205,7 @@ add_side_to_stack { (void)scn; ASSERT(scn && trgsides && stack - && side_id < SIDE_MAX__ && side_id < 2 * scn->ntris); + && side_id < SIDE_MAX__ && side_id < 2 * scn->nutris); ASSERT(!find_side_in_list(trgsides, stack, side_id, FLAG_WAITING_STACK)); darray_side_id_push_back(stack, &side_id); trgsides[side_id].list_id = FLAG_WAITING_STACK; @@ -216,7 +220,7 @@ add_side_to_medium_list { (void)scn; ASSERT(scn && side_ids_by_medium && trgsides - && side_id < 2 * scn->ntris); + && side_id < 2 * scn->nutris); if(trgsides[side_id].list_id == FLAG_LIST_BY_MEDIUM) { ASSERT(find_side_in_list(trgsides, side_ids_by_medium, side_id, FLAG_LIST_BY_MEDIUM)); @@ -294,7 +298,7 @@ extract_connex_components alloc = descriptor_get_allocator(desc); scn = desc->scene; - res = darray_triangle_comp_resize(&desc->triangles_comp, scn->ntris); + res = darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris); if(res != RES_OK) goto error; triangles_comp = darray_triangle_comp_data_get(&desc->triangles_comp); @@ -329,7 +333,7 @@ extract_connex_components side_id_t crt_side_id = start_side_id; char* side_membership; - ASSERT(start_side_id == SIDE_NULL__ || start_side_id < 2 * scn->ntris); + ASSERT(start_side_id == SIDE_NULL__ || start_side_id < 2 * scn->nutris); if(start_side_id == SIDE_NULL__) break; /* start_side_id=SIDE_NULL__ => medium done! */ ASSERT(trgsides[start_side_id].list_id == FLAG_LIST_BY_MEDIUM); @@ -339,9 +343,9 @@ extract_connex_components ASSERT(tmp <= COMPONENT_MAX__); cc_descriptor_clear(&current_cc); /* 1 char per triangle (2 sides) */ - darray_char_resize(&current_cc.side_membership, scn->ntris); + darray_char_resize(&current_cc.side_membership, scn->nutris); side_membership = darray_char_data_get(&current_cc.side_membership); - memset(side_membership, 0, scn->ntris * sizeof(char)); + memset(side_membership, 0, scn->nutris * sizeof(char)); current_cc.cc_id = (component_id_t)tmp; current_cc.medium = m; @@ -351,7 +355,7 @@ extract_connex_components struct trgside* crt_side = trgsides + crt_side_id; const trg_id_t crt_trg_id = TRGSIDE_2_TRG(crt_side_id); struct triangle_comp* trg_comp = triangles_comp + crt_trg_id; - ASSERT(crt_trg_id < scn->ntris); + ASSERT(crt_trg_id < scn->nutris); ASSERT(trgsides[crt_side_id].medium == m); /* Record crt_side both as component and triangle level */ @@ -422,6 +426,9 @@ exit: MEM_RM(scn->dev->allocator, component_ids_by_medium); } darray_side_id_release(&stack); + ASSERT(desc->triangle_count + == darray_triangle_comp_size_get(&desc->triangles_comp)); + /* triangles_enc is still unused: no size to assert */ return res; error: goto exit; @@ -563,7 +570,7 @@ group_connex_components continue; } else { /* If hit, group this component */ - const trg_id_t hit_trg_id = (trg_id_t) hit.prim.prim_id; + const trg_id_t hit_trg_id = (trg_id_t)hit.prim.prim_id; const struct triangle_in* hit_trg_in = darray_triangle_in_cdata_get(&desc->scene->triangles_in) + hit_trg_id; const struct triangle_comp* hit_trg_comp = @@ -571,8 +578,7 @@ group_connex_components enum side_id hit_side = (hit.normal[2] > 0) ? SIDE_FRONT : SIDE_BACK; const side_id_t hit_side_id = TRGIDxSIDE_2_TRGSIDE(hit_trg_id, hit_side); - ASSERT(hit.prim.prim_id < desc->scene->ntris); - ASSERT(hit.prim.prim_id <= TRG_MAX__); + ASSERT(hit.prim.prim_id < desc->scene->nutris); /* Not really the root until following links */ cc->cc_group_root = hit_trg_comp->component[hit_side]; @@ -889,7 +895,7 @@ build_result approx_trg_counts[e_id] += cc->triangle_count; } side_membership - = MEM_ALLOC(alloc, desc->scene->ntris * sizeof(*side_membership)); + = MEM_ALLOC(alloc, desc->scene->nutris * sizeof(*side_membership)); if(!side_membership) { res = RES_MEM_ERR; goto error; @@ -901,14 +907,14 @@ build_result FOR_EACH(e, 0, desc->enclosures_count) { struct enclosure_data* enc = enclosures + e; trg_id_t t; - memset(side_membership, 0, desc->scene->ntris * sizeof(*side_membership)); + memset(side_membership, 0, desc->scene->nutris * sizeof(*side_membership)); /* Process all CC enclosures_count times to limit memory footprint. */ FOR_EACH(c, 0, cc_count) { const struct cc_descriptor* cc = cc_descriptors + c; const char* cc_membership = darray_char_cdata_get(&cc->side_membership); if(cc->enclosure_id != e) continue; - FOR_EACH(t, 0, desc->scene->ntris) side_membership[t] |= cc_membership[t]; + FOR_EACH(t, 0, desc->scene->nutris) side_membership[t] |= cc_membership[t]; } /* Translate membership into a side and vertex lists. */ res = darray_triangle_in_reserve(&enc->sides, approx_trg_counts[e]); @@ -918,7 +924,9 @@ build_result /* New vertex numbering scheme local to the enclosure */ htable_vrtx_id_clear(&vtable); if(res != RES_OK) goto error; - FOR_EACH(t, 0, desc->scene->ntris) { + ASSERT(desc->scene->nutris + == darray_triangle_in_size_get(&desc->scene->triangles_in)); + FOR_EACH(t, 0, desc->scene->nutris) { const struct triangle_in* trg_in = triangles_in + t; struct triangle_in trg; int i;