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:
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;