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 8cce1bcbc3b1d8c524dd5df1ad37457a5ae929e5
parent ea96ad9c852b427814621b68fc30d811e8210b87
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 13 Feb 2018 10:31:43 +0100

Add code to determine by-triangle enclosures.

Diffstat:
Msrc/senc_descriptor.c | 15+++++----------
Msrc/senc_scene_analyze.c | 13++++++++++++-
2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -189,20 +189,15 @@ senc_descriptor_get_global_enclosures const unsigned itri, unsigned enclosures[2]) { - const struct triangle_comp* trg; + const struct triangle_enc* trg; int i; if(!enclosures || !desc - || itri >= darray_triangle_in_size_get(&desc->scene->triangles_in)) + || itri >= darray_triangle_enc_size_get(&desc->triangles_enc)) return RES_BAD_ARG; - trg = darray_triangle_comp_cdata_get(&desc->triangles_comp) + itri; - - /* FIXME: trg->component is not what we need. - * We want an enclosure ID, not a component ID! */ - - + trg = darray_triangle_enc_cdata_get(&desc->triangles_enc) + itri; FOR_EACH(i, 0, 2) { - ASSERT(trg->component[i] < UINT_MAX); - enclosures[i] = (unsigned)trg->component[i]; /* Back to API type */ + ASSERT(trg->enclosure[i] < UINT_MAX); + enclosures[i] = (unsigned)trg->enclosure[i]; /* Back to API type */ } return RES_OK; } diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -845,6 +845,7 @@ build_result struct enclosure_data* enclosures; char* side_membership = NULL; const struct triangle_in* triangles_in; + struct triangle_enc* triangles_enc; const union double3* positions; struct htable_vrtx_id vtable; size_t tmp; @@ -893,6 +894,9 @@ build_result res = RES_MEM_ERR; goto error; } + res = darray_triangle_enc_resize(&desc->triangles_enc, desc->scene->nutris); + if (res != RES_OK) goto error; + triangles_enc = darray_triangle_enc_data_get(&desc->triangles_enc); htable_vrtx_id_init(alloc, &vtable); FOR_EACH(e, 0, desc->enclosures_count) { struct enclosure_data* enc = enclosures + e; @@ -944,12 +948,16 @@ build_result ++enc->header.triangle_count; res = darray_triangle_in_push_back(&enc->sides, &trg); if(res != RES_OK) goto error; + ASSERT(triangles_enc[t].enclosure[SIDE_FRONT] == ENCLOSURE_NULL__); + triangles_enc[t].enclosure[SIDE_FRONT] = e; } if(side_membership[t] & FLAG_BACK) { ++enc->header.triangle_count; triangle_in_flip(&trg); res = darray_triangle_in_push_back(&enc->sides, &trg); if(res != RES_OK) goto error; + ASSERT(triangles_enc[t].enclosure[SIDE_BACK] == ENCLOSURE_NULL__); + triangles_enc[t].enclosure[SIDE_BACK] = e; } } } @@ -1002,7 +1010,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) darray_neighbourhood_init(scn->dev->allocator, &neighbourhood_by_edge); neighbourhood_by_edge_initialized = 1; - /* Step 1: */ + /* Step 1: list edges and connect triangles to edges */ res = scan_edges(scn, &neighbourhood_by_edge, &triangles_tmp); if(res != RES_OK) { log_err(scn->dev, "%s: could not scan edges.\n", FUNC_NAME); @@ -1026,6 +1034,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) goto error; } + /* Step 2: link triangles by neighbourhood */ res = link_neighbours(scn, trgsides, &neighbourhood_by_edge, &triangles_tmp, side_ids_by_medium); if(res != RES_OK) { @@ -1038,6 +1047,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) darray_cc_descriptor_init(scn->dev->allocator, &connex_components); connex_components_initialized = 1; + /* Step 3: extract triangle connex components */ res = extract_connex_components(desc, trgsides, &connex_components, &triangles_tmp, side_ids_by_medium); if(res != RES_OK) { @@ -1057,6 +1067,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) } side_ids_by_medium = NULL; + /* Step 4: group components */ res = group_connex_components(desc, trgsides, &connex_components); if(res != RES_OK) { log_err(scn->dev,