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 144092d10863d8a9ce1434b2d655594a0964511e
parent e50d53b5af12c1b9f84f09ced229fe69a78c5c20
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 20 Feb 2018 17:13:26 +0100

Decrease enclosures' memory footprint by ~40%.

Replace vertices by indexes in global vertices list.

Diffstat:
Msrc/senc_enclosure.c | 18+++++++++++-------
Msrc/senc_enclosure_data.h | 20+++++++++++---------
Msrc/senc_scene_analyze.c | 14+++-----------
Msrc/senc_scene_c.h | 5+++++
4 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/src/senc_enclosure.c b/src/senc_enclosure.c @@ -100,15 +100,19 @@ senc_enclosure_get_vertex const unsigned ivert, double coord[3]) { - const union double3* positions; if(!enclosure || !coord - || ivert >= enclosure->data->header.vertices_count) + || ivert >= enclosure->data->header.vertices_count) { return RES_BAD_ARG; - ASSERT(darray_position_size_get(&enclosure->data->vertices) - == enclosure->data->header.vertices_count); - positions = darray_position_cdata_get(&enclosure->data->vertices); - d3_set(coord, positions[ivert].vec); - return RES_OK; + } else { + const vrtx_id_t idx + = darray_vrtx_id_cdata_get(&enclosure->data->vertices)[ivert]; + const union double3* positions + = darray_position_cdata_get(&enclosure->desc->scene->vertices); + ASSERT(darray_vrtx_id_size_get(&enclosure->data->vertices) + == enclosure->data->header.vertices_count); + d3_set(coord, positions[idx].vec); + return RES_OK; + } } res_T diff --git a/src/senc_enclosure_data.h b/src/senc_enclosure_data.h @@ -21,6 +21,7 @@ #include "senc.h" #include "senc_scene_c.h" +#include "senc_internal_types.h" static void init_header(struct enclosure_header* header) @@ -38,7 +39,8 @@ struct enclosure_data { struct enclosure_header header; /* Same triangle can appear twice if both sides */ struct darray_triangle_in sides; - struct darray_position vertices; + /* Index of vertices in scene's unique vertices */ + struct darray_vrtx_id vertices; }; static FINLINE void @@ -46,40 +48,40 @@ enclosure_data_init(struct mem_allocator* alloc, struct enclosure_data* enc) { ASSERT(enc); init_header(&enc->header); darray_triangle_in_init(alloc, &enc->sides); - darray_position_init(alloc, &enc->vertices); + darray_vrtx_id_init(alloc, &enc->vertices); } static FINLINE res_T enclosure_data_copy -(struct enclosure_data* dst, - const struct enclosure_data* src) + (struct enclosure_data* dst, + const struct enclosure_data* src) { res_T res = RES_OK; ASSERT(src && dst); dst->header = src->header; res = darray_triangle_in_copy(&dst->sides, &src->sides); if(res != RES_OK) return res; - return darray_position_copy(&dst->vertices, &src->vertices); + return darray_vrtx_id_copy(&dst->vertices, &src->vertices); } static FINLINE void enclosure_data_release(struct enclosure_data* n) { ASSERT(n); darray_triangle_in_release(&n->sides); - darray_position_release(&n->vertices); + darray_vrtx_id_release(&n->vertices); } static FINLINE res_T enclosure_data_copy_and_release -(struct enclosure_data* dst, - struct enclosure_data* src) + (struct enclosure_data* dst, + struct enclosure_data* src) { res_T res = RES_OK; ASSERT(src && dst); dst->header = src->header; res = darray_triangle_in_copy_and_release(&dst->sides, &src->sides); if(res != RES_OK) return res; - return darray_position_copy_and_release(&dst->vertices, &src->vertices); + return darray_vrtx_id_copy_and_release(&dst->vertices, &src->vertices); } #endif /* SENC_ENCLOSURE_DATA_H */ diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -46,11 +46,6 @@ const struct cc_descriptor CC_DESCRIPTOR_NULL = CC_DESCRIPTOR_NULL__; #define DARRAY_DATA side_id_t #include <rsys/dynamic_array.h> -#define HTABLE_NAME vrtx_id -#define HTABLE_KEY vrtx_id_t -#define HTABLE_DATA vrtx_id_t -#include <rsys/hash_table.h> - /******************************************************************************* * Helper function ******************************************************************************/ @@ -931,7 +926,6 @@ build_result 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; component_id_t cc_count, c; @@ -948,7 +942,6 @@ build_result darray_enclosure_resize(&desc->enclosures, desc->enclosures_count); enclosures = darray_enclosure_data_get(&desc->enclosures); triangles_in = darray_triangle_in_cdata_get(&desc->scene->triangles_in); - positions = darray_position_cdata_get(&desc->scene->vertices); /* Set some enclosure data */ side_counts = MEM_CALLOC(alloc, desc->enclosures_count, sizeof(side_id_t)); if(!side_counts) { @@ -996,7 +989,7 @@ build_result } /* Translate membership into a side and vertex lists. */ OK(darray_triangle_in_reserve(&enc->sides, side_counts[e])); - OK(darray_position_reserve(&enc->vertices, side_counts[e] / 2)); + OK(darray_vrtx_id_reserve(&enc->vertices, side_counts[e] / 2)); /* New vertex numbering scheme local to the enclosure */ htable_vrtx_id_clear(&vtable); ASSERT(desc->scene->nutris @@ -1016,13 +1009,12 @@ build_result } else { /* Create new association */ tmp = htable_vrtx_id_size_get(&vtable); - ASSERT(tmp == darray_position_size_get(&enc->vertices)); + ASSERT(tmp == darray_vrtx_id_size_get(&enc->vertices)); ASSERT(tmp < VRTX_MAX__); trg.vertice_id[i] = (vrtx_id_t)tmp; OK(htable_vrtx_id_set(&vtable, trg_in->vertice_id + i, trg.vertice_id + i)); - OK(darray_position_push_back(&enc->vertices, - positions + trg_in->vertice_id[i])); + OK(darray_vrtx_id_push_back(&enc->vertices, trg_in->vertice_id + i)); ++enc->header.vertices_count; } } diff --git a/src/senc_scene_c.h b/src/senc_scene_c.h @@ -24,6 +24,11 @@ struct mem_allocator; +#define HTABLE_NAME vrtx_id +#define HTABLE_KEY vrtx_id_t +#define HTABLE_DATA vrtx_id_t +#include <rsys/hash_table.h> + union double3 { struct { double x, y, z;