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