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 b293d850467926092b0f70d76a43bd3224dc1263
parent a8f6347c7f33467d9c59a9a428e0d98ef7526b84
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 16 Feb 2018 05:14:17 +0100

Reduce memory footprint of vertices deduplicate.

Replace a large global array by a small one local to a single add_geometry.

Diffstat:
Msrc/senc_scene.c | 24++++++++++--------------
Msrc/senc_scene_c.h | 2--
2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -36,7 +36,6 @@ scene_release(ref_T * ref) darray_triangle_in_release(&scn->triangles_in); darray_position_release(&scn->vertices); htable_vrtx_release(&scn->unique_vertices); - darray_vrtx_id_release(&scn->unique_vertice_ids); htable_trg_release(&scn->unique_triangles); MEM_RM(dev->allocator, scn); SENC(device_ref_put(dev)); @@ -75,7 +74,6 @@ senc_scene_create darray_triangle_in_init(dev->allocator, &scn->triangles_in); darray_position_init(dev->allocator, &scn->vertices); htable_vrtx_init(dev->allocator, &scn->unique_vertices); - darray_vrtx_id_init(dev->allocator, &scn->unique_vertice_ids); htable_trg_init(dev->allocator, &scn->unique_triangles); exit: @@ -99,6 +97,7 @@ senc_scene_add_geometry void(*position)(const unsigned ivert, double pos[3], void* ctx), void* ctx) { + struct darray_vrtx_id unique_vertice_ids; unsigned i; vrtx_id_t actual_nverts = 0; vrtx_id_t actual_nuverts = 0; @@ -114,15 +113,16 @@ senc_scene_add_geometry return RES_BAD_ARG; /* Make room for new geometry; suppose no more duplicates. */ + darray_vrtx_id_init(scn->dev->allocator, &unique_vertice_ids); + OK(darray_vrtx_id_reserve(&unique_vertice_ids, nverts)); OK(darray_position_reserve(&scn->vertices, scn->nuverts + nverts)); OK(darray_triangle_in_reserve(&scn->triangles_in, scn->nutris + ntris)); OK(htable_vrtx_reserve(&scn->unique_vertices, scn->nuverts + nverts)); - OK(darray_vrtx_id_reserve(&scn->unique_vertice_ids, scn->nverts + nverts)); OK(htable_trg_reserve(&scn->unique_triangles, scn->nutris + ntris)); - /* Get geometry */ trg = darray_triangle_in_cdata_get(&scn->triangles_in); + /* Get geometry */ FOR_EACH(i, 0, nverts) { vrtx_id_t* p_vrtx; union double3 tmp; @@ -132,7 +132,7 @@ senc_scene_add_geometry p_vrtx = htable_vrtx_find(&scn->unique_vertices, &tmp); if(p_vrtx) { /* Duplicate vertex */ - unique_v = darray_vrtx_id_cdata_get(&scn->unique_vertice_ids)[*p_vrtx]; + unique_v = *p_vrtx; } else { /* New vertex */ unique_v = scn->nuverts + actual_nuverts; @@ -143,9 +143,8 @@ senc_scene_add_geometry ++actual_nuverts; } /* The unique ID for vertex v is u */ - ASSERT(scn->nverts + i - == darray_vrtx_id_size_get(&scn->unique_vertice_ids)); - OK(darray_vrtx_id_push_back(&scn->unique_vertice_ids, &unique_v)); + ASSERT(i == darray_vrtx_id_size_get(&unique_vertice_ids)); + OK(darray_vrtx_id_push_back(&unique_vertice_ids, &unique_v)); ++actual_nverts; } @@ -153,7 +152,6 @@ senc_scene_add_geometry int j; unsigned med[2]; unsigned ind[3]; - vrtx_id_t vrtx_key; union vrtx_id3 trg_key; struct triangle_in tmp; trg_id_t* p_trg; @@ -165,11 +163,9 @@ senc_scene_add_geometry res = RES_BAD_ARG; goto error; } - vrtx_key = ind[j] + scn->nverts; - ASSERT(vrtx_key < darray_vrtx_id_size_get(&scn->unique_vertice_ids)); + ASSERT(ind[j] < darray_vrtx_id_size_get(&unique_vertice_ids)); /* Find the unique ID for this vertex */ - tmp.vertice_id[j] = - darray_vrtx_id_cdata_get(&scn->unique_vertice_ids)[vrtx_key]; + tmp.vertice_id[j] = darray_vrtx_id_cdata_get(&unique_vertice_ids)[ind[j]]; } if(tmp.vertice_id[0] == tmp.vertice_id[1] || tmp.vertice_id[0] == tmp.vertice_id[2] @@ -250,12 +246,12 @@ senc_scene_add_geometry } exit: + darray_vrtx_id_release(&unique_vertice_ids); /* Update sizes */ scn->nuverts += actual_nuverts; scn->nverts += actual_nverts; scn->nutris += actual_nutris; scn->ntris += actual_ntris; - ASSERT(scn->nverts == darray_vrtx_id_size_get(&scn->unique_vertice_ids)); ASSERT(scn->nuverts == htable_vrtx_size_get(&scn->unique_vertices)); ASSERT(scn->nutris == htable_trg_size_get(&scn->unique_triangles)); ++scn->ngeoms; diff --git a/src/senc_scene_c.h b/src/senc_scene_c.h @@ -186,8 +186,6 @@ struct senc_scene { * neighbourhoods, we need vertice unicity. */ /* Keep each unique vertex; no duplicates here. */ struct htable_vrtx unique_vertices; - /* Associate each vertex with its rank in unique_vertices. */ - struct darray_vrtx_id unique_vertice_ids; /* Htables used to detect duplicate triangles. */ /* Keep each unique triangle; no duplicates here. */