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 cbb5805453ccc42394c74676e6f4d39dad1db97d
parent cdfd04dfe9704d959c210551a0051496a9761a12
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 12 Apr 2018 15:23:02 +0200

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

Diffstat:
Msrc/senc.h | 13+++++++++++++
Msrc/senc_descriptor.c | 38++++++++++++++++++++++++++++++++++++++
Msrc/senc_descriptor_c.h | 10++++++++++
3 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/src/senc.h b/src/senc.h @@ -166,12 +166,25 @@ senc_descriptor_get_enclosure_count unsigned* count); SENC_API res_T +senc_descriptor_get_enclosure_count_by_medium + (const struct senc_descriptor* descriptor, + const unsigned medium, + unsigned* count); + +SENC_API res_T senc_descriptor_get_enclosure (struct senc_descriptor* descriptor, const unsigned idx, struct senc_enclosure** enclosure); SENC_API res_T +senc_descriptor_get_enclosure_by_medium + (struct senc_descriptor* descriptor, + const unsigned medium, + const unsigned idx, + struct senc_enclosure** enclosure); + +SENC_API res_T senc_descriptor_get_global_triangles_count (const struct senc_descriptor* descriptor, unsigned* count); /* Number of unique triangles. */ diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -36,6 +36,7 @@ descriptor_release(ref_T * ref) scn = desc->scene; darray_triangle_enc_release(&desc->triangles_enc); darray_enclosure_release(&desc->enclosures); + darray_ids_array_release(&desc->ids_array_by_medium); MEM_RM(scn->dev->allocator, desc); SENC(scene_ref_put(scn)); @@ -59,6 +60,8 @@ descriptor_create(struct senc_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->triangle_count = scn->nutris; desc->vertices_count = scn->nuverts; @@ -94,6 +97,24 @@ senc_descriptor_get_enclosure_count } res_T +senc_descriptor_get_enclosure_count_by_medium + (const struct senc_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 */ + return RES_OK; +} + +res_T senc_descriptor_get_enclosure (struct senc_descriptor* desc, const unsigned idx, @@ -110,6 +131,23 @@ senc_descriptor_get_enclosure } res_T +senc_descriptor_get_enclosure_by_medium + (struct senc_descriptor* desc, + const unsigned med, + const unsigned idx, + struct senc_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 senc_descriptor_get_enclosure(desc, index, out_enc); +} + +res_T senc_descriptor_get_global_triangles_count (const struct senc_descriptor* desc, unsigned* count) diff --git a/src/senc_descriptor_c.h b/src/senc_descriptor_c.h @@ -18,6 +18,7 @@ #include <rsys/ref_count.h> #include <rsys/dynamic_array.h> +#include <rsys/dynamic_array_uint.h> #include "senc.h" #include "senc_enclosure_data.h" @@ -74,6 +75,14 @@ triangle_enc_init(struct mem_allocator* alloc, struct triangle_enc* trg) { #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 senc_descriptor { struct senc_scene* scene; enclosure_id_t enclosures_count; @@ -81,6 +90,7 @@ struct senc_descriptor { struct darray_triangle_enc triangles_enc; /* Store enclosures */ struct darray_enclosure enclosures; + struct darray_ids_array ids_array_by_medium; trg_id_t triangle_count; vrtx_id_t vertices_count;