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