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 815fee4ac237ba4799e25bfae9700e302b1699b7
parent 10558d205b15530f9e521bde7d73e77c02e60929
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 12 Apr 2018 13:47:44 +0200

Add 2 new API calls to allow enclosures access by medium.

Diffstat:
Msrc/senc2d.h | 13+++++++++++++
Msrc/senc2d_descriptor.c | 39+++++++++++++++++++++++++++++++++++++++
Msrc/senc2d_descriptor_c.h | 10++++++++++
Msrc/senc2d_scene_analyze.c | 6++++++
Msrc/test_senc2d_descriptor.c | 40+++++++++++++++++++++++++++++++++++-----
5 files changed, 103 insertions(+), 5 deletions(-)

diff --git a/src/senc2d.h b/src/senc2d.h @@ -167,12 +167,25 @@ senc2d_descriptor_get_enclosure_count unsigned* count); SENC2D_API res_T +senc2d_descriptor_get_enclosure_count_by_medium + (const struct senc2d_descriptor* descriptor, + const unsigned medium, + unsigned* count); + +SENC2D_API res_T senc2d_descriptor_get_enclosure (struct senc2d_descriptor* descriptor, const unsigned idx, struct senc2d_enclosure** enclosure); SENC2D_API res_T +senc2d_descriptor_get_enclosure_by_medium + (struct senc2d_descriptor* descriptor, + const unsigned medium, + const unsigned idx, + struct senc2d_enclosure** enclosure); + +SENC2D_API res_T senc2d_descriptor_get_global_segments_count (const struct senc2d_descriptor* descriptor, unsigned* count); /* Number of unique segments. */ diff --git a/src/senc2d_descriptor.c b/src/senc2d_descriptor.c @@ -36,6 +36,7 @@ descriptor_release(ref_T * ref) scn = desc->scene; darray_segment_enc_release(&desc->segments_enc); darray_enclosure_release(&desc->enclosures); + darray_ids_array_release(&desc->ids_array_by_medium); MEM_RM(scn->dev->allocator, desc); SENC2D(scene_ref_put(scn)); @@ -59,6 +60,8 @@ descriptor_create(struct senc2d_scene* scn) /* Enclosure 0 is always defined for infinite */ darray_enclosure_init(scn->dev->allocator, &desc->enclosures); OK(darray_enclosure_resize(&desc->enclosures, 1)); + darray_ids_array_init(scn->dev->allocator, &desc->ids_array_by_medium); + OK(darray_ids_array_resize(&desc->ids_array_by_medium, scn->nmeds)); desc->enclosures_count = 1; desc->segment_count = scn->nusegs; desc->vertices_count = scn->nuverts; @@ -94,6 +97,25 @@ senc2d_descriptor_get_enclosure_count } res_T +senc2d_descriptor_get_enclosure_count_by_medium + (const struct senc2d_descriptor* desc, + const unsigned med, + unsigned* count) +{ + size_t tmp; + const struct darray_uint* ids; + if(!desc || !count || med >= desc->scene->nmeds) + return RES_BAD_ARG; + ASSERT(darray_ids_array_size_get(&desc->ids_array_by_medium) + == desc->scene->nmeds); + ids = darray_ids_array_cdata_get(&desc->ids_array_by_medium); + tmp = darray_uint_size_get(ids); + ASSERT(tmp < UINT_MAX); /* API type */ + *count = (unsigned)tmp; + return RES_OK; +} + +res_T FINLINE senc2d_descriptor_get_enclosure (struct senc2d_descriptor* desc, const unsigned idx, @@ -110,6 +132,23 @@ senc2d_descriptor_get_enclosure } res_T +senc2d_descriptor_get_enclosure_by_medium + (struct senc2d_descriptor* desc, + const unsigned med, + const unsigned idx, + struct senc2d_enclosure** out_enc) +{ + const struct darray_uint* ids; + unsigned index; + if(!desc || med >= desc->scene->nmeds || !out_enc) return RES_BAD_ARG; + ids = darray_ids_array_cdata_get(&desc->ids_array_by_medium); + if(idx >= darray_ids_array_size_get(&desc->ids_array_by_medium)) + return RES_BAD_ARG; + index = darray_uint_cdata_get(ids)[idx]; + return senc2d_descriptor_get_enclosure(desc, index, out_enc); +} + +res_T senc2d_descriptor_get_global_segments_count (const struct senc2d_descriptor* desc, unsigned* count) diff --git a/src/senc2d_descriptor_c.h b/src/senc2d_descriptor_c.h @@ -18,6 +18,7 @@ #include <rsys/ref_count.h> #include <rsys/dynamic_array.h> +#include <rsys/dynamic_array_uint.h> #include "senc2d.h" #include "senc2d_enclosure_data.h" @@ -74,6 +75,14 @@ segment_enc_init(struct mem_allocator* alloc, struct segment_enc* seg) { #define DARRAY_FUNCTOR_COPY_AND_RELEASE enclosure_data_copy_and_release #include <rsys/dynamic_array.h> +#define DARRAY_NAME ids_array +#define DARRAY_DATA struct darray_uint +#define DARRAY_FUNCTOR_INIT darray_uint_init +#define DARRAY_FUNCTOR_COPY darray_uint_copy +#define DARRAY_FUNCTOR_RELEASE darray_uint_release +#define DARRAY_FUNCTOR_COPY_AND_RELEASE darray_uint_copy_and_release +#include <rsys/dynamic_array.h> + struct senc2d_descriptor { struct senc2d_scene* scene; enclosure_id_t enclosures_count; @@ -81,6 +90,7 @@ struct senc2d_descriptor { struct darray_segment_enc segments_enc; /* Store enclosures */ struct darray_enclosure enclosures; + struct darray_ids_array ids_array_by_medium; seg_id_t segment_count; vrtx_id_t vertices_count; diff --git a/src/senc2d_scene_analyze.c b/src/senc2d_scene_analyze.c @@ -960,6 +960,7 @@ build_result const enclosure_id_t e = (enclosure_id_t)ee; struct enclosure_data* enc = enclosures + e; const struct cc_descriptor* current = cc_descriptors[enc->first_component]; + struct darray_uint* ids_by_medium; seg_id_t fst_idx = 0; seg_id_t sgd_idx = enc->side_count; seg_id_t s; @@ -977,6 +978,11 @@ build_result = (unsigned)current->medium; /* Back to API type */ ASSERT(enc->header.enclosed_medium < desc->scene->nmeds); + ids_by_medium = darray_ids_array_data_get(&desc->ids_array_by_medium) + + current->medium; + tmp_res = darray_uint_push_back(ids_by_medium, &e); + if(*res != RES_OK) continue; + /* Build side and vertex lists. */ tmp_res = darray_segment_in_resize(&enc->sides, enc->side_count); if(*res != RES_OK) continue; diff --git a/src/test_senc2d_descriptor.c b/src/test_senc2d_descriptor.c @@ -70,15 +70,45 @@ main(int argc, char** argv) CHK(count == 2); - CHK(senc2d_descriptor_get_enclosure(NULL, 0, &enc) == RES_BAD_ARG); - CHK(senc2d_descriptor_get_enclosure(desc, count, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(NULL, 0, &count) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(desc, 10, &count) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(desc, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(NULL, 10, &count) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(NULL, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(desc, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(NULL, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_count_by_medium(desc, 0, &count) == RES_OK); + + CHK(count == 1); + CHK(senc2d_descriptor_get_enclosure(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc2d_descriptor_get_enclosure(NULL, count, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure(desc, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure(desc, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure(NULL, 0, &enc) == RES_BAD_ARG); CHK(senc2d_descriptor_get_enclosure(NULL, 0, NULL) == RES_BAD_ARG); - CHK(senc2d_descriptor_get_enclosure(desc, count, NULL) == RES_BAD_ARG); - CHK(senc2d_descriptor_get_enclosure(NULL, count, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure(NULL, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure(NULL, 10, NULL) == RES_BAD_ARG); CHK(senc2d_descriptor_get_enclosure(desc, 0, &enc) == RES_OK); + CHK(senc2d_enclosure_ref_put(enc) == RES_OK); + + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 0, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 0, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 0, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 10, 0, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 10, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 10, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 10, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 0, 0, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 0, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 0, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 0, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 10, 0, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 10, 0, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 10, 10, &enc) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(NULL, 10, 10, NULL) == RES_BAD_ARG); + CHK(senc2d_descriptor_get_enclosure_by_medium(desc, 0, 0, &enc) == RES_OK); + CHK(senc2d_descriptor_get_global_vertices_count(NULL, &count) == RES_BAD_ARG); CHK(senc2d_descriptor_get_global_vertices_count(desc, NULL) == RES_BAD_ARG); CHK(senc2d_descriptor_get_global_vertices_count(desc, &count) == RES_OK);