commit fc91c9efee867a2b670ee4a2070bcfe87217e38c
parent 10498e115555814aaa80443e4d41fd6060205094
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 10 Oct 2019 17:28:07 +0200
Add API calls to access scene geometry without prior analyze
Diffstat:
4 files changed, 150 insertions(+), 5 deletions(-)
diff --git a/src/senc.h b/src/senc.h
@@ -209,6 +209,24 @@ senc_scene_get_unique_triangles_count
(const struct senc_scene* scene,
unsigned* count);
+/* Returns the itri_th unique triangles; the returned indices are
+ * unique vertex indices.
+ * Can be called anytime, before or after a call to analyze. */
+SENC_API res_T
+senc_scene_get_unique_triangle
+ (const struct senc_scene* scene,
+ const unsigned itri,
+ unsigned indices[3]);
+
+/* Returns the itri_th unique triangles; the returned indices are
+ * unique vertex indices.
+ * Can be called anytime, before or after a call to analyze. */
+SENC_API res_T
+senc_scene_get_unique_triangle_media
+ (const struct senc_scene* scene,
+ const unsigned itri,
+ unsigned media[2]);
+
/* Returns the number of vertices in the scene. */
SENC_API res_T
senc_scene_get_vertices_count
@@ -222,11 +240,13 @@ senc_scene_get_unique_vertices_count
(const struct senc_scene* scene,
unsigned* count);
-/* Returns the number of triangles in the scene. */
+/* Returns the coordinates of the ivert_th unique vertex.
+ * Can be called anytime, before or after a call to analyze. */
SENC_API res_T
-senc_scene_get_triangles_count
+senc_scene_get_unique_vertex
(const struct senc_scene* scene,
- unsigned* count);
+ const unsigned ivert,
+ double coord[3]);
SENC_API res_T
senc_scene_ref_get
diff --git a/src/senc_scene.c b/src/senc_scene.c
@@ -18,6 +18,7 @@
#include "senc_scene_c.h"
#include <rsys/rsys.h>
+#include <rsys/double3.h>
#include <rsys/mem_allocator.h>
#include <limits.h>
@@ -367,6 +368,46 @@ senc_scene_get_unique_triangles_count
}
res_T
+senc_scene_get_unique_triangle
+ (const struct senc_scene* scn,
+ const unsigned itri,
+ unsigned indices[3])
+{
+ const struct triangle_in* trg;
+ int i;
+ if(!scn || !indices
+ || itri >= darray_triangle_in_size_get(&scn->triangles_in))
+ return RES_BAD_ARG;
+ trg = darray_triangle_in_cdata_get(&scn->triangles_in) + itri;
+
+ FOR_EACH(i, 0, 3) {
+ ASSERT(trg->vertice_id[i] < UINT_MAX);
+ indices[i] = (unsigned)trg->vertice_id[i]; /* Back to API type */
+ }
+ return RES_OK;
+}
+
+res_T
+senc_scene_get_unique_triangle_media
+ (const struct senc_scene* scn,
+ const unsigned itri,
+ unsigned media[2])
+{
+ const struct triangle_in* trg;
+ int i;
+ if(!scn || !media
+ || itri >= darray_triangle_in_size_get(&scn->triangles_in))
+ return RES_BAD_ARG;
+ trg = darray_triangle_in_cdata_get(&scn->triangles_in) + itri;
+
+ FOR_EACH(i, 0, 2) {
+ ASSERT(trg->vertice_id[i] < UINT_MAX);
+ media[i] = (unsigned)trg->medium[i]; /* Back to API type */
+ }
+ return RES_OK;
+}
+
+res_T
senc_scene_get_vertices_count
(const struct senc_scene* scn,
unsigned* count)
@@ -387,6 +428,23 @@ senc_scene_get_unique_vertices_count
}
res_T
+senc_scene_get_unique_vertex
+ (const struct senc_scene* scn,
+ const unsigned ivert,
+ double coord[3])
+{
+
+ const union double3* v;
+ if(!scn || !coord
+ || ivert >= darray_position_size_get(&scn->vertices))
+ return RES_BAD_ARG;
+
+ v = darray_position_cdata_get(&scn->vertices) + ivert;
+ d3_set(coord, v->vec);
+ return RES_OK;
+}
+
+res_T
senc_scene_ref_get(struct senc_scene* scn)
{
if(!scn) return RES_BAD_ARG;
diff --git a/src/test_senc_scene.c b/src/test_senc_scene.c
@@ -29,7 +29,8 @@ main(int argc, char** argv)
struct senc_enclosure* enc = NULL;
struct senc_enclosure_header header;
struct context ctx;
- unsigned medfront[2], medback[2];
+ unsigned medfront[2], medback[2], ind[3];
+ double vrtx[3];
unsigned count, i, maxm;
enum senc_convention convention;
(void)argc, (void)argv;
@@ -51,6 +52,9 @@ main(int argc, char** argv)
CHK(senc_scene_create(dev,
SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK);
+ CHK(senc_scene_reserve(NULL, 0, 0, 0) == RES_BAD_ARG);
+ CHK(senc_scene_reserve(scn, 0, 0, 0) == RES_OK);
+
CHK(senc_scene_get_convention(NULL, &convention) == RES_BAD_ARG);
CHK(senc_scene_get_convention(scn, NULL) == RES_BAD_ARG);
CHK(senc_scene_get_convention(NULL, NULL) == RES_BAD_ARG);
@@ -118,6 +122,33 @@ main(int argc, char** argv)
CHK(senc_scene_get_unique_vertices_count(scn, &count) == RES_OK);
CHK(count == nvertices);
+ CHK(senc_scene_get_unique_triangle(NULL, 0, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(scn, UINT_MAX, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(scn, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(NULL, UINT_MAX, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(NULL, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(scn, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(NULL, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle(scn, 0, ind) == RES_OK);
+
+ CHK(senc_scene_get_unique_triangle_media(NULL, 0, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(scn, UINT_MAX, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(scn, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(NULL, UINT_MAX, ind) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(NULL, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(scn, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(NULL, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_triangle_media(scn, 0, ind) == RES_OK);
+
+ CHK(senc_scene_get_unique_vertex(NULL, 0, vrtx) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(scn, UINT_MAX, vrtx) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(scn, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(NULL, UINT_MAX, vrtx) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(NULL, 0, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(scn, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(NULL, UINT_MAX, NULL) == RES_BAD_ARG);
+ CHK(senc_scene_get_unique_vertex(scn, 0, vrtx) == RES_OK);
+
CHK(senc_scene_analyze(NULL, NULL) == RES_BAD_ARG);
CHK(senc_scene_analyze(scn, NULL) == RES_BAD_ARG);
CHK(senc_scene_analyze(NULL, &desc) == RES_BAD_ARG);
diff --git a/src/test_senc_undefined_medium.c b/src/test_senc_undefined_medium.c
@@ -33,7 +33,7 @@ test(enum senc_convention convention)
unsigned medium;
unsigned gid;
struct context ctx;
- unsigned i, t, ecount, tcount;
+ unsigned i, t, ecount, vcount, tcount;
int is_front, is_in;
unsigned media[12];
unsigned rev_box_indices[sizeof(box_indices) / sizeof(*box_indices)];
@@ -85,6 +85,24 @@ test(enum senc_convention convention)
/* Cannot run analyze with undefined media */
BA(senc_scene_analyze(scn, &desc));
+ /* Get the deduplicated geometry without (successful) analyze */
+ OK(senc_scene_get_unique_vertices_count(scn, &vcount));
+ CHK(vcount == nvertices);
+ OK(senc_scene_get_unique_triangles_count(scn, &tcount));
+ CHK(tcount == ntriangles);
+ FOR_EACH(i, 0, tcount) {
+ int j;
+ unsigned med[2], ids[3];
+ OK(senc_scene_get_unique_triangle(scn, i, ids));
+ OK(senc_scene_get_unique_triangle_media(scn, i, med));
+ CHK(med[0] == ((i % 2) ? 0 : SENC_UNDEFINED_MEDIUM) && med[1] == 1);
+ FOR_EACH(j, 0, 3) {
+ double pos[3];
+ CHK(ids[j] < vcount);
+ OK(senc_scene_get_unique_vertex(scn, ids[j], pos));
+ }
+ }
+
/* Same information again, using a reversed box */
ctx.indices = rev_box_indices;
SWAP(const unsigned*, ctx.front_media, ctx.back_media);
@@ -100,6 +118,24 @@ test(enum senc_convention convention)
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
NULL, nvertices, get_position, &ctx));
+ /* Get the deduplicated geometry without (successful) analyze */
+ OK(senc_scene_get_unique_vertices_count(scn, &vcount));
+ CHK(vcount == nvertices);
+ OK(senc_scene_get_unique_triangles_count(scn, &tcount));
+ CHK(tcount == ntriangles);
+ FOR_EACH(i, 0, tcount) {
+ int j;
+ unsigned med[2], ids[3];
+ OK(senc_scene_get_unique_triangle(scn, i, ids));
+ OK(senc_scene_get_unique_triangle_media(scn, i, med));
+ CHK(med[0] == 0 && med[1] == 1);
+ FOR_EACH(j, 0, 3) {
+ double pos[3];
+ CHK(ids[j] < vcount);
+ OK(senc_scene_get_unique_vertex(scn, ids[j], pos));
+ }
+ }
+
/* Can run analyze */
OK(senc_scene_analyze(scn, &desc));
OK(senc_descriptor_ref_put(desc));