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 7e50c82a2538283656f632f107778ed45803e0b9
parent 475b525076043ca52b0fd546a68ba9c482617a71
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 14 Feb 2018 16:52:35 +0100

Move tmp data out of the descriptor.

Allowing to release them early.

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

diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -34,7 +34,6 @@ descriptor_release(ref_T * ref) ASSERT(ref); desc = CONTAINER_OF(ref, struct senc_descriptor, ref); scn = desc->scene; - darray_triangle_comp_release(&desc->triangles_comp); darray_triangle_enc_release(&desc->triangles_enc); darray_enclosure_release(&desc->enclosures); @@ -54,7 +53,6 @@ descriptor_create(struct senc_scene* scn) if(desc) { desc->scene = scn; SENC(scene_ref_get(desc->scene)); - darray_triangle_comp_init(scn->dev->allocator, &desc->triangles_comp); darray_triangle_enc_init(scn->dev->allocator, &desc->triangles_enc); /* Enclosure 0 is always defined for infinite */ darray_enclosure_init(scn->dev->allocator, &desc->enclosures); diff --git a/src/senc_descriptor_c.h b/src/senc_descriptor_c.h @@ -77,8 +77,6 @@ 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 */ diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -280,6 +280,7 @@ extract_connex_components struct trgside* trgsides, struct darray_cc_descriptor* connex_components, struct darray_triangle_tmp* triangles_tmp_array, + struct darray_triangle_comp* triangles_comp, struct darray_side_id* side_ids_by_medium) { res_T res = RES_OK; @@ -288,7 +289,6 @@ extract_connex_components struct senc_scene* scn; struct mem_allocator* alloc; struct darray_side_id stack; - struct triangle_comp* triangles_comp; /* Arrays of cc_descriptor ids, organized by medium. */ struct darray_component_id* component_ids_by_medium = NULL; @@ -297,9 +297,6 @@ extract_connex_components alloc = descriptor_get_allocator(desc); scn = desc->scene; - - OK(darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris)); - triangles_comp = darray_triangle_comp_data_get(&desc->triangles_comp); /* Init data structures */ darray_side_id_init(alloc, &stack); @@ -353,7 +350,8 @@ extract_connex_components /* Pop waiting stack to feed crt_side */ 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; + struct triangle_comp* trg_comp = + darray_triangle_comp_data_get(triangles_comp) + crt_trg_id; ASSERT(crt_trg_id < scn->nutris); ASSERT(trgsides[crt_side_id].medium == m); @@ -444,7 +442,7 @@ exit: } darray_side_id_release(&stack); ASSERT(desc->triangle_count - == darray_triangle_comp_size_get(&desc->triangles_comp)); + == darray_triangle_comp_size_get(triangles_comp)); /* triangles_enc is still unused: no size to assert */ return res; error: @@ -475,6 +473,7 @@ static res_T group_connex_components (struct senc_descriptor* desc, struct trgside* trgsides, + const struct darray_triangle_comp* triangles_comp, struct darray_cc_descriptor* connex_components) { res_T res = RES_OK; @@ -598,7 +597,7 @@ group_connex_components 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 = - darray_triangle_comp_cdata_get(&desc->triangles_comp) + hit_trg_id; + darray_triangle_comp_cdata_get(triangles_comp) + hit_trg_id; 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); @@ -1026,6 +1025,9 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) /* Triangle neighbourhood by edge. */ struct darray_neighbourhood neighbourhood_by_edge; char neighbourhood_by_edge_initialized = 0; + /* Store by-triangle components */ + struct darray_triangle_comp triangles_comp; + char triangles_comp_initialized = 0; /* Array of triangle sides. */ struct trgside* trgsides = NULL; @@ -1080,10 +1082,13 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) neighbourhood_by_edge_initialized = 0; darray_cc_descriptor_init(scn->dev->allocator, &connex_components); connex_components_initialized = 1; + darray_triangle_comp_init(scn->dev->allocator, &triangles_comp); + triangles_comp_initialized = 1; + OK(darray_triangle_comp_resize(&triangles_comp, scn->nutris)); /* Step 3: extract triangle connex components */ res = extract_connex_components(desc, trgsides, &connex_components, - &triangles_tmp, side_ids_by_medium); + &triangles_tmp, &triangles_comp, side_ids_by_medium); if(res != RES_OK) { log_err(scn->dev, "%s: could not extract connex components from scene.\n", FUNC_NAME); @@ -1102,13 +1107,17 @@ 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); + res = group_connex_components(desc, trgsides, &triangles_comp, + &connex_components); if(res != RES_OK) { log_err(scn->dev, "%s: could not group connex components from scene.\n", FUNC_NAME); goto error; } + darray_triangle_comp_release(&triangles_comp); + triangles_comp_initialized = 0; + /* Build result. */ res = build_result(desc, &connex_components); if(res != RES_OK) { @@ -1116,15 +1125,13 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) goto error; } - darray_triangle_comp_purge(&desc->triangles_comp); - - exit: if(connex_components_initialized) darray_cc_descriptor_release(&connex_components); if(neighbourhood_by_edge_initialized) darray_neighbourhood_release(&neighbourhood_by_edge); if(triangles_tmp_initialized) darray_triangle_tmp_release(&triangles_tmp); + if(triangles_comp_initialized) darray_triangle_comp_release(&triangles_comp); if(side_ids_by_medium) { FOR_EACH(m, 0, scn->nmeds) { struct darray_side_id* cc = side_ids_by_medium + m;