star-enclosures-2d

Extract enclosures from 2D geometry
git clone git://git.meso-star.fr/star-enclosures-2d.git
Log | Files | Refs | README | LICENSE

commit 03fdc536e376e12be60172cc0293adea915c4e7e
parent f258fc48fbe7fd7b13933413e0dbd2a99529a4b0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 25 Oct 2019 16:39:20 +0200

Add a reserve API call

Diffstat:
Mcmake/CMakeLists.txt | 6+++---
Msrc/senc2d.h | 8++++++++
Msrc/senc2d_scene.c | 22++++++++++++++++++++++
Msrc/test_senc2d_many_enclosures.c | 2++
Msrc/test_senc2d_many_segments.c | 2++
5 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -24,9 +24,9 @@ option(NO_TEST "Do not build tests" OFF) # Check dependencies ################################################################################ find_package(RCMake 0.4 REQUIRED) -find_package(Star2D 0.1 REQUIRED) -find_package(RSys 0.6.1 REQUIRED) -find_package(OpenMP 1.2 REQUIRED) +find_package(Star2D 0.3.1 REQUIRED) +find_package(RSys 0.8.1 REQUIRED) +find_package(OpenMP 2.0 REQUIRED) if(NOT NO_TEST) find_package(StarSP 0.7 REQUIRED) diff --git a/src/senc2d.h b/src/senc2d.h @@ -150,6 +150,14 @@ senc2d_scene_create const enum senc2d_convention convention, struct senc2d_scene** scene); +/* Reserve memory according to anticipated scene size. */ +SENC2D_API res_T +senc2d_scene_reserve + (struct senc2d_scene* scene, + const unsigned vertices_count, + const unsigned triangles_count, + const unsigned media_count); + /* Add a new set of vertices and segments to the scene. * Vertices can be duplicates and are deduplicated on the fly. * Segments can be duplicates as long as they constantly define the same diff --git a/src/senc2d_scene.c b/src/senc2d_scene.c @@ -94,6 +94,28 @@ error: } res_T +senc2d_scene_reserve + (struct senc2d_scene* scn, + const unsigned vertices_count, + const unsigned triangles_count, + const unsigned media_count) +{ + res_T res = RES_OK; + if(!scn) return RES_BAD_ARG; + + OK(darray_position_reserve(&scn->vertices, vertices_count)); + OK(darray_segment_in_reserve(&scn->segments_in, triangles_count)); + OK(htable_vrtx_reserve(&scn->unique_vertices, vertices_count)); + OK(htable_seg_reserve(&scn->unique_segments, triangles_count)); + OK(darray_side_range_reserve(&scn->media_use, media_count)); + +end: + return res; +error: + goto end; +} + +res_T senc2d_scene_add_geometry (struct senc2d_scene* scn, const unsigned nsegs, diff --git a/src/test_senc2d_many_enclosures.c b/src/test_senc2d_many_enclosures.c @@ -94,6 +94,8 @@ main(int argc, char** argv) && sa_size(ctx.indices) / 2 < UINT_MAX); circ_seg_count = (unsigned)sa_size(ctx.indices) / 2; circ_vrtx_count = (unsigned)sa_size(ctx.positions) / 2; + CHK(senc2d_scene_reserve(scn, NB_CIRC * circ_vrtx_count, NB_CIRC * circ_seg_count, 0) + == RES_OK); FOR_EACH(i, 0, NB_CIRC_1) { double center_x = 2 * (1 + NB_CIRC_1) * (i - NB_CIRC_1 / 2); FOR_EACH(j, 0, NB_CIRC_1) { diff --git a/src/test_senc2d_many_segments.c b/src/test_senc2d_many_segments.c @@ -92,6 +92,8 @@ main(int argc, char** argv) && sa_size(ctx.indices) / 2 < UINT_MAX); circ_seg_count = (unsigned)sa_size(ctx.indices) / 2; circ_vrtx_count = (unsigned)sa_size(ctx.positions) / 2; + CHK(senc2d_scene_reserve(scn, NB_CIRC * circ_vrtx_count, NB_CIRC * circ_seg_count, 0) + == RES_OK); FOR_EACH(i, 0, NB_CIRC) { m1 = i; d2(ctx.offset, 0, i * 10);